生成器定义:
generator:生成器本质上就是迭代器
获取生成器:
# 首先我们先看一个简单函数
def func():
print("约吗?")
return "叔叔我不约
ret = func()
print(ret)
# 约吗?
# 叔叔我不约
# 将函数中的return换成yield就是生成器
def func():
print("约吗?")
yield "叔叔我不约"
ret = func()
print(ret)
# <generator object func at 0x0000022CBD94CEB8>
yield 和 return的区别:
- yield是分段来执行⼀个函数。 return直接停⽌执⾏函数。
- 当程序运⾏完最后⼀个yield, 那么后⾯继续进⾏next()程序会报错。
def func():
print("哈哈哈谁都不能阻止我打印...")
return "SB"
print("我还想接着打印,给个机会...")
ret = func()
print(ret)
# 哈哈哈谁都不能阻止我打印...
# SB
def func():
print("哈哈哈谁都不能阻止我打印...")
yield "SB"
print("你越这么说我越要打印哈哈哈...")
yield "S2B"
print("我就是要打印,你喊return来都没用哈哈哈")
# return "SB"
# print("爸爸给个机会!!!")
ret = func()
print(ret.__next__())
# 哈哈哈谁都不能阻止我打印...
# SB
print(ret.__next__())
# S2B
# 我就是要打印,你喊return来都没用哈哈哈
send() 和 next()区别:
- send() 和 next() 都是让生成器向下走一次
- send()可以给上⼀个yield的位置传递值, 不能给最后⼀个yield发送值。 在第⼀次执⾏⽣成器代码的时候不能使⽤send(),因为没有yield可以接收。
优点:
由于生成器具有惰性机制,每次想要得到值都必须next()去取一次,所有生成器具有节省内存的优点。
# 鸡蛋
def get_eggs():
eggs = []
for i in range(10000):
eggs.append(i)
return eggs
ret = get_eggs() # 10000个鸡蛋
# 老母鸡
def get_eggs():
for i in range(10000):
yield i
ret = get_eggs() # 老母鸡
print(ret.__next__()) # 老母鸡下1个蛋
print(ret.__next__()) # 老母鸡下2个蛋
迭代器定义:
- 凡是可作⽤于 for 循环的对象都是 Iterable 可迭代对象
- 凡是可作⽤于 next() 函数的对象都是 Iterator 迭代器(⽣成器都是 Iterator 对象)
- 集合数据类型如 list 、 dict 、 str 等是 Iterable ,但不是 Iterator ,不过可 以通过 iter() 函数获得⼀个 Iterator 对象。
闭包定义:
函数里面再定义一个函数,里面的函数用到外面函数的变量,称这个这个函数以及⽤到的变量称为闭包
优点:
- 数据常驻内存,方便反复读取 (保证外层函数中的变量在内存中常驻)
- 数据安全,函数外部无法修改闭包引用的变量
from urllib.request import urlopen
def but():
content = urlopen("http://www.xiaohua100.cn/index.html").read()
def get_content():
return content
return get_content
fn = but() # 这个时候就开始加载校花100的内容
# 后⾯需要⽤到这⾥⾯的内容就不需要在执⾏⾮常耗时的⽹络连接操作了
网友评论