迭代器总结与生成器

迭代器总结(迭代取值和索引取值的对比)

# 迭代器主要就是一个迭代取值,另外一种取值方式就是索引(下标)取值

迭代取值
    1. 不依赖于索引取值的一种取值方式
    2. 不能够重复取值,只能够从左往右固定取值
索引取值
    1. 它能够重复取值(通过索引l[0])
    2. 它需要是容器类型

l = [1, 2, 3, 4]

res = l.__iter__()
res.__next__() # 1
res.__next__() # 2

res1 = l.__iter__()
res1.__next__()  # 1
res1.__next__()  # 2

生成器

 Python 中,使用了 yield 的函数被称为生成器(generator)

yield 是一个关键字,用于定义生成器函数,生成器函数是一种特殊的函数,可以在迭代过程中逐步产生值,而不是一次性返回所有结果。跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器

def index():
    print('from index')
    print('from index')
    yield 123,234,345 # 以元组的方式返回
    print('second')
    print('second')
    yield 'hello'
    print('three')
    yield

res=index()
print(res)  
print(res.__next__())


## 生成器其实就是一个自定义的迭代器
# res.__next__() # 只要你调用next方法,代码就会走到函数中第一个yield关键字所在的位置停住
# res.__next__() # 代码从上一次yield停住的地方继续往下执行,走到遇到下一个yield停住

生成器练习题

# range() 三种玩法

def my_range():
    pass

for i in range(0,10):
    print(i)

    
def my_range(start, stop=None, step=1):
    if not stop: # 意味着只传了一个参数,stop没有值
        stop = start
        start = 0
    while start < stop:
        yield start
        start+=step

# print(my_range(0, 20))
# for i in my_range(0, 20):
#     print(i)

# for i in my_range(0, 20, 2):
#     print(i)

for i in my_range(10):
    print(i)

生成器yield的其他用法

def eater(name):
    print('%s:正在吃...' % name)
    while True:
        food = yield
        print('%s正在吃%s' % (name, food))

'''eater就变成了生成器'''
res=eater('jerry') # 生成器对象:generator object
print(res)

res.__next__()

# send做了两件事情:1. 传值给yield、2. 执行__next__
res.send('包子')
res.send('水果')

生成器表达式

列表生成式
res = [name for name in names_list]
print(res) # 就是一个列表

res1 = (name for name in names_list)
print(res1)
names_list = ['kevin', 'jerry', 'tony', 'oscar']
res1 = (name for name in names_list)
print(res1)

print(res1.__next__())
print(res1.__next__())

生成器表达式如果不使用数据,就不给你数据

把迭代器、生成器看成是一个工厂,什么时候需要数据工厂就给你加工数据
目的:就是为了节省内存空间

生成器笔试题

# 求和
def add(n, i):
    return n + i
# 调用之前是函数 调用之后是生成器
def test():
    for i in range(4):
        yield i
g = test()  # 初始化生成器对象
for n in [1, 10]:
    g = (add(n, i) for i in g)

res = list(g)
print(res)

#A. res=[10,11,12,13]
#B. res=[11,12,13,14]
C. res=[20,21,22,23]     #结果
#D. res=[21,22,23,24]

yield和return的对比

yield
    1. 代码遇到yield不会停止,而是停住
    2. yield也可以有返回值,并且还支持多个,以元组的形式返回
    3. yield可以把一个函数变成生成器,next取值

return
    1. 代码遇到return就会停止
    2. return可以有返回值并且还支持多个,以元组的形式返回

拓展程序员需要知道的几个网站

1. https://www.runoob.com/python/python-func-dir.html
2. https://www.w3school.com.cn/html/index.asp
3. 博客园、CSDN、github、gitee、等

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值