Глобальные и локальные переменные 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Глобальные и локальные переменные



Листинг 11.25. Глобальные переменные

def func(glob2):

print("Значение глобальной переменной glob1 =", glob1)

glob2 += 10

print("Значение локальной переменной glob2 =", glob2)

 

glob1, glob2 = 10, 5

func(77) # Вызываем функцию

print("Значение глобальной переменной glob2 =", glob2)

 

Листинг 11.26. Локальные переменные

def func():

local1 = 77 # Локальная переменная

glob1 = 25 # Локальная переменная

print("Значение glob1 внутри функции =", glob1)

glob1 = 10 # Глобальная переменная

func() # Вызываем функцию

print("Значение glob1 вне функции =", glob1)

try:

print(local1) # Вызовет исключение NameError

except NameError: # Обрабатываем исключение

print("Переменная local1 не видна вне функции")

 

Листинг 11.27. Ошибка при обращении к переменной до присваивания значения

def func():

# Локальная переменная еще не определена

print(glob1) # Эта строка вызовет ошибку!!!

glob1 = 25 # Локальная переменная

glob1 = 10 # Глобальная переменная

func() # Вызываем функцию

# Результат выполнения:

# UnboundLocalError: local variable 'glob1' referenced before assignment

 

Листинг 11.28. Использование ключевого слова global

def func():

# Объявляем переменную glob1 глобальной

global glob1

glob1 = 25 # Изменяем значение глобальной переменной

print("Значение glob1 внутри функции =", glob1)

glob1 = 10 # Глобальная переменная

print("Значение glob1 вне функции =", glob1)

func() # Вызываем функцию

print("Значение glob1 после функции =", glob1)

 

 

x = 5

# Сохраняется ссылка, а не значение переменной x!!!

func = lambda: x

x = 80 # Изменили значение

print(func()) # Выведет: 80, а не 5

 

Листинг 11.29. Сохранение значения переменной

x = 5

# Сохраняется значение переменной x

func = (lambda y: lambda: y)(x)

x = 80 # Изменили значение

print(func()) # Выведет: 5

 

Листинг 11.30. Сохранение значения с помощью параметра по умолчанию

x = 5

# Сохраняется значение переменной x

func = lambda x=x: x

x = 80 # Изменили значение

print(func()) # Выведет: 5

 

 

def func():

local1 = 54

glob2 = 25

print("Глобальные идентификаторы внутри функции")

print(sorted(globals().keys()))

print("Локальные идентификаторы внутри функции")

print(sorted(locals().keys()))

glob1, glob2 = 10, 88

func()

print("Глобальные идентификаторы вне функции")

print(sorted(globals().keys()))

 

 

def func():

local1 = 54

glob2 = 25

print("Локальные идентификаторы внутри функции")

print(sorted(vars().keys()))

glob1, glob2 = 10, 88

func()

print("Глобальные идентификаторы вне функции")

print(sorted(vars().keys()))

print("Указание объекта в качестве параметра")

print(sorted(vars(dict).keys()))

print("Альтернативный вызов")

print(sorted(dict.__dict__.keys()))

Вложенные функции

Листинг 11.31. Вложенные функции

def func1(x):

def func2():

print(x)

return func2

 

f1 = func1(10)

f2 = func1(99)

f1() # Выведет: 10

f2() # Выведет: 99

 

 

def func1(x):

def func2():

print(x)

x = 30

return func2

 

f1 = func1(10)

f2 = func1(99)

f1() # Выведет: 30

f2() # Выведет: 30

 

 

def func1(x):

def func2(x=x): # Сохраняем текущее значение, а не ссылку

print(x)

x = 30

return func2

 

f1 = func1(10)

f2 = func1(99)

f1() # Выведет: 10

f2() # Выведет: 99

 

Листинг 11.32. Ключевое слово nonlocal

def func1(a):

x = a

def func2(b):

nonlocal x # Объявляем переменную как nonlocal

print(x)

x = b # Можем изменить значение x в func1()

return func2

 

f = func1(10)

f(5) # Выведет: 10

f(12) # Выведет: 5

f(3) # Выведет: 12

Аннотации функций

def func(a: "Параметр1", b: 10 + 5 = 3) -> None:

print(a, b)

 

 

>>> def func(a: "Параметр1", b: 10 + 5 = 3) -> None: pass

 

>>> func.__annotations__

{'a': 'Параметр1', 'b': 15, 'return': None}

Модули и пакеты

print(__name__) # Выведет: __main__

 

Листинг 12.1. Проверка способа запуска модуля

if __name__ == "__main__":

print("Это главная программа")

else:

print("Импортированный модуль")

12.1. Инструкция import

import time # Импортируем модуль time

print(time.strftime("%d.%m.%Y")) # Выводим текущую дату

 

Листинг 12.2. Подключение нескольких модулей сразу

import time, math # Импортируем несколько модулей сразу

print(time.strftime("%d.%m.%Y")) # Текущая дата

print(math.pi) # Число pi

 

 

math.pi

 

Листинг 12.3. Пример использования функции getattr()

import math

print(getattr(math, "pi")) # Число pi

print(getattr(math, "x", 50)) # Число 50, т. к. x не существует

 

Листинг 12.4. Проверка существования атрибута

import math

def hasattr_math(attr):

if hasattr(math, attr):

return "Атрибут существует"

else:

return "Атрибут не существует"

print(hasattr_math("pi")) # Атрибут существует

print(hasattr_math("x")) # Атрибут не существует

 

Листинг 12.5. Использование псевдонимов

import math as m # Создание псевдонима

print(m.pi) # Число pi

 

Листинг 12.6. Содержимое модуля tests.py

# -*- coding: utf-8 -*-

x = 50

 

Листинг 12.7. Содержимое основной программы

# -*- coding: utf-8 -*-

import tests # Подключаем файл tests.py

x = 22

print(tests.x) # Значение переменной x внутри модуля

print(x) # Значение переменной x в основной программе

input()

 

Листинг 12.8. Вывод ключей словаря modules

# -*- coding: utf-8 -*-

import tests, sys # Подключаем модули tests и sys

print(sorted(sys.modules.keys()))

input()

 

Листинг 12.9. Использование функции __import__()

# -*- coding: utf-8 -*-

s = "test" + "s" # Динамическое создание названия модуля

m = __import__(s) # Подключение модуля tests

print(m.x) # Вывод значения атрибута x

input()

 

Листинг 12.10. Вывод списка всех идентификаторов

# -*- coding: utf-8 -*-

import tests

print(dir(tests))

print(sorted(tests.__dict__.keys()))

input()

12.2. Инструкция from

Листинг 12.11. Инструкция from

# -*- coding: utf-8 -*-

from math import pi, floor as f

print(pi) # Вывод числа pi

# Вызываем функцию floor() через идентификатор f

print(f(5.49)) # Выведет: 5

input()

 

 

from math import (pi, floor,

sin, cos)

 

Листинг 12.12. Импорт всех идентификаторов из модуля

# -*- coding: utf-8 -*-

from math import * # Импортируем все идентификаторы из модуля math

print(pi) # Вывод числа pi

print(floor(5.49)) # Вызываем функцию floor()

input()

 

Листинг 12.13. Содержимое файла module1.py

# -*- coding: utf-8 -*-

s = "Значение из модуля module1"

 

Листинг 12.14. Содержимое файла module2.py

# -*- coding: utf-8 -*-

s = "Значение из модуля module2"

 

Листинг 12.15. Содержимое основной программы

# -*- coding: utf-8 -*-

from module1 import *

from module2 import *

import module1, module2

print(s) # Выведет: "Значение из модуля module2"

print(module1.s) # Выведет: "Значение из модуля module1"

print(module2.s) # Выведет: "Значение из модуля module2"

input()

 

Листинг 12.16. Использование атрибута __all__

# -*- coding: utf-8 -*-

x, y, z, _s = 10, 80, 22, "Строка"

__all__ = ["x", "_s"]

 

Листинг 12.17. Содержимое основной программы

# -*- coding: utf-8 -*-

from module3 import *

print(sorted(vars().keys())) # Получаем список всех идентификаторов

input()

 

Пути поиска модулей

>>> import sys # Подключаем модуль sys

>>> sys.path # path содержит список путей поиска модулей

 

 

# Это комментарий

C:\folder1

C:\folder2

 

Листинг 12.18. Изменение списка путей поиска модулей

# -*- coding: utf-8 -*-

import sys

sys.path.append(r"C:\folder1") # Добавляем в конец списка

sys.path.insert(0, r"C:\folder2") # Добавляем в начало списка

print(sys.path)

input()

 

 

sys.path.append("C:\\folder1\\folder2\\folder3")

Повторная загрузка модулей

from imp import reload

reload(<Объект модуля>)

 

 

# -*- coding: utf-8 -*-

x = 150

 

 

>>> import sys

>>> sys.path.append(r"C:\book") # Добавляем путь к папке с модулем

>>> import tests2 # Подключаем модуль tests2.py

>>> print(tests2.x) # Выводим текущее значение

 

 

>>> # Изменяем значение в модуле на 800

>>> import tests2

>>> print(tests2.x) # Значение не изменилось

 

Листинг 12.19. Повторная загрузка модуля

>>> from imp import reload

>>> reload(tests2) # Перезагружаем модуль

<module 'tests2' from 'C:\book\tests2.py'>

>>> print(tests2.x) # Значение изменилось

Пакеты

Листинг 12.20. Содержимое файлов __init__.py

# -*- coding: utf-8 -*-

print("__init__ из", __name__)

 

Листинг 12.21. Содержимое модулей module1.py, module2.py и module3.py

# -*- coding: utf-8 -*-

msg = "Модуль {0}".format(__name__)

 

Листинг 12.22. Содержимое файла main.py

# -*- coding: utf-8 -*-

 

# Доступ к модулю folder1\module1.py

import folder1.module1 as m1

# Выведет: __init__ из folder1

print(m1.msg) # Выведет: Модуль folder1.module1

from folder1 import module1 as m2

print(m2.msg) # Выведет: Модуль folder1.module1

from folder1.module1 import msg

print(msg) # Выведет: Модуль folder1.module1

 

# Доступ к модулю folder1\folder2\module2.py

import folder1.folder2.module2 as m3

# Выведет: __init__ из folder1.folder2

print(m3.msg) # Выведет: Модуль folder1.folder2.module2

from folder1.folder2 import module2 as m4

print(m4.msg) # Выведет: Модуль folder1.folder2.module2

from folder1.folder2.module2 import msg

print(msg) # Выведет: Модуль folder1.folder2.module2

 

input()

 

 

import folder1.folder2.module2

 

 

print(folder1.folder2.module2.msg)

 

 

import folder1.folder2.module2 as m

print(m.msg)

 

 

from folder1.folder2 import module2

print(module2.msg)

 

 

from folder1.folder2.module2 import msg

print(msg)

 

 

from folder1.folder2.module2 import *

print(msg)

 

 

# -*- coding: utf-8 -*-

__all__ = ["module2", "module3"]

 

Листинг 12.23. Содержимое файла main.py

# -*- coding: utf-8 -*-

from folder1.folder2 import *

print(module2.msg) # Выведет: Модуль folder1.folder2.module2

print(module3.msg) # Выведет: Модуль folder1.folder2.module3

input()

 

 

from.module import *

 

 

from..module import *

 

 

from...module import *

 

 

from.. import module

 

Листинг 12.24. Содержимое модуля module3.py

# -*- coding: utf-8 -*-

 

# Импорт модуля module2.py из текущего каталога

from. import module2 as m1

var1 = "Значение из: {0}".format(m1.msg)

from.module2 import msg as m2

var2 = "Значение из: {0}".format(m2)

 

# Импорт модуля module1.py из родительского каталога

from.. import module1 as m3

var3 = "Значение из: {0}".format(m3.msg)

from..module1 import msg as m4

var4 = "Значение из: {0}".format(m4)

 

Листинг 12.25. Содержимое файла main.py

# -*- coding: utf-8 -*-

from folder1.folder2 import module3 as m

print(m.var1) # Значение из: Модуль folder1.folder2.module2

print(m.var2) # Значение из: Модуль folder1.folder2.module2

print(m.var3) # Значение из: Модуль folder1.module1

print(m.var4) # Значение из: Модуль folder1.module1

input()

 

 

# -*- coding: utf-8 -*-

import module2 # Ошибка! Поиск модуля по абсолютному пути

var1 = "Значение из: {0}".format(module2.msg)

var2 = var3 = var4 = 0

 

 

from. import module2

 

 

import folder1.folder2.module2 as module2



Поделиться:


Последнее изменение этой страницы: 2016-06-23; просмотров: 228; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.191.195.110 (0.078 с.)