Если задача занимает слишком много строк кода на Python, вероятно, вы делаете это неправильно.

Это руководство позволит вам избавиться от старых стандартов кодирования и оснастит ваш арсенал инструментами, которые помогут вам в написании большего количества кода Pythonic / Idiomatic. Между прочим, идиоматика просто означает использование идиом определенной технологии, в данном случае Python.

Давайте начнем:

  1. Понимание списка

Много раз вы хотите перебрать элементы списка, например, с помощью цикла for. В других языках есть такие функции, как forEach или map. Python производит большое впечатление, позволяя написать цикл for в одной строке кода. Рассмотрим следующий пример, нам нужно извлечь «названия» из списка продуктов. Это определенно может происходить из API.

Вместо того, чтобы писать:

products = [
    {'name': 'Product1', 'category': 'Cell Phone'},
    {'name': 'Product2', 'category': 'Clothing'},
    {'name': 'Product3', 'category': 'Utensils'},
]

def get_names(products):
    names = []
    for product in products:
        names.append(product['name'])
    return names

Ты можешь написать:

def get_names(products):
    return [p['name'] for p in products]

Выражение внутри [] возвращает генератор. Нам нужно заключить его в квадратные скобки, чтобы преобразовать в список. Или мы могли бы также использовать list () вместо [], оба они одинаковы.

def get_names(products):
    return list(p['name'] for p in products)

Это просто, красиво, понятно и питонично.

2. Вложенные циклы for в режиме понимания списка

Иногда один цикл for может не соответствовать потребности. Хорошая новость заключается в том, что списки понимания очень масштабируемы. Рассмотрим следующий пример, в котором мы изменили продукты, чтобы у них был список их «old_prices», и нам нужно получить их для некоторого анализа данных:

Вместо того, чтобы писать:

products = [
    {'name': 'Product1', 'old_prices': [2300, 2700, 2900]},
    {'name': 'Product2', 'old_prices': [1300, 1700, 1900]},
    {'name': 'Product3', 'old_prices': [3300, 3700, 3900]},
]
def get_prices(products):
    prices = []
    
    for product in products:
        for price in product['old_prices']:
            prices.append(price)
            
    return prices

Ты можешь написать:

def get_prices(products):
    return [p for prices in products for p in prices['old_prices']]

Вы можете просто добавлять все больше и больше циклов for по мере их вложения.

3. Составление списка с условными операторами

Теперь у наших товаров есть несколько интересных категорий.

products = [
    {'name': 'Product1', 'categories': ['A', 'B', 'C']},
    {'name': 'Product2', 'categories': ['D', 'E', 'A']},
    {'name': 'Product3', 'categories': ['A', 'B', 'D']},
]

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

Вместо того, чтобы писать:

def get_product_with_category(products, category):
    output_products = []
    
    for product in products:
        if category in product['categories']:
            output_products.append(product)
            
    return output_products

Ты можешь написать:

def get_product_with_category(products, category):
    return [p for p in products if category in p['categories']]

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

4. Объединение словарей

Слияние более чем одного словаря - очень частый случай использования в реальных приложениях. Python предоставляет несколько удобных функций. Рассмотрим следующие три словаря, и мы хотим их объединить:

params = {'id': 1, 'role': 'Admin'}
data = {'server': 'Apache Kafka'}
other = {'color': 'blue', 'role': 'User'}

Хороший подход:

params.update(data)
params.update(other)

Пифонический путь?

merged = {**params, **data, **other}

** оператор разворачивает пары "ключ-значение". Обратите внимание, что «other» имеет тот же ключ, что и «params», и это «роль». Значение «other» будет иметь приоритет, так как оно будет объединено в конце.

Вы можете сделать то же самое со списками, используя *

5. Итерировать список в обратном порядке

Есть функция, доступная как reversed (), она позволит вам перемещаться по списку в обратном порядке. Вам нужно обернуть его [] или list (), чтобы преобразовать его в список.

ints = [1, 2, 3, 4, 5, 6, 7]
reversed_ints = [reversed(ints)]
print(reversed_ints)
Output:: [7, 6, 5, 4, 3, 2, 1]

6. Обязательные аргументы ключевого слова

Просто поставив * в начале списка параметров функции, вы можете сделать ключевые аргументы обязательными. Если полный набор аргументов не предоставлен, будут выданы ошибки.

def user(*, username, email):
    print(f'{username} {email}')
user(email='[email protected]', username='uzairamer')

7. Использование карты для перебора списка

Это полностью то же самое, что и функция карты в Javascript, Dart или других языках программирования. Но в Python это более элегантно. Например, у вас есть список целых чисел, но они представлены в виде строк, и вы хотите преобразовать тип в int.

Использование понимания списка:

l = ['1', '2', '3', '4', '5']
ints = [int(i) for i in l]
print(ints)
Output:: [1, 2, 3, 4, 5]

Используя карту:

l = ['1', '2', '3', '4', '5']
ints = list(map(int, l))  # every item in l is passed through int()
print(ints)
Output:: [1, 2, 3, 4, 5]

Предоставление пользовательской функции для карты

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

l = ['1', '2', '3', '4', '5']

def add_hello(i):
    return f'Hello {i}'

greetings = list(map(add_hello, l))
print(greetings)
Output:: ['Hello 1', 'Hello 2', 'Hello 3', 'Hello 4', 'Hello 5']

Есть две другие функции, похожие на map, то есть сокращение и filter. Не стесняйтесь исследовать их.

8. Лямбда-функции (анонимные функции)

Лямбда-функции также называются анонимными функциями. Тип лямбда-функций такой же, как и тип функций, определенных ключевым словом def. Но лямбда-функции более строгие и точные по своей природе. Рассмотрим следующий пример, обе функции эквивалентны.

def identity(x):
    return x
lambda x: x

Другой пример:

def square(x):
    return x*x

lambda x: x*x

Поскольку мы уже знакомы с функцией карты, давайте воспользуемся одним из приведенных выше примеров карты в терминах лямбда-функции:

l = ['1', '2', '3', '4', '5']
greetings = list(map(lambda x: f'Hello {x}', l))
print(greetings)
Output:: ['Hello 1', 'Hello 2', 'Hello 3', 'Hello 4', 'Hello 5']

Что, если бы мы хотели иметь дело с более чем одним аргументом? Это тоже довольно просто. См. Следующий пример:

lambda x, y, z: x+y+z

Сладкий ❤️

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

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

user = {'name': 'Uzair', 'age': 21}
print('Hi, my name is {name} and my age is {age}'.format(**user))

10. Оператор деления этажа (//)

Я не знал об этом операторе и импортировал функцию пола из стандартной математической библиотеки, поставляемой с python. К счастью, я нашел это:

>>> 13 // 2  # equivalien to math.floor(13/2)
6

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

Я хочу поблагодарить своих учителей

Раймонд Хеттингер @ raymondh

Майкл Кеннеди @ mkennedy

Следуйте за мной в твиттере @ МУзаирАмерЧ

Https://github.com/uzairamer