十四:生成器函数和迭代器函数

一:列表生成器:就是在列表内部使用一条语句来生成一个列表。

example 1: 列表生成器示例

 1 # 列表生成: 把可迭代对象中的每一个元素进行操作的结果放在列表中
 2
 3 s = [x * x for x in range(5)]
 4
 5
 6 # 操作也可以是一个函数
 7
 8 def f(x):
 9     return x * x
10
11 s = [f(x) for x in range(5)]

二:生成器函数:生成器函数与一般的函数有一个显著的不同,对于一般的函数,会把所有的结果一次性返回,被存储到内存中,对于数据量比较大的结果如果一次性全部返回会占用非常大的内存空间;但是生成器只是返回一个生成器对象,如果想要返回结果,只能调用内部的 next()方法进行操作,并且每次只能返回一个结果,对于大量的 next()操作可以使用 for 循环来实现。

example 2: 列表生成器创建生成器

1 s = (x * 2 for x in range(10))
2 print(s)    # <generator object <genexpr> at 0x00EEEA50>
3
4 for i in s: # 生成器是一个可迭代对象
5     print(i)
6
7 print(next(s))   # 等价于 s.__next__() in py2

三:生成器的创建:创建一个生成器有两种方式,一种就是利用列表生成式来创建一个元祖,这个元祖就是一个生成器;另外一种方式就是使用yield来创建一个生成器。

example 3:yield 创建生成器示例:

 1 # 生成器的创建方式:yield 关键字实现
 2
 3 # def foo():   # 生成器函数
 4 #     print(‘ok‘)
 5 #     yield 1     # 类似于一般函数的 return ,返回值为 1,下次从这个断点开始往下执行
 6 #     print(‘ok2‘)
 7 #     yield 2
 8 #
 9 # f = foo()   # f 是一个生成器
10 # print(f)
11 #
12 # for i in f :  #生成器本身就是一个可迭代对象
13 #     print(i)   # 内存中始终只存储有一个元素,py垃圾回收机制

四:可迭代对象:就是内部有 iter() 方法的对象,比如,列表,元祖,字典,都是可迭代对象。

example 4: 可迭代对象

1 # 什么是可迭代对象? 内部有iter方法,列表,元祖,字典都是可迭代对象
2
3 L= [1,2,3]
4
5 L.__iter__()

五:利用 yield 来实现斐波那契数列,每个元素一个一个生成,并不是一下子都执行出来存放在内存中

example 5: 利用yield 来实现 斐波那契数列

 1 # 斐波那契数列:0 1 1 2 3 5 8 13
 2
 3 # def fib(max):
 4 #     n,befor,after = (0,0,1)
 5 #     while n<max:
 6 #         yield befor     # 通过调用 next()一个一个的返回
 7 #         befor,after = after,befor + after
 8 #         n += 1
 9 #
10 # f = fib(8)
11 # print(f)
12
13 # print(next(f))   # 0
14 # print(next(f))   # 1
15 # print(next(f))   # 1

yield 实现 Fib 数列

六:生成器中的传值操作:send():可以利用该函数传入值,即把该值传送给 yield 的值

example 6:生成器传值

 1 def bar():
 2     print(‘ok1‘)
 3     count = yield 1
 4     print(count)
 5
 6     yield 2
 7
 8 f = bar()
 9 print(f)
10
11 next(f)  # 打印 ok1, yield返回
12 # s = f.send(None)  # 第一次send 只能传入None ,等同于 next(f)
13 ret = f.send(‘eee‘)   # 把‘eee’发送到上次断点处,赋值给 count ,然后打印
14 print(ret)   # 将整个生成器函数的返回值 返回给调用者,赋值给 ret

七:迭代器:生成器都是迭代器,迭代器不一定都是生成器。可迭代对象通过内置的 iter() 方法可以转化为一个迭代器。迭代器同样可以通过调用 next()方法。

1 # 生成器都是迭代器,迭代器不一定是生成器
2
3 L= [1,2,3,4]
4 d = iter(L)
5 print(d)   # <list_iterator object at 0x017873F0>
6
7 print(next(d))  # 1
8
9 for i in [1,2,3]:  # 1,调用可迭代对象的 iter 方法 返回一个迭代器对象,2,不断调用迭代器对象的 next 方法 3,处理Iterorstop异常

原文地址:https://www.cnblogs.com/zpcoding/p/9480768.html

时间: 2024-09-30 20:51:00

十四:生成器函数和迭代器函数的相关文章

《C++编程思想》 第十四章 多态和虚函数 (原书代码+习题+讲解)

一.相关知识点 函数调用捆绑 把函数体与函数调用相联系称为捆绑(binding).当捆绑在程序运行之前(由编译器和连接器)完成时,称为早捆绑.我们可能没有听到过这个术语,因为在过程语言中是不会有的:C编译只有一种函数调用,就是早捆绑.上面程序中的问题是早捆绑引起的,因为编译器在只有 instrument地址时它不知道正确的调用函数.解决方法被称为晚捆绑,这意味着捆绑在运行时发生,基于对象的类型.晚捆绑又称为动态捆绑或运行时捆绑.当一个语言实现晚捆绑时,必须有一种机制在运行时确定对象的类型和合适的

第十四篇 SQL游标、函数的使用方法

游标的的使用有日常的开发和维护的过程不使用的并不多,但是碰到一些棘手的问题的时候,游标时常是个非常好的帮手,下面就说下游标的使用方法,方法自己以后查阅,和加深一些印象,下面以一个存储过程为例 T-SQL中的游标定义在MSDN中如下: DECLARE cursor_name CURSOR [ LOCAL | GLOBAL ] [ FORWARD_ONLY | SCROLL ] [ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ] [ READ_ONLY | SC

第十四章 高级I/O函数

在I/O操作上设置超时的三种方法: 调用alarm,超时产生SIGALRM信号: 在select中阻塞等待I/O,select可以设定超时,代替阻塞在I/O调用上: 使用SO_RCVTIMEO和SO_SNDTIMEO套接字选项: 书中的connect_timeo.c是封装了connect,并且多传入一个超时时间参数. #include "../include/unpv13.h" static void connect_alarm(int); int connect_timeo(int 

【叶子函数分享五十四】汉字转拼音函数 [转]

/* ------------------------------------------------------------- 函数: fn_GetPinyin 描述: 汉字转拼音(无数据表版) 使用: dbo.fn_GetPinyin('中华人民共和国') = zhonghuarenmingongheguo 作者: 流香羽(改编:Tony) 博客: http://hi.baidu.com/流香羽 ------------------------------------------------

python第十四课--排序及自定义函数之案例二:冒泡排序

案例二:冒泡排序 lt1=[45,12,56,-32,-3,44,75,-22,100] print('排序前:'+str(lt1)) 自定义函数:实现冒泡排序(升序)原则:1).有没有形参?有,接受一个列表对象 2).有没有返回值?没有,排完就排完 def bubbleSort(lt): length=len(lt) for i in range(length-1): for j in range(length-1-i): if lt[j]>lt[j+1]: lt[j],lt[j+1]=lt[

python第十四课--排序及自定义函数

1.排序 特点: 1).升序:从小到大 2).降序:从大到小 课堂实现选择排序:参看老郭选择排序.py文件 2.函数:(方法/method) 自定义函数: 概念:它表示一段作用范围(作用域),当中封装了一段业务逻辑代码,此范围有名字, 我们需要调用函数名,才能去执行它: 好处: 1).代码的复用性变强 2).代码的扩展性和维护性变好 3).代码的阅读性变好 函数有五要素: ①.函数修饰符:必须都是def开头 ②.函数返回值:函数执行完毕可能存在有返回值/没有返回值两种情况 ③.函数名:标识符(规

python第二十四课——set中的函数

集合中常用的一些函数: 1.add(obj):追加一个obj元素到集合中 pop():从集合中随机弹出一个元素 remove(obj):删除集合中和obj匹配的元素 clear():清空集合 s1={10,100,3.14,'abcd'} s1.add('haha') print(s1.pop()) s1.remove('abcd') s1.clear() 以下代码有问题:set中的pop只能是空的函数,不能传递内容和索引,一传就错...错误类型:TypeError print(s1.pop(1

python第十四课--排序及自定义函数之案例一:选择排序

案例一:选择排序使用选择排序的思想实现列表数据的升序排序 lt=[45,12,56,-32,-3,44,75,-22,100] length=len(lt) # print('排序前:'+str(lt)) 使用嵌套循环来实现外层循环控制轮数,i可以认为是选中空间或者点 for i in range(0,length-1): #内层循环呢控制每一轮执行的次数,j可以认为是比较空间或箭头 for j in range(i+1,length): #判断两空间中的内容,如果选中空间比比较空间中的数据大,

十四.生成器

2019-09-24-23:24:24 一.什么时生成器? 1.生成器的实质就是迭代器 二.生成器的获取方式 1.通过生成器函数 2.通过各种推导式获取生成器 3.通过数据转换获取生成器 三..案例 #这个是一个简单函数,怎样变成生成器呢? def func(): print("111") return 222 ret = func() print(ret) #将函数中的return换成yield就是生成器 def func(): print("111") yiel