Для решения задачи (25) полезно уметь пользоваться (f)-строками — форматированными выражениями, содержащими поля замены. Форматированные (f)-строки имеют вид f'<текст >{объект}< текст>’. Поля замены ограничиваются фигурными скобками, и значения в них подставляются во время выполнения программы.
Например, фрагменты программ:
print(‘Решать задания ЕГЭ мне помогают материалы ЯКласс!’)
print(f’Решать задания ЕГЭ мне помогают материалы ЯКласс!’)
будут выполняться одинаково, хотя в верхней строке обычное форматирование, а во второй — (f)-строка. Обратим на это внимание в следующем примере.
Рис. (1). Пример вывода
Рис. (2). Результат работы программы (1)
Для аккуратного форматирования придётся воспользоваться разделителем sep(=») и вставкой дополнительных пробелов в текст для того, чтобы избавиться от автоматически расставляемых пробелов на месте запятых в функции print.
Сравни результат работы с результатом работы (f)-строки:
Рис. (3). Пример вывода (f)-строки
Рис. (4). Результат работы программы (2)
Конечно, этим не исчерпываются возможности (f)-строк.
Рассмотрим задачу на поиск делителей числа.
Пример (1)
Для некоторого случайного числа в интервале ([4,12300]) подсчитай количество нетривиальных делителей и выведи их.
Решение
Рис. (5). Программа (1)
Рис. (6). Результат работы программы (3)
Обрати внимание на оформление вывода. Результаты работы программы форматированы как (f)-строки. В качестве объекта в фигурных скобках записана стандартная функция len от другой функции mult. Одна из этих функций составлена пользователем и описана здесь же в программе. Кроме использования вычислений в (f)-строке мы также можем форматировать нужные нам строки.
Пример (2)
Даны символы «e», «c», «t», «f», «j», «k», «y». Сколько различных имён файлов, соответствующих маске (1?23.?x?), можно составить из предложенных символов? Сколько из них будут иметь расширение «txt» или «exe»?
Рис. (7). Программа (2)
Обрати внимание: для контроля за работой программы мы вывели на печать имена файлов с заданными расширениями.
Рис. (8). Результат работы программы (4)
Разбор досрочного варианта (2022)
Назовём маской числа последовательность цифр в которой также могут встречаться следующие символы:
-
символ «?» означает ровно одну произвольную цифру;
-
символ «*» означает любую последовательность цифр произвольной длины; в том числе «*» может задавать и пустую последовательность.
Среди натуральных чисел, не превышающих (10**9), найди все числа, соответствующие маске (12345?6?8) и делящиеся на (17) без остатка.
В ответе запиши в первом столбце таблицы все найденные числа в порядке возрастания, а во втором столбце — соответствующие им частные от деления на (17).
Здесь полем замены будут цифры, занимающие места «?».
Рис. (9). Программа (3)
Рис. (10). Результат работы программы (5)
Для решения задач с применением масок числа полезно знать работу функции product модуля itertools.
В условии задачи досрочного варианта упоминается, что в маске может находиться «*», а это набор символов любой длины, в том числе и нулевой.
Функция product модуля itertools сформирует нам необходимую комбинацию символов для замены «*».
Рассмотрим пример её работы.
Пример (3)
Составь все возможные пары из элементов строк (‘0123’) и (‘abcd’) — такие, чтобы первый элемент был из числовой строки, а следующий — из текстовой. (Множество таких пар элементов называется декартовым произведением первой и второй из заданных строк.)
Рис. (11). Программа (4)
Мы получили список, состоящий из кортежей, первый элемент которых — из числовой строки, а второй — из текстовой.
Рис. (12). Результат работы программы (6)
Но для вставки вместо «*» нам нужно преобразовать кортежи, из которых состоит список, в строки.
Пример (3A)
Метод join преобразовал кортежи в строки.
Рис. (13). Результат работы программы (7)
Если необходимо составить комбинации пар, или троек, или иного количества символов одного множества, то необходимо задать параметр repeat для функции product.
Пример (3B)
Составь таблицу истинности логической функции
((x→y)≡(z→w))∨(x∧w).
Рис. (14). Программа (5)
Рис. (15). Результат работы программы (8)
Пример (3C)
Рис. (16). Программа (6)
Рис. (17). Результат работы программы (9)
Вот эти строки уже можно вставлять на место «*».
Рассмотрим ещё одно задание из ЕГЭ прошлых лет.
Пример (4)
Определи, какое из указанных имён файлов удовлетворяет маске (‘?vi*r.?xt’).
1) vir.txt
2) ovir.txt
3) ovir.xt
4) virr.txt
Задание решалось вручную, и мы можем составить программу и сопоставить ответ, полученный программой, с ручными расчётами.
Рис. (18). Программа (7)
ГлавнаяШпаргалкиСамые нужные функции Python
21 марта, 2022
1 мин
Инф 💻
1040
0
Давно ищешь все самые полезные функции для Python, которые пригодятся на ЕГЭ по информатике и в разработке?
Тогда лови нашу подборку! Не забудь сохранить.
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter. Мы обязательно поправим!
Редакция Без Сменки
44
подписчиков
+ Подписаться
Редакция Без Сменки
Честно. Понятно. С душой.
44
подписчиков
+ Подписаться
Где вы учитесь?
-
в 11 классе
-
в 10 классе
-
в средней школе
-
я студент
-
я выпускник
-
я родитель
Результаты
Вам также будет интересно
Редакция Без Сменки
10 июня, 2022
1 мин
Био 🦠
Что такое анализатор
Если кто-то вам скажет, что «глаз и ухо —это анализаторы», то бегите от такого человека к нам в 150…
252
0
Редакция Без Сменки
06 июня, 2022
1 мин
Англ 🇬🇧
выражение to have something done
I’m having my nails done today. — Иду сегодня на ноготочки, девАчки.
I had my laptop repaired. -…
218
0
Редакция Без Сменки
17 мая, 2022
1 мин
Хим 🧪
Углерод: его свойства и соединения
Углерод (С) — элемент IVA группы. У углерода 4 валентных электрона. В возбужденном состоянии у…
1309
0
Редакция Без Сменки
06 июня, 2022
1 мин
Общ 👨👩👧
Основы Конституционного строя РФ
Сейчас на территории нашей страны действует Конституция, которая была принята 12 декабря 1991 г. в…
358
0
Редакция Без Сменки
06 июня, 2022
1 мин
Англ 🇬🇧
Разница между can и to be able to
▪️ LSP can sing great, I wonder where he learned?
ЛСП умеет классно петь, интересно, где он…
356
0
Редакция Без Сменки
21 марта, 2022
1 мин
Общ 👨👩👧
Как проходят выборы и все ли обладают избирательным правом?
Каждый из нас обладает равным избирательным правом в пределах своего избирательного округа.
И…
482
0
0 комментария
Авторизуйтесь, чтобы оставить комментарий.
В Python существуют десятки встроенных функций и классов, сотни инструментов, входящих в стандартную библиотеку Python, и тысячи сторонних библиотек на PyPI. Держать всё в голове начинающему программисту нереально. В статье расскажем про стандартные встроенные функции Python: какие используются часто, а какие вам, вероятно, не пригодятся никогда.
Чтобы разобраться, на какие функции стоит обратить внимание, их следует разделить на группы:
- общеизвестные: почти все новички используют эти функции и довольно часто;
- неочевидные для новичков: об этих функциях полезно знать, но их легко пропустить, когда вы новичок в Python;
- понадобятся позже: об этих встроенных функциях полезно помнить, чтобы найти их потом, когда/если они понадобятся;
- можно изучить когда-нибудь: это может пригодиться, но только при определённых обстоятельствах;
- скорее всего, они вам не нужны: они вряд ли понадобятся, если вы не занимаетесь чем-то достаточно специализированным.
Встроенные функции в первых двух категориях являются основными. Они в конечном итоге будут нужны почти всем начинающим программистам на Python. Встроенные модули в следующих двух категориях являются специализированными, но потребности в них будут варьироваться в зависимости от вашей специализации. Категория 5 — это скрытые встроенные функции. Они очень полезны, когда в них есть необходимость, но многим программистам Python они, вероятно, никогда не понадобятся.
Общеизвестные функции
Если вы уже писали код на Python, эти модули должны быть вам знакомы.
Вряд ли найдётся разработчик, даже начинающий, который не знает эту функцию вывода. Как минимум реализация «Hello, World!» требует использования данного метода. Но вы можете не знать о различных аргументах, которые можно передавать в print
.
>>> words = ["Welcome", "to", "Python"]
>>> print(words)
['Welcome', 'to', 'Python']
>>> print(*words, end="!n")
Welcome to Python!
>>> print(*words, sep="n")
Welcome
to
Python
len
В Python нет синтаксиса вроде my_list.length()
или my_string.length
, вместо этого используются поначалу непривычные конструкции len(my_list)
и len(my_string)
.
>>> words = ["Welcome", "to", "Python"]
>>> len(words)
3
Нравится вам такая реализация или нет, другой альтернативы не предусмотрено, поэтому к ней нужно привыкнуть.
str
К сожалению, в отличие от многих других языков программирования, в Python нельзя объединять строки и числа.
>>> version = 3
>>> "Python " + version
Traceback (most recent call last):
File "", line 1, in
TypeError: can only concatenate str (not "int") to str
Python отказывается приводить целое число 3 к типу строка, поэтому нужно сделать это самостоятельно, используя встроенную функцию str
(технически это класс, но с целью уменьшить количество ненужной информации будем принимать все методы за функции).
>>> version = 3
>>> "Python " + str(version)
'Python 3'
int
Если нужно пользовательский ввод преобразовать в integer
, эта функция незаменима. Она может преобразовывать строки в целые числа.
>>> program_name = "Python 3"
>>> version_number = program_name.split()[-1]
>>> int(version_number)
3
Эту функцию также можно использовать для отсечения дробной части у числа с плавающей точкой.
>>> from math import sqrt
>>> sqrt(28)
5.291502622129181
>>> int(sqrt(28))
5
Обратите внимание, если нужно обрезать дробную часть при делении, оператор «//
» более уместен (с отрицательными числами это работает иначе).
int (3/2) == 3 // 2
float
Если строка, которую надо конвертировать в число, не является целым числом, здесь поможет метод float
.
>>> program_name = "Python 3"
>>> version_number = program_name.split()[-1]
>>> float(version_number)
3.0
>>> pi_digits = '3.141592653589793238462643383279502884197169399375'
>>> len(pi_digits)
50
>>> float(pi_digits)
3.141592653589793
Float
также можно использовать для преобразования целых чисел в числа с плавающей запятой.
В Python 2 такое преобразование необходимо, но в Python 3 целочисленное деление больше не является чем-то особенным (если вы специально не используете оператор «//
»). Поэтому больше не нужно использовать float
для этой цели, теперь float(x)/y
можно легко заменить на x/y
.
list
Эта функция может очень облегчить задачу, если вы хотите составить список из итераций цикла.
>>> numbers = [2, 1, 3, 5, 8]
>>> squares = (n**2 for n in numbers)
>>> squares
at 0x7fd52dbd5930>
>>> list_of_squares = list(squares)
>>> list_of_squares
[4, 1, 9, 25, 64]
При работе со списком метод copy
позволяет создать его копию.
>>> copy_of_squares = list_of_squares.copy()
Если вы не знаете, с какими элементами работаете, функция list
является более общим способом перебора элементов и их копирования.
>>> copy_of_squares = list(list_of_squares)
Также можно использовать списковое включение, но делать это не рекомендуется.
Обратите внимание, когда вы хотите создать пустой список, следует использовать буквальный синтаксис списка («[ ]
»).
>>> my_list = list() # Так делать нельзя
>>> my_list = [] # Так можно
Использование «[ ]
» считается более идиоматическим, так как эти скобки на самом деле выглядят как список Python.
tuple
Эта функция во многом похожа на функцию list
, за исключением того, что вместо списков она создает кортежи.
>>> numbers = [2, 1, 3, 4, 7]
>>> tuple(numbers)
(2, 1, 3, 4, 7)
Если вы пытаетесь создать хешируемую коллекцию (например, ключ словаря), стоит отдать предпочтению кортежу вместо списка.
dict
Эта функция создаёт новый словарь.
Подобно спискам и кортежам, dict
эквивалентна проходу по массиву пар «ключ-значение» и созданию из них словаря.
Дан список кортежей, по два элемента в каждом.
>>> color_counts = [('red', 2), ('green', 1), ('blue', 3), ('purple', 5)]
Выведем его на экран с помощью цикла.
>>> colors = {}
>>> for color, n in color_counts:
... colors[color] = n
...
>>> colors
{'red': 2, 'green': 1, 'blue' 3, 'purple': 5}
То же самое, но с использованием dict
.
>>> colors = dict(color_counts)
>>> colors
{'red': 2, 'green': 1, 'blue' 3, 'purple': 5}
Функция dict
может принимать 2 типа аргументов:
- другой словарь: в этом случае этот словарь будет скопирован;
- список кортежей «ключ-значение»: в этом случае из этих слов будет создан новый словарь.
Поэтому следующий код также будет работать.
>>> colors
{'red': 2, 'green': 1, 'blue' 3, 'purple': 5}
>>> new_dictionary = dict(colors)
>>> new_dictionary
{'red': 2, 'green': 1, 'blue' 3, 'purple': 5}
Функция dict
также может принимать ключевые слова в качестве аргументов для создания словаря со строковыми ключами.
>>> person = dict(name='Trey Hunner', profession='Python Trainer')
>>> person
{'name': 'Trey Hunner', 'profession': 'Python Trainer'}
Но рекомендуется всё же использовать литералы вместо ключевых слов.
>>> person = {'name': 'Trey Hunner', 'profession': 'Python Trainer'}
>>> person
{'name': 'Trey Hunner', 'profession': 'Python Trainer'}
Такой синтаксис более гибок и немного быстрее. Но самое главное он более чётко передаёт факт того, что вы создаёте именно словарь.
Как в случае со списком и кортежем, пустой словарь следует создавать с использованием буквального синтаксиса («{ }
»).
>>> my_list = dict() # Так делать нельзя
>>> my_list = {} # Так можно
Использование «{ }
» более идиоматично и эффективно с точки зрения использования процессора. Обычно для создания словарей используются фигурные скобки, dict
встречается гораздо реже.
set
Функция set
создаёт новый набор. Она принимает итерации из хешируемых значений (строк, чисел или других неизменяемых типов) и возвращает set
.
>>> numbers = [1, 1, 2, 3, 5, 8]
>>> set(numbers)
{1, 2, 3, 5, 8}
Создать пустой набор с «{ }
» нельзя (фигурные скобки создают пустой словарь). Поэтому функция set
— лучший способ создать пустой набор.
>>> numbers = set()
>>> numbers
set()
Можно использовать и другой синтаксис.
>>> {*()} # Так можно создать пустой набор
set()
Такой способ имеет недостаток — он сбивает с толку (он основан на редко используемой функции оператора *
), поэтому он не рекомендуется.
range
Эта функция создаёт объект range
, который представляет собой диапазон чисел.
>>> range(10_000)
range(0, 10000)
>>> range(-1_000_000_000, 1_000_000_000)
range(-1000000000, 1000000000)
Результирующий диапазон чисел включает начальный номер, но исключает конечный (range(0, 10)
не включает 10).
Данная функция полезна при переборе чисел.
>>> for n in range(0, 50, 10):
... print(n)
...
0
10
20
30
40
Обычный вариант использования — выполнить операцию n
раз.
first_five = [get_things() for _ in range(5)]
Функция range
в Python 2 возвращает список. Это означает, что примеры кода выше будут создавать очень большие списки. Range
в Python 3 работает как xrange
в Python 2. Числа вычисляются «более лениво» при проходе по диапазону.
Функции, неочевидные для новичков
bool
Эта функция проверяет достоверность (истинность) объектов Python. Относительно чисел будет выполняться проверка на неравенство нулю.
>>> bool(5)
True
>>> bool(-1)
True
>>> bool(0)
False
Применяя bool
к коллекциям, будет проверяться их длина (больше 0 или нет).
>>> bool('hello')
True
>>> bool('')
False
>>> bool(['a'])
True
>>> bool([])
False
>>> bool({})
False
>>> bool({1: 1, 2: 4, 3: 9})
True
>>> bool(range(5))
True
>>> bool(range(0))
False
>>> bool(None)
False
Проверка истинности очень важна в Python. Вместо того, чтобы задавать вопросы о длине контейнера, многие новички задают проверку истинности.
# Вместо этого
if len(numbers) == 0:
print("The numbers list is empty")
# многие делают так
if not numbers:
print("The numbers list is empty")
Данная функция используется редко. Но, если нужно привести значение к логическому типу для проверки его истинности, bool
вам необходима.
enumerate
Если нужно в цикле посчитать количество элементов (по одному элементу за раз), эта функция может быть очень полезной. Такая задача может показаться специфической, но она бывает нужна довольно часто.
Например, если нужно отслеживать номер строки в файле.
>>> with open('hello.txt', mode='rt') as my_file:
... for n, line in enumerate(my_file, start=1):
... print(f"{n:03}", line)
...
001 This is the first line of the file
002 This is the second line
003 This is the last line of the file
Enumerate
также часто используется для отслеживания индекса элементов в последовательности.
def palindromic(sequence):
"""Возвращает True, если последовательность является палиндромом."""
for i, item in enumerate(sequence):
if item != sequence[-(i+1)]:
return False
return True
Также следует обратить внимание, что новички в Python часто используют range(len(sequence))
. Если вы когда-нибудь встретите конструкции типа range(len(...))
, лучше заменить её на enumerate
. Она поможет упростить конструкцию операторов.
def palindromic(sequence):
"""Возвращает True, если последовательность является палиндромом."""
for i in range(len(sequence)):
if sequence[i] != sequence[-(i+1)]:
return False
return True
zip
Эта функция ещё более специализирована, чем enumerate
. Zip
используется для перебора сразу нескольких объектов одновременно.
>>> one_iterable = [2, 1, 3, 4, 7, 11]
>>> another_iterable = ['P', 'y', 't', 'h', 'o', 'n']
>>> for n, letter in zip(one_iterable, another_iterable):
... print(letter, n)
...
P 2
y 1
t 3
h 4
o 7
n 11
По сравнению с enumerate
, последняя функция удобна, когда нужна индексация во время цикла. Если нужно обрабатывать несколько объектов одновременно, zip
предпочтительнее enumerate
.
reversed
Функция reversed
, как enumerate
и zip
, возвращает итератор.
>>> numbers = [2, 1, 3, 4, 7]
>>> reversed(numbers)
<list_reverseiterator object at 0x7f3d4452f8d0>
Единственное, что можно сделать с этим итератором, пройтись по нему (но только один раз).
>>> reversed_numbers = reversed(numbers)
>>> list(reversed_numbers)
[7, 4, 3, 1, 2]
>>> list(reversed_numbers)
[]
Подобно enumerate
и zip
, reversed
является своего рода вспомогательной функцией в циклах. Её использование можно увидеть исключительно в цикле for
.
>>> for n in reversed(numbers):
... print(n)
...
7
4
3
1
2
Есть несколько и других способов перевернуть списки в Python.
# Синтаксис нарезки
for n in numbers[::-1]:
print(n)
# Метод переворота на месте
numbers.reverse()
for n in numbers:
print(n)
Данная функция, как правило, является лучшим способом «перевернуть» любой список (а также набор, массив и т. д.) в Python.
В отличие от numbers.reverse()
, reversed
не изменяет список, а возвращает итератор перевёрнутых элементов.
reversed(numbers)
(в отличие от numbers [:: - 1]
) не создает новый список. Возвращаемый им итератор извлекает следующий элемент в обратном порядке при проходе по циклу. Также синтаксис reversed(numbers)
намного более читабелен, чем numbers [:: - 1]
.
Можно использовать факт, что reversed
не копирует список. Если объединить его с функцией zip
, можно переписать функцию palindromic
(из раздела enumerate
), не занимая дополнительной памяти (не копируя объект).
def palindromic(sequence):
"""Возвращает True, если последовательность является палиндромом."""
for n, m in zip(sequence, reversed(sequence)):
if n != m:
return False
return True
sum
Эта функция берёт набор чисел и возвращает их сумму.
>>> sum([2, 1, 3, 4, 7])
17
В Python есть много вспомогательных функций, которые выполняют циклы за вас (отчасти потому, что они хорошо сочетаются с генератор-выражениями).
>>> numbers = [2, 1, 3, 4, 7, 11, 18]
>>> sum(n**2 for n in numbers)
524
min и max
Эти функции выдают минимальное и максимальное число из набора соответственно.
>>> numbers = [2, 1, 3, 4, 7, 11, 18]
>>> min(numbers)
1
>>> max(numbers)
18
Данные методы сравнивают элементы, используя оператор <
. Поэтому, все передаваемые в них значения должны быть упорядочены и сопоставимы друг с другом.
Min
и max
также принимают key
-свойство, позволяющее настроить, что на самом деле означают «минимум» и «максимум» для конкретных объектов.
>>> fruits = ['kumquat', 'Cherimoya', 'Loquat', 'longan', 'jujube']
>>> sorted(fruits, key=len)
['Loquat', 'longan', 'jujube', 'kumquat', 'Cherimoya']
sorted
Эта функция принимает любой набор элементов и возвращает новый список всех значений в отсортированном порядке.
>>> numbers = [1, 8, 2, 13, 5, 3, 1]
>>> words = ["python", "is", "lovely"]
>>> sorted(words)
['is', 'lovely', 'python']
>>> sorted(numbers, reverse=True)
[13, 8, 5, 3, 2, 1, 1]
Данная функция (как min
и max
) сравнивает элементы, используя оператор <
, поэтому все значения, переданные ей, должны быть упорядочены.
Sorted
также позволяет настраивать сортировку с помощью key
-свойства.
any и all
Эти функции могут быть использованы в паре с генератор-выражениями, чтобы определить соответствие элементов заданному условию.
Используя all
, можно переписать функцию palindromic
следующим образом.
def palindromic(sequence):
"""Возвращает True, если последовательность является палиндромом."""
return all(
n == m
for n, m in zip(sequence, reversed(sequence))
)
Отрицание условия и возвращаемого значения позволит также использовать any
в этом примере точно также (что усложнит конструкцию, но вполне сойдёт в качестве примера использования).
def palindromic(sequence):
"""Возвращает True, если последовательность является палиндромом."""
return not any(
n != m
for n, m in zip(sequence, reversed(sequence))
)
5 функций для отладки
Эти функции часто игнорируются, но будут полезны для отладки и устранения неисправностей кода.
breakpoint
Если нужно приостановить выполнение кода и перейти в командную строку Python, эта функция вам пригодится. Вызов breakpoint
перебросит вас в отладчик Python.
Эта встроенная функция была добавлена в Python 3.7, но если вы работаете в более старых версиях, можете получить тот же результат с помощью import pdb; pdb.set_trace()
.
dir
Эта функция может использоваться в двух случаях:
- просмотр списка всех локальных переменных;
- просмотр списка всех атрибутов конкретного объекта.
Из примера можно увидеть локальные переменные сразу после запуска и после создания новой переменной x
.
>>> dir()
['__annotations__', '__doc__', '__name__', '__package__']
>>> x = [1, 2, 3, 4]
>>> dir()
['__annotations__', '__doc__', '__name__', '__package__', 'x']
Если в dir
передать созданный список x
, на выходе можно увидеть все его атрибуты.
>>> dir(x)
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
В выведенном списке атрибутов можно увидеть его типичные методы (append
, pop
, remove
и т. д.) , а также множество более сложных методов для перегрузки операторов.
vars
Эта функция является своего рода смесью двух похожих инструментов: locals()
и __dict__
.
Когда vars
вызывается без аргументов, это эквивалентно вызову locals()
, которая показывает словарь всех локальных переменных и их значений.
>>> vars()
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>}
Когда вызов происходит с аргументом, vars
получает доступ к атрибуту __dict__
, который представляет собой словарь всех атрибутов экземпляра.
>>> from itertools import chain
>>> vars(chain)
mappingproxy({'__getattribute__': <slot wrapper '__getattribute__' of 'itertools.chain' objects>, '__iter__': <slot wrapper '__iter__' of 'itertools.chain' objects>, '__next__': <slot wrapper '__next__' of 'itertools.chain' objects>, '__new__': <built-in method __new__ of type object at 0x5611ee76fac0>, 'from_iterable': <method 'from_iterable' of 'itertools.chain' objects>, '__reduce__': <method '__reduce__' of 'itertools.chain' objects>, '__setstate__': <method '__setstate__' of 'itertools.chain' objects>, '__doc__': 'chain(*iterables) --> chain objectnnReturn a chain object whose .__next__() method returns elements from thenfirst iterable until it is exhausted, then elements from the nextniterable, until all of the iterables are exhausted.'})
Перед использованием vars
было бы неплохо сначала обратиться к dir
.
type
Эта функция возвращает тип объекта, который вы ей передаете.
Тип экземпляра класса есть сам класс.
>>> x = [1, 2, 3]
>>> type(x)
<class 'list'>
Тип класса — это его метакласс, обычно это type
.
>>> type(list)
<class 'type'>
>>> type(type(x))
<class 'type'>
Атрибут __class__
даёт тот же результат, что и функция type
, но рекомендуется использовать второй вариант.
>>> x.__class__
<class 'list'>
>>> type(x)
<class 'list'>
Функция type
, кроме отладки, иногда полезна и в реальном коде (особенно в объектно-ориентированном программировании с наследованием и пользовательскими строковыми представлениями).
Обратите внимание, что при проверке типов обычно вместо type
используется функция isinstance
. Также стоит понимать, что в Python обычно не принято проверять типы объектов (вместо этого практикуется утиная типизация).
help
Если вы находитесь в Python Shell или делаете отладку кода с использованием breakpoint
, и хотите знать, как работает определённый объект, метод или атрибут, функция help
поможет вам.
В действительности вы, скорее всего, будете обращаться за помощью к поисковой системе. Но если вы уже находитесь в Python Shell, вызов help(list.insert)
будет быстрее, чем поиск документации в Google.
Функции, которые пригодятся позже
В начале изучения Python эти функции вам по большей части будут не нужны, но в конечном итоге они вам понадобятся.
open
Эта функция служит для открытия файла и последующей работы с ним. Но, если вы не работаете с файлами напрямую, то она вам может и не пригодиться.
Несмотря на то, что работа с файлами очень распространена, далеко не все программисты Python работают с файлами через open
. Например, разработчики Django могут не использовать её вообще.
input
Эта функция запрашивает у пользователя ввод, ждёт нажатия клавиши Enter, а затем возвращает набранный текст.
Чтение из стандартного ввода — это один из способов получить входные данные в программе. Но есть и много других способов: аргументы командной строки, чтение из файла, чтение из базы данных и многое другое.
repr
Эта функция необходима для представления объекта в читабельном виде.
Для многих объектов функции str
и repr
работают одинаково.
>>> str(4), repr(4)
('4', '4')
>>> str([]), repr([])
('[]', '[]')
Но есть объекты, для которых их применение различается.
>>> str('hello'), repr("hello")
('hello', "'hello'")
>>> from datetime import date
>>> str(date(2020, 1, 1)), repr(date(2020, 1, 1))
('2020-01-01', 'datetime.date(2020, 1, 1)')
Строковое представление, которое вы видите в Python Shell, использует repr
, тогда как функция print
использует str
.
>>> date(2020, 1, 1)
datetime.date(2020, 1, 1)
>>> "hello!"
'hello!'
>>> print(date(2020, 1, 1))
2020-01-01
>>> print("hello!")
hello!
Также repr
используется при ведении лог-журнала, обработке исключений и реализации более сложных методов.
super
Эта функция очень важна, если используется наследование одного класса от другого.
Многие пользователи Python редко создают классы. Они не являются важной частью Python, хоть для многих типов программирования они необходимы. Например, вы не можете использовать веб-фреймворк Django без создания классов.
property
Эта функция является декоратором и дескриптором.
Декоратор позволяет создать атрибут, который всегда будет содержать возвращаемое значение конкретного вызова функции. Это проще всего понять на примере.
Пример класса, который использует property
.
class Circle:
def __init__(self, radius=1):
self.radius = radius
@property
def diameter(self):
return self.radius * 2
Здесь вы можете увидеть доступ к атрибуту diameter
объекта Circle
.
>>> circle = Circle()
>>> circle.diameter
2
>>> circle.radius = 5
>>> circle.diameter
10
Если вы занимаетесь объектно-ориентированным программированием на Python, вам, вероятно, захочется узнать о property
больше в какой-то момент. В отличие от других объектно-ориентированных языков, в Python property
используется вместо методов getter
и setter
.
issubclass и isinstance
Функция issubclass
проверяет, является ли класс подклассом одного или нескольких других классов.
>>> issubclass(int, bool)
False
>>> issubclass(bool, int)
True
>>> issubclass(bool, object)
True
Функция isinstance
проверяет, является ли объект экземпляром одного или нескольких классов.
>>> isinstance(True, str)
False
>>> isinstance(True, bool)
True
>>> isinstance(True, int)
True
>>> isinstance(True, object)
True
Функция isinstance
может быть представлена как делегирование в issubclass
.
>>> issubclass(type(True), str)
False
>>> issubclass(type(True), bool)
True
>>> issubclass(type(True), int)
True
>>> issubclass(type(True), object)
True
Если вы перегружаете операторы, вам может понадобиться использование isinstance
, но в целом в Python стараются избегать строгой проверки типов, поэтому особой нужды в данных функциях нет.
hasattr, getattr, setattr и delattr
Если нужно работать с атрибутами объекта, но имя атрибутов является динамическим и постоянно меняется, данные функции вам будут необходимы.
Например, есть объект thing
, который нужно проверить на конкретное значение.
>>> class Thing: pass
...
>>> thing = Thing()
Функция hasattr
позволяет проверить, имеет ли объект определённый атрибут.
>>> hasattr(thing, 'x')
False
>>> thing.x = 4
>>> hasattr(thing, 'x')
True
Функция getattr
позволяет получить значение атрибута (с необязательным значением по умолчанию, если атрибут не существует).
>>> getattr(thing, 'x')
4
>>> getattr(thing, 'x', 0)
4
>>> getattr(thing, 'y', 0)
0
Функция setattr
позволяет установить значение атрибута.
>>> setattr(thing, 'x', 5)
>>> thing.x
5
И delattr
соответственно удаляет атрибут.
>>> delattr(thing, 'x')
>>> thing.x
Traceback (most recent call last):
File "", line 1, in
AttributeError: 'Thing' object has no attribute 'x'
classmethod и staticmethod
Если у вас есть метод, который должен вызываться в экземпляре или в классе, вам нужен декоратор classmethod
. Фабричные методы (альтернативные конструкторы) являются распространённым случаем для этого.
class RomanNumeral:
"""Римская цифра, представленная как строка и число."""
def __init__(self, number):
self.value = number
@classmethod
def from_string(cls, string):
return cls(roman_to_int(string)) # Функция пока еще не существует
Немного сложнее придумать хорошее использование staticmethod
, так как всегда можно использовать функцию уровня модуля вместо статического метода.
class RomanNumeral:
"""Римская цифра, представленная как строка и число."""
SYMBOLS = {'M': 1000, 'D': 500, 'C': 100, 'L': 50, 'X': 10, 'V': 5, 'I': 1}
def __init__(self, number):
self.value = number
@classmethod
def from_string(cls, string):
return cls(cls.roman_to_int(string))
@staticmethod
def roman_to_int(numeral):
total = 0
for symbol, next_symbol in zip_longest(numeral, numeral[1:]):
value = RomanNumeral.SYMBOLS[symbol]
next_value = RomanNumeral.SYMBOLS.get(next_symbol, 0)
if value < next_value:
value = -value
total += value
return total
Функция roman_to_int
не требует доступа к экземпляру или классу, поэтому ей не нужно быть @classmethod
. Фактически нет необходимости делать эту функцию staticmethod
(вместо classmethod
). staticmethod
является просто более сдерживающим, чтобы сигнализировать о том факте, что функция не зависима от класса, в котором она находится.
next
Данная функция возвращает следующий элемент в итераторе.
Она может работать со следующими видами итераторов:
- объекты
enumerate
; - объекты
zip
; - возвращаемые значения функции
reversed
; - файлы
- объекты
csv.reader
; - генератор-выражения;
- генератор-функции;
Функция next
может быть представлена как способ вручную перебрать набор, чтобы получить один единственный элемент, а затем выйти из перебора.
Функции, которые когда-нибудь можно выучить
Следующие встроенные функции Python определённо не бесполезны, но они более специализированы.
Эти функции вам, возможно, будут нужны, но также есть шанс, что вы никогда не прибегнете к ним в своём коде.
- iter: возвращает итератор (список, набор и т. д.);
- callable: возвращает
True
, если аргумент является вызываемым; - filter and map: вместо них рекомендуется использовать генератор-выражения;
- Round: округляет число;
- divmod: эта функция выполняет деление без остатка (
//
) и операцию по модулю (%
) одновременно; - bin, oct и hex: служат для отображения чисел в виде строки в двоичной, восьмеричной или шестнадцатеричной форме;
- abs: возвращает абсолютное значение числа (аргумент может быть целым или числом с плавающей запятой, если аргумент является комплексным числом, его величина возвращается);
- hash;
- object.
Прочие специфические функции
- ord и chr: могут пригодиться при изучении ASCII или Unicode;
- exec и eval: для исполнения строки;
- compile;
- slice: если вы реализуете
__getitem__
для создания пользовательской последовательности, это может вам понадобиться; - bytes, bytearray и memoryview: если вы часто работаете с байтами;
- ascii: похож на
repr
, но возвращает представление объекта только в ASCII; - frozenset: как
set
, но он неизменен (и хешируемый); - __import__: лучше использовать
importlib
; - format: вызывает метод
__format__
, который используется для форматирования строк; - pow: оператор возведения в степень (
**
); - complex: если вы не используете комплексные числа (
4j + 3
), она вам не понадобится.
Заключение
Если вы только начинаете свой путь в изучении Python, нет необходимости изучать все встроенные функции сейчас. Не торопитесь, сосредоточьтесь на первых двух пунктах (общеизвестные и упускаемые из виду), а после можете перейти и к другим, если/когда они вам понадобятся.
Перевод статьи «Python built-ins worth learning»
Программирование на Phyton. ЕГЭ 2022
Урок 1 из 5. Основы
Языки программирования бывают разные, например, для веба хорошо подходит PHP, а если хочешь написать ОС, то лучше всего Си. В принципе, большинство современных языков – полные, то есть на любом из них можно написать что угодно: хоть сайт, хоть игру.
Но не рекомендую вам писать видеоигры на Паскале:)
Какой язык лучше всего учить сейчас? Он должен отвечать двум критериям:
- Не очень сложный синтаксис: его нужно успеть освоить в совершенстве за учебный год. Поэтому если вы не знаете Java, например, то лучше оставить его на потом;
- На нем должно быть удобно решать задачи из ЕГЭ (спасибо, кэп).
Ну, что, вы уже догадались, к чему я веду?:)
Конечно, нам подходит Python. У него простой синтаксис, и, главное, – очень много встроенных функций, которые существенно облегчают жизнь.
Например, сравните код на Паскале и на Питоне для вот этой задачи:
Дана строка, у которой могут быть пробелы в начале, в конце и между словами может оказаться более одного пробела. Уберите все лишние пробелы, т.е. удалите все пробелы в начале и конце, а между словами оставьте только один пробел.
Паскаль:
var s: string;
begin
readln(s);
p := 0;
while s[p] = ‘ ‘ do
delete(s, p, 1); {удаляем все пробелы в начале}
p := length(s);
while s[p] = ‘ ‘ do begin
delete(s, p, 1); {удаляем все пробелы в конце}
p := p – 1;
end;
p := pos(s, ‘ ‘);
while pos(s, ‘ ‘) <> 0 do
begin
delete(s, p, 1); {удаляем один пробел каждый раз, когда встретили два пробела подряд}
p := pos(s, ‘ ‘);
end;
writeln(s)
end.
Питон:
s = input().strip() # считываем и сразу удаляем лишние пробелы вначале и в конце
while s.find(‘ ‘) >= 0:
s = s.replace(‘ ‘, ‘ ‘) # заменяем два пробела на один
print(s)
Если вы думаете, что будет что-то ещё, вы ошибаетесь: это и есть вся программа 🙂 Некоторые программы на питоне вообще можно написать в одну строку!
В общем, думаю, я вас заинтересовал. А если вы хотите научиться так же влёгкую решать задачки из ЕГЭ (а потом и более сложные, то есть становиться программистом), вам самое время смотреть первый вебинар марафона “Программирование на Phyton!”
Документация
Библиотека работает в Python 3.6+
Немного терминологии
Модуль — это файл с расширением .py
, находящийся в библиотеке.
Например, модуль constants
— это файл constants.py
.
Модуль decorators
1. Декоратор cache
Для чего: мемоизация работы функции.
Пример использования:
from infEGE import cache @cache def fib(n): if n in {0,1}: return 1 return fib(n - 1) + fib(n - 2) fib(50)
Если убрать @cache
, то вычисляться будет очень долго.
Модуль constants
Для чего: константы для использования в алгоритмах.
Содержимое:
E = 2.718281828459045 PI = 3.141592653589793 maxValue = float('inf') minValue = float('-inf')
Модуль algebra_logic
1. Функция print_true_table
Синтаксис: print_true_table(variables: str, expretion: str, value: Union[int, bool, ‘all’] = ‘all’) -> None
Для чего:
Вывод таблицы истинности лог.функции expretion от переменных variables.
Если value='all', выводятся все строки таблицы;
Если value=1 или True, выводятся строки таблицы, где функция истинна;
Если value=0 или False, выводятся строки таблицы, где функция ложна.
В качестве лог.операций можно использовать обычные операции Python
или такие эквиваленты:
{"&": " and ", "|": " or ", "~": " not ", "->": "<="}.
Пример использования #1:
from infEGE import print_true_table print_true_table("xy", "x->y", 1)
Вывод:
xy F
00 1
01 1
11 1
Внимание: в Python приоритет <= выше, чем and, or, not! Ставьте скобки!
Пример использования #2:
from infEGE import print_true_table print_true_table("xy", "x&(y|x)|y", 0)
Вывод:
xy F
00 0
Пример использования #3:
from infEGE import print_true_table print_true_table("xzy", "x or z and (y or not x)")
Вывод:
xzy F
000 0
001 0
010 1
011 1
100 1
101 1
110 1
111 1
Модуль combinatorics
1. Функция permutation_with_repeat
Синтаксис: permutation_with_repeat(seq: Union[list, tuple, str], repeat: int = 1)
Для чего:
Возвращает перестановки элкементов итерируемого
обьекта seq с repeat повторениями.
Пример использования:
from infEGE import permutation_with_repeat for el in permutation_with_repeat('123', 2): print(el)
Вывод:
('1', '1')
('1', '2')
('1', '3')
('2', '1')
('2', '2')
('2', '3')
('3', '1')
('3', '2')
('3', '3')
2. Функция permutations
Синтаксис: permutations(seq: Union[list, tuple, str]):
Для чего:
Возвращает перестановки элкементов итерируемого объекта seq.
Пример использования:
from infEGE import permutations for el in permutations('abc'): print(el)
Вывод:
abc
acb
bac
bca
cab
cba
Модуль lists_and_other
1. Функция prod
Синтаксис: prod(seq: Union[list, tuple, set]) -> Union[int, float]
Для чего:
Возввращает произведение элементов итерируемого объекта seq.
Пример использования:
from infEGE import prod print(prod([5, 8, 6, 100, 54]))
Вывод:
1296000
Модуль string
1. Функция replacing
Синтаксис: replacing(string: str, substring: str, new_string: str, mode: str = ‘обычно’, cnt: Union[int, str] = ‘all’) -> str
Для чего:
Возвращает строку string с заменённой подстрокой
substring на подстроку new_string в количестве cnt.
Режим "обычно":
замена стандартным replace
Режим "целиком":
замена подстроки substring если она не
является частью большей подстроки.
Пример использования #1:
from infEGE import replacing print(replacing("Питон плохой тон", "тон", "нот"))
Вывод:
Пинот плохой нот
Пример использования #2:
from infEGE import replacing print(replacing("Питон плохой тон", "тон", "нот", cnt=1))
Вывод:
Пинот плохой тон
Пример использования #3:
from infEGE import replacing print(replacing("Питон плохой тон", "тон", "нот", "целиком"))
Вывод:
Питон плохой нот
2. Функция index_n
Синтаксис: index_n(string: str, substring: str, n: int = 1) -> int
Для чего:
Возвращает индекс n-го вхождения СЛЕВА подстроки
substring в строку string. Если такого вхождения
нет, возвращается -1000.
Пример использования #1:
from infEGE import index_n print(index_n("01230123", "1"))
Вывод:
1
Пример использования #2:
from infEGE import index_n print(index_n("01230123", "1", 2))
Вывод:
5
Пример использования #3:
from infEGE import index_n print(index_n("01230123", "1", 3))
Вывод:
-1000
3. Функция is_number
Синтаксис: is_number(n: str) -> bool
Для чего:
Проверяет является ли строка n числом.
Если да возвращается True, иначе - False.
Пример использования #1:
from infEGE import is_number print(is_number("23"))
Вывод:
True
Пример использования #2:
from infEGE import is_number print(is_number("2n3"))
Вывод:
False
Модуль system_count
1. Функция to_base
Синтаксис: to_base(number: Union[int, str], old_base: int = 10, new_base: int = 10) -> Union[int, str]
Для чего:
Переводит число number с основанием old_base в число
с основанием new_base.
Пример использования #1:
from infEGE import to_base print(to_base(5, new_base=2))
Вывод:
101
Пример использования #2:
from infEGE import to_base print(to_base(15, new_base=16))
Вывод:
F
Пример использования #3:
from infEGE import to_base print(to_base("FA32", old_base=17, new_base=10))
Вывод:
76638
Пример использования #4:
from infEGE import to_base print(to_base("FA32", old_base=17, new_base=6))
Вывод:
1350450
Модуль mathematics
1. Функция is_prime
Синтаксис: is_prime(n: int) -> bool
Для чего:
Если n - простое, то возващается True, иначе - False.
Пример использования #1:
from infEGE import is_prime print(is_prime(5))
Вывод:
True
Пример использования #2:
from infEGE import is_prime print(is_prime(25))
Вывод:
False
Пример использования #3:
from infEGE import is_prime print(is_prime(1))
Вывод:
False
2. Функция is_even
Синтаксис: is_even(n: int) -> bool
Для чего:
Если n - чётно, то возващается True, иначе - False.
Пример использования #1:
from infEGE import is_even print(is_even(12))
Вывод:
True
Пример использования #2:
from infEGE import is_even print(is_even(25))
Вывод:
False
3. Функция is_odd
Синтаксис: is_odd(n: int) -> bool
Для чего:
Если n - нечётно, то возващается True, иначе - False.
Пример использования #1:
from infEGE import is_odd print(is_odd(12))
Вывод:
False
Пример использования #2:
from infEGE import is_odd print(is_odd(25))
Вывод:
True
4. Функция divided
Синтаксис: divided(n: int, d: int) -> bool
Для чего:
Если n нацело делится на d, то возвращается True, иначе - False.
Пример использования #1:
from infEGE import divided print(divided(12, 5))
Вывод:
False
Пример использования #2:
from infEGE import divided print(divided(121, 11))
Вывод:
True
5. Функция not_divisible
Синтаксис: not_divisible(n: int, d: int) -> bool
Для чего:
Если n не делится нацело на d, то возвращается True, иначе - False.
Пример использования #1:
from infEGE import not_divisible print(not_divisible(12, 5))
Вывод:
True
Пример использования #2:
from infEGE import not_divisible print(not_divisible(121, 11))
Вывод:
False
6. Функция factorial
Синтаксис: factorial(n: int) -> int
Для чего:
Возвращает n! (0! = 1)
Пример использования:
from infEGE import factorial print(factorial(6))
Вывод:
720
7. Функция factorize
Синтаксис: factorize(number: int) -> list
Для чего:
Возвращает разложение числа number на простые множители в list.
Пример использования #1:
from infEGE import factorize print(factorize(1))
Вывод:
[]
Пример использования #2:
from infEGE import factorize print(factorize(11))
Вывод:
[11]
Пример использования #3:
from infEGE import factorize print(factorize(55))
Вывод:
[5, 11]
8. Функция divisors
Синтаксис: divisors(n: int) -> list
Для чего:
Возвращает все натуральные делители числа n на интервале (1; n).
Пример использования #1:
from infEGE import divisors print(divisors(1))
Вывод:
[]
Пример использования #2:
from infEGE import divisors print(divisors(720))
Вывод:
[2, 3, 4, 5, 6, 8, 9, 10, 12, 15, 16, 18, 20, 24, 30, 36, 40, 45, 48, 60, 72, 80, 90, 120, 144, 180, 240, 360]
9. Функция fib
Синтаксис: fib(n: int) -> int
Для чего:
Возвращает n-ый член последовательности Фибоначчи. Нумерация с 0.
Пример использования #1:
from infEGE import fib print(fib(0))
Вывод:
0
Пример использования #2:
from infEGE import fib print(fib(1))
Вывод:
1
Пример использования #3:
from infEGE import fib print(fib(2))
Вывод:
1
Пример использования #4:
from infEGE import fib print(fib(3))
Вывод:
2
Пример использования #5:
from infEGE import fib print(fib(2001))
Вывод:
6835702259575806647045396549170580107055408029365524565407553367798082454408054014954534318953113802726603726769523447478238192192714526677939943338306101405105414819705664090901813637296453767095528104868264704914433529355579148731044685634135487735897954629842516947101494253575869699893400976539545740214819819151952085089538422954565146720383752121972115725761141759114990448978941370030912401573418221496592822626
Примечание: Данный алгоритм работает быстрее рекурсивного! Асимптоматика: O(N)
Каждое значение в Python имеет тип. Поскольку всё в Python — объекты, типы являются классами, а значения — экземплярами (объектами) этих классов.
Прим. перев. В Python 2 типы и классы — разные понятия, в то время как в Python 3 это одно и то же.
В Python есть разные типы, давайте рассмотрим самые основные.
Числа
Целые числа, числа с плавающей запятой и комплексные числа относятся к группе чисел. В Python они представлены классами int
, float
и complex
.
Мы можем использовать функцию type()
, чтобы узнать класс переменной или значения, и функцию isinstance()
для проверки принадлежности объекта определённому классу:
>>> a = 5
>>> print(a, "is of type", type(a))
5 is of type <class 'int'>
>>> a = 2.0
>>> print(a, "is of type", type(a))
2.0 is of type <class 'float'>
>>> a = 1+2j
>>> print(a, "is complex number?", isinstance(1+2j, complex))
(1+2j) is complex number? True
Целые числа могут быть любой длины, они ограничиваются лишь доступной памятью.
Числа с плавающей запятой имеют ограниченную точность. Визуально разницу между целым числом и числом с плавающей запятой можно заметить в консоли по наличию точки: 1
— целое число, 1.0
— с плавающей запятой.
Комплексные числа записываются в форме x+yj
, где x
— действительная часть числа, а y
— мнимая. Вот несколько примеров:
>>> a = 1234567890123456789
>>> a
1234567890123456789
>>> b = 0.1234567890123456789
>>> b
0.12345678901234568
>>> c = 1+2j
>>> c
(1+2j)
Обратите внимание, что значение переменной b
было усечено.
Списки
Список представляет собой упорядоченную последовательность элементов. Он очень гибкий и является одним из самых используемых типов в Python. Элементы списка не обязательно должны быть одного типа.
Объявить список довольно просто. Внутрь квадратных скобок помещаются элементы списка, разделённые запятой:
>>> a = [1, 2.2, 'python']
Мы можем использовать оператор []
для извлечения элемента (такая операция называется «доступ по индексу») или диапазона элементов (такая операция назвается «извлечение среза») из списка. В Python индексация начинается с нуля:
>>> a = [5,10,15,20,25,30,35,40]
>>> print("a[2] =", a[2])
a[2] = 15
>>> print("a[0:3] =", a[0:3])
a[0:3] = [5, 10, 15]
>>> print("a[5:] =", a[5:])
a[5:] = [30, 35, 40]
Списки являются изменяемым типом, т.е. значения его элементов можно изменить:
>>> a = [1,2,3]
>>> a[2] = 4
>>> a
[1, 2, 4]
Кортежи
Так же как и список, кортеж (tuple) является упорядоченной последовательностью элементов. Вся разница заключается в том, что кортежи неизменяемы.
Кортежи используются для защиты данных от перезаписи и обычно работают быстрее, чем списки, т.к. их нельзя изменять.
Для создания кортежа нужно поместить внутрь круглых скобок элементы, разделённые запятой:
>>> t = (5,'program', 1+3j)
Мы можем использовать оператор извлечения среза []
для извлечения элементов, но мы не можем менять их значения:
>>> t = (5,'program', 1+3j)
>>> print("t[1] =", t[1])
t[1] = program
>>> print("t[0:3] =", t[0:3])
t[0:3] = (5, 'program', (1+3j))
# Приводит к ошибке, т.к.
# кортежи неизменяемы
>>> t[0] = 10
Строки
Строка представляет собой последовательность символов. Мы можем использовать одинарные или двойные кавычки для создания строки. Многострочные строки можно обозначить тройными кавычками, '''
или """
:
>>> s = "Простая строка"
>>> s = '''многострочная
строка'''
Как и в случае со списками и кортежами, мы можем использовать оператор []
и со строками. Стоит отметить, что строки в Python относятся к категории неизменяемых последовательностей, то есть все функции и методы могут лишь создавать новую строку.
Множества
Множество является неупорядоченной уникализированной последовательностью. Объявляется множество с помощью элементов, разделённых запятой, внутри фигурных скобок:
>>> a = {5,2,3,1,4}
# вывод переменной множества
>>> print("a =", a)
a = {1, 2, 3, 4, 5}
# тип данных переменной а
>>> print(type(a))
<class 'set'>
Над множествами можно выполнять такие операции, как объединение и пересечение. Т.к. элементы в множестве должны быть уникальны, они автоматически удаляют дубликаты:
>>> a = {1,2,2,3,3,3}
>>> a
{1, 2, 3}
Поскольку множество является неупорядоченной последовательностью, оператор извлечения среза здесь не работает:
>>> a = {1,2,3}
>>> a[1]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'set' object does not support indexing
Словари
Словари — неупорядоченные наборы пар ключ-значение.
Они используются, когда нужно сопоставить каждому из ключей значение и иметь возможность быстро получать доступ к значению, зная ключ. В других языках словари обычно называются map
, hash
или object
. Словари оптимизированы для извлечения данных. Чтобы извлечь значение, нужно знать ключ.
Словарь объявляется парами элементов в форме ключ:значение, заключенными в фигурные скобки:
>>> d = {1:'value', 'key':2}
>>> type(d)
<class 'dict'>
Значение может быть любого типа, а вот ключ — только неизменяемого.
Мы используем ключ, чтобы получить соответствующее ему значение. Но не наоборот:
>>> d = {1:'value', 'key':2}
>>> print("d[1] =", d[1]);
d[1] = value
>>> print("d['key'] =", d['key']);
d['key'] = 2
# Приводит к ошибке
>>> print("d[2] =", d[2]);
Преобразование типов данных
Мы можем преобразовывать значения из одного типа в другой с помощью таких функций, как int()
, float()
, str()
и т.д.
>>> float(5)
5.0
При преобразовании числа с плавающей запятой в целое будет утеряна часть после запятой:
>>> int(10.6)
10
>>> int(-10.6)
-10
Для преобразования из/в строку должны использоваться совместимые значения:
>>> float('2.5')
2.5
>>> str(25)
'25'
>>> int('1p')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '1p'
Можно даже преобразовывать одну последовательность в другую:
>>> set([1,2,3])
{1, 2, 3}
>>> tuple({5,6,7})
(5, 6, 7)
>>> list('hello')
['h', 'e', 'l', 'l', 'o']
Прим. перев. Для преобразования списка из символов обратно в строку нельзя вызвать str(список)
, так как в результате мы получим строковое представление списка (наподобие того, что мы видим, когда выводим список на экран). Вместо этого нужно сделать следующее:
''.join(['h', 'e', 'l', 'l', 'o'])
Для преобразования в словарь каждый элемент последовательности должен быть парой:
>>> dict([[1,2],[3,4]])
{1: 2, 3: 4}
>>> dict([(3,26),(4,44)])
{3: 26, 4: 44}
Интересуетесь Python? Тогда взгляните на нашу подборку книг для программистов любого уровня.
Перевод статьи «Python Data Types»
Начав писать главу про ООП, понял что совсем забыл освятить такой большой и нужный раздел Пайтона как функции. Тема это большая и обширная, потому, чтобы не сильно растягивать паузу между уроками, решил разделить ее на 2 части. Сначала расскажу основы, потом уже углубленные особенности Пайтоновского функциестроения.
Функции в Пайтоне объявляются не просто, а очень просто. Вот пример самой простой:
Def empty_func():
pass
Начинается объявление с ключевого слова def, что как не сложно догадаться является сокращением от define. После него идет имя функции. После имени в круглых скобках задается список параметров, в данном случае отсутствующих.
Тело функции пишется с отступом со следующей строки. учтите, что в Пайтоне функции с пустым телом запрещены, потому в качестве тела приведенной выше функции используется «пустой оператор» pass.
Теперь рассмотрим пример посерьезнее.
Def safe_div(x, y):
«»»Do a safe division:-)
for fun and profit»»»
if y != 0:
z = x / y
print z
return z
else:
print «Yippie-kay-yay, motherf___er!»
В этом примере есть несколько нововведений. первое, что бросается в глаза — это строка документации (docstring), идущая сразу после тела функции.
Обычно эта строка занимает не одну строку исходного текста (простите за каламбур) и потому задается в тройных кавычках. Она предназначена для описания функции, ее предназначения, параметров и т.п. Все хорошие ИДЕ умеют с этой строкой работать. Получить к ней доступ можно и из самой программы, используя свойство __doc__:
Print safe_div.__doc__
Этим свойством (да, да, именно свойством, в Пайтоне даже функции на самом деле — классы) удобно пользоваться во время сеансов работы интерактивной консоли.
>>> from ftplib import FTP
>>> print FTP.__doc__
An FTP client class.
To create a connection, call the class using these argument:
host, user, passwd, acct
These are all strings, and have default value «».
Then use self.connect() with optional host and port argument.
# дальнейшее почикано мною:-)
Вернемся к нашей исходной функции. Суть ее очень проста, она принимает 2 параметра: х и у. Если у не равен 0, она делит х на у, выводит результат на экран и возвращает свое частное в виде результата. Результат функции возвращают с помощью команды return. Благодаря механизму кортежей, описанному в прошлом уроке, функции в Пайтоне могут возвращать одновременно множество объектов.
Если же делитель все-таки равен нулю, функция выводит сообщение об ошибке. Неверно было бы предположить что в этом случае функция ничего не вернет. Правильнее будет сказать что функция вернет «ничего»:) Иначе говоря, если в функции отсутствует оператор return, или же он вызван без параметров, то функция возвращает специальное значение None. В этом легко убедиться вызвав что-то типа print safe_div(10, 0).
Вот пример слегка посложнее, он взят из доклада-презентации Гвидо ван Россума.
Def gcd(a, b):
«Нахождение НОД»
while a != 0:
a,b = b%a,a # параллельное определение
return b
Данная функция находит наибольший общий делитель двух чисел.
В общем, следует учитывать, что параметры в функции Пайтоном передаются по ссылке. Еще одним, возможно нетривиальным фактом к которому придется привыкать — является тот факт что сами функции являются значением, которое можно присваивать. Если воспользоваться нашей функцией safe_div для дальнейших экспериментов, то можно написать следующий код.
Mystic_function = safe_div
print mystic_function(10, 4)
Вот на этот раз и все, «за бортом» осталось еще много аспектов определения функций в Пайтоне, которые будут освещены в следующий раз.
Упражнения для проверки.
1. На основе существующей функции нахождения НОД, напишите функцию поиска НОК двух чисел.
2. Напишите подпрограмму табулирования функции, переданной в качестве аргумента. Так же аргументами задается начальное, конечное значение и шаг табуляции.
PS кстати, каков оптимальный объем «урока»? Что лучше — реже выходящие большие главы, или «лучше меньше да чаще».
Быстрая навигация:
1.31 Списки — массивы. Первое знакомство. 1.30 Функции которые возвращают результат — return 1.29 Подпрограммы: функции и процедуры в Питоне 1.28 Преобразование типов данных — int() 1.27 Ввод данных с клавиатуры — input() 1.26 Типы и размеры данных 1.25 Цикл с предусловием — while. Числа Фибоначчи 1.24 Измерение длины строки, списки 1.23 Срезы строк — вывод определенного количества символов из имеющегося текста 1.22 Строки и управляющие символы 1.21 Системные ошибки в процессе отладки программы 1.20 Оператор ветвления — if, комментарии 1.19 Вывод на печать — print(), быстрый ввод данных, округление, комментарии 1.18 Типы программирования. Часть 2. Объектно-ориентированное программирование 1.17 Типы программирования. Часть 1. Структурное программирование. Циклы 1.16 Представление символьной информации — ASCII 1.15 Деление двоичных чисел 1.14 Математические операции с двоичными числами 1.13 Как хранится и записывается информация. Биты и байты 1.12 Перевод целых чисел десятичной системы счисления в другую систему 1.11 Перевод целых чисел из шестнадцатеричной системы счисления в десятичную 1.10 Перевод целого двоичного числа в шестнадцатеричное 1.9 Перевод целого двоичного числа в другую систему счисления 1.8 Системы счисления 1.7 Булевая алгебра. Логические выражения 1.6 Базовые понятия. Часть 3 — Числа, выражения, операнды, знаки операций 1.5 Базовые понятия. Часть 2 — Программа, данные 1.4 Базовые понятия. Часть 1 — Задача и алгоритм 1.3 Среда разработки СИ 1.2 История языков программирования 1.1 Введение
При написании программ в любом языке программирования необходимо стремиться к написанию компактных кодов, чтобы можно было легко ориентироваться в самом коде.
Бывает что реализовать таким образом свой код не представляется возможным и, зачастую, программный код выглядит как нескончаемой длинны свиток древнего документа, который занимает 10 — 15 экранов монитора по вертикали…
Конечно же разобраться в такой программе бывает крайне сложно самому автору такого творения.
В этом случае на помощь программисту приходит возможность разбиения кода программы на подпрограммы
.
Подпрограмма
— это некая законченная программа, но не самостоятельная.
Она вызывается из какой то программы более высокого уровня только для выполнения того или иного действия.
Как это выглядит на практике?
К примеру в какой то очень большой программе вам необходимо произвести (мы с вами уже рассматривали алгоритм его работы).
И вместо того, чтобы в этом большом программном коде каждый раз писать еще и код для расчета чисел Фибоначчи, мы просто выносим его в отдельный файл. Это и будет подпрограмма.
Тогда в том месте где должен производиться необходимый расчет этих чисел мы вставляем лишь некое указание на то, чтобы в этом месте была вызвана наша подпрограмма.
В этом случае программный код значительно уменьшается в объеме и разобраться в работе программы будет намного легче.
В разных языках программирования такие подпрограммы называются:
Процедурами или
— функциями
В языке СИ такие подпрограммы называются функциями.
Кстати мы с вами уже применяли функции на практике!
Например мы с вами использовали ВСТРОЕННЫЕ в интерпретатор функции:
Print() — для вывода данных на печать неких параметров, которые были заключены в круглые скобки
— str() — для преобразования данных к строковому типу. Именно ее предварительно запускает функция print()
— int() — для преобразования данных к целому числу
— float() — для преобразования целых чисел в дробный тип
— round() — для округления некоего значения
и т.п.
Итак.
Для вызова функции достаточно набрать ее имя и в скобках перечислить требуемые параметры (аргументы) которые мы хотим передать в данную функцию.
Но было бы совсем неинтересно, если бы у нас не было возможности создавать свои собственные функции для выполнения тех или иных задач.
Что касается Питона, то в нем существует специальный оператор определения функции, имеющий следующий синтаксис:
def ИМЯ_ФУНКЦИИ(СПИСОК_ПАРАМЕТРОВ):
ПОСЛЕДОВАТЕЛЬНОСТЬ_ВЫРАЖЕНИЙ
Имена функций следует подбирать также, как и имена переменных — по тем же правилам: имя должно начинаться с латинской буквы.
— В списке параметров находятся некие значения, которые передаются в функцию. Эти параметры перечисляются через запятую.
В Питоне для определения функции первым параметром пишется служебное слово def
(заголовок функции) (от define
— определить) — этим мы указываем, что будем вызывать функцию.
Заголовок функции после закрывающей круглой скобки заканчивается двоеточием (в Питоне) и далее следуют необходимые выражения начинающиеся со смещения относительно начала строки (используется как правило клавиша TAB).
Возвращаясь к расчету чисел Фибоначчи рассмотрим на его примере работу вызова функции.
Мы возьмем еще один вариант расчета чисел Фибоначчи, который не рассматривали ранее.
Он основан на параллельном присваивании значений переменным.
Def fib(n):
a, b = 0, 1
while a
Если вкратце, то строка:
a, b = 0, 1
означает запись (но не полностью эквивалентна ей):
a = 0
b = 1
А строка
a, b = b, a + b
означает запись:
a = b
b = a + b
Рассмотрим код по строкам:
1
def fib(n):
— определить (def
) функцию по имени fib
с параметрами (аргументами) указанными в круглых скобках которые мы хотим передать в эту самую функцию по имени fib
.
Т.е. в качестве параметра n
мы будем передавать значение для которого будет производиться расчет. Это число будет передаваться в нашу функцию в качестве аргумента.
После двоеточия вводимые данные в интерпретаторе Python печатаются с отступом. Это говорит о том, что эти данные имеют непосредственное отношение к данной функции.
2
a, b = 0, 1
Инициализируем переменные соответствующими значениями:
a = 0
b = 1
3
while a Оператор цикла while
— будет выполняться до тех пор, пока будет выполнено условие цикла a
Здесь также после двоеточия открывается новый блок имеющий НЕПОСРЕДСТВЕННОЕ отношение только к циклу.
Этот блок будет печататься после перевода строки с дополнительным отступом.
4
print(a, end = » «)
Выводим на печать данные переменной а и пробел после каждого витка цикла
5
a, b = b, a + b
Присваиваем переменным соответствующие значения:
a = b
b = a + b
Для изменения исходных данных и продолжения работы расчета чисел Фибоначчи
6
print()
Обратите внимание на то, что данный print()
нужно печатать ПОД while
… т.е. он уже относится не к телу цикла while
, а к телу функции fib
Однако для чего нам нужен второй print()
да еще и с пустыми скобками?
В данном случае это вывод пустой строки — сделать «отбивку» — перенос строки. А еще вернее, данная функция выводит на печать символ перевода строки.
В нашем случае можно и не использовать.
Итак мы определили функцию fib
для расчета чисел Фибоначчи и она, как вы заметили — не работает.
Для того, чтобы она заработала необходимо ее ВЫЗВАТЬ и передать ей некий параметр для расчетов.
Вызываем нашу функцию и передаем в качестве аргумента значение 40
.
В результате мы должны получить расчет чисел Фибоначчи для всех чисел до 40
:
Печатаем в интерпретаторе Python:
fib(40)
Получаем:
0 1 1 2 3 5 8 13 21 34
Вы можете еще раз вызвать функцию fib()
с другим параметром и точно также получите вывод необходимых данных.
Например введем
fib(400)
И получим:
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377
Таким образом нашу функцию можно запускать необходимое количество раз.
Во многих языках программирования процедура и функция не синонимы и имеют отличия друг от друга.
Чем же они отличаются друг от друга в таких языках программирования?
Функция — возвращает значение
— Процедура — не возвращает значение
Поясним на примере:
Если мы можем использовать такую запись (только в качестве примера):
x = fib(n)
— то это функция, она присваивает полученное значение переменной x
(в данном случае переменной x ничего записано не будет)
Если же возможна только запись fib(n)
— то это процедура.
Таким образом мы можем сказать, что наш пример является ПРОЦЕДУРОЙ.
Как в Питоне использовать наш код для расчета чисел Фибоначчи в качестве функции мы рассмотрим несколько позже…
Последнее обновление: 11.04.2018
Функции представляют блок кода, который выполняет определенную задачу и который можно повторно использовать в других частях программы. Формальное определение функции:
Def имя_функции ([параметры]):
инструкции
Определение функции начинается с выражения def
, которое состоит из имени функции, набора скобок с параметрами и двоеточия.
Параметры в скобках необязательны. А со следующей строки идет блок инструкций, которые выполняет функция. Все инструкции функции имеют отступы от начала строки.
Например, определение простейшей функции:
Def say_hello():
print(«Hello»)
Функция называется say_hello . Она не имеет параметров и содержит одну единственную инструкцию,
которая выводит на консоль строку «Hello».
Для вызова функции указывается имя функции, после которого в скобках идет передача значений для всех ее параметров. Например:
Def say_hello():
print(«Hello»)
say_hello()
say_hello()
say_hello()
Здесь три раза подряд вызывается функция say_hello. В итоге мы получим следующий консольный вывод:
Hello
Hello
Hello
Теперь определим и используем функцию с параметрами:
Def say_hello(name):
print(«Hello,»,name)
say_hello(«Tom»)
say_hello(«Bob»)
say_hello(«Alice»)
Функция принимает параметр name, и при вызове функции мы можем передать вместо параметра какой-либо значение:
Hello, Tom
Hello, Bob
Hello, Alice
Значения по умолчанию
Некоторые параметры функции мы можем сделать необязательными, указав для них значения по умолчанию при определении функции. Например:
Def say_hello(name=»Tom»):
print(«Hello,», name)
say_hello()
say_hello(«Bob»)
Здесь параметр name является необязательным. И если мы не передаем при вызове функции для него значение, то применяется значение по умолчанию, то есть
строка «Tom».
Именованные параметры
При передаче значений функция сопоставляет их с параметрами в том порядке, в котором они передаются. Например, пусть есть следующая функция:
Def display_info(name, age):
print(«Name:», name, «t», «Age:», age)
display_info(«Tom», 22)
При вызове функции первое значение «Tom» передается первому параметру — параметру name, второе значение — число 22 передается второму параметру — age. И так далее по порядку.
Использование именованных параметров позволяет переопределить порядок передачи:
Def display_info(name, age):
print(«Name:», name, «t», «Age:», age)
display_info(age=22, name=»Tom»)
Именованные параметры предполагают указание имени параметра с присвоением ему значения при вызове функции.
Неопределенное количество параметров
С помощью символа звездочки можно определить неопределенное количество параметров:
Def sum(*params):
result = 0
for n in params:
result += n
return result
sumOfNumbers1 = sum(1, 2, 3, 4, 5) # 15
sumOfNumbers2 = sum(3, 4, 5, 6) # 18
print(sumOfNumbers1)
print(sumOfNumbers2)
В данном случае функция sum принимает один параметр — *params , но звездочка перед названием параметра указывает, что фактически на место этого
параметра мы можем передать неопределенное количество значений или набор значений. В самой функции с помощью цикла for можно пройтись по этому набору и произвести с переданными
значениями различные действия. Например, в данном случае возвращается сумма чисел.
Возвращение результата
Функция может возвращать результат. Для этого в функции используется оператор return
, после которого указывается возвращаемое значение:
Def exchange(usd_rate, money):
result = round(money/usd_rate, 2)
return result
result1 = exchange(60, 30000)
print(result1)
result2 = exchange(56, 30000)
print(result2)
result3 = exchange(65, 30000)
print(result3)
Поскольку функция возвращает значение, то мы можем присвоить это значение какой-либо переменной и затем использовать ее: result2 = exchange(56, 30000) .
В Python функция может возвращать сразу несколько значений:
Def create_default_user():
name = «Tom»
age = 33
return name, age
user_name, user_age = create_default_user()
print(«Name:», user_name, «t Age:», user_age)
Здесь функция create_default_user возвращает два значения: name и age. При вызове функции эти значения по порядку присваиваются переменным
user_name и user_age, и мы их можем использовать.
Функция main
В программе может быть определено множество функций. И чтобы всех их упорядочить, хорошей практикой считается добавление специальной функции
main , в которой потом уже вызываются другие функции:
Def main():
say_hello(«Tom»)
usd_rate = 56
money = 30000
result = exchange(usd_rate, money)
print(«К выдаче», result, «долларов»)
def say_hello(name):
print(«Hello,», name)
def exchange(usd_rate, money):
result = round(money/usd_rate, 2)
return result
# Вызов функции main
main()
В языках программирования функции являются именованной частью кода. Это отдельные блоки в тексте программы. Определяются с помощью зарезервированного слова def. В Python к функциям можно обращаться неограниченное количество раз из любой части сценария.
Зачем нужны функции
Функции — это незаменимый инструмент программиста. С их помощью разработчик структурирует программу, делая ее понятней и компактнее. С помощью функций можно добиться многократного использования отдельной части кода без его повторного написания.
Это простейший способ упаковать логику выполнения отдельных частей программы. При этом сокращается объем и время, которое специалист тратит на создание сценария.
Как написать первую функцию
В Python 3 для начинающих свое знакомство с программированием есть самая простая функция print(). Чтобы увидеть ее в действии вам понадобится среда разработки. Для этого скачайте дистрибутив языка с официального сайта и установите Python на компьютер.
Откройте меню «Пуск» и в списке программ найдите Python 3. Разверните его щелчком левой клавиши. В открывшемся списке найдите среду IDLE и запустите ее. Наберите print(«Hello, World!») и нажмите «Ввод». Интерпретатор вернет результат вашей первой функции.
Некоторые программисты предпочитают работать в консоли. Если вы относитесь к их числу, нажмите win+R и введите команду python.exe. Откроется обычный интерпретатор, только с интерфейсом cmd. Наберите программу описанным выше образом и нажмите Enter в конце, чтобы увидеть результат.
Как использовать def
Новые функции создаются с помощью инструкции def. Они так же эффективны, как и встроенные print() или open(), но отличаются от функций в компилирующих языках. Python def относится к исполняемым инструкциям. Это означает, что функции не существует, пока интерпретатор ее не увидит, и не перейдет к ее исполнению.
Инструкция def создает новый объект и дает ему название. То есть когда интерпретатор приступает к реализации, он создает новый объект и связывает его с именем, указанным после def. Чтобы хранить данные к функциям можно прикреплять различные атрибуты.
Теперь давайте напишем функцию, возвращающую фразу «Hello, World!», только с использованием def:
- >>> def здравствуй_мир():
- print(«Hello, World!»)
- >>> здравствуй_мир() #вызов функции
- Hello, World!
Синтаксис функций и return
Инструкция def в Python состоит из заголовка и пишется по следующим правилам:
- >>>def
После заголовка следует блок инструкций, который начинается с обязательного отступа. В IDLE интерпретатор сделает его автоматически. Но в блокноте или другом текстовом редакторе вы можете забыть нажать Tab. Тогда функция не запустится. Программный код в блоке инструкции называется телом функции и выполняется каждый раз при ее вызове.
Также в теле иногда находится return:
- def (аргумент 1, аргумент 2, аргумент N):
- return
Return завершает работу функции и передает вызывающей программе объект-результат. Инструкция не является обязательной. Функция будет работать без return, и завершится, когда поток управления достигнет конца ее тела.
Параметры и аргументы
Каждой функции можно передавать параметры, которые указываются в скобках после def. В Python они записываются как переменные, разделенные запятыми. Значения или ссылки на объекты этим именам присваиваются в блоке за двоеточием. После операции присвоения их принято называть аргументами, а не параметрами.
Аргументы внутри функции никак не связаны с объектами вне ее, поэтому в программировании их относят к локальным переменным. Область видимости ограничена блоком функции, который начинается с def и заканчивается return. Чтобы было понятнее, приведем пример:
- x = 12 #присваиваем переменным ссылки на целочисленные объекты
- y = 34
- >>>def example(x,y): #создаем функцию с именем example
- x = «Hello» #присваиваем значения аргументам x, y
- y = «Python»
- print(x, y, sep= «, »)
- return None
- >>>example(x, y) #вызываем функцию, не забыв указать параметры
- Hello, Python
- >>>print(x, y)
- 12 34
Обратите внимание на предпоследнюю строчку кода. В интерпретаторе Python команда print() вернула переменные x и y из глобальной области видимости.
Значения аргументов не обязательно указывать внутри функции, можно их вписать вручную при ее вызове:
- >>>def E_2(x, y):
- return x + y
- >>>E_2(«Hello, » «Python!») #чтобы слова были разделены, поставьте пробел перед закрывающей кавычкой
- Hello, Python!
- E_2(5, 4)
Как видно из примера с простой функцией E_2, результат полностью зависит от типа объектов x и y. В первом случае E_2 выполнила конкатенацию, а во втором — арифметическую операцию сложения. В этом заключается принцип полиморфизма и То, что объекты определяют синтаксический смысл, обуславливает гибкость и простоту языка. Не нужно тратить время на то, чтобы отдельно указать тип данных, с которым работает функция.
Правило LEGB
Это правило касается работы с переменными в разных областях видимости. По умолчанию все имена, которые вы создаете в теле функции, считаются локальными. А имена в модуле являются глобальными. При желании именам можно присвоить значение переменных верхнего уровня с помощью инструкции notlocal и global.
Правило LEGB объясняет схему разрешения имен:
- Как только интерпретатор находит переменную внутри инструкции def, он сначала выполняет поиск значений в локальной области видимости.
- Если поиск не дает результата, он переходит к области видимости любой всеобъемлющей инструкции def.
- Дальше интерпретатор двигается к глобальным именам в верхнем уровне модуля и тем, что обозначены как global.
- Если поиск не дает результатов, интерпретатор ищет имена во встроенной области видимости языка Python.
Рассмотрим наглядный пример:
- >>>L = 85
- >>>R = 23
- >>>def пример_2(K):
- R = 10
- C = L + K+R
- return C
- >>>пример_2(5)
Переменные L и R находятся на верхнем уровне и являются глобальными именами. R, C и K — это локальные переменные, так как присваивание значения происходит внутри инструкции def.
Интерпретатор сначала выполняет операцию сложения для локальных R, C и K, игнорируя переменную R вне инструкции def. Потом ищет L, и не найдя ее среди имен local, переходит на верхний уровень.
Что такое lambda
Помимо def, в Python функции можно создавать с помощью специальных выражений, одно из которых — lambda. Свое оригинальное название получила в честь лямбда-исчислений языка LISP.
Как и def, lambda создает функцию, которую можно будет в дальнейшем вызвать, но не связывает ее с каким-нибудь именем. На практике lambda используют, когда нужно отложить выполнение фрагмента кода.
Основы лямбда-выражений
По внешнему виду lambda-выражения напоминают инструкции def. Вначале пишется ключевое слово lambda, потом аргументы, двоеточие и само выражение:
- >>>f = lambda x, y, z: x + y + z
- >>>f(2, 3, 4)
Тело лямбда представляет собой одно единственное выражение, а не блок инструкций. За счет этого lambda ограничена в возможностях и не настолько универсальна как def. В ней может быть реализована только логика, без циклов while или for.
Для лямбда действуют аналогичные с def правила поиска переменных. Имена, указанные вне выражения, являются глобальными, внутри — локальными, и они никак не влияют друг на друга.
Lambda-выражения очень удобно встраивать в программу. За счет небольшого размера они минимизируют и упрощают код. Но использование лямбда не является принципиальным. В Python 3 начинающим для работы будет достаточно инструкции def.
В этой статье я планирую рассказать о функциях, именных и анонимных, инструкциях def, return и lambda, обязательных и необязательных аргументах функции, функциях с произвольным числом аргументов.
Именные функции, инструкция def
Функция в python — объект, принимающий аргументы и возвращающий значение. Обычно функция определяется с помощью инструкции def
.
Определим простейшую функцию:
def
add
(x
,
y
):
return
x
+
y
Инструкция return
говорит, что нужно вернуть значение. В нашем случае функция возвращает сумму x и y.
Теперь мы ее можем вызвать:
>>>
add
(1
,
10
)
11
>>>
add
(«abc»
,
«def»
)
«abcdef»
Функция может быть любой сложности и возвращать любые объекты (списки, кортежи, и даже функции!):
>>>
def
newfunc
(n
):
…
def
myfunc
(x
):
…
return
x
+
n
…
return
myfunc
…
>>>
new
=
newfunc
(100
)
# new — это функция
>>>
new
(200
)
300
Функция может и не заканчиваться инструкцией return, при этом функция вернет значение :
>>>
def
func
():
…
pass
…
>>>
print
(func
())
None
Аргументы функции
Функция может принимать произвольное количество аргументов или не принимать их вовсе. Также распространены функции с произвольным числом аргументов, функции с позиционными и именованными аргументами, обязательными и необязательными.
>>>
def
func
(a
,
b
,
c
=
2
):
# c — необязательный аргумент
…
return
a
+
b
+
c
…
>>>
func
(1
,
2
)
# a = 1, b = 2, c = 2 (по умолчанию)
5
>>>
func
(1
,
2
,
3
)
# a = 1, b = 2, c = 3
6
>>>
func
(a
=
1
,
b
=
3
)
# a = 1, b = 3, c = 2
6
>>>
func
(a
=
3
,
c
=
6
)
# a = 3, c = 6, b не определен
Traceback (most recent call last):
File «», line 1, in
func(a=3, c=6)
TypeError
: func() takes at least 2 arguments (2 given)
Функция также может принимать переменное количество позиционных аргументов, тогда перед именем ставится *:
>>>
def
func
(*
args
):
…
return
args
…
>>>
func
(1
,
2
,
3
,
«abc»
)
(1, 2, 3, «abc»)
>>>
func
()
()
>>>
func
(1
)
(1,)
Как видно из примера, args — это из всех переданных аргументов функции, и с переменной можно работать также, как и с кортежем.
Функция может принимать и произвольное число именованных аргументов, тогда перед именем ставится **:
>>>
def
func
(**
kwargs
):
…
return
kwargs
…
>>>
func
(a
=
1
,
b
=
2
,
c
=
3
)
{«a»: 1, «c»: 3, «b»: 2}
>>>
func
()
{}
>>>
func
(a
=
«python»
)
{«a»: «python»}
В переменной kwargs у нас хранится , с которым мы, опять-таки, можем делать все, что нам заблагорассудится.
Анонимные функции, инструкция lambda
Анонимные функции могут содержать лишь одно выражение, но и выполняются они быстрее. Анонимные функции создаются с помощью инструкции lambda
. Кроме этого, их не обязательно присваивать переменной, как делали мы инструкцией def func():
>>>
func
=
lambda
x
,
y
:
x
+
y
>>>
func
(1
,
2
)
3
>>>
func
(«a»
,
«b»
)
«ab»
>>>
(lambda
x
,
y
:
x
+
y
)(1
,
2
)
3
>>>
(lambda
x
,
y
:
x
+
y
)(«a»
,
«b»
)
«ab»
lambda функции, в отличие от обычной, не требуется инструкция return, а в остальном, ведет себя точно так же:
>>>
func
=
lambda
*
args
:
args
>>>
func
(1
,
2
,
3
,
4
)
(1, 2, 3, 4)