Тема Python — подробное перечисление и архивирование

Python

Эта статья возникла из личного публичного аккаунта:TechFlow, оригинальность это не просто, прошу внимания


СегодняЧасть 7 тем Pythonстатье мы продолжаем вводить итеративную корреляцию.

enumerate

Впервые введена функция перечисления.

В нашем ежедневном процессе программирования мы часто сталкиваемся с проблемой.

В языке C и некоторых древних языках нет концепции итератора, поэтому, когда мы хотим пройтись по массивам или контейнерам, мы можем передавать только индексы. С итератором наш процесс обхода намного удобнее, мы можем напрямую использовать переменную для перебора значений в контейнере. Самый простой пример — обход массива, например, мы хотим пройтись по массиву элементов. Мы можем напрямую:

for item in items:

С помощью итераторов мы можем легко перемещаться по массиву без индексации или вычисления длины массива. ноЧто делать, если нам нужно знать индекс элемента в теле цикла?

Действительно ли мы можем выбирать только между индексами и итераторами, например, добавлять переменную вне тела цикла для записи индекса?

idx = 0
for item in items:
operation()
idx += 1

Это решает проблему, но громоздко, совсем не лаконично и в профессиональном плане совсем неpythonic(код, совместимый с Python). Чтобы продолжить pythonic, у нас есть функция enumerate для решения ситуации, когда мы хотим выполнить итерацию напрямую и нам нужно знать индекс элемента.

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

for i, item in enumerate(items):

Кроме того, enumerate также поддерживает входящие параметры. Например, в некоторых сценариях мы хотим, чтобы индекс начинался с 1, а не с 0. Для этого мы можем передать дополнительный параметр:

for i, item in enumerate(items, 1):

Зацикливание — важная операция при программировании, и по этой причине функция enumerate широко используется. Однако следует отметить одну вещь: если мы повторяеммассив кортежей, нам нужно обратить внимание на различие между индексом и значением. Например:

data = [(1, 3), (2, 1), (3, 3)]

Когда enumerate не используется, у нас есть две итерации, обе из которых могут работать.

for x, y in data:

for (x, y) in data:

Но если мы используем enumerate, так как введен индекс, мы должны различать, иначе будет сообщено об ошибке, поэтому у нас есть только один способ итерации:

for i, (x, y) in enumerate(data):

zip

Другая функция, которая будет представлена ​​далее, также удобна для повторения, но она для другого сценария —Перебор нескольких объектов.

Сценарий его применения очень прост, это то, что мы хотимИтерация по нескольким фрагментам данных одновременно, такие как имя пользователя и данные о занятии пользователя, являются отдельными, мы хотим одновременно просмотреть род занятий и имя пользователя. Если мы не используем zip, мы можем просто отказаться от итератора и вернуться к традиционному режиму обхода индекса. Это конечно возможно, но есть две маленькие проблемы.Первая маленькая проблема это конечно читабельность кода хуже, недостаточно питонична.Вторая проблема в том что нам нужноОбслуживание двух контейнеров разной длины, добавит дополнительный код. Используя zip, вы можете решить две вышеуказанные проблемы одновременно.

Давайте посмотрим на пример:

names = ['xiaoming', 'xiaohua', 'xiaohei', 'xiaoli']
jobs = ['coach', 'student', 'student', 'student', 'professor']

for name, job in zip(names, jobs):
print(name, job)

Конечным результатом является кортеж имен и профессий:

xiaoming coach
xiaohua student
xiaohei student
xiaoli student

В приведенном выше примере длины имен и заданий на самом деле несовместимы.Автоматически обрезать для нас в соответствии с более коротким. Если нам не нужно усечение, мы также можем использовать zip_longest в itertools вместо zip:

from itertools import zip_longest
for name, job in zip_longest(names, jobs):

В этом случае элементы недостаточной длины будутЗаполнить нет, zip_longest предоставляет значение параметра fillvalue, которое может быть заполнено указанным нами значением.

И zip, и zip_longest могут поддерживать обход нескольких итераторов. Например:

names = ['xiaoming', 'xiaohua', 'xiaohei', 'xiaoli']
jobs = ['coach', 'student', 'student', 'student', 'professor']
hobbies = ['footbal', 'tennis', 'badminton', 'basketbal']

for name, job, hobby in zip(names, jobs, hobbies):
print(name, job, hobby)

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

jobDict = dict(zip(names, jobs))

Следует отметить, что результат, возвращаемый вызовом zip, на самом деле является итератором, и мы автоматически просматриваем содержимое итератора при преобразовании его в dict. Например, если мы напрямую напечатаем результат вызова zip, мы обнаружим, что на экран выводится адрес итератора:

print(zip(names, jobs))
>>> <zip object at 0x10ec93b40>

Мы хотим получить его содержимое, нам нужно вручную преобразовать его в список:

print(list(zip(names, jobs)))
>>> [('xiaoming', 'coach'), ('xiaohua', 'student'), ('xiaohei', 'student'), ('xiaoli', 'student')]

Будь то enumerate или zip на самом делеНижний слой реализован на основе итераторов, ничего особо эзотерического в принципе нет, и мы их не используем и на наш код это не влияет. Но причина, по которой Python есть Python, и причина, по которой многие люди хвалят его лаконичный язык и логику, неотделима от нашего широкого использования этих инструментов и методов для упрощения логики кода. Поэтому нам очень нужно понять.Я надеюсь, что каждый может писать код на питоне, не только умение писать код сильно, но и сам код красивый.

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