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

Когда я только начал изучать Python, мне потребовалось некоторое время, чтобы открыть для себя функцию zip (). Конечно, такова природа Python; всегда есть что узнать об этом языке. В большинстве случаев эти новые открытия Python потрясающие, мощные и простые в использовании, если вы их разобрали, и это определенно верно в отношении zip!

Итак, как работает функция zip? В сжатой форме zip () объединяет элементы одного индекса из нескольких итерируемых объектов вместе как элементы кортежа итеративного объекта zip. Давайте разберем это определение на примере, потому что рабочие примеры часто намного легче понять, чем одни слова. Вот пример короткого кода, чтобы начать грокинг:

a = ["one", "two", "three"]
b = ["apples", "oranges", "peaches"]
c = zip(a, b)
print(c)
# <zip object at 0x000001E6BF050380>

Zip возвращает объект с возможностью итерации, но это нормально!

Обратите внимание, что значение c не является кортежем, списком или другим типом общей переменной, это итеративный zip-объект, как показано в выходных данных, поэтому нам нужно выполнить итерацию по нему, чтобы использовать его. Это очень легко сделать несколькими способами, и именно так обычно используется функция zip. Вот один из способов преобразовать этот zip-объект в список с помощью всего лишь одного дополнительного вызова функции Python list ():

a = ["one", "two", "three"]
b = ["apples", "oranges", "peaches"]
c = zip(a, b)
c = list(c)
print(c)
# [('one', 'apples'), ('two', 'oranges'), ('three', 'peaches')]

Теперь мы куда-то добираемся

Взгляните на созданный список. В нем есть три кортежа, каждый из которых содержит пару элементов, где первый элемент в исходном списке a соединен с первым элементом в списке b, вторые элементы объединены в пары во втором кортеже и так далее. Представьте, что это застежка-молния, которая тянет предметы слева и справа в взаимосвязанные пары результатов. В результате я представляю каждую пару сцепляющихся зубцов на молнии как кортеж.

Часто вам не нужно сначала преобразовывать итерируемый zip-объект в список или кортеж, чтобы использовать его. Вот пример, где к каждому элементу (каждому кортежу) осуществляется доступ в цикле for для их распечатки:

a = ["one", "two", "three"]
b = ["apples", "oranges", "peaches"]
c = zip(a, b)
for item in c:
  print(item)
# ('one', 'apples')
# ('two', 'oranges')
# ('three', 'peaches')

Векторы

В качестве полезного примера из реальной жизни следующий код показывает, насколько кратко функция zip позволяет нам обрабатывать некоторые векторы. Вектор может быть представлен в виде списка чисел, обычно 2 или 3 числа на вектор (но они могут быть длиннее) для двух- или трехмерной математики. Если вы не слишком увлечены векторной математикой, ничего страшного, большая часть следующего кода в любом случае будет иметь смысл. Просто внимательно посмотрите, как функция zip обрабатывает числа из двух векторов, объединяя числа, которые они содержат.

Например, предположим, что у вас есть два двумерных вектора, и вы хотите сложить их вместе. Первый вектор v1 имеет значения 3 и 4, а второй вектор v2 представлен значениями 7 и 2. Векторная сумма находится путем сложения их частей, в данном случае для получения векторного результата, состоящего из 10 и 6. Вот код, в котором я использовал функцию zip в своей функции добавления, чтобы значительно упростить и сжать код:

def add(v1, v2):
    return [a + b for a, b in zip(v1, v2)]
v1 = [3, 4]
v2 = [7, 2]
print(add(v1, v2))        # [10, 6]

Функция zip объединяет значения в двух векторах, они извлекаются из каждого кортежа в переменных a и b, складываются вместе и собираются в список. Легко свежий.

Калькуляторы умеют это делать!

Если вы читали какие-либо из моих других статей о Medium, вы знаете, как я взволнован языком программирования Python. Несколько лет назад я написал книги по Visual Basic, опубликованные в Microsoft Press и O’Reilly Media, но за последние несколько лет я полностью перешел на Python. Многие другие сделали то же самое, поскольку Python недавно был объявлен самым популярным языком программирования в мире. Для этого есть много причин, но я оставлю это на другой раз.

Прямо сейчас я хочу выразить энтузиазм по поводу следующего поколения портативных калькуляторов, которые имеют встроенную поддержку Python. Недавно я написал книги для Калькулятора Numworks, Калькулятора Python TI-84 Plus CE и Калькулятора TI-Nspire CX II.

В каждой из этих книг представлено множество коротких программ на Python, взятых из множества предметных областей. Я упоминаю об этом, потому что функция zip отлично работает во всех трех этих калькуляторах, потому что все они поддерживают либо стандартный Micro Python, либо Circuit Python. Мощная штука! Я убежден, что Python появится во многих будущих калькуляторах, потому что этот язык идеально подходит для экономии памяти, обеспечения стандартизированного синтаксиса, удобного для чтения и записи, упрощения очень мощных вычислений и помощи учащимся в освоении огромный старт с соответствующими будущими техническими навыками.

Полный листинг модулей vectors.py

В следующем полном списке программ Vectors, представленном в каждой книге, приведены примеры нескольких функций, использующих функцию zip. Что меня поражает, так это то, как эти очень немногие строки кода используют очень мало памяти в каждом калькуляторе, обеспечивая при этом мощные векторные функции, которые в других языках программирования, вероятно, потребовали бы намного больше байтов кодового пространства. Это полный модуль vectors.py, который я использую каждый день для солнечной энергии, анализа дронов и астрономических расчетов на моем настольном компьютере, а также на моих портативных калькуляторах:

from math import *
def add(v1, v2):
    return [a + b for a, b in zip(v1, v2)]
def sub(v1, v2):
    return [a - b for a, b in zip(v1, v2)]
def dot(v1, v2):
    return sum((a * b for a, b in zip(v1, v2)))
def mag(v):
    return sum(i * i for i in v) ** 0.5
def unit(v):
    m = mag(v)
    return [i / m for i in v]
def mul(v, n):
    return [i * n for i in v]
def ang(v1, v2):
    m1 = mag(v1)
    m2 = mag(v2)
    dt = dot(v1, v2)
    return degrees(acos(dt / m1 / m2))
def cross(v1, v2):
    a, b, c = v1
    d, e, f = v2
    return [b * f - c * e, c * d - a * f, a * e - b * d]
def stp(v1, v2, v3):
    a, b, c = v1
    d, e, f = v2
    g, h, i = v3
    p = a * e * i + b * f * g + c * d * h
    m = a * f * h + b * d * i + c * e * g
    return p - m

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

import vectors as v
print("\n2D Vectors")
v1 = [3, 4]
v2 = [7, 2]
print(v.add(v1, v2))        # [10, 6]
print(v.sub(v1, v2))        # [-4, 2]
print(v.dot(v1, v2))        # 29
print(v.mag(v1))            # 5.0
print(v.unit(v1))           # [0.6, 0.8]
print(v.mul(v1,3))          # [9, 12]
print(v.ang(v1, v2))        # 37.184706453233126
print("\n3D Vectors")
v1 = [3, 4, 5]
v2 = [6, 5, 4]
v3 = [7, 5, 1]
print(v.add(v1, v2))        # [9, 9, 9]
print(v.sub(v1, v2))        # [-3, -1, 1]
print(v.dot(v1, v2))        # 58
print(v.mag(v1))            # 7.0710678118654755
print(v.unit(v1))           # [0.424.., 0.565.., 0.707..]
print(v.mul(v1,3))          # [9, 12, 15]
print(v.ang(v1, v2))        # 20.81145883951287
print(v.cross(v1, v2))      # [-9, 18, -9]
print(v.stp(v1, v2, v3))    # 18

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

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

Страсть и миссия Джона - делиться кодом Python, чтобы помочь развенчать загадки жизни и повеселиться. Джон является автором Python для Numworks, Python для OpenSCAD, Python для TI-Nspire CX II, Python для калькулятора TI-84 Plus CE Python. и многие другие названия .