Как стать автором
Обновить

Сохраните в закладках эту статью, если вы новичок в Python (особенно если изучаете Python сами)

Время на прочтение6 мин
Количество просмотров49K

Привет, Хабр! Представляю вашему вниманию перевод статьи "Bookmark this if you are new to Python (especially if you self-learn Python)" в двух частях (1, 2) c простыми, но полезными советами и трюками в Python.



Если из-за скучной карантинной жизни вы решили погрузиться в Python, поздравляю. Вы столкнулись с самым быстрорастущим языком программирования. Я уверен, что вы уже знаете некоторые преимущества Python, такие как его простота, легкость в освоении и т.д. Это также основные причины, по которым я изучил Python пять лет назад. Я надеюсь, что вы сможете изучать Python более эффективно и наслаждаться этим процессом, и для этого я подготовил список простых, но полезных трюков и советов.


Уточнение: в настоящее время я использую Python 3.8. Если вы столкнулись с какими-либо проблемами во время запуска моих примеров, пожалуйста, проверьте, не связано ли это с вашей версией Python.


Содержание



Сравнение значений


>>> a = 1
>>> b = 3
>>> a == 1
True
>>> a == 2
False
>>> a == b
False
>>> a > b
False
>>> a <= b
True
>>> if a <= b :
...     print('a is less than or equal to b')
...
a is less than or equal to b

Вы можете сравнить значения двух объектов. Результатом будет True или False. Вы можете использовать сравнение непосредственно в качестве условия в операторе if-else.


Условный оператор возврата


Вместо


>>> def compare(a,b):
...     if a> b:
...             return a
...     else:
...             return b
...

вы можете поместить условие непосредственно после оператора return.


>>> def compare(a, b):
...     return a if a > b else b
...

Назначение нескольких переменных из списка/кортежа в одну строку


Вместо


>>> arr_list = [1,4,7]
>>> a = arr_list[0]
>>> b = arr_list[1]
>>> c = arr_list[2]

вы можете сделать то же самое, но в одну строку:


>>> a, b, c = arr_list
>>> a
1
>>> b
4
>>> c
7

Генерация списков


Вместо


>>> arr_list = [1,4,7]
>>> result = []
>>> for i in arr_list:
...     result.append(i*2)
...
>>> result
[2, 8, 14]

вы можете сделать так:


>>> result = [x*2 for x in arr_list]
>>> result
[2, 8, 14]

Используйте zip для сравнения элементов в двух списках


Вместо


>>> a = [1,5,8]
>>> b = [3,4,7]
>>> result = []
>>> for i in range(len(a)):
...     result.append(a[i] if a[i] < b[i] else b[i])
...
>>> result
[1, 4, 7]

можно так:


>>> result = [min(i) for i in zip(a,b)]
>>> result
[1, 4, 7]

Используйте lambda для сортировки вложенного массива по второму элементу


>>> arr_list= [[1,4], [3,3], [5,7]]
>>> arr_list.sort(key=lambda x: x[1])
>>> arr_list
[[3, 3], [1, 4], [5, 7]]

filter, map


Вместо


>>> arr_list = [-1, 1, 3, 5]
>>> result = []
>>> for i in arr_list:
...     if i > 0:
...             result.append(i**2)
...
>>> result
[1, 9, 25]

делайте так


>>> result = list(map(lambda x: x**2, filter(lambda x: x > 0, arr_list)))
>>> result
[1, 9, 25]

Поправка: виноват-виноват, можно еще лучше с помощью генерации списков :)


Спасибо Oleg Kapustin и Kuldeep Pal.


>>> result = [i**2 for i in arr_list if i > 0]
>>> result
[1, 9, 25]

Проверка, все ли элементы в списке уникальные


Используйте функцию set для удаления повторяющихся элементов из списка, а затем проверьте, равны ли длина списка и получившегося множества.


>>> arr_list = [1,4,4,6,9]
>>> len(arr_list) == len(set(arr_list))
False

Форматирование строк


>>> pi = 3.14159
# До Python3.6
>>> print('The value of pi is {:.2f}'.format(pi))
The value of pi is 3.14

>>> a, b, c = 1,5,9
>>> print('a is {}; b is {}; c is {}'.format(a,b,c))
a is 1; b is 5; c is 9

# С Python3.6+
>>> print(f'The value of pi is {pi:.2f}')
The value of pi is 3.14
>>> pi
3.14159

>>> print(f'a is {a}; b is {b}; c is {c}')
a is 1; b is 5; c is 9

Одним из преимуществ форматирования строк является возможность вывода числового значения с округлением без влияния на точность исходного значения.


Дополнительная информация: PyFormat


enumerate


Вместо


>>> arr_list = [1, 5, 9]
>>> for i in range(len(arr_list)):
...     print(f'Index: {i}; Value: {arr_list[i]}')
...
Index: 0; Value: 1
Index: 1; Value: 5
Index: 2; Value: 9

можно так:


>>> for i, j in enumerate(arr_list):
...     print(f'Index: {i}; Value: {j}')
...
Index: 0; Value: 1
Index: 1; Value: 5
Index: 2; Value: 9

Получение определенной части массива


>>> arr_list = [1,4,6,8,10,11]
>>> a, *b, c = arr_list
>>> a
1
>>> b
[4, 6, 8, 10]
>>> c
11

Комбинации и перестановки


Используйте возможности itertools


>>> str_list = ['A', 'C', 'F']
>>> list(itertools.combinations(str_list,2))
[('A', 'C'), ('A', 'F'), ('C', 'F')]
>>> list(itertools.permutations(str_list,2))
[('A', 'C'), ('A', 'F'), ('C', 'A'), ('C', 'F'), ('F', 'A'), ('F', 'C')]

Одновременное обновление нескольких переменных


Вместо


>>> a = 5
>>> b = 8
>>> temp = a
>>> a = b
>>> b = temp + a
>>> a
8
>>> b
13

Вы можете делать вычисление обеих переменных в одной строке. В этом случае не нужно создавать временную переменную.


>>> a = 5
>>> b = 8
>>> a,b = b, a+b
>>> a
8
>>> b
13

(PS: Что же это? Последовательность Фибоначчи!)


Дополнительная информация: Evaluation order


Получение строки из списка


>>> str_list = ['This', 'is', 'WYFok']
>>> ' '.join(str_list)
'This is WYFok'

Можно объединить все элементы, которые должны быть в строковых форматах, в строку с помощью функции join. Только необходимо добавить разделитель между элементами.


>>> ans_list = [3,6,9]
>>> 'The answer is '+','.join(map(str,ans_list))
'The answer is 3,6,9'

С помощью функции map можно преобразовать целочисленные элементы в строки, и в сочетании с функцией join вы получите новую строковую переменную.


Дополнительная информация: str.join, map


Underscore (подчеркивание)


Обычно, если требуется повторить шаг, используется цикл for, как показано ниже:


>>> for i in range(3):
...     print('Hello')
...
Hello
Hello
Hello

Можно увидеть, что переменная i не используется в этом цикле for. В этой ситуации вместо i можно использовать _ (подчеркивание). ( _ – просто имя переменной, и в Python его принято использовать для игнорируемых переменных. Это означает, что переменная цикла фактически не используется.)


>>> for _ in range(3):
...     print('Hello')
...
Hello
Hello
Hello

Dict.keys, Dict.values, Dict.items


>>> teacher_subject = {'Ben':'English','Maria':'Math','Steve':'Science'}
>>> teacher_subject.keys()
dict_keys(['Ben', 'Maria', 'Steve'])
>>> teacher_subject.values()
dict_values(['English', 'Math', 'Science'])
>>> teacher_subject.items()
dict_items([('Ben', 'English'), ('Maria', 'Math'), ('Steve', 'Science')])

Для словаря можно использовать функции keys и values для извлечения ключей и значений соответственно. С помощью функции items можно извлекать сразу и ключи, и значения вместе. Это полезно, если вам нужно переключаться между ключами и значениями.


>>> subject_teacher = {y:x for x,y in teacher_subject.items()}
>>> subject_teacher
{'English': 'Ben', 'Math': 'Maria', 'Science': 'Steve'}

Важно: остерегайтесь дублирующихся значений при переключении, иначе вы получите отсутствующие элементы после.


(Дополнительно: С zip вы можете сформировать словарь из двух списков)


>>> subject = ['English','Math','Scienc']
>>> teacher = ['Ben','Maria','Steve']
>>> subject_teacher = {f:v for f,v in zip(subject,teacher)}
>>> subject_teacher
{'English': 'Ben', 'Math': 'Maria', 'Scienc': 'Steve'}

Дополнительная информация: Mapping Types — dict


Сравнение двух множеств


>>> a = {1,2,3}
>>> b = {1,2,3,4,5}
# a подмножество b?
>>> a<=b
True
# b подмножество a?
>>> a>=b
False
# Объединение a и b 
>>> a.union(b)
{1, 2, 3, 4, 5}
# Пересечение a и b 
>>> a.intersection(b)
{1, 2, 3}
# Разница 
# Вернет элементы из a, но не из b 
>>> a.difference(b)
set()
# Вернет элементы из b, но не из a
>>> b.difference(a)
{4, 5}

Дополнительная информация: Set


collections.Counter


Это удобно, если требуется подсчитать количество всех элементов в списке. Появится объект класса Counter, отображающий все уникальные элементы списка с соответствующим количеством этих элементов в списке.


>>> import collections
>>> arr_list = [1,1,1,1,2,2,2,3,3,5,5,5,7]
>>> c = collections.Counter(arr_list)
>>> c
Counter({1: 4, 2: 3, 5: 3, 3: 2, 7: 1})
>>> type(c)
<class 'collections.Counter'>
>>> c[1]
4
>>> c[6]
0
# Приводим обратно к словарю
>>> dict(c)
{1: 4, 2: 3, 3: 2, 5: 3, 7: 1}

Дополнительная информация: collections.Counter


Заключение


Хотя эти приемы довольно просты, они могут помочь сэкономить время и упростить ваш код. Надеюсь, статья помогла вам разобраться, как использовать простые возможности Python. Хорошего обучения и кода. Увидимся в следующий раз.

Теги:
Хабы:
Всего голосов 30: ↑24 и ↓6+18
Комментарии22

Публикации

Истории

Работа

Python разработчик
138 вакансий
Data Scientist
61 вакансия

Ближайшие события