python基础(八):函数yield生成器和iter迭代器

yield生成器:

  • yield是生成器,生成一个迭代器,其作用是把一个函数变成一个generator。

与普通函数不同,生成器是一个返回迭代器的函数,只能用于迭代操作。在调用生成器的过程中,每遇到yield时函数会暂停并保存当前所有的运行内存信息,返回yield的值,并在下一次从当前位置继续运行。

注:可以通过for循环或者手动调用Xun(5)的next()方法。

例1:

当使用return时,函数运行到return即截止,返回数值。

def getNum(n):
    i = 0
    while i <= n:
        return i        # 循环结束,不能再运行下一行
        i += 1
print(getNum(5))
# output:0

把return改成yield后:

def getNum(n):
    i = 0
    while i <= n:
        yield i
        i += 1
print(getNum(5))
# output:<generator object getNum at 0x000002D818C496D8>

 返回了一个生成器对象。

将getNum(5)赋值给a,再print(a):

def getNum(n):
    i = 0
    while i <= n:
        yield i
        i += 1
a = getNum(5)
print(next(a))          # output:0
print(next(a))          # output:1

可以看到,第一个print(next(a))调用了getNum生成器,当运行到yield时,返回i的值(0);第二个print(next(a))使生成器接着从yield开始运行,再运行到yield时返回i的值(1)。

一般地,我们采用for循环:

def getNum(n):
    i = 0
    while i <= n:
        yield i
        i += 1
a = getNum(5)
for i in a:
    print(i)

注:例子中,当i运行到6时,也就是调用6次next(a)时,会报错。

  • 使用生成器可以达到延迟操作的效果,所谓延迟操作就只指在需要的时候产生结果,而不是立即产生结果,节省资源消耗。和声明一个序列不同的是,生成器在不使用的时候几乎是不占内存的。

例2:

for循环本身就是一个生成器。当我们运行如下所示的代码时,非常占内存,会卡。

a = [x for x in range(10000000)]
print(a)

换种方式,把它变成生成器:

a = (x for x in range(10000000))
print(a)

用一下生成一个,不占内存。(这里的括号和元祖没关系) 

 

例3:

我们给yield赋值:

def getNum(n):
    i = 0
    while i <= n:
        temp = yield i
        print(temp)
        i += 1
a = getNum(5) 
print(next(a))
print(next(a))

会发现输出是:

0
None
1

是因为yield返回值后,再次运行时,只运行temp=,所以temp是None。

我们把next改为a.send:

def getNum(n):
    i = 0
    while i <= n:
        temp = yield i
        print(temp)
        i += 1
a = getNum(5) 
print(next(a))
print(a.send('我是a'))

输出:

0
我是a
1

用send,我们把“我是a”字符串送回生成器,赋值给了temp。

 

iter迭代器:

        迭代器是python最强大的功能之一,是访问集合元素的一种方式。

       迭代器是一个可以记住遍历的位置的对象。迭代器对象从集合的第一个元素开始访问,只到所有的元素被访问完结束。

       迭代器只能往前不会后退。迭代器有两个基本方法:iter(), 和next()。

       字符串,列表或元祖,集合对象都可以用于创建迭代器:

list1 = [1, 2, 3, 4]
it = iter(list1)        # 创建迭代器对象
print(next(it))        # 输出迭代器的下一个元素 output:1
print(next(it))        # output:2

        可迭代对象:可以用for in 便利的对象都可以叫可迭代对象。如:list, string, dict。

        迭代器:可以被next()函数调用的,并不断返回下一个值的对象叫迭代器。

        凡是可以用作与next()函数的对象都是可迭代对象。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python中的生成器都是用于处理大量数据或者无限序列的工具,但是它们在实现方式和使用方法上有所不同。 生成器是一种特殊的函数,它能够暂停执行并保存当前的状态,然后在需要时恢复执行。这样可以避免创建大量的数据对象,从而节省内存空间。生成器可以通过yield语句来实现,每次执行到yield语句时,函数会返回一个值,并暂停执行,等待下一次调用时恢复执行。例如: ```python def my_generator(): yield 1 yield 2 yield 3 gen = my_generator() print(next(gen)) # 1 print(next(gen)) # 2 print(next(gen)) # 3 ``` 是一种对象,它能够遍历一个序列,并且支持一些特定的操作,比如获取下一个元素。Python中的列表、元组、字典等数据类型都是可代的对象。可以通过调用iter函数来获取一个对象,然后使用next函数来获取下一个元素,直到代结束。例如: ```python my_list = [1, 2, 3] my_iterator = iter(my_list) print(next(my_iterator)) # 1 print(next(my_iterator)) # 2 print(next(my_iterator)) # 3 ``` 需要注意的是,只能遍历一次,遍历结束后就不能再次使用。如果需要多次遍历,可以重新获取对象。另外,可以使用for循环来遍历可代对象,for循环会自动调用iter函数获取对象,并使用next函数遍历序列。例如: ```python my_list = [1, 2, 3] for item in my_list: print(item) ``` 这样就可以遍历my_list中的所有元素。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值