Программирование на python лекция 4
TRANSCRIPT
![Page 1: Программирование на Python лекция 4](https://reader033.vdocuments.mx/reader033/viewer/2022061002/6299c91be79ca2165f4d4907/html5/thumbnails/1.jpg)
Программирование
на Pythonлекция 4
Владимир Юрьевич Полищук
Инженерная школаинформационных технологий и
робототехники,Томский политехнический университет
![Page 2: Программирование на Python лекция 4](https://reader033.vdocuments.mx/reader033/viewer/2022061002/6299c91be79ca2165f4d4907/html5/thumbnails/2.jpg)
Содержание
•Функции
•Модули
2
![Page 3: Программирование на Python лекция 4](https://reader033.vdocuments.mx/reader033/viewer/2022061002/6299c91be79ca2165f4d4907/html5/thumbnails/3.jpg)
Основы функций
Функция – это средство, позволяющее группировать наборы инструкций так, что в программе они могут запускаться неоднократно.
Функции обеспечивают многократноеиспользование программного кода и уменьшающие его избыточность.
3
![Page 4: Программирование на Python лекция 4](https://reader033.vdocuments.mx/reader033/viewer/2022061002/6299c91be79ca2165f4d4907/html5/thumbnails/4.jpg)
Зачем нужны функции?
• Максимизировать многократноеиспользование программного кода и минимизировать его избыточность
• Процедурная декомпозиция
4
![Page 5: Программирование на Python лекция 4](https://reader033.vdocuments.mx/reader033/viewer/2022061002/6299c91be79ca2165f4d4907/html5/thumbnails/5.jpg)
Создание функций
Основные концепции, составляющие основу функций в языке Python:
• def – это исполняемый программный код. Функции в языке Python создаются с помощью новой инструкции def (создает объект и присваивает ему имя).
• Выражение lambda создает объект и возвращает его в виде результата.
• return передает объект результата вызывающей программе.
• yield передает объект результата вызывающей программе и запоминает, где был произведен возврат.
• аргументы передаются посредством присваивания (в виде ссылок на объекты).
5
![Page 6: Программирование на Python лекция 4](https://reader033.vdocuments.mx/reader033/viewer/2022061002/6299c91be79ca2165f4d4907/html5/thumbnails/6.jpg)
Создание функций (2)
Основные концепции, составляющие основу функций в языке Python:
• global объявляет глобальные переменные для модуля, без присваивания им значений.
• nonlocal объявляет переменные, находящиеся в области видимости объемлющей функции, без присваивания им значений.
• Аргументы получают свои значения (ссылки на объекты) в результате выполнения операции присваивания.
• Аргументы, возвращаемые значения и переменные не объявляются.
6
![Page 7: Программирование на Python лекция 4](https://reader033.vdocuments.mx/reader033/viewer/2022061002/6299c91be79ca2165f4d4907/html5/thumbnails/7.jpg)
Инструкция def
def <name>(arg1, arg2,... argN): # возвращает объект None
<statements>
def <name>(arg1, arg2,... argN):
...
return <value>
def <name>(arg1, arg2,... argN):
...
yield <value>
7
![Page 8: Программирование на Python лекция 4](https://reader033.vdocuments.mx/reader033/viewer/2022061002/6299c91be79ca2165f4d4907/html5/thumbnails/8.jpg)
Инструкция def
if test:def func(): # Определяет функцию таким способом...
else: def func(): # Или таким способом...
...func() # Вызов выбранной версии
othername = func # Связывание объекта функции с именем
othername() # Вызов функции
def func():... # Создает объект функцииfunc() # Вызывает объектfunc.attr=value # Присоединяет атрибут к объекту
8
![Page 9: Программирование на Python лекция 4](https://reader033.vdocuments.mx/reader033/viewer/2022061002/6299c91be79ca2165f4d4907/html5/thumbnails/9.jpg)
!!
Функции имеют две стороны:
• определение (инструкция def, которая создает функцию)
• вызов (выражение, которое предписывает интерпретатору выполнить тело функции).
9
![Page 10: Программирование на Python лекция 4](https://reader033.vdocuments.mx/reader033/viewer/2022061002/6299c91be79ca2165f4d4907/html5/thumbnails/10.jpg)
Определение
def times(x, y): # Создать функцию и связать ее с именем
return x * y # Тело, выполняемое при вызове функции
Вызов
>>> times(2, 4) # Аргументы в круглых скобках
8
10
![Page 11: Программирование на Python лекция 4](https://reader033.vdocuments.mx/reader033/viewer/2022061002/6299c91be79ca2165f4d4907/html5/thumbnails/11.jpg)
>>> x = times(3.14, 4) # Сохранить объект результата
>>> x
12.56
>>>times(‘word’, 2) # Функции не имеют типа
‘wordword’
11
![Page 12: Программирование на Python лекция 4](https://reader033.vdocuments.mx/reader033/viewer/2022061002/6299c91be79ca2165f4d4907/html5/thumbnails/12.jpg)
Полиморфизм в языке Python
def times(x, y): return x * y
полиморфизм – термин, который означает, что смысл операции зависит от типов обрабатываемых объектов.
12
![Page 13: Программирование на Python лекция 4](https://reader033.vdocuments.mx/reader033/viewer/2022061002/6299c91be79ca2165f4d4907/html5/thumbnails/13.jpg)
!!
• Оформив программный код в виде функции, появляется возможность использовать его столько раз, сколько потребуется.
• Так как вызывающая программа может передавать функции произвольные аргументы, функция сможет использоваться с любыми двумя последовательностями (или итерируемыми объектами) для получения их пересечения.
• Когда логика работы оформлена в виде функции, достаточно изменить программный код всего в одном месте, чтобы изменить способ получения пересечения.
• Поместив функцию в файл модуля, ее можно будет импортировать и использовать в любой программе на вашем компьютере.
13
![Page 14: Программирование на Python лекция 4](https://reader033.vdocuments.mx/reader033/viewer/2022061002/6299c91be79ca2165f4d4907/html5/thumbnails/14.jpg)
Пример
def intersect(seq1, seq2):
res= [] # Изначально пустой результат
for x in seq1: # Обход последовательности seq1
if x in seq2: # Общий элемент?
res.append(x) # Добавить в конец
return res
>>> s1 = “SPAM
>>> s2 = “SCAM”
>>>intersect(s1, s2) # Строки
[‘S’, ‘A’, ‘M’]
>>> [x for x in s1 if x in s2] # генератор списков
[‘S’, ‘A’, ‘M’]
14
![Page 15: Программирование на Python лекция 4](https://reader033.vdocuments.mx/reader033/viewer/2022061002/6299c91be79ca2165f4d4907/html5/thumbnails/15.jpg)
Еще о полиморфизме
>>>x = intersect([1, 2, 3], (1, 4)) # Смешивание типов
>>>x # Объект с результатом
[1]
15
![Page 16: Программирование на Python лекция 4](https://reader033.vdocuments.mx/reader033/viewer/2022061002/6299c91be79ca2165f4d4907/html5/thumbnails/16.jpg)
Локальные переменные
def intersect(seq1, seq2):
res= [] # Изначально пустой результат
for x in seq1: # Обход последовательности seq1
if x in seq2: # Общий элемент?
res.append(x) # Добавить в конец
return res
Почти все переменные в функции intersect являются локальными, так:
• Переменная res явно участвует в операции присваивания, поэтому она – локальная переменная.
• Аргументы передаются через операцию присваивания, поэтому seq1 и seq2 тоже локальные переменные.
• Цикл for присваивает элементы переменной, поэтому имя x также является локальным.
16
![Page 17: Программирование на Python лекция 4](https://reader033.vdocuments.mx/reader033/viewer/2022061002/6299c91be79ca2165f4d4907/html5/thumbnails/17.jpg)
Области видимости в языке Python
• Имена, определяемые внутри инструкции def, видны только программному коду внутри инструкции def. К этим именам нельзя обратиться за пределами функции.
• Имена, определяемые внутри инструкции def, не вступают в конфликт с именами, находящимися за пределами инструкции def, даже если и там и там присутствуют одинаковые имена.
17
![Page 18: Программирование на Python лекция 4](https://reader033.vdocuments.mx/reader033/viewer/2022061002/6299c91be79ca2165f4d4907/html5/thumbnails/18.jpg)
Области видимости в языке Python
• Если присваивание переменной выполняется внутри инструкции def, переменная является локальной для этой функции. • Если присваивание производится в пределах объемлющей инструкции def, переменная является нелокальной для этой функции.• Если присваивание производится за пределами всех инструкций def, она является глобальной для всего файла.
X = 99def func():
X = 88
18
![Page 19: Программирование на Python лекция 4](https://reader033.vdocuments.mx/reader033/viewer/2022061002/6299c91be79ca2165f4d4907/html5/thumbnails/19.jpg)
Правила видимости имен• Объемлющий модуль – это глобальная область видимости.
• Глобальная область видимости охватывает единственный файл. Не надо заблуждаться насчет слова «глобальный» – имена на верхнем уровне файла являются глобальными только для программного кода в этом файле.
• Каждый вызов функции создает новую локальную область видимости. Всякий раз, когда вызывается функция, создается новая локальная область видимости –то есть пространство имен, в котором находятся имена, определяемые внутри функции.
• Операция присваивания создает локальные имена, если они не были объявлены глобальными или нелокальными.global , nonlocal
• Все остальные имена являются локальными в области видимости объемлющей функции, глобальными или встроенными.
19
![Page 20: Программирование на Python лекция 4](https://reader033.vdocuments.mx/reader033/viewer/2022061002/6299c91be79ca2165f4d4907/html5/thumbnails/20.jpg)
!!
L = []
L.append(X)
L =X
20
![Page 21: Программирование на Python лекция 4](https://reader033.vdocuments.mx/reader033/viewer/2022061002/6299c91be79ca2165f4d4907/html5/thumbnails/21.jpg)
Разрешение имен: правило LEGB
Для инструкции def:
• Поиск имен ведется самое большее в четырех областях видимости: локальной, затем в объемлющей функции (если таковая имеется), затем в глобальной и, наконец, во встроенной.
• По умолчанию операция присваивания создает локальные имена.
• Объявления global и nonlocal отображают имена на область видимости вмещающего модуля и функции соответственно.
21
![Page 22: Программирование на Python лекция 4](https://reader033.vdocuments.mx/reader033/viewer/2022061002/6299c91be79ca2165f4d4907/html5/thumbnails/22.jpg)
Разрешение имен: правило LEGB
Когда внутри функции выполняется обращение к неизвестному имени, интерпретатор пытается отыскать его в четырех областях видимости:
• в локальной (local, L),
• затем в локальной области любой объемлющей инструкции def (enclosing, E) или в выражении lambda,
• затем в глобальной (global, G)
• и, наконец, во встроенной (built-in, B).
Поиск завершается, как только будет найдено первое подходящее имя.
22
![Page 23: Программирование на Python лекция 4](https://reader033.vdocuments.mx/reader033/viewer/2022061002/6299c91be79ca2165f4d4907/html5/thumbnails/23.jpg)
Разрешение имен: правило LEGB
• Когда внутри функции выполняется операция присваивания, интерпретатор всегда создает или изменяет имя в локальной области видимости, если в этой функции оно не было объявлено глобальным или нелокальным.
• Когда выполняется присваивание имени за пределами функции (то есть на уровне модуля или в интерактивной оболочке), локальная область видимости совпадает с глобальной – с пространством имен модуля.
23
![Page 24: Программирование на Python лекция 4](https://reader033.vdocuments.mx/reader033/viewer/2022061002/6299c91be79ca2165f4d4907/html5/thumbnails/24.jpg)
Разрешение имен: правило LEGB
24
![Page 25: Программирование на Python лекция 4](https://reader033.vdocuments.mx/reader033/viewer/2022061002/6299c91be79ca2165f4d4907/html5/thumbnails/25.jpg)
Пример области видимости
# Глобальная область видимости
X = 99 # X и func определены в модуле: глобальная область
def func(Y): # Y и Z определены в функции: локальная область
# Локальная область видимости
Z=X+Y # X – глобальная переменная
return Z
func(1) # func в модуле: вернет число 100
25
![Page 26: Программирование на Python лекция 4](https://reader033.vdocuments.mx/reader033/viewer/2022061002/6299c91be79ca2165f4d4907/html5/thumbnails/26.jpg)
Встроенная область видимости
>>> import builtins>>> dir(builtins)['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException', 'BlockingIOError', 'BrokenPipeError', 'BufferError', 'BytesWarning', 'ChildProcessError', 'ConnectionAbortedError', 'ConnectionError', 'ConnectionRefusedError', 'ConnectionResetError', 'DeprecationWarning', 'EOFError', 'Ellipsis', 'EnvironmentError', 'Exception', 'False', 'FileExistsError', 'FileNotFoundError', 'FloatingPointError', 'FutureWarning', 'GeneratorExit', 'IOError', 'ImportError', 'ImportWarning', 'IndentationError', 'IndexError', 'InterruptedError', 'IsADirectoryError', 'KeyError', 'KeyboardInterrupt', 'LookupError', 'MemoryError', 'ModuleNotFoundError', 'NameError', 'None', 'NotADirectoryError', 'NotImplemented', 'NotImplementedError', 'OSError', 'OverflowError', 'PendingDeprecationWarning', 'PermissionError', 'ProcessLookupError', 'RecursionError', 'ReferenceError', 'ResourceWarning', 'RuntimeError', 'RuntimeWarning', 'StopAsyncIteration', 'StopIteration', 'SyntaxError', 'SyntaxWarning', 'SystemError', 'SystemExit', 'TabError', 'TimeoutError', 'True', 'TypeError', 'UnboundLocalError', 'UnicodeDecodeError', 'UnicodeEncodeError', 'UnicodeError', 'UnicodeTranslateError', 'UnicodeWarning', 'UserWarning', 'ValueError', 'Warning', 'WindowsError', 'ZeroDivisionError', '__build_class__', '__debug__', '__doc__', '__import__', '__loader__', '__name__', '__package__', '__spec__', 'abs', 'all', 'any', 'ascii', 'bin', 'bool', 'breakpoint', 'bytearray', 'bytes', 'callable', 'chr', 'classmethod', 'compile', 'complex', 'copyright', 'credits', 'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval', 'exec', 'exit', 'filter', 'float', 'format', 'frozenset', 'getattr', 'globals', 'hasattr', 'hash', 'help', 'hex', 'id', 'input', 'int', 'isinstance', 'issubclass', 'iter', 'len', 'license', 'list', 'locals', 'map', 'max', 'memoryview', 'min', 'next', 'object', 'oct', 'open', 'ord', 'pow', 'print', 'property', 'quit', 'range', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice', 'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', 'vars', 'zip']
26
![Page 27: Программирование на Python лекция 4](https://reader033.vdocuments.mx/reader033/viewer/2022061002/6299c91be79ca2165f4d4907/html5/thumbnails/27.jpg)
Встроенная область видимости
>>>zip # Обычный способ<class zip>
>>>import builtins # Более сложный способ>>>builtins.zip
<class zip>
def hider():open= ‘spam’ # Локальная переменная,
переопределяет встроенное имя...
open(‘data.txt’) # В этой области видимости файл не будет открыт!
27
![Page 28: Программирование на Python лекция 4](https://reader033.vdocuments.mx/reader033/viewer/2022061002/6299c91be79ca2165f4d4907/html5/thumbnails/28.jpg)
Встроенная область видимости
X = 88 # Глобальная переменная X
def func():
X = 99 # Локальная переменная X: переопределяет глобальную
func()
print(X) # Выведет 88: значение не изменилось
28
![Page 29: Программирование на Python лекция 4](https://reader033.vdocuments.mx/reader033/viewer/2022061002/6299c91be79ca2165f4d4907/html5/thumbnails/29.jpg)
Инструкция global
Инструкция global сообщает интерпретатору, что функция будет изменять одно или более глобальных имен, то есть имен, которые находятся в области видимости (в пространстве имен) вмещающего модуля.
29
![Page 30: Программирование на Python лекция 4](https://reader033.vdocuments.mx/reader033/viewer/2022061002/6299c91be79ca2165f4d4907/html5/thumbnails/30.jpg)
Инструкция global
Общая информация об инструкции global:
• Глобальные имена – это имена, которые определены на верхнем уровне вмещающего модуля.
• Глобальные имена должны объявляться, только если им будут присваиваться значения внутри функций.
• Обращаться к глобальным именам внутри функций можно и без объявления их глобальными.
30
![Page 31: Программирование на Python лекция 4](https://reader033.vdocuments.mx/reader033/viewer/2022061002/6299c91be79ca2165f4d4907/html5/thumbnails/31.jpg)
Инструкция global
X = 88 # Глобальная переменная X
def func():
global X
X = 99 # Глобальная переменная X: за пределами инструкции def
func()
print(X) # Выведет 99
y,z= 1, 2 # Глобальные переменные в модуле
def all_global():
global x # Объявляется глобальной для присваивания
x=y+z # Объявлять y, z не требуется: применяется правило LEGB
31
![Page 32: Программирование на Python лекция 4](https://reader033.vdocuments.mx/reader033/viewer/2022061002/6299c91be79ca2165f4d4907/html5/thumbnails/32.jpg)
Минимизируйте количество глобальных переменных
X = 99
def func1():
global X
X = 88
def func2():
global X
X = 77
32
![Page 33: Программирование на Python лекция 4](https://reader033.vdocuments.mx/reader033/viewer/2022061002/6299c91be79ca2165f4d4907/html5/thumbnails/33.jpg)
Передача аргументов
• Аргументы передаются через автоматическое присваивание объектов локальным переменным.
• Операция присваивания именам аргументов внутри функции не оказывает влияния на вызывающую программу.
• Изменение внутри функции аргумента, который является изменяемым объектом, может оказывать влияние на вызывающую программу.
33
![Page 34: Программирование на Python лекция 4](https://reader033.vdocuments.mx/reader033/viewer/2022061002/6299c91be79ca2165f4d4907/html5/thumbnails/34.jpg)
Передача аргументов
Схема передачи аргументов:
• Неизменяемые объекты передаются «по значению».
• Изменяемые объекты передаются «по указателю».
34
![Page 35: Программирование на Python лекция 4](https://reader033.vdocuments.mx/reader033/viewer/2022061002/6299c91be79ca2165f4d4907/html5/thumbnails/35.jpg)
Аргументы и разделяемые ссылки
>>> def f(a): # Имени a присваивается переданный объект
a = 99 # Изменяется только локальная переменная
>>> b = 88
>>> f(b) # Первоначально имена a и b ссылаются на одно и то же число 88
>>>print(b) # Переменная b не изменилась
88
35
![Page 36: Программирование на Python лекция 4](https://reader033.vdocuments.mx/reader033/viewer/2022061002/6299c91be79ca2165f4d4907/html5/thumbnails/36.jpg)
Аргументы и разделяемые ссылки
>>> def changer(a, b): # В аргументах передаются ссылки на объекты
a = 2 # Изменяется только значение локального имени
b[0] = ‘spam’ # Изменяется непосредственно разделяемый объект
>>> X = 1
>>> L = [1, 2] # Вызывающая программа
>>> changer(X, L) # Передаются изменяемый и неизменяемый объекты
>>>X, L # Переменная X – не изменилась, L - изменилась
(1, [‘spam’, 2])
36
![Page 37: Программирование на Python лекция 4](https://reader033.vdocuments.mx/reader033/viewer/2022061002/6299c91be79ca2165f4d4907/html5/thumbnails/37.jpg)
>>> X = 1 >>> a = X # Разделяют один и тот же объект>>> a = 2 # Изменяется только ‘a’, значение ‘X’ остается
равным 1>>> print(X) 1
>>> L = [1, 2]>>>b = L # Разделяют один и тот же объект>>>b[0] = ‘spam’ # Изменение в самом объекте: ‘L’ также
изменяется>>>print(L)[‘spam’, 2]
Аргументы и разделяемые ссылки
37
![Page 38: Программирование на Python лекция 4](https://reader033.vdocuments.mx/reader033/viewer/2022061002/6299c91be79ca2165f4d4907/html5/thumbnails/38.jpg)
Ссылки: аргументы
38
![Page 39: Программирование на Python лекция 4](https://reader033.vdocuments.mx/reader033/viewer/2022061002/6299c91be79ca2165f4d4907/html5/thumbnails/39.jpg)
Как избежать воздействий на изменяемые аргументы
L = [1, 2]changer(X, L[:]) # Передается копия, поэтому
переменная ‘L’ не изменится
def changer(a, b): b = b[:] # Входной список копируется, что
исключает воздействие на вызывающую программу
a = 2b[0] = ‘spam’ # Изменится только копия
списка
L = [1, 2]changer(X, tuple(L)) # Передается кортеж, поэтому попытка изменения возбудит исключение
39
![Page 40: Программирование на Python лекция 4](https://reader033.vdocuments.mx/reader033/viewer/2022061002/6299c91be79ca2165f4d4907/html5/thumbnails/40.jpg)
!!
Cледует запомнить – функции могут оказывать воздействие на передаваемые им изменяемые объекты, такие как списки и словари. Это не всегда является проблемой и часто может приносить пользу.
40
![Page 41: Программирование на Python лекция 4](https://reader033.vdocuments.mx/reader033/viewer/2022061002/6299c91be79ca2165f4d4907/html5/thumbnails/41.jpg)
Имитация выходных параметров
>>> def multiple(x, y):
x = 2 # Изменяется только локальное имя
y = [3, 4]
return x, y # Новые значения возвращаются в виде кортежа
>>> X = 1
>>> L = [1, 2]
>>>X, L = multiple(X, L) # Результаты присваиваются именам в вызывающей программе
>>>X, L
(2, [3, 4])41
![Page 42: Программирование на Python лекция 4](https://reader033.vdocuments.mx/reader033/viewer/2022061002/6299c91be79ca2165f4d4907/html5/thumbnails/42.jpg)
Модули
import
Позволяет клиентам (импортерам) получать модуль целиком.
from
Позволяет клиентам получать определенные имена из модуля.
imp.reload
Обеспечивает возможность повторной загрузки модуля без остановки интерпретатора Python.
42
![Page 43: Программирование на Python лекция 4](https://reader033.vdocuments.mx/reader033/viewer/2022061002/6299c91be79ca2165f4d4907/html5/thumbnails/43.jpg)
Зачем нужны модули
С точки зрения теории модули играют как минимум три роли:
• Повторное использование программного кода
• Разделение системы пространств имен
• Реализация служб или данных для совместногопользования
43
![Page 44: Программирование на Python лекция 4](https://reader033.vdocuments.mx/reader033/viewer/2022061002/6299c91be79ca2165f4d4907/html5/thumbnails/44.jpg)
Архитектура программы на языке Python
b.py
def spam(text):
print(text, ‘spam’)
a.py
import b
b.spam(‘string’)
44string spam
![Page 45: Программирование на Python лекция 4](https://reader033.vdocuments.mx/reader033/viewer/2022061002/6299c91be79ca2165f4d4907/html5/thumbnails/45.jpg)
Архитектура программы на языке Python
Повсюду в сценариях на языке Pythonиспользуется нотация object.attribute –большинство объектов обладают атрибутами, доступ к которым можно получить с помощью оператора «.»
45
![Page 46: Программирование на Python лекция 4](https://reader033.vdocuments.mx/reader033/viewer/2022061002/6299c91be79ca2165f4d4907/html5/thumbnails/46.jpg)
Модули стандартной библиотеки
46
![Page 47: Программирование на Python лекция 4](https://reader033.vdocuments.mx/reader033/viewer/2022061002/6299c91be79ca2165f4d4907/html5/thumbnails/47.jpg)
Создание модуля
текстовый файл с расширением «.py»
#module1.py
def printer(x): # Атрибут модуля
print(x)
if.py
import if
47
![Page 48: Программирование на Python лекция 4](https://reader033.vdocuments.mx/reader033/viewer/2022061002/6299c91be79ca2165f4d4907/html5/thumbnails/48.jpg)
Использование модулей
Инструкции import или from.
Обе инструкции отыскивают, компилируют и запускают программный код модуля, если он еще не был загружен.
48
![Page 49: Программирование на Python лекция 4](https://reader033.vdocuments.mx/reader033/viewer/2022061002/6299c91be79ca2165f4d4907/html5/thumbnails/49.jpg)
Инструкция import
#module1.py
def printer(x): # Атрибут модуля
print(x)
>>> import module1 # Загрузить модуль целиком
>>> module1.printer(‘Hello world!’) # Имя дополняется именем модуля Hello world!
49
![Page 50: Программирование на Python лекция 4](https://reader033.vdocuments.mx/reader033/viewer/2022061002/6299c91be79ca2165f4d4907/html5/thumbnails/50.jpg)
Инструкция from
#module1.py
def printer(x): # Атрибут модуля
print(x)
>>>from module1 import printer # Копировать одну переменную
>>>printer(‘Hello world!’) # Имя не требует дополнения
Hello world!
50
![Page 51: Программирование на Python лекция 4](https://reader033.vdocuments.mx/reader033/viewer/2022061002/6299c91be79ca2165f4d4907/html5/thumbnails/51.jpg)
Инструкция from *
#module1.py
def printer(x): # Атрибут модуля
print(x)
>>> from module1 import * # Скопировать все переменные
>>> printer(‘Hello world!’)
Hello world!
51
![Page 52: Программирование на Python лекция 4](https://reader033.vdocuments.mx/reader033/viewer/2022061002/6299c91be79ca2165f4d4907/html5/thumbnails/52.jpg)
Потенциальные проблемы инструкции from
• Инструкция from делает местоположение переменных менее явным и очевидным (имя name несет меньше информации, чем module.name)
• Инструкция from способна повреждать пространства имен, по крайней мере, в принципе – если использовать ее для импортирования переменных, когда существуют одноименные переменные в имеющейся области видимости, то эти переменные просто будут перезаписаны.
• С другой стороны, инструкция from скрывает в себе более серьезные проблемы, когда используется в комбинации с функцией reload, так как импортированные имена могут ссылаться на предыдущие версии объектов.
• Кроме того, инструкция в форме from module import * действительно может повреждать пространства имен и затрудняет понимание имен, особенно когда она применяется более чем к одному файлу
Совет: отдавать предпочтение инструкции import для простых модулей, явно перечислять необходимые переменные в инструкциях from и не использовать форму from * для импорта более чем одного файла в модуле.
52
![Page 53: Программирование на Python лекция 4](https://reader033.vdocuments.mx/reader033/viewer/2022061002/6299c91be79ca2165f4d4907/html5/thumbnails/53.jpg)
Когда необходимо использовать инструкцию import (1)
# M.py
def func():
...выполнить что-то одно...
# N.py
def func():
...выполнить что-то другое...
# O.py
from M import func
from N import func # Перезапишет имя, импортированное из модуля M
func() # Будет вызвана N.func
53
![Page 54: Программирование на Python лекция 4](https://reader033.vdocuments.mx/reader033/viewer/2022061002/6299c91be79ca2165f4d4907/html5/thumbnails/54.jpg)
Когда необходимо использовать инструкцию import (2)
# M.py
def func():
...выполнить что-то одно...
# N.py
def func():
...выполнить что-то другое...
# O.py
import M,N # Получить модуль целиком, а не отдельные имена
M.func() # Теперь можно вызывать обе функции
N.func() # Наличие имени модуля делает их уникальными
54