Python 技能提升(三)

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</
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值