global 和 nonlocal
b = '全局变量 global variable'
def foo():
a = '局部变量 local variable'
# 在局部里面操作全局变量,需要加上声明
global b
b = b + '!!!'
print(b)
foo()
# 全局变量 global variable!!!
b = '全局变量 global variable'
def foo():
a = '局部变量 local variable'
# 在二级局部变量里面操作一级局部变量,则使用 nonlocal 进行声明
def inner_foo():
nonlocal a
a = a + '!!!'
print(a)
inner_foo()
print(a)
foo()
# 局部变量 local variable!!!
# 局部变量 local variable!!!
协程
概念
基本认识
- 协程不是计算机提供的,它由程序员认为创造
- 协程(Coroutine),也可以被称为微线程,是一种用户态内的上下文切换技术
- 简单来说,就是通过一个线程实现代码块相互切换执行
实现协程的方式
- 通过第三方模块
greenlet
- yield 关键字
- asyncio 装饰器(Python 3.4)
- async、await 关键字(Python 3.5)【推荐】
实现
通过 greenlet 实现(了解)
pip install greenlet
from greenlet import greenlet
def func1():
print(1) # 第2步:输出1
gr2.switch() # 第3步:切换到 func2 函数
print(2) # 第6步:输出2
gr2.switch() # 第7步:切换到 func2 函数,从上一次执行的位置继续向后执行
def func2():
print(3) # 第4步:输出 3
gr1.switch() # 第5步:切换到 func1 函数,从上一次执行的位置继续向后执行
print(4) # 第8步:输出4
gr1 = greenlet(func1)
gr2 = greenlet(func2)
gr1.switch() # 第1步:去执行 func1 函数
通过 yield 关键字(了解)
def func1():
yield 1
yield from func2()
yield 2
def func2():
yield 3
yield 4
# 调用生成器函数,返回生成器对象
obj = func1()
print(obj)
# for...in... 背后会不断调用 next(obj) 来获取 yield 产生的数据
for i in obj:
print(i)
# <generator object func1 at 0x0000025CB2A84E80>
# 1</