python学习第十二章

本节主要内容:

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赋值

猜你喜欢

转载自www.cnblogs.com/ahliucong/p/9198928.html
今日推荐