本节主要内容:
1. 迭代器
2. 生成器
1.迭代器,
之前一直在用可迭代对象进行操作,那么到底什么是可迭代对像呢,本小节主要讨论可迭代对象,可迭代对象有哪些str,tuple,lst,dic,set()
我们可以通过dir函数来查看类中定义好的所有⽅方法
示例:
s = "123"
print(dir(s))
如果是可迭代的, 就会找到__iter__ 这个字段,如果是不可迭代的,找不到这个的.
这里要注意__iter__()是获取对像的迭代器,
__next__()是获取迭代器中的元素.
示例如下:
s = "123" # print(dir(s)) c = s.__iter__()#获取可迭代对像的迭代器 print(c) print(c.__next__())#获取迭代器中的元素 print(c.__next__())
2.生成器
生成器实质就是迭代器.
在python 中有三种方式来获取生成器.
1.通过生成器函数来生成来
2.通过各种推导式来实现生成器
3.通过数据的转换也可以获取生成器
今天我们主要使用生成器函数来完成生成器的创建和使用
示例:
""" 下面是一个普通的函数 """ def fun(): lst = [] for w in range(10): lst.append(str(w)) return lst lst = fun() print(lst)
如果想改成生成器的话,就需要做出如下修改
def fun(): for w in range(10): yield str(w) l = fun() print(l) print(l.__next__()) print(l.__next__()) """ 这样就变成了生成器了,通过在函数中加yield 关键字,就变成了生成器, 下面是运行结果 <generator object fun at 0x000000D7BF4A6C50> 0 1 """
函数中存在了关键字yield,函数就变成了生成器.另外一点要注意的是,如果函数变成了生成器,那么函数的执行就不是函数执行,而是生成生成器.
f = fun()
比如这样是生成生成器f .因为生成器本质上是迭代器,所以执行是f.__next__()来执行的.
这里重点说一下yield和return的区别.
return是函数执行到这里函数就结束了,yield是执行到这里返回yield后面的内容.生成器暂停,再调用再执行.
另外一点就是如果生成器执行完了,再执行yield会报错.
再介绍一个send()方法,send方法和yield方法一样都是让生成器执行到下一个yield
send()和yield不同之处在于send可以给上一个yield传值.不能给最后一个yield传值.在第一次执行代码时需要用next()
示例:
def fun(): print("今天天气很好,适合出去玩.") c = yield "那到哪里玩呢?" print(c) print("不错的主意!") yield "结束" f = fun() f.__next__() en = f.send("天安门") print(en)
这里要注意两点,一个是send()是传给上一个yield.以及send会执行到下一个yield.所以这个特性导致了不能第一个执行yield以及不能给最后的yield赋值