Привет, Хабр! Представляю вашему вниманию перевод статьи "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.
Содержание
- Сравнение значений
- Условный оператор возврата
- Назначение нескольких переменных из списка/кортежа в одну строку
- Генерация списков
- Используйте zip для сравнения элементов в двух списках
- Используйте lambda для сортировки вложенного массива по второму элементу
- filter, map
- Проверка, все ли элементы в списке уникальные
- Форматирование строк
- enumerate
- Получение определенной части массива
- Комбинации и перестановки
- Одновременное обновление нескольких переменных
- Получение строки из списка
- Underscore (подчеркивание)
- Dict.keys, Dict.values, Dict.items
- Сравнение двух множеств
- collections.Counter
- Заключение
Сравнение значений
>>> 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. Хорошего обучения и кода. Увидимся в следующий раз.