Если задача занимает слишком много строк кода на Python, вероятно, вы делаете это неправильно.
Это руководство позволит вам избавиться от старых стандартов кодирования и оснастит ваш арсенал инструментами, которые помогут вам в написании большего количества кода Pythonic / Idiomatic. Между прочим, идиоматика просто означает использование идиом определенной технологии, в данном случае Python.
Давайте начнем:
- Понимание списка
Много раз вы хотите перебрать элементы списка, например, с помощью цикла 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
Следуйте за мной в твиттере @ МУзаирАмерЧ