python迭代器、生成器

1、迭代器

#迭代器,有两个bif:1、iter():对一个容器对象调用iter()可以得到他的迭代器;2、next():迭代器返回下一个值
#两个魔法方法:__inter__()   __next__()

for each in 'luffy': #'luffy'为一个容器对象
    print(each)
'''===================================
l
u
f
f0
y
0
'''
dic={'luffy':'op',\
     'chopper':'doctor',\
     'zoro':'sword'}
for xyz in dic:
    print('%s -> %s'% (xyz,dic[xyz]))
    
'''===========================
luffy -> op
chopper -> doctor
zoro -> sword
'''
    
string='luffy' #容器对象
one=iter(string) #one即为一个迭代器
while True:
    try:
        each=next(one)
    except:
        print('迭代完毕')
        break
    print(each)
'''========================
l
u
f
f
y
迭代完毕
'''
'''
#使用魔法方法重写,可获得想要的效果
class Fibs: #斐波那契
    def __init__(self):
        self.a=0
        self.b=1
    def __inter__(self): #返回自身
        return self
    def __next__(self):
        self.a,self.b=self.b,self.a+self.b
        return self.a
fibs=Fibs()
for i in fibs:
    if i<20:
        print(i)
    else:
        break
'''

2、生成器

#===============生成器===================
#生成器其实是特殊的迭代器
def luffy():
    print('生成器')
    yield 1   #yield,相当于普通函数的return,但是retrun返回后函数结束,而yield返回后会使程序暂停
              #下一次执行时,会从下一步开始执行
    yield 2

onep=luffy()
print(next(onep)) #输出1,下一次执行从  yield 2  开始
print(next(onep)) #输出2,再次执行会报错

#=============for可以自动调用next方法,探测报错======

for i in luffy(): #容器对象为luffy(),不是onep()
    print(i) #全部输出

#==============生成器表达式=============
#生成器表达式和生成器函数都能够得到生成器对象
#列表推导式
x=[i for i in range(50) if not(i%3) and i%2] #输出0-50中能被3整除不能被2整除的数,当满足条件时,才能进入for循环。not(i%3)为真,且i%2为真(即余数不为0)
#for前面是要被输出的数
print(x) #[3, 9, 15, 21, 27, 33, 39, 45]

#字典推导式
y={i:i for i in range(9) if not(i%2)} 
print(y) #{0: 0, 2: 2, 4: 4, 6: 6, 8: 8}

z={i:i%2==0 for i in range(20)} #for前面为布尔类型,故输出为布尔类型
print(z)
'''
{0: True, 1: False, 2: True, 3: False, 4: True, 5: False, 6: True, 7: False, 8: True, 9: False,10: True, 11: False, 12: True, 13: False, 14: True, 15: False, 16: True, 17: False, 18: True, 19: False}
''''
#还有集合推导式,元组推导式等等 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python中的生成器是一种基于惰性计算的概念,它们可以有效地处理大量的数据或者无限序列。下面我将分别介绍生成器(Iterator)是一个实现了代协议(Iterator Protocol)的对象。通过调用内置函数 `iter()` 可以将可代对象转换为对象可以使用内置函数 `next()` 来逐个访问数据元素,直到没有更多的元素可供访问时,会引发 `StopIteration` 异常。例如,可以使用来遍历列表、元组、集合等容类型的数据。 生成器(Generator)则是一种特殊的。它不需要显式地实现代协议,而是通过函数中的 `yield` 关键字来实现惰性计算。生成器函数在每次调用时返回一个值,并在下一次调用时从上一次离开的位置继续执行。这样可以节省大量的内存空间,并且提高程序的效率。生成器函数定义时使用 `def` 关键字,并包含至少一个 `yield` 关键字。 下面是一个简单的示例代码,演示了如何使用生成器: ```python # 使用遍历列表 my_list = [1, 2, 3, 4, 5] my_iter = iter(my_list) while True: try: item = next(my_iter) print(item) except StopIteration: break # 使用生成器生成斐波那契数列 def fibonacci(): a, b = 0, 1 while True: yield a a, b = b, a + b fib = fibonacci() for i in range(10): print(next(fib)) ``` 希望以上解释能够帮助你理解生成器的概念。如果有任何进一步的问题,请随时提问!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值