Return
Вывод:
Объяснение:
▪️Когда в try-блоке «try … finally» выполняется оператор return, break или continue, finally также выполняется «на выходе».
▪️Возвращаемое значение функции определяется последним выполненным оператором return. Поскольку finally выполняется всегда, оператор return, выполняемый в finally, всегда будет последним.
#return
def func():
try:
return 'try'
finally:
return 'finally’
Вывод:
>>> func()
'finally’
Объяснение:
▪️Когда в try-блоке «try … finally» выполняется оператор return, break или continue, finally также выполняется «на выходе».
▪️Возвращаемое значение функции определяется последним выполненным оператором return. Поскольку finally выполняется всегда, оператор return, выполняемый в finally, всегда будет последним.
#return
Вложенные list comprehensions
В list comprehensions можно использовать несколько for:
#tips
В list comprehensions можно использовать несколько for:
>>> l = [[1,2,3], [4,5,6]]
>>> [lll * 2 for ll in l for lll in ll]
[2, 4, 6, 8, 10, 12]
#tips
The random module
Нетрудно догадаться, что модуль random служит для генерации случайных чисел. В основу его работы положен алгоритм Мерсенна. Функция random.random() возвращает случайный float из интервала [0.0, 1.0). Результат всегда будет меньше чем 1.0.
Стоит рассмотреть два интересных примера использования функции random.
▪️Для того, чтобы выбрать рандомный элемент из списка или кортежа, используйте random.choice()
▪️Для того, чтобы выбрать несколько элементов из списка или кортежа, используйте random.choices()
#random
Нетрудно догадаться, что модуль random служит для генерации случайных чисел. В основу его работы положен алгоритм Мерсенна. Функция random.random() возвращает случайный float из интервала [0.0, 1.0). Результат всегда будет меньше чем 1.0.
>>> random.random()
0.4631297580529897
>>> random.random()
0.5855244248224873
Стоит рассмотреть два интересных примера использования функции random.
▪️Для того, чтобы выбрать рандомный элемент из списка или кортежа, используйте random.choice()
>>> items = ['one', 'two', 'three', 'four', 'five']
>>> random.choice(items)
’two’
▪️Для того, чтобы выбрать несколько элементов из списка или кортежа, используйте random.choices()
>>> random.choices(items, k=3)
['three', 'five', 'four’]
#random
Сортировка словаря по значению
Или c помощью operator:
#tips
>>> xs = {'a': 4, 'b': 3, 'c': 2, 'd': 1}
>>> sorted(xs.items(), key=lambda x: x[1])
[('d', 1), ('c', 2), ('b', 3), ('a', 4)]Или c помощью operator:
>>> import operator
>>> sorted(xs.items(), key=operator.itemgetter(1))
[('d', 1), ('c', 2), ('b', 3), ('a', 4)]
#tips
Метод get для словарей
Вывод:
Вызов функции с аргументом по умолчанию (или без существующего ключа):
#tips #dict
name_for_userid = {
382: "Alice",
590: "Bob",
951: "Dilbert",
}
def greeting(userid):
return "Hi {}".format(name_for_userid.get(userid, “there”))Вывод:
>>> greeting(382)
"Hi Alice!”
Вызов функции с аргументом по умолчанию (или без существующего ключа):
>>> greeting(333333)
"Hi there!”
#tips #dict
type() vs isinstance()
С помощью функции type() можно проверить, принадлежит ли аргумент тому или иному типу:
В отличие от type(), функция isinstance() специально создана для проверки принадлежности данных определенному классу (типу данных):
isinstance() по сравнению с type() позволяет проверить данные на принадлежность хотя бы одному типу из кортежа, переданного в качестве второго аргумента:
Кроме того, isinstance() поддерживает наследование. Для isinstance() экземпляр производного класса также является экземпляром базового класса. Для type() это не так:
#tips #isinstance
С помощью функции type() можно проверить, принадлежит ли аргумент тому или иному типу:
>>> a = 10
>>> b = [1, 2, 3]
>>> type(a) == int
True
>>> type(b) == list
True
>>> type(a) == float
False
В отличие от type(), функция isinstance() специально создана для проверки принадлежности данных определенному классу (типу данных):
>>> isinstance(a, int)
True
>>> isinstance(b, list)
True
>>> isinstance(b, tuple)
False
>>> c = (4, 5, 6)
>>> isinstance(c, tuple)
True
isinstance() по сравнению с type() позволяет проверить данные на принадлежность хотя бы одному типу из кортежа, переданного в качестве второго аргумента:
>>> isinstance(a, (float, int, str))
True
>>> isinstance(a, (list, tuple, dict))
False
Кроме того, isinstance() поддерживает наследование. Для isinstance() экземпляр производного класса также является экземпляром базового класса. Для type() это не так:
>>> class A (list):
... pass
...
>>> a = A()
>>> type(a) == list
False
>>> type(a) == A
True
>>> isinstance(a, A)
True
>>> isinstance(a, list)
True
#tips #isinstance
Мы с @python_lounge создали совместный чат для питонистов и для тех, что еще только начинает. В планах участники будут помогать друг другу с различными ошибками и просто отвечать на вопросы.
@pychat_ru - ждем всех.
@pychat_ru - ждем всех.
Hello World pinned «Мы с @python_lounge создали совместный чат для питонистов и для тех, что еще только начинает. В планах участники будут помогать друг другу с различными ошибками и просто отвечать на вопросы. @pychat_ru - ждем всех.»
Namedtuples
Использование namedtuple немного короче, чем объявление класса напрямую:
Строковое представление нашего объекта:
Как и обычный кортеж, namedtuple неизменяем:
#tips
Использование namedtuple немного короче, чем объявление класса напрямую:
>>> from collections import namedtuple
>>> Car = namedtuple('Car', 'color mileage anothernumber’)
>>> my_car = Car('red', 3812.4, 228)
>>> my_car.color
'red'
>>> my_car.mileage
3812.4
>>> my_car.anothernumber
228
Строковое представление нашего объекта:
>>> my_car
Car(color='red' , mileage=3812.4, anothernumber=228)
Как и обычный кортеж, namedtuple неизменяем:
>>> my_car.color = 'blue'
AttributeError: "can't set attribute”
#tips
Как работает цикл for в Python?
Python не имеет традиционных циклов for. Для того, чтобы объяснить это, рассмотрим цикл for написанный в C стиле:
Так работает типичный цикл for в C-подобных языках программирования. Но цикл в Python так не работает. Цикл в Python это скорее foreach цикл.
📎 В циклах Python нет индексной переменной
📎 Здесь нет инициализации индекса, проверки границ или инкрементации индекса
📎 Циклы в Python работают со всеми элементами листа
📎 Именно поэтому эти циклы могут работать с любыми итерируемыми объектами, например:
#for #iterators #tips
Python не имеет традиционных циклов for. Для того, чтобы объяснить это, рассмотрим цикл for написанный в C стиле:
int numbers[5] = {1, 2, 3, 4, 5};
for (int i = 0; i < size; ++i) {
printf(“%d\n”, numbers[i]);
}Так работает типичный цикл for в C-подобных языках программирования. Но цикл в Python так не работает. Цикл в Python это скорее foreach цикл.
numbers = [1, 2, 3, 4, 5]
for n in numbers:
print(n)
📎 В циклах Python нет индексной переменной
📎 Здесь нет инициализации индекса, проверки границ или инкрементации индекса
📎 Циклы в Python работают со всеми элементами листа
📎 Именно поэтому эти циклы могут работать с любыми итерируемыми объектами, например:
numbers = [1, 2, 3, 4, 5]
iterator = iter(numbers)
for item in iterator:
print(item)
#for #iterators #tips
Function argument unpacking
Создадим простую функцию.
Создадим к ней дополнительно кортеж и словарь.
Теперь мы можем передавать их в нашу функцию вот так просто, это удобно:
#tips
Создадим простую функцию.
def myfunc(x, y, z):
print(x, y, z)
Создадим к ней дополнительно кортеж и словарь.
tuple_vec = (1, 0, 1)
dict_vec = {'x': 1, 'y': 0, 'z': 1}
Теперь мы можем передавать их в нашу функцию вот так просто, это удобно:
>>> myfunc(*tuple_vec)
1, 0, 1
>>> myfunc(**dict_vec)
1, 0, 1
#tips
Есть ли разница между [] и list()?
В принципе результат будет одним и тем же, но давайте заглянем глубже:
Инициализация листа с помощью конструктора list() выглядит как минимум в 4-5 раз медленнее. Попробуем заглянуть внутрь с помощью модуля dis, который служит для изучения байткода Python’a.
Ответ заключается в том, что в то случае когда мы выбираем list() вместо [] мы теряем вычислительное время на “избыточный” вызов самой функции list().
📎 Во многих случаях это не настолько важно, поскольку мы имеем дело с микросекундами. Однако стоит об этом помнить, если ты имеешь дело с big data.
#list
>>> f = []
>>> f = list()
В принципе результат будет одним и тем же, но давайте заглянем глубже:
>>> timeit.timeit(‘[]’, number=10**8)
2.25569809000001
>>> timeit.timeit(‘list()’, number=10**8)
10.330681907999995
Инициализация листа с помощью конструктора list() выглядит как минимум в 4-5 раз медленнее. Попробуем заглянуть внутрь с помощью модуля dis, который служит для изучения байткода Python’a.
>>> dis.dis('f=[]')
1 0 BUILD_LIST 0
2 STORE_NAME 0 (f)
4 LOAD_CONST 0 (None)
6 RETURN_VALUE
>>> dis.dis('f=list()')
1 0 LOAD_NAME 0 (list)
2 CALL_FUNCTION 0
4 STORE_NAME 1 (f)
6 LOAD_CONST 0 (None)
8 RETURN_VALUEОтвет заключается в том, что в то случае когда мы выбираем list() вместо [] мы теряем вычислительное время на “избыточный” вызов самой функции list().
📎 Во многих случаях это не настолько важно, поскольку мы имеем дело с микросекундами. Однако стоит об этом помнить, если ты имеешь дело с big data.
#list
Какими модулями чаще пользуешься?
Anonymous Poll
25%
numpy/scipy
5%
matplotlib/seaborn
38%
requests/urllib2
9%
PIL/pillow
9%
threading/multiprocessing
14%
pandas/scikit-learn
Что выведет следующий код?
def check_size(val):
if val > 0x18:
val >>= 1
return val
def dga(seed):
out = ""
for k, n in enumerate([1, 3, 5, 7, 0xb, 0xd]):
i = check_size(k * seed)
out += chr(i + 0x61)
return out
if __name__ == '__main__':
print('al' + dga(1))
Python's null Equivalent: None
Эквивалент ключевого слова null в Python это None.
Многие утверждают, что слово null несколько эзотерично. Это не самое дружелюбное слово для начинающих программистов. Кроме того, None относится именно к намеченной функциональности — это ничто и не имеет никакого поведения.
Стоит отметить пару особенностей работы с None:
📎 Python является объектно ориентированным языком, поэтому None — это тоже объект:
📎 Самый лучший вариант проверки на None — с помощью оператора is:
Почему так? Если переопределить оператор сравнения в пользовательском классе, это может привести к неожиданному результату:
Вывод:
#tips #None
Эквивалент ключевого слова null в Python это None.
Многие утверждают, что слово null несколько эзотерично. Это не самое дружелюбное слово для начинающих программистов. Кроме того, None относится именно к намеченной функциональности — это ничто и не имеет никакого поведения.
Стоит отметить пару особенностей работы с None:
📎 Python является объектно ориентированным языком, поэтому None — это тоже объект:
>>> type(None)
< class 'NoneType’>
📎 Самый лучший вариант проверки на None — с помощью оператора is:
number = None
if number is None:
print(‘None’)
Почему так? Если переопределить оператор сравнения в пользовательском классе, это может привести к неожиданному результату:
class MyClass:
def __eq__(self, my_object):
return True
my_class = MyClass()
if my_class is None:
print('my_class is None, using the is keyword')
else:
print('my_class is not None, using the is keyword')
if my_class == None:
print('my_class is None, using the == syntax')
else:
print('my_class is not None, using the == syntax’)
Вывод:
my_class is not None, using the is keyword
my_class is None, using the == syntax
#tips #None
Итераторы
Итератор – это интерфейс, который позволяет перебирать элементы последовательности. Он используется, например, в цикле for ... in ..., но этот механизм скрыт от глаз разработчика. При желании итератор можно получить воспользовавшись функцией iter().
Чтобы получить следующий элемент коллекции или строки, нужно передать итератор функции next().
Пример простого итератора:
Вывод:
Итератор – это интерфейс, который позволяет перебирать элементы последовательности. Он используется, например, в цикле for ... in ..., но этот механизм скрыт от глаз разработчика. При желании итератор можно получить воспользовавшись функцией iter().
Чтобы получить следующий элемент коллекции или строки, нужно передать итератор функции next().
Пример простого итератора:
class SimpleIterator:
def __iter__(self):
return self
def __init__(self, limit):
self.limit = limit
self.counter = 0
def __next__(self):
if self.counter < self.limit:
self.counter += 1
return 1
else:
raise StopIteration
Вывод:
simple_iter = SimpleIterator(5)
for i in simple_iter:
print(i)
1
1
1
1
1
“is” vs “==“
Два списка указывают на один и тот же объект:
Результат:
Пробуем создать абсолютно новый объект:
Результат:
📎 is возвратит True, если обе переменные ссылаются на один объект
📎 == возвратит True, если сравниваемые объекты идентичны
#tips
Два списка указывают на один и тот же объект:
>>> a = [1, 2, 3]
>>> b = a
Результат:
>>> a is b
True
>>> a == b
True
Пробуем создать абсолютно новый объект:
>>> c = a[:]
Результат:
>>> a == c
True
>>> a is c
False
📎 is возвратит True, если обе переменные ссылаются на один объект
📎 == возвратит True, если сравниваемые объекты идентичны
#tips
PEP8
PEP 8 де-факто представляет собой руководство по стилю написания кода Python. В нем рассматриваются соглашения по именованию, структура кода, пустые области (табуляция против пробелов) и другие аналогичные темы.
Писать код с учетом принципов PEP 8 — хорошая идея (помогает разработчикам создавать более стабильный код). С помощью программы pycodestyle, которая запускается из командной строки, можно проверить код на соответствие принципам PEP 8. Для установки этой программы введите в терминале такую команду:
Пример использования:
#pep8
PEP 8 де-факто представляет собой руководство по стилю написания кода Python. В нем рассматриваются соглашения по именованию, структура кода, пустые области (табуляция против пробелов) и другие аналогичные темы.
Писать код с учетом принципов PEP 8 — хорошая идея (помогает разработчикам создавать более стабильный код). С помощью программы pycodestyle, которая запускается из командной строки, можно проверить код на соответствие принципам PEP 8. Для установки этой программы введите в терминале такую команду:
$ pip3 install pycodestyle
Пример использования:
$ pycodestyle smooth.py
smooth.py:3:1: E265 block comment should start with '# '
smooth.py:4:1: E265 block comment should start with '# '
smooth.py:5:1: E265 block comment should start with '# '
smooth.py:10:51: E251 unexpected spaces around keyword / parameter equals
smooth.py:10:53: E251 unexpected spaces around keyword / parameter equals
smooth.py:14:33: W292 no newline at end of file
#pep8
PyPI
pycodestyle
Python style guide checker
First Class functions
Свойства функций первого класса:
📎 Функция является экземпляром типа object.
📎 Можно сохранить функцию в переменной.
📎 Можно передать функцию в качестве параметра другой функции.
📎 Можно вернуть функцию из функции.
📎 Можно хранить их в структурах данных, таких как хеш-таблицы, списки, словари, etc
Хранение функции в списке:
Вывод:
Возврат функции из другой функции:
Вывод:
#tips #closure #firstclassfunctions
Свойства функций первого класса:
📎 Функция является экземпляром типа object.
📎 Можно сохранить функцию в переменной.
📎 Можно передать функцию в качестве параметра другой функции.
📎 Можно вернуть функцию из функции.
📎 Можно хранить их в структурах данных, таких как хеш-таблицы, списки, словари, etc
Хранение функции в списке:
def myfunc(a, b):
return a + b
Вывод:
>>> funcs = [myfunc]
>>> funcs[0]
<function myfunc at 0x107012230>
>>> funcs[0](2, 3)
5
Возврат функции из другой функции:
def outer(x):
def inner(y):
return x+y
return inner
closure = outer(15)
Вывод:
>>> closure(10)
25
#tips #closure #firstclassfunctions