Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Алгоритмизация и программирование. Язык Python. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
06.09.2026
Размер:
1 Мб
Скачать
def write_multiple_items(file, separator, *args): file.write(separator.join(args))
Как правило, эти variadic аргументы будут последними в списке формаль-
ных параметров, потому что они собирают все оставшиеся вводимые аргументы, которые передаются в функцию. Любые формальные параметры,
которые находятся после параметра *args являются аргументами "только по ключевому слову". Это означает, что они могут быть использованы только в качестве ключевых слов, а не позиционных аргументов.
def concat(*args, sep="/"): return sep.join(args)
# Обращение к функции
print(concat("earth", "mars", "venus")) Результат: earth/mars/venus
# Обращение к функции
concat("earth", "mars", "venus", sep=".") Результат: earth.mars.venus
4.1.4. Распаковка списков аргументов
Происходит обратная ситуация, когда аргументы уже в списке или корте-
же, но должны быть распакованы при вызове функции, требующей отдельных
позиционных аргументов. Например, встроенная функция range() ожидает отдельных аргументов start и stop. Если они не доступны по отдельности, записывают вызов функции с *-оператором для распаковки аргументов из списка или кортежа.
Пример
list(range(3, 6)) # нормальный вызов с отдельными аргументами Результат 3, 4, 5
args = [3, 6] list(range(*args)) # вызов с аргументами, распакованными из списка Результат 3, 4, 5
В такой же форме словари могут поставлять аргументы с ключевым сло­вом с помощью **-оператора: Пример
def parrot(voltage, state='a stiff', action='voom'): print("-- This parrot wouldn't", action, end=' ') print("if you put", voltage, "volts through it.", end=' ')
51
print("E's", state, "!") # Обращение к функци d = {"voltage": "four million", "state": "bleedin' demised", "action": "VOOM"} parrot(**d)
Результат
-- This parrot wouldn't VOOM if you put four million volts through it. E's bleedin' demised !
4.1.5. Возврат значений из функции. Оператор return
Функции могут возвращать значения в основную ветку программы. В языке программирования Python выход из функции и передача значений вы­полняется оператором return. При выполнении функции, если встречается return, то он возвращает значение, указанное после этой команды, и завершает- ся выполнение функции.
Пример
def celinder(): # функция cylinder безаргументов r=float(input()) # перевод вводимого значения в вещественный тип h=float(input()) # перевод вводимого значения в вещественный тип
# площадь боковой поверхности цилиндра
side = 2 * 3.14 * r * h
# площадь одного основания цилиндра
circle = 3.14 * r ** 2
# полная площадь цилиндра
full = side + 2 * circle return full
# обращение к функции из программы
square = cylinder() print(square)
Исходные данные: r=3, h=7 Результат: 188.4
В данной программе в основную ветку из функции возвращается значе­ние локальной переменной full.
В основной ветке программы это значение присваивается глобальной пе-
ременной square. То есть выражение square = cylinder() выполняется так:
1) вызывается функция cylinder();
2) из функции возвращается значение;
3) возвращенное значение присваивается переменной square.
Не обязательно присваивать результат переменной, его можно сразу вы-
вести на экран: print(cylinder()).
52
В функции могут быть использованы несколько операторов return. Одна­ко всегда выполняется только один из них, а именно тот, который первым до­стигнет поток выполнения. Допустим, в процессе выполнения функции реши-
ли обработать исключение, возникающее на некорректный ввод. Пусть тогда в ветке except обработчика исключений происходит выход из функции без всяких
вычислений и передачи значения. Пример
def celinder(): try: # начало обработки исключения r=float(input()) h=float(input()) except ValueError: # не корректный ввод значений для переменных return # выход из функции side = 2 * 3.14 * r * h circle = 3.14 * r ** 2 full = side + 2 * circle return full
# обращение к функции из программы
square = cylinder() print(square)
Если вместо цифр ввести буквы, то сработает return, вложенный в except.
Он завершит выполнение функции, так что все нижеследующие вычисления, в
том числе return full, будут опущены. Пример выполнения:
r None
Возвращенное из функции значение None относится к типу данных NoneType. В тех случаях, когда после return ничего не указано, то по умолча- нию считается, что там стоит объект None. В тоже время можно явно написать return None.
4.1.6. Возврат нескольких значений
В Питоне позволительно возвращать из функции несколько объектов, пе-
речислив их через запятую после команды return. Пример
def celinder(): r=float(input()) h=float(input()) side = 2 * 3.14 * r * h circle = 3.14 * r ** 2
53
full = side + 2 * circle return side, circle, full
# обращение к функции из программы
sCyl, cCyl, fCyl = cylinder() print(“Площадь боковой поверхности %.2f” % sCyl) print(“Площадь одного основания цилиндра %.2f” % cCyl) print(“Полная площадь цилиндра %.2f” % fCyl)
Пример выполнения: 4 3 (75.36, 50.24, 175.84)
4.2. Lambda-выражения
С помощью ключевого слова lambda может быть создана маленькая анонимная функция. Эта функция возвращает сумму ее двух аргументов: lambda a, b: a+b. Lambda-функции могут быть использованы там, где требуют­ся объекты-функции. Синтаксически они ограничены одним выражением.
Семантически они являются просто синтаксическим сахаром для обычного
определения функции. Как вложенные определения функции lambda-функции могут ссылаться на переменные из содержащей области.
Пример
def make_incrementor(n): return lambda x: x + n
# Обращение к функции
f = make_incrementor(42) f(0) Результат 42
# Обращение к функции
f(1) Результат 43
4.3. Строки документации
Здесь несколько соглашений о содержании и форматировании строк
документации.
Первой строке всегда следует быть короткой, краткая сводка назначения объекта. Для краткости не следует явно указывать имя или тип объекта,
поскольку они доступны другими способами (за исключением, если имя оказы-
вается глаголом, описывающим операцию функции). Эта строка должна
начинаться с заглавной буквы и заканчиваться точкой.
54
Если есть еще строки документации, вторая должна быть пустой, визуально отделяя сводку от остального описания. Следующие строки должны представлять собой один или несколько параграфов, описывающих соглашения
о вызовах объекта, его побочные эффекты и т. д.
Анализатор Python не удаляет отступ из многострочных строковых
литералов, так что инструменты, которые обрабатывают документацию, должны удалять отступы, если это необходимо. Это делается с помощью следующего соглашения. Первый непустая линия после первой строки определяет размер отступа для всей строки документации. (Мы не можем использовать первую строку, поскольку она, как правило, примыкает к открывающим кавычкам строки, так что ее отступ не является очевидным в
строковом литерале.) Пробелы, "эквивалентные" этому отступу, затем удаля-
ются из начала всех линий строки. Линий с меньшим отступом быть не должно, но если они есть, все их ведущие пробелы должны удаляться. Эквивалентность
пробелов должна быть проверена после расширения табуляций (до 8 пробелов, как правило).
Пример
def my_function(): """Do nothing, but document it. No, really, it doesn't do anything. """ Pass
# Обращение к функции
print(my_function.__doc__) Результат
Do nothing, but document it. No, really, it doesn't do anything.
4.4. Аннотации функций
Function annotations являются полностью необязательными метаданными о типах, используемых пользовательскими.
Аннотации хранятся в атрибуте annotations функции как словарь и не
имеют никакого эффекта на любую другую часть функции. Параметры аннотаций определяются двоеточием после имени параметра, за которым
следует выражение, оценивающее значение аннотации. Возвращения аннотации определяются литералом ->, следующим выражению, между списком параметра и двоеточием, обозначая конец оператора def. Следующий
пример имеет позиционный аргумент, аргумент с ключевым словом и
аннотированное возвращаемое значение:
def f(ham: str, eggs: str = 'eggs') -> str: print("Annotations:", f.__annotations__)
55
Синтаксис метода
Назначение
Эквивалент
list.append(x)
Добавляет элемент в конец списка
a[len(a):] = [x]
list.extend(iterable)
Расширяет список добавлением всех
элементов из итерации
a[len(a):] =
iterable
list.insert(i, x)
Вставляет элемент в заданную позицию.
Первый аргумент это индекс
элемента, перед которым происходит
вставка, так a.insert(0, x) вставляет впереди списка, а a.insert(len(a),x)
a.append(x)
list.remove(x)
Удаляет первый элемент из списка, чье
значение равно x. Возникает ошибка, если такого элемента нет
list.pop([i])
Удаляет элемент в заданной позиции в списке и возвращает его. Если индекс
не указан, a.pop() удаляет и возвращает
последний элемент в списке. (Квадратные скобки вокруг i в сигнатуре метода означают, что
параметр необязательный)
list.clear()
Удаляет все элементы из списка
del a[:]
print("Arguments:", ham, eggs) return ham + ' and ' + eggs
# Обращение к функции
f('spam') Результат
Annotations: {'ham': <class 'str'>, 'return': <class 'str'>, 'eggs': <class 'str'>} Arguments: spam eggs 'spam and eggs'
5. СТРУКТУРЫ ДАННЫХ
5.1. Подробнее о списках
Списковый тип данных имеет большое количество для методов. В табл. 7 представлены методы списковых объектов.
Т а б л и ц а 7. Методы списковых объектов
56
Окончание табл. 7
Синтаксис метода
Назначение
Эквивалент
list.index(x[, start[, end]])
Возвращает индекс (отсчет с нуля) первого элемента в списке, чье значение
равно x. Возникает ValueError, если такого элемента нет. Необязательные аргументы start и end интерпретируются
как запись среза и используются как ограничитель для поиска в конкретной
последовательности списка. Возвращаемый индекс вычисляется от­носительно начала полной последова­тельности, а не от аргумента start
list.count(x)
Возвращает какое число раз x добавлен в список
list.sort(key=None, reverse=False)
Сортирует элементы списка на месте (аргументы могут быть использованы
для настройки сортировки)
list.reverse()
Выполняет реверс (обратное построе­ние) элементов списка на месте
list.copy()
Возвращает поверхностную копию
списка
a[:]
Примеры fruits = ['orange', 'apple', 'pear', 'banana', 'kiwi', 'apple', 'banana']
print(fruits.count('apple')) Результат: 2
print (fruits.count('tangerine')) Результат: 0
print (fruits.index('banana')) Результат: 3
print (fruits.index('banana', 4) ) # Находит следующий banana, начиная с позиции
4
Результат: 6 fruits.reverse()
print(fruits) Результат: 'banana', 'apple', 'kiwi', 'banana', 'pear', 'apple', 'orange'
print (fruits.append('grape')) print(fruits) Результат: 'banana', 'apple', 'kiwi', 'banana', 'pear', 'apple', 'orange', 'grape'
fruits.sort()
57
print(fruits) Результат: 'apple', 'apple', 'banana', 'banana', 'grape', 'kiwi', 'orange', 'pear'
print(fruits.pop()) Результат: 'pear'
5.1.1. Использование списков в качестве стеков
Методы списков делают возможным очень легко использовать список как стек, в котором последний добавленный элемент есть первый извлеченный элемент ("последним вошел, первым вышел"). Для добавления элемента вверх
стека используйте append(). Для извлечения элемента из верха стека, исполь­зуйте pop() без конкретного индекса.
Пример
# Добавление в конец списка два новых элемента 6 и 7
stack = [3, 4, 5] stack.append(6) stack.append(7) print(stack) Результат: 3, 4, 5, 6, 7
# Удаление и возвращение последнего элемента списка
stack.pop() Результат: 7 Print( stack) Результат: 3, 4, 5, 6
5.1.2. Использование списков в качестве очередей
Список может быть использован как очередь, где первый добавленный
элемент есть первый извлеченный элемент ("первым вошел, первым вышел") – однако списки не эффективны для этой цели. В то время как добавление с помощью append() и извлечение с помощью pop() с конца списка осуществля­ются быстро, добавление с помощью insert() или извлечение с помощью pop()
из начала списка происходит медленно (потому что все другие элементы
должны быть сдвинуты на один).
Для организации очереди используется класс deque встроенного модуля Collections, реализующий специализированный контейнер типов данных, который был разработан для быстрых добавлений и извлечений с обоих концов.
Пример
from collections import deque # Подключение класса deque модуля collections queue = deque(["Eric", "John", "Michael"]) queue.append("Terry") # Terry прибыл – добавление в конец списка queue.append("Graham") # Graham прибыл – добавление в конец списка
58
queue.popleft() # Первый прибывший теперь покинул – удаление элемент списка слева queue.popleft() # Второй прибывший теперь покинул – удаление элемент списка слева print(queue) # Вывод остальной очереди в порядке прибытия Результат: Michael, Terry, Graham
5.1.3. Генераторы списков
Генераторы списков обеспечивает лаконичный способ их создания. Обычные приложения создают новые списки, где каждый элемент есть результат нескольких операций, применяемых к каждому члену другой последовательности или итерации, или создают подпоследовательности тех
элементов, которые удовлетворяют конкретному условию. Пример
# Создание списка квадратов
squares = [] # Создание пустого списка for x in range(10): squares.append(x**2) print(squares,sep=”,”)
Результат: 0, 1, 4, 9, 16, 25, 36, 49, 64, 81
В процессе выполнения программы создается (или перезаписывается) переменная под именем x, которая продолжает существовать после завершения цикла.
Примеры
# Создание списка квадратов. Второй способ
squares = list(map(lambda x: x**2, range(10)))
# Эквивалентно
squares = [x**2 for x in range(10)]
Генератор списка состоит из скобок, содержащих выражение, за которым
следует for, затем ни одной или больше for или условий if. Результатом будет
новый список, полученный от вычисления выражения в данном контексте
присутствующих записей for и if. Примеры
# listcomp сочетает в себе элементы двух списков, если они не равны
combs= [(x, y) for x in [1,2,3] for y in [3,1,4] if x != y] print(combs)
Результат: (1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4) Эквивалент
combs = []
59
for x in [1,2,3]: for y in [3,1,4]: if x != y: combs.append((x, y)) print(combs)
Результат: (1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)
Порядок операторов for и if одинаков в обоих данных частях кода. Если выражение является кортежем (как (x, y) в предыдущем примере), оно должно быть заключено в скобки.
Примеры
vec = [-4, -2, 0, 2, 4]
# Создает новый список с удвоенными значениями
vec1=[x*2 for x in vec] print(vec1,sep=”,”) Результат: -8, -4, 0, 4, 8
# Фильтрует список, исключая отрицательные числа
vec1=[x for x in vec if x >= 0] print(vec1,sep=”,”) Результат: 0, 2, 4
# Применяет функцию для всех элементов
Vec1=[abs(x) for x in vec] print(vec1,sep=”,”) Результат: 4, 2, 0, 2, 4
# Вызывает метод для каждого элемента
freshfruit = [' banana', ' loganberry ', 'passion fruit '] freshfruit1 = [weapon.strip() for weapon in freshfruit] print(freshfruit1,sep=”,”) Результат: 'banana', 'loganberry', 'passion fruit'
# Создает список двойных кортежей как (число, квадрат)
xx=[(x, x**2) for x in range(6)] print(xx) Результат: (0, 0), (1, 1), (2, 4), (3, 9), (4, 16), (5, 25)
# Кортеж должен быть заключен в скобки, иначе возбуждается ошибка
xx= [x, x**2 for x in range(6)] Результат File "<stdin>", line 1, in ? [x, x**2 for x in range(6)] ^ SyntaxError: invalid syntax
60
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]