迭代器
1.迭代器
- 概念
迭代器是一个可以记住遍历的位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退 - 函数
迭代器有两个基本的方法:iter() 和 next()。
字符串,列表或元组,集合对象都可用于创建迭代器: - 如:
通过生成器 生成的对象 就是一个迭代器
dic = {"name":"xiaoming","age":20}
itDic = iter((dic))
2.生成器
- 概念
使用了 yield 的函数被称为生成器。
跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。
在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回yield的值。并在下一次从当前位置继续运行。
- 理解
a = yield 1 这个表达式,如果这个表达式只是x = 1,相信每个人都能理解是把1的值赋值给了x。而现在等号右边是一个yield 1,所以先要执行yield 1,然后才是赋值。yield把1值返回到了调用者那里,因为执行等号右边的yield就是暂停,所以不会对a赋值。
那这个表达式的下一步操作:赋值,却换句话说a = yield 1 只执行了一半,而send()里面的值的作用是把值传进当前的yield. - 例子
#案例一
def fun():
a = yield 1
print(a)
b = yield 12
print(b)
#获得迭代器
getNext = fun()
#运行迭代器中第一个元素,yield相当于return返回1,这时a是没有被赋值的即a为None
print(next(getNext))
#send函数是把把值传进yield中,即yield这时为message,而接着上面的运行,
#又因为a = yield,所以message会赋值给a,这时print(a)会输出a的值,即message
#接着运行到yield = 12,这时会相当于运行了return 12,返回了12,b没有被赋值
print(getNext.send("message"))
#案例二
def run():
yield 0
print("xxx")
yield "111"
print("yyy")
yield "222"
print("yyxx")
#1.会通过函数 的第一个生成器的对象
g=run()
#如果需要生成器一步步执行 需要使用next()
print(next(g))
#运行到yield 0,相当于return 0
print(next(g))
#先运行了print("xxx"),然后运行到yield "111",相当于return "111"
print(next(g))
3.yield
- 理解
yield 的作用就是把一个函数变成一个generator,带有 yield 的函数不再是一个普通函数,Python 解释器会将其视为一个生成器,如调用Xun函数,不会执行该函数,而是返回一个iterable迭代对象!
return与yield区别:yield与return类似,都可以返回值,但不一样的地方,yield可以返回多次值,而return只能返回一次。 - 例子
def fun():
num = 0
while True:
num += 1
yield num
- 参考
https://blog.youkuaiyun.com/mieleizhi0522/article/details/82142856