python——函数 19、生成器(一)

一、什么是生成器?

答:当函数体内有yield的关键字时就叫做生成器

def foo():
    print(‘a‘)
    yield 1
    print(‘b‘)
    yield 2
    print(‘c‘)
    yield 3
x=foo()
print(x.__next__())
print(x.__next__())

可以看出 1、生成器就是迭代器

2、yield与return一样 都是返回值 (区别?向下继续看)

既然生成器就是迭代器 那就可以用for循环来实现一下这个

def foo():
    print(‘a‘)
    yield 1
    print(‘b‘)
    yield 2
    print(‘c‘)
    yield 3
    print(‘d‘)
x=foo()
for i in x:
    pass
在迭代器里已经说过for循环原理像这个for循环 for i in x: (#obj=x.__iter__#obj.__next__)
def foo():
    print(‘a‘)
    yield 1
    print(‘b‘)
    yield 2
    print(‘c‘)
    yield 3
    print(‘d‘)
x=foo()
for i in x:
    print(i)#将每次next返回值打出来
每一个next都会print一次 所以打印的结果如下图: 可以看到d是没有返回值的 在迭代器里 就会报出StopIteration但是for循环里他会自动捕捉所以就不会报异常

二、yield的功能

1、把函数的最后执行结果做成迭代器

2、yield与return类似,只不过是yield可以返回多个值,而return只能返回一个值

3、遵循迭代器取值方式 obj.__next__(),触发函数执行,当运行一次obj.__next__()时函数就会停到第一个yield,也就是说你写几个obj.__next__()你函数就停在第几个yield

例子:

def foo(x):
    print(‘play‘)
    while x>0:
        yield x
        x-=1
    print(‘game over‘)
g=foo(5)
print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__())

当然 这样会报一个StopIteration的异常,前面已经说过既然是迭代器也可以这么改一下代码:

def foo(x):
    print(‘play‘)
    while x>0:
        yield x
        x-=1
    print(‘game over‘)
g=foo(5)
for i in g:
    print(i)

不再写g.__next__() ,把它改为for循环 就可以自动捕捉异常 不会再报出StopIteration异常

原文地址:https://www.cnblogs.com/StevenSunYiwen/p/9358683.html

时间: 2024-10-01 05:06:05

python——函数 19、生成器(一)的相关文章

Python函数(十一)-生成器

首先看一下什么是列表生成式 >>> [i*2 for i in range(10)] [0, 2, 4, 6, 8, 10, 12, 14, 16, 18] >>> a=[] >>> for i in range(10): ... a.append(i*2) ... >>> a [0, 2, 4, 6, 8, 10, 12, 14, 16, 18] 这一句代码就实现了三句代码的效果,这一句代码就是列表生成式 列表如果存的数据太多,就会

(1-6)python函数_生成器

理解: 我们先用一个通俗的比方来了解下生成器,去饭店吃饭时,我们点了菜单,厨师不是一次性把菜都上齐,而是一个个菜上.这里的厨师就是一个生成器对象.生成器是python一大特性,python使用生成器对延迟操作提供支持,只在都要好好的时候才产生结果,而不是立 即产生结果. 1.生成器函数:常规函数定义,使用yield语句而不是return语句返回结果,yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次从它离开的地方继续执行 2.生成器表达式:类似于列表,但是,生成器返回按需产

Python函数-5 生成器

生成器 有时候,序列或集合内的元素的个数非常巨大,如果全制造出来并放入内存,对计算机的压力是非常大的.比如,假设需要获取一个10**20次方如此巨大的数据序列,把每一个数都生成出来,并放在一个内存的列表内,这是粗暴的方式,有如此大的内存么?如果元素可以按照某种算法推算出来,需要就计算到哪个,就可以在循环的过程中不断推算出后续的元素,而不必创建完整的元素集合,从而节省大量的空间.在Python中,这种一边循环一边计算出元素的机制,称为生成器:generator. 生成生成器: g = (x * x

python函数、装饰器、迭代器、生成器

5月21日,请假结婚,然后性格惰性来了,不怎么想看视频和笔记,性格中的弱点开始出现,开始做的不错,渐渐开始松懈,直至放弃--- 函数补充进阶 函数对象 函数的嵌套 名称空间与作用域 闭包函数 函数之装饰器 函数之迭代器 函数之生成器 内置函数 一.函数补充进阶 1.函数对象:  函数是第一类对象,即函数可以当作数据传递,它的应用形式也被称为高阶函数,函数的特性如下: a. 可以被引用 1 # def foo(): 2 # print('from foo') 3 # 4 # func = foo

python函数:迭代器和生成器

python函数:迭代器和生成器 迭代器和生成器是函数中的一大重点,务必掌握,何为迭代?何为迭代器? 预习: 处理文件,用户指定要查找的文件和内容,将文件中包含要查找内容的每一行都输出到屏幕(使用生成器) 一.迭代器 for i in 50:     print(i) #运行结果: # Traceback (most recent call last): #   File "G:/python/python代码/八月/day2 迭代器生成器/3迭代器.py", line 8, in &

python中的生成器函数是如何工作的?

以下内容基于python3.4 1. python中的普通函数是怎么运行的? 当一个python函数在执行时,它会在相应的python栈帧上运行,栈帧表示程序运行时函数调用栈中的某一帧.想要获得某个函数相关的栈帧,则必须在调用这个函数且这个函数尚未返回时获取,可能通过inspect模块的currentframe()函数获取当前栈帧. 栈帧对象中的3个常用的属性: f_back : 调用栈的上一级栈帧 f_code: 栈帧对应的c f_locals: 用在当前栈帧时的局部变量; 比如: >>&g

python函数-迭代器和生成器

一 迭代器 1.1 认识迭代器 什么是迭代 什么是迭代器 迭代器 如何从列表.字典中取值的 index索引 ,key for循环 凡是可以使用for循环取值的都是可迭代的 可迭代协议 :内部含有__iter__方法的都是可迭代的 迭代器协议 :内部含有__iter__方法和__next__方法的都是迭代器 一个生成器 只能取一次生成器在不找它要值的时候始终不执行当他执行的时候,要以执行时候的所有变量值为准 l = [1,2,3] while True: lst = l.__iter__() ##

python之迭代器生成器和内置函数,匿名函数

今天学习了迭代器生成器以及内置函数和匿名函数,说实话有些懵圈,有些难度了. 一.迭代器和生成器 1.如何从列表.字典中取值的: index索引 for循环 凡是可以使用for循环取值的都是可迭代的 (1)可迭代协议:内部含有__iter__方法的都是可迭代的 (2)迭代器协议:内部含有__iter__方法和__next__方法的都是迭代器 什么是可迭代的:内部含有__iter__方法的都是可迭代的 什么是迭代器:迭代器=iter(可迭代的),自带一个__next__方法 可迭代最大的优势:节省内

Python函数进阶:闭包、装饰器、生成器、协程

返回目录 本篇索引 (1)闭包 (2)装饰器 (3)生成器 (4)协程 (1)闭包 闭包(closure)是很多现代编程语言都有的特点,像C++.Java.JavaScript等都实现或部分实现了闭包功能,很多高级应用都会依靠闭包实现. 一般专业文献上对闭包的定义都比较拗口,比如:“将组成函数的语句和这些语句的执行环境打包在一起时,得到的对象称为闭包.” 其实,简单来说,你可以将闭包看成是一个轻载的类,这个类只有一个函数方法,并且只有为数不多的几个成员变量. 闭包的优点是:实现起来比类稍微轻巧一