Этот пост был первоначально опубликован в stevemerc.com
При перемещении от PHP в Python ваш опыт со многими из основных языковых функций и конструкций легко переносится. Конечно, синтаксис отличается, но не радикально так. Такие вещи, такие как Loop Constres, основные структуры данных и даже OOP не требуют долго, чтобы почувствовать знакомые. Одной из областей, где это не правда, является ли списком Python и обременительно. PHP не имеет эквивалента здесь, и на мой взгляд, это область, где Python действительно сияет с точки зрения функциональности, простоты использования и краткости.
В этом посте я объясню, какой список и комплексное представление есть, и показывать в непосредственной близости от PHP и Python, чтобы продемонстрировать, как и почему вы используете их.
Во-первых, определение от официального Документы :
«Попределения списка предоставляют краткий способ создания списков. Общие приложения должны делать новые списки, где каждый элемент является результатом некоторых операций, применяемых к каждому элементу другой последовательности или нерешимости, или для создания подпоследовательности этих элементов, которые удовлетворяют определенному условию ».
Начнем с простого примера. Мы будем использовать массив ассоциативных массивов в PHP и список диктопов в Python, чтобы представлять (некоторые из) розового флойда.
PHP:
'The Piper at the Gates of Dawn', 'year' => 1967], ['name' => 'Atom Heart Mother', 'year' => 1970], ['name' => 'The Dark Side of the Moon', 'year' => 1973], ['name' => 'Animals', 'year' => 1977], ['name' => 'The Wall', 'year' => 1979]];
Python:
albums = [{'name': 'The Piper at the Gates of Dawn', 'year': 1967}, {'name': 'Atom Heart Mother', 'year': 1970}, {'name': 'The Dark Side of the Moon', 'year': 1973}, {'name': 'Animals', 'year': 1977}, {'name': 'The Wall', 'year': 1979}]
Первое, что мы хотим сделать, это захватить список имена альбома:
PHP:
Каждый разработчик PHP должен быть тесно знаком с вышеупомянутым. Для разработчиков новых в Python естественно делать что-то подобное: Python:
album_names = [] for album in albums: album_names.append(album['name'])
Но есть легче (и, возможно, лучше) способ сделать это, используя список пометков:
Python:
album_names = [album['name'] for album in albums]
Попробуйте это в своем выборе, и вы получите:
['The Piper at the Gates of Dawn', 'Atom Heart Mother', 'The Dark Side of the Moon', 'Animals', 'The Wall']
В Python понимание списка принимает следующую форму:
[(expression) (for clause) (zero or more if statements)]
Скажем, мы хотели вернуть список списков, где каждый внутренний список содержит два элемента: первый год, а затем имя альбома:
PHP:
Python:
by_year_name = [[album['year'], album['name']] for album in albums] # [[1967, 'The Piper at the Gates of Dawn'], [1970, 'Atom Heart Mother'], [1973, 'The Dark Side of the Moon'], [1977, 'Animals'], [1979, 'The Wall']]
Только хочу, чтобы альбомы выпущены после 1970 года?
PHP:
1970) { return [$album['year'], $album['name']]; } }, $albums);
Python:
filtered = [[album['year'], album['name']] for album in albums if album['year'] > 1970] # [[1973, 'The Dark Side of the Moon'], [1977, 'Animals'], [1979, 'The Wall']]
Не нравится «стена»?
PHP:
1970 && $album['name'] != 'The Wall') { return [$album['year'], $album['name']]; } }, $albums);
Python:
# We'll move the if statements to a new line for the sake of readability filtered = [[album['year'], album['name']] for album in albums if album['year'] > 1970 and album['name'] != 'The Wall'] # [[1973, 'The Dark Side of the Moon'], [1977, 'Animals']]
К настоящему времени вы должны увидеть, насколько более разряжены примеры Python по сравнению с PHP. Это продолжает проводить истину, поскольку ваша логика становится более сложной.
Итак, что такое обременительные понятия? Оказывается, что они похожи на состав списка, но вместо этого создают диктографические (шокирующие, я знаю.)
Давайте индексируем альбомы к году, но только для тех, которые были освобождены до 1973 года:
PHP:
Python:
indexed = {album['year']: album['name'] for album in albums if album['year'] < 1973} # {1970: 'Atom Heart Mother', 1967: 'The Piper at the Gates of Dawn'}
Синтаксис может выглядеть по-другому, но все равно следует за форму:
[(expression) (for clause) (zero or more if statements)]
Вы можете работать с дикторами в списке по достоинствами и наоборот. Вернемся в исходный список диктопов, но с верхней версией имени альбома:
uppercased = [{'name': album['name'].upper(), 'year': album['year']} for album in albums] # [{'name': 'THE PIPER AT THE GATES OF DAWN', 'year': 1967}, {'name': 'ATOM HEART MOTHER', 'year': 1970}, {'name': 'THE DARK SIDE OF THE MOON', 'year': 1973}, {'name': 'ANIMALS', 'year': 1977}, {'name': 'THE WALL', 'year': 1979}]
Важно помнить, это Символы снаружи понимания определяют, какой тип структуры данных вы получите? Отказ Квадратные брекеты используются для поручения списка, а вьющиеся скобки используются для обличных понятных.
Давайте закончим еще один пример: возвращение генератора:
# Notice how we use parens instead of square braces album_gen = (album for album in albums if album['year'] > 1970) #at 0x109d4ff50>
Там еще есть еще больше, что вы можете сделать с помощью списка и нагруженных в общих чертах, которые за пределами объема этого поста. Я оставлю это как упражнение для читателя, чтобы играть вокруг (Подсказка: попробуйте вложенные вложения или выяснение, когда вы хотите использовать Map
или фильтр
вместо понимания.)
Список и комплексное понятие – это ужасная особенность Python, которую я желаю PHP имел. Они делают работу с коллекциями данных намного проще. Добавьте их в свой арсенал, и вы будете рады, что вы сделали!
👋 Наслаждался этим постом?
Присоединяйтесь к моему рассылка И следуй за мной в Twitter @mercatante Для большего количества контента такого.
Оригинал: “https://dev.to/mercatante/python-comprehensions-for-php-developers-4iid”