REF: Шпаргалка по Python
Структуры данных
Арифметические операции
3 // 2 # 1 округленное вниз целочисленное значение
3 % 2 # 1 остаток от деления
int(3.9) # = 3
Логика
Автоматически вычисляются к
False: None, 0 (целое),
0.0 (вещественное), пустые строки и объекты контейнерных типов.
Оператор
and обладает приоритетом перед
or.
Строки
st, s = "aaa", 'aa'
st.strip() # удаляем пробелы вначале и конце (возврат новой строки)
st.lower() # в нижний регистр
st.upper() # в вехний регистр
st.startswith(s) # начинается со строки s (True, False)
st.endswith(s) # заканчивается строкой s (True, False)
st.find(s) # индекс найденного вхождения (int)
s in st # s содержится в st (True, False)
st.replace(s1,s2) # заменить все s1 на s2
','.join(["F", "B", "I"]) # cклеить элементы списка с разделителем
Память
Строки, числа - неизменяемые объекты
y = x = 3
s1, s2, i1, i2 = "aaa", "aaa", 1, 1
x is y # True (ссылаются на одну память)
s1 is s2 # True
i1 is i2 # True
[3] is [3] # False
id(x) # 2546626711664 (адрес в памяти)
Списки
lst = [1, 2, 3]
lst.append(4) # [1, 2, 3, 4] ничего не возращает (в нём же)
lst.insert(2, 4) # [1, 2, 4, 3] (на 2-ю позицию, сдвигая вправо)
[1, 2, 3] + [4, 5] # [1, 2, 3, 4, 5] конкатенация
lst.extend([4, 5]) # тоже но эффективнее (?)
lst.pop() # 4 [1, 2, 3] удалить последний, вернув его
lst.pop(1) # 2 [1, 3, 4] удалить второй lst[1], вернув его
lst.remove(2) # удаляет первую 2-ку (если нет - будет исключение)
lst.reverse() # перевернуть список
1 in lst # есть или нет в списке
lst.sort() # лексографически сортировать (элементы сравнимы)
lst.sort(reverse = True) # в обратном порядке
lst.sort(key = lambda x: x%2) # [1,2,3,4] -> [2,4,1,3]
lst = list( filter(lambda x: x % 2, lst) )# [1,2,3,4] -> [1,3]
lst = list( filter(None, tokens) ) # ['a','','b'] -> ['a','b'] убрать пустые строки
Множество
Элементы должны быть хешируемыми (числа, строки, но не списки)
hash('a') # -5021022557028035767
s = {'a','a','b'} # {'b','a'} порядок не определён, значения уникальны
'a' in s # принадлежность
Ассоциативные массивы
Выполняет операцию
t[hash('x')] и проверяет, не равно ли
None возвращаемое значение.
t = {'x' : 1, 'y' : 2}
t['x'] = 3 # если ключа 'x' нет - исключение, иначе значение
t.get('x') # None если нет, иначе значение
'x' in t # есть ли ключ
t.keys(), t.values() # ключи, значения
for k, v in t.items(): # пары ключ-значение
print(k) if v > 5 else None
Управление и функции
Циклы и ветвления
for i in [0, 1, 2]: j = 0 if x > 3: print("Big")
print(i) while j < 3: elif x == 3: print("Medium")
j = j + 1 else: print("Small")
Функции
def f(x, y=2):
return x*y
f = lambda x,y: x+y # lambda аргументы : возвращаемое выражение
z = f(2,3)
Списковое включение и map
lst = [x**2 for x in range(10)]
lst = [(1,2), (3,4)]
[x for x,y in lst if y > 2] # [1]
[(x, y) for x in range(3) for y in range(3)])
([line.strip() for line in open("readFile.py")]
[[x for x in line.split() if len(x) > 3] for line in text.split('\n')]
Функция map() применяет функцию к каждому элементу итерируемого объекта.
Если объектов несколько, остановит расчеты после достижения конца наиболее короткого объекта:
list(map(lambda x: 2*x, [1,2,3])) # [2, 4, 6]
txt = ['girl like boy', 'boy is programmer']
mark = list( map(lambda s: (True, s) if 'girl' in s else (False, s), txt) )
powers = list(map(pow, [2,3], [1, 2, 3])) # [2, 9] = 2**1, 3**2
Срезы
s = [0, 1, 2, 3, 4] # список
s[:] # копия списка (новая память)
s[1:] # [1, 2, 3, 4] все, кроме первого
s[-3:] # [2, 3, 4] последние 3
s[1:4:2] # [1, 3] с шагом 2
del s[1:3] # s = [0, 3, 4] удаление
s[1:4:2]=list("ab") # s = [0,'a',2,'b',4] замена
"Hello!"[2:4] # 'll' списки, строки, кортежи
"Hello!"[::-1] # '!olleH' переворот
Чтобы объекты понимали срезы (slice), необходимо определить
методы
__getitem__, __setitem__, __delitem__ (атрибуты
key могут быть
None,
надо проверять):
class MySliceble():
def __getitem__(self, key):
if isinstance(key, slice):
return list(range(key.start, key.stop, key.step))
else:
raise Exception("Trying to access by index")
my = MySliceble()
my[2:9:2] # [2, 4, 6, 8]