https://github.com/soreana/python-notes
https://github.com/soreana/python-notes
Last synced: 9 months ago
JSON representation
- Host: GitHub
- URL: https://github.com/soreana/python-notes
- Owner: soreana
- License: apache-2.0
- Created: 2022-11-07T23:51:07.000Z (about 3 years ago)
- Default Branch: main
- Last Pushed: 2023-05-16T23:59:57.000Z (over 2 years ago)
- Last Synced: 2025-01-25T23:16:29.267Z (11 months ago)
- Size: 121 KB
- Stars: 0
- Watchers: 2
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Python-notes
In python result of the `/` is float !!!!!!!!!!!!!!
The truncated division operator, //, also works on floating point numbers. It truncates to the nearest integer, but still produces a floating point result. Thus 7.0 // 3.0 is 2.0.
for example:
```python
print( 10 / 3 ) # prints 3.333333333
print( 10 // 3) # prints 3
```
** is the power sign.
```python
print( 4**2 ) # prints 16
```
Functions are objects in Python. So if I print out what's the value of square, then Python is going to tell me that square is a function. So if I run my code, you can see that line 1 prints out function square.
```python
def square():
return none
print(square) # outputs
```
type function shows the type of the variable.
```python
print(type("Hello, World!")) # prints
print(type(20)) # prints
print(type(3.2)) # prints
print(type(True)) # prints
```
Use """ to split string in multiple lines.
```python
print("""This message will span
several lines
of the text.""")
```
When python casts float to int, it drops numbers after the dot. For example:
```python
int(3.999) # is 3
int(3.0) # is 3
int(-3.9999) # is -3
```
Get input:
```python
n = input("Please enter your name: ") # It always reads string. you should cast it if you want to convert it to another type.
print("Hello", n)
```
For loop examples:
```python
for _ in range(3): # runs three time
...
for i in range(5): # range returnes a sequence of [0, 1, 2, 3, 4] (last item is exclusive)
...
for i in range(1, 5): # now it returnes a sequence of [1, 2, 3, 4]
...
```
How import works
```python
import random
prob = random.random()
print(prob)
diceThrow = random.randrange(1,7) # return an int, one of 1,2,3,4,5,6
print(diceThrow)
```
```python
from random import random, randrange
prob = random()
print(prob)
diceThrow = randrange(1,7) # return an int, one of 1,2,3,4,5,6
print(diceThrow)
```
Tuple vs List:
Tuple is immutable, but the list is not.
```python
t = (5,)
print(type(t)) # prints
l = ["hello", 2.0, 5, [10, 20]]
print(type(l)) # prints
```
```python
t = (5,) # this is a tuple.
t = (5) # this is an integer. Python can't understand if if was the (2+3) or it is a tuple.
t = () # this is an empty tuple.
```
Slice operator: syntax [from`(inclusive)`:to`(exclusive)`]
```python
singers = "Peter, Paul, and Mary"
print(singers[7:11]) # It prints Paul, index five is not included!
fruit = "banana"
print(fruit[:3]) # ban, again index 3 is not included
print(fruit[3:]) # ana
L = [0.34, '6', 'SI106', 'Python', -2]
print(L[1:-1]) # prints [ '6', 'SI106', 'Python']
```
Concatenation:
```python
print([1,2] + [3,4]) # prints [1,2, 3,4]
print([0, 1] * 4) # prints [0, 1, 0, 1, 0, 1, 0, 1]
```
Count:
It is the same in String and Lists
```python
a = "I have had an apple on my desk before!"
z = ['atoms', 4, 'neutron', 6, 'proton', 4, 'electron', 4, 'electron', 'atoms']
print(a.count("e")) # prints 5
print(a.count("ha")) # prints 2
print(z.count(4)) # prints 3
```
Index:
It throws an error if it couldn't find the key
```python
music = "Pull out your music and dancing can begin"
bio = ["Metatarsal", "Metatarsal", "Fibula", [], "Tibia", "Tibia", 43, "Femur", "Occipital", "Metatarsal"]
print(music.index("m"))
print(music.index("your"))
print(bio.index("Metatarsal"))
print(bio.index([]))
print(bio.index(43))
seasons = ["winter", "spring", "summer", "fall"]
print(seasons.index("autumn")) #Error!
```
Splitting:
```python
song = "The rain in Spain..."
wds = song.split() # it uses space as splitter by default.
song = "The rain in Spain..."
wds = song.split('ai') # it uses ai as splitter.
```
Joining:
```python
wds = ["red", "blue", "green"]
glue = ';'
s = glue.join(wds)
print(s) # prints red;blue;green
print(wds) # join doesn't have any effect one the wds
print("".join(wds)) # prints redbluegreen
```
In operator:
```python
print('p' in 'apple') # returns True
print('' in 'a') # returns True
print('' in 'apple') # returns True
print('x' not in 'apple') # returns True
print("a" in ["a", "b", "c", "d"]) # returns True
print(9 in [3, 2, 9, 10, 9.0]) # returns True
print('wow' not in ['gee wiz', 'gosh golly', 'wow', 'amazing']) # returns Tru
```
Mutablity:
```python
alist = ['a', 'b', 'c', 'd', 'e', 'f']
alist[1:3] = ['x', 'y']
print(alist) # prints ['a', 'x', 'y', 'd', 'e', 'f']
alist[1:3] = [] # This assignment deletes elements 1 and 2 but it is better to use the del statement *1
print(alist) # prints ['a', 'd', 'e', 'f']
alist = ['a', 'd', 'f']
alist[1:1] = ['b', 'c']
print(alist) # prints ['a', 'b', 'c', 'd', 'f']
alist[4:4] = ['e']
print(alist) # prints ['a', 'b', 'c', 'd', 'e', 'f']
*1
a = ['one', 'two', 'three']
del a[1]
print(a) # prints ['one', 'three']
alist = ['a', 'b', 'c', 'd', 'e', 'f']
del alist[1:5]
print(alist) # prints ['a', 'f']
```
But Strings are immutable:
```python
greeting = "Hello, world!"
greeting[0] = 'J' # Results TypeError: 'str' does not support item assignment on line 2
```
Tuples are also immutable:
```python
julia = ("X", "Y")
julia[0] = 'X' # TypeError: 'tuple' object does not support item assignment
```
Refrences
```python
a = "banana"
b = "banana"
print(a is b) # prints true
print(id(a)) # prints 2
print(id(b)) # prints 2
a = [81,82,83]
b = [81,82,83]
print(a is b) # prints False
print(a == b) # prints True
print(id(a)) # prints 3
print(id(b)) # prints 4
```
Cloning a List:
The slice operator, always grabs some part of a list, and **makes a new list** using those items that have been grabbed. So, if we execute the following code, then we have a clone of a.
```python
a = [1, 2, 3, 4, 5]
b = a[:] # Now, b is the clone of the a
```
Mutating methods:
```python
mylist = []
mylist.append(5)
mylist.append(27)
mylist.append(3)
mylist.append(12)
print(mylist) # prints [5, 27, 3, 12]
mylist.insert(1, 12)
print(mylist) # prints [5, 12, 27, 3, 12]
print(mylist.count(12)) # prints 2
print(mylist.index(3)) # prints 3
print(mylist.count(5)) # prints 1
mylist.reverse() # it is in-place
print(mylist) # prints [12, 3, 27, 12, 5]
mylist.sort() # it is in-place
print(mylist) # prints [3, 5, 12, 12, 27]
mylist.remove(5) # removes 5 not an object at index 5
print(mylist) # prints [3, 12, 12, 27]
lastitem = mylist.pop()
print(lastitem) # prints 27
print(mylist) # prints [3, 12, 12]
```
**Important:** Concatenation with + operator creates a new list, but the append function add the element to the end of the array. It doesn't create a new list.
The fucking Python language doesn't do the same with (arr) + (arr) and (arr) += (arr). In case of (arr) + (arr) it concatenate the arrays and creates new object. But in (arr) += (arr) it append the second array to the first one. There isn't any new object.
String mutation:
It doesn't have any effect on the String, it always generates new string.
```python
ss = "Hello, World"
print(ss.upper()) # prints HELLO, WORLD
tt = ss.lower()
print(tt) # prints hello, world
print(ss) # prints Hello, world
ss = " Hello, World "
els = ss.count("l")
print(els)
print("***"+ss.strip()+"***")
news = ss.replace("o", "***")
print(news)
# Checkes if the letter is alpha or not
letter = 'a'
letter.isalpha() # returns True
```
String format:
```python
person = "Samar"
score = 20
print('Hello {}. Your score is {}.'.format(name, score))
print('Hello {nm}. Your score is {s1}.'.format(s1=score, nm=name))
print('Hello {0}. Your score is {1}. Bye {0}!'.format(name, score))
origPrice = 80.99
discount = 33.30
newPrice = (1 - discount/100)*origPrice
calculation = '${:.2f} discounted by {}% is ${:.2f}.'.format(origPrice, discount, newPrice)
```
# Files:
Open/close file:
```python
fileRef = open('school_prompt2.txt','r')
fileRef.close()
```
| Method Name | Use | Explanation|
|:-----------:|:---:|:-----------:|
| write | filevar.write(astring) | Add a string to the end of the file. filevar must refer to a file that has been opened for writing.|
read(n)|filevar.read()|Read and return a string of n characters, or the entire file as a single string if n is not provided.|
|readline(n)|filevar.readline()| Read and return the next line of the file with all text up to and including the newline character. If n is provided as a parameter, then only n characters will be returned if the line is longer than n. Note the parameter n is not supported in the browser version of Python, and in fact is rarely used in practice, you can safely ignore it.|
|readlines(n)| filevar.readlines()| Returns a list of strings, each representing a single line of the file. If n is not provided then all lines of the file are returned. If n is provided then n characters are read but n is rounded up so that an entire line is returned. Note Like readline readlines ignores the parameter n in the browser.
File iteration:
```python
f = open("file.txt", "r")
# iterating over characters
for ch in f.read():
...
# iterating over lines
for li in f.readlines():
...
# iterating over lines using the file ref (prefered)
for li in f:
...
f.close()
```
Writing a files:
```python
f = open("file.txt", "w") # equivalents to `with open("file.txt", "w") as f`
for number in range(1, 13):
square = number * number
f.write(str(square) + "\n") # Note-1: we have to add the \n explicitly, Note-2: We also need to pass a String in contrast to the print
f.close()
```
With keyword:
It is the same for reading (`open` with `r` option) and writing (following example):
```python
# These are the same
f = open("file.txt", "w")
...
f.close()
with open("file.txt", "w") as f:
...
```
Dictionaries:
```python
emptyDic = {}
pets = {"cat":12, "dog":6, "elephant":23}
print(pets["dog"]) # prints 6
pets["mouse"] = 3
print(pets["mouse"]) # prints 3
del pets["elephant"] # removes elephant
print(len(pets)) # prints 3
```
Some useful methods:
| Method | Parameters | Description |
|:-------|:-----------|:------------|
| keys | none | Returns a view of the keys in the dictionary |
| values | none | Returns a view of the values in the dictionary |
| items | none | Returns a view of the key-value pairs in the dictionary |
| get | key | Returns the value associated with key; None otherwise |
| get | key,alt | Returns the value associated with key; alt otherwise |
```python
inventory = {'apples': 430, 'bananas': 312, 'pears': 217, 'oranges': 525}
for akey in inventory.keys():
...
for akey in sorted(inventory.keys()):
...
# Or simply
for k in inventory:
...
# iterate over the values
for v in inventory.values():
...
# iterate over both key and values
for k, v in inventory.items():
...
# Check existance
if 'bananas' in inventory:
print(inventory['bananas'])
# Get the value safely inventory['cherries'] throws an error cause the cherries key doesn't exist in the inventory but get returns None
print(inventory.get("apples"))
print(inventory.get("cherries"))
print(inventory.get("cherries",0))
ks = list(inventory.keys()) # Keys doesn't return the keys as a list, we should convert it using the list() conversion function.
```
Functions:
if you don't return anyting from the function, the return value would be `None`.
In the following code, adding results in an error but multipying not.
```python
x = 9
# has error
def adding():
x+=1
print(x)
# No error
def multipying():
global x
x+=1
print(x)
adding()
multipying()
```
Tuple boxing/unboxing
```python
julia = ("Julia", "Roberts", 1967, "Duplicity", 2009, "Actress", "Atlanta, Georgia")
# or equivalently (implicit tuple boxing)
julia = "Julia", "Roberts", 1967, "Duplicity", 2009, "Actress", "Atlanta, Georgia"
print(julia[4])
# (implicit tuple unboxing)
name, surname, birth_year, movie, movie_year, profession, birth_place = julia
(a, b, c, d) = (1, 2, 3) # ValueError: need more than 3 values to unpack
# Swapping values
a = 1
b = 2
(a, b) = (b, a)
```
Use tuple boxing/unboxing in for loop
```python
fruits = ['apple', 'pear', 'apricot', 'cherry', 'peach']
# the following three fors output the same result
for n in range(len(fruits)):
print(n, fruits[n])
for item in enumerate(fruits):
print(item[0], item[1])
for idx, fruit in enumerate(fruits):
print(idx, fruit)
```
Use tuple boxing/unboxing with functions:
```python
def circleInfo(r):
""" Return (circumference, area) of a circle of radius r """
c = 2 * 3.14159 * r
a = 3.14159 * r * r
return c, a
circumference, area = circleInfo(10)
def add(x, y):
return x + y
print(add(3, 4))
z = (5, 4)
print(add(*z)) # this line will cause the values to be unpacked
print(add(z)) # this line causes an error
```
Optional Parameters
Python acts weired with the optional parameters
```python
initial = 7
# Default values are only evaluated when we declare the function.
# If we change the initial value it doesn't have any effect on f function
def f(x, y =3, z=initial):
print("x, y, z, are: " + str(x) + ", " + str(y) + ", " + str(z))
initial = 10
f(2) # Prints "x, y, z, are: 2, 3, 7" not "x, y, z, are: 2, 3, 10"
def f(a, L=[]):
L.append(a)
return L
print(f(1)) # Prints [1]
print(f(2)) # Prints [1, 2]
print(f(3)) # Prints [1, 2, 3]
print(f(4, ["Hello"])) # Prints ['Hello', 4]
print(f(5, ["Hello"])) # Prints ['Hello', 5]
```
Lambda functions:
```python
def f(x):
return x - 1
print(f) # prints
print(type(f)) # prints
print(f(3)) # prints 2
print(lambda x: x-2) # prints >
print(type(lambda x: x-2)) # prints
print((lambda x: x-2)(6)) # prints 6
```
Sorting a list
```python
L1 = [1, 7, 4, -2, 3]
# Option one
L1.sort()
print(L1) # prints [-2, 1, 3, 4, 7]
# Options two (prefered)
L2 = sorted(L1)
# Reversed
L3 = sorted(L1, reverse=True ) # L3 is [7, 4, 3, 1, -2]
# With key
def absolute(x):
if x >= 0:
return x
else:
return -x
L4 = sorted(L1, key=absolute) # L4 is [1, -2, 3, 4, 7]
# Dictionaries
d = {"F": 10, 'T': 20, 'C': 6, "G": 1, 'H': 2, 'L': 14}
D1 = sorted(d.keys()) # Based on the key
D2 = sorted(d, key= lambda k: d[k]) # Based on the values
# Tuples
# For a sequence of tuples, the default sort order is based on the default sort order for the first elements
# of the tuples, with ties being broken by the second elements, and then third elements if necessary, etc.
tups = [('A', 3, 2),
('C', 1, 4),
('B', 3, 1),
('A', 2, 4),
('C', 1, 2)]
for tup in sorted(tups):
print(tup)
# prints
# ('A', 2, 4)
# ('A', 3, 2)
# ('B', 3, 1)
# ('C', 1, 2)
# ('C', 1, 4)
# We can use this trick to break ties
fruits = ['peach', 'kiwi', 'apple', 'blueberry', 'papaya', 'mango', 'pear']
new_order = sorted(fruits, key=lambda fruit_name: (len(fruit_name), fruit_name))
for fruit in new_order:
print(fruit)
# prints
# kiwi
# pear
# apple
# mango
# peach
# papaya
# blueberry
```
# Utility functions:
```python
def octal_to_string(octal):
result = ""
value_letters = [(4,"r"),(2,"w"),(1,"x")]
# Iterate over each of the digits in octal
for digit in [int(n) for n in str(octal)]:
# Check for each of the permissions values
for value, letter in value_letters:
if digit >= value:
result += letter
digit -= value
else:
result += '-'
return result
print(octal_to_string(755)) # Should be rwxr-xr-x
print(octal_to_string(644)) # Should be rw-r--r--
print(octal_to_string(750)) # Should be rwxr-x---
print(octal_to_string(600)) # Should be rw-------
```
```python
def perm_to_num(symbolic):
'''
Convert symbolic permission notation to numeric notation.
'''
perms = {
'---': '0',
'--x': '1',
'-w-': '2',
'-wx': '3',
'r--': '4',
'r-x': '5',
'rw-': '6',
'rwx': '7'
}
# Trim Lead If It Exists
if len(symbolic) == 10:
symbolic = symbolic[1:]
# Parse Symbolic to Numeric
x = (symbolic[:-6], symbolic[3:-3], symbolic[6:])
numeric = perms[x[0]] + perms[x[1]] + perms[x[2]]
return numeric
print(perm_to_num('rwxr-xr-x')) # Shoule be 755
print(perm_to_num('rw-r--r--')) # Shoule be 644
print(perm_to_num('rwxr-x---')) # Shoule be 750
print(perm_to_num('rw-------')) # Shoule be 600
```