博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python生成器 迭代器
阅读量:6573 次
发布时间:2019-06-24

本文共 4614 字,大约阅读时间需要 15 分钟。

#*****************列表表达式************# l=[s**2 for s in range(1,11) if s%2 is 0]# print(l)# #[4, 16, 36, 64, 100]  1-10内所有偶数的平方
[m + n for m in 'ABC' for n in 'XYZ']#['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']   排列组合names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],         ['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]l2 = [name for i in names for name in i if name.count('e') == 2]      #找列表中有两个"e"的字符串  ,用了两个循环 for i in names 和 for name in i 是嵌套的#['Jefferson', 'Wesley', 'Steven', 'Jennifer']x = {    'name':'alex',    'Values':[{
'timestamp':1517991992.94,         'values':100,}, {
'timestamp': 1517992000.94, 'values': 200,}, {
'timestamp': 1517992014.94, 'values': 300,}, {
'timestamp': 1517992744.94, 'values': 350}, {
'timestamp': 1517992800.94, 'values': 280} ],}print([[dic[i] ] for dic in x['Values'] for i in dic ])      #两个循环嵌套结构#[[1517991992.94], [100], [1517992000.94], [200], [1517992014.94], [300], [1517992744.94], [350], [1517992800.94], [280]]print([ [dic[i] for i in dic] for dic in x['Values'] ])    #循环的位置不同,得到的列表不同#[[1517991992.94, 100], [1517992000.94, 200], [1517992014.94, 300], [1517992744.94, 350], [1517992800.94, 280]] #有时直接粘博客上的代码会报错,在pycharm中重新敲一遍就好了 #**************类似的字典也有表达式#以下是将字典的键和值互换的字典推导式mcase = {
'a': 10, 'b': 34}print({mcase[i]: i for i in mcase})#{10: 'a', 34: 'b'}

 

#*****************使用列表表达式创建generator,将 [ ]换为 ( )*********# l=(s**2 for s in range(1,11) if s%2 is 0)# print(l)  #
at 0x0000015C4A3A4BA0> 表明这是一个生成器对象# print(next(l)) #4# print(next(l)) #16# print(next(l)) #36# print(next(l)) #64#************************使用函数创建,yield***************def fib(max): n, a, b = 0, 0, 1 while n < max: yield b a, b = b, a + b n = n + 1 return 'done'f=fib(10) # 规定了循环的总次数,同时fib进行了初始化,指向第0个,这个是必须的,f=fib()把fib()通过yield返回的值一次次传递出来,如果没有那么fib()的值只是第一个yield返回的值print(next(f))print(next(f))print(next(f))print(next(f))print(next(f))print(next(f))# 1# 1# 2# 3# 5# 8for i in fib(10): #使用迭代代替next print(i)# 1# 1# 2# 3# 5# 8# 13# 21# 34# 55g = fib(6)while True: try: x = next(g) print('g:', x) except StopIteration as e: print('Generator return value:', e.value) break# g: 1# g: 1# g: 2# g: 3# g: 5# g: 8#*****************杨辉三角**********************# 1# / \# 1 1# / \ / \# 1 2 1# / \ / \ / \# 1 3 3 1# / \ / \ / \ / \# 1 4 6 4 1# / \ / \ / \ / \ / \# 1 5 10 10 5 1def YH(max): n ,l1,count = 0 ,[1] ,0 while n < max: try: yield l1 l2 = [] for i in range(0, (len(l1) - 1)): l2.append(l1[i] + l1[i + 1]) l2.insert(0, 1) l2.append(1) l1 = l2 n += 1 except StopIteration as e: print('Generator return value:', e.value) breakY = YH(10)for i in Y: print(i)

 

#######迭代器isinstance("s",str)  #判断变量s是否是字符串,isinstance是用来判断某个变量的类型,其他的变量类型也可用此判断# 凡是可作用于for循环的对象都是Iterable类型;# 凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列;# 集合数据类型如list、dict、str等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。# Python的for循环本质上就是通过不断调用next()函数实现的,例如:for x in [1, 2, 3, 4, 5]:    pass#等价于# 首先获得Iterator对象:it = iter([1, 2, 3, 4, 5])# 循环:while True:    try:        # 获得下一个值:        x = next(it)    except StopIteration:        # 遇到StopIteration就退出循环        break

 

'''可迭代对象:Iterable        内部含有__iter__方法的就是可迭代对象.        可迭代对象不能取值,因为内部不含有__next__方法.    可迭代对象 ---> 迭代器.        obj.__iter__()        iter(obj)    迭代器:Iterator        内部含有__iter__,__next__ 方法的对象.    可迭代对象: str,list,dict,tuple,set,range    文件句柄:是迭代器.    迭代器的优点:        1,节省内存.        2,惰性机制.        3,单向,不可逆.    如何判断可迭代对象,迭代器.        1,__iter__ in dir(obj)        2,isinstance(l1,Iterable)          isinstance(l1,Iterator)    生成器:        自己用python代码写的迭代器就是生成器.        生成器的本身就是迭代器.'''

 

可迭代对象  内部含有__iter__方法  str,list,tuple,dict,set,range迭代器		内部含有__iter__方法,并且含有__next__方法  f文件句柄,map,filter,zip,等,生成器本身就是迭代器迭代器的特点:1,节省内存.2,惰性机制3,单向不可逆python内置的next()方法实际上就是执行函数的__next__方法it = iter([1, 2, 3, 4, 5])   # iter将可迭代对象变为迭代器,也可以在对象的类中加入__next__方法

   

 

#*******使生成器拿出一个个值的方法obj = (i for i in [1,2,3])#方法一,使用__next__方法ret1 = obj.__next__()print(ret1)     #1#方法二,使用 for 循环for i in obj:    print(i)# 1# 2# 3#方法三,使用list,相当于把生成器转化为列表表达式ret2 = list(obj)print(ret2)    #通过列表也会执行生成器,把生成器中的值拿出来#[1, 2, 3]#这三种方式不要同时使用,因为如果一个生成器中的元素没拿完的话,下一个执行生成器时会接着生成元素,而不是重新生成

 

转载于:https://www.cnblogs.com/perfey/p/9152969.html

你可能感兴趣的文章
mysql允许远程登录
查看>>
你可能不知道的技术细节:存储过程参数传递的影响
查看>>
POJ1703 Find them, Catch them
查看>>
自适应备忘录 demo
查看>>
HTML转义字符大全(转)
查看>>
[摘录]调动员工积极性的七个关键
查看>>
Linux getcwd()的实现【转】
查看>>
Backup Volume 操作 - 每天5分钟玩转 OpenStack(59)
查看>>
.htaccess 基础教程(四)Apache RewriteCond 规则参数
查看>>
转: maven进阶:一个多模块项目
查看>>
Android控件之HorizontalScrollView 去掉滚动条
查看>>
UVM中的class--2
查看>>
任务调度器配置文件
查看>>
ORACLE 存储过程异常捕获并抛出
查看>>
HDU 4293 Groups (线性dp)
查看>>
博客园博客美化相关文章目录
查看>>
root用户重置其他密码
查看>>
关于查询扩展版ESI高被引论文的说明
查看>>
【iCore3应用】基于iCore3双核心板的编码器应用实例
查看>>
Oracle推断值为非数字
查看>>