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

Привет, Хабр! Представляю вашему вниманию перевод статьи "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. Хорошего обучения и кода. Увидимся в следующий раз.

AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама

Комментарии 22

    +3
    Я генерирую один список вот так.
    >>> name = ["Bob","Jon","Alice"]
    >>> work = ["manager","driver","director"]
    >>> dict(zip(name, work))
    {'Bob': 'manager', 'Alice': 'director', 'Jon': 'driver'}
      +1
      Это же словарь.
        0
        Совершенно верно! Прошу прощения за неточность.
    • НЛО прилетело и опубликовало эту надпись здесь
        +3
        Проверка, все ли элементы в списке уникальные

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

          +4
          Ещё довольно полезной может быть построчный вывод результата из списка.
          Вместо цикла можно использовать одну строку print
          >>> var = [1, 2, 3]
          >>> print(*var, sep='\n')
          1
          2
          3
          
            +3

            Не пишите названия статей в повелительном наклонении, если пишите на Хабр.
            Приятно читать такие комментарии? Такие заголовки тоже...

              0
              Согласен, не очень приятно, ведь во втором случае должно быть слово пишете.
                0
                Следствие написания комментария на телефоне, не более.
                0
                «Если», да ещё и с вариантами внутри сильно снижают градус повелевания от указания или призыва к совету или предложению. Всё нормально читается.
                • НЛО прилетело и опубликовало эту надпись здесь
                  +1

                  А это ведь работает. В закладки много добавило людей. Наверное даже не читая)

                  –3

                  Для Python есть официальный Tutorial, на 99% покрывающий все потребности изучающих.
                  Все остальные руководства (что я встречал) для изучающих (включая эти две статьи) имеют как минимум два существенных недостатка:
                  1) они не покрывают даже того, что есть в официальном Tutorial;
                  2) они не обновляются.

                    +1

                    Потребности изучающих часто выходят за пределы мануалов. К примеру, я и еще пара человек в группе вк (learnpythonforfun) стараемся помогать советом в простейших вещах по известному бесплатному курсу (pythontutor). Кто-то застопорился на простейшей задаче, кто-то не понимает, как работает какой-то механизм языка, почему что-то работает определенным образом — небольшая помощь ментора может быть очень кстати в таких вещах.

                    –3

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

                      –1

                      Тут скорее причинно-следственная связь в другую сторону направлена: люди переводят чужие статьи (причём, как правило, фигово), за это им ставят минуса — рейтинг становится отрицательным.

                      +3
                      Добавил даже не читая. Тренированный хомячок
                        +2
                        Используйте zip для сравнения элементов в двух списках

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

                          +2
                          Используйте lambda для сортировки вложенного массива по второму элементу
                          arr_list= [[2,4], [1,3], [5,7]]
                          arr_list.sort()

                          Если вы в исходном списке ключ сортировки стоит на первом месте в каждом элементе, то параметр key писать не надо, список будет отсортирован по объекту нулевом индексе каждого элемента.
                          [[1,3], [2,4], [5,7]]

                            0

                            Но в этом случае сортировка будет сравнивать списки дальше, если первые элементы равны, а это лишняя работа, которая не всегда нужна.

                              0

                              В общем да, будут сравниваться два списка и кортежа по всем правилам их сравнения.

                            +1
                            collections.Counter

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

                            Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                            Самое читаемое