[每日一题]18、Python中迭代器、生成器、yield

点击上方Python3X”,选择“置顶或者星标

第一时间收到精彩推送!


Python Every Day, 第 18 天



在理解yield之前,你必须先知道iterable(迭代器)和generator(生成器)。


迭代器:

我们平时使用的列表,就是一个迭代器。可以通过for循环的方式去读取列表中的每一个元素。


所有可以通过for .. in 进行遍历的都是迭代器 。比如列表、字符串、files


 
 
arr = [1, 2, 3, 4]for i in arr:    print(i)for i in 'Python3X':    print(i)234]
for i in arr:
    print(i)

for i in 'Python3X':
    print(i)


生成器(generator):


如上迭代器声明一个列表或者字符串,当他们存储的内容过多时,会占用较多的内存。 这时候生成器的作用就显现出来了。


比如定义一个生成器


 
 
# 把创建列表的[] 改成 () 就创建了一个生成器genergener = (i ** 2 for i in range(10))for i in gener:    print(i) # 一次打印0、1、4、9、16 ... i的平方
gener = (i ** 2 for i in range(10))

for i in gener:
    print(i) # 一次打印0、1、4、9、16 ... i的平方


如上,gener只是一个对象,并不会像列表一样占用太多空间。


yield


一定程度上来讲相当于return,区别在于return执行完之后不再往后执行,而yield相当于把返回一个生成器,程序不会终止


如下代码,会依次打印什么呢?


 
 
def m():    print('m()  starting')    while True:        result = yield 1        print('result = ', result)g = m()  print(next(g))print('*' * 10)print(next(g))print('&' * 10)print(next(g))
    print('m()  starting')
    while True:
        result = yield 1
        print('result = ', result)

g = m()  
print(next(g))
print('*' * 10)
print(next(g))
print('&' * 10)
print(next(g))


最终结果和解释如下


 
 
m()  starting      # 刚进入函数m() 执行的打印信息1                  # 执行next(g) 返回1,而不会再去执行result=xxx**********         # '*' * 10 标记用result =  None     # 再次执行next(g)的时候,首先打印了result = None,1                  # 然后才返回1 &&&&&&&&&&         # 标记用result =  None     # 继续执行next(g), 仍然返回result=None1                  # 然后才返回1
1                  # 执行next(g) 返回1,而不会再去执行result=xxx
**********         # '*' * 10 标记用
result =  None     # 再次执行next(g)的时候,首先打印了result = None,
1                  # 然后才返回1 
&&&&&&&&&&         # 标记用
result =  None     # 继续执行next(g), 仍然返回result=None
1                  # 然后才返回1


由此可以证明,当执行yield的时候返回了1(生成器对象),再不会往下执行,当再次调用函数m的时候才继续往下执行,执行while循环,再遇到yield的时候继续返回生成器对象。 以此类推。。

往期Python Every Day

[每日一题]17、用Python将字符串进行特殊的转换

[每日一题]16、用Python算出100万内的雷劈数

[每日一题]15、用Python输出杨辉三角

[每日一题]14、Python中is和== 的区别

[每日一题]13、任意数组,实现一个特定的排序

[每日一题]12、Python中的多线程

[每日一题]11、用Python打印乘法口诀表

[每日一题]10、一道关于九宫格的面试题

[每日一题]9、Python中文件的读取

[每日一题]8、Python中的深拷贝和浅拷贝

[每日一题]7、Python中的super()函数

 [每日一题]6、Python中的可变参数

[每日一题]5、Python中的lambda表达式

[每日一题]4、Python中的迭代器

[每日一题]3、Python实现删除list中重复元素的几种方式

[每日一题]2、Python中的类的定义和装饰器@classmethod与@staticmethod

[每日一题] 1、Python中的可变对象与不可变对象


640?



感谢您的阅读


640?wx_fmt=gif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
迭代器生成器Python 用于处理可迭代对象的两种重要机制。 迭代器是一个实现了迭代协议的对象,它通过定义 `__iter__()` 和 `__next__()` 方法来实现。`__iter__()` 方法返回迭代器本身,而 `__next__()` 方法返回下一个元素。当没有更多元素时,`__next__()` 方法会引发 `StopIteration` 异常。可以使用内置的 `iter()` 函从可迭代对象获取迭代器生成器是一种特殊的迭代器,它使用函来创建。生成器使用 `yield` 语句来产生一个值,并在下次调用时从离开的地方继续执行。与普通函不同,生成器在调用时不会立即执行,而是返回一个生成器对象。可以使用 `next()` 函或 `for` 循环来迭代生成器对象。 使用生成器可以有效地处理大型据集或无限序列,因为它们按需生成值,而不需要一次性将所有值存储在内存。 下面是一个迭代器生成器的示例代码: ```python # 迭代器示例 class MyIterator: def __init__(self, data): self.data = data self.index = 0 def __iter__(self): return self def __next__(self): if self.index >= len(self.data): raise StopIteration value = self.data[self.index] self.index += 1 return value my_iter = MyIterator([1, 2, 3]) for num in my_iter: print(num) # 生成器示例 def my_generator(data): for num in data: yield num my_gen = my_generator([1, 2, 3]) for num in my_gen: print(num) ``` 输出结果为: ``` 1 2 3 1 2 3 ``` 希望以上内容能对你有所帮助!如果你还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值