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]