python的高级特性:切片,迭代,列表生成式,生成器,迭代器
2017-12-30 16:31
1086 查看
python的高级特性:切片,迭代,列表生成式,生成器,迭代器
#演示切片 k="abcdefghijklmnopqrstuvwxyz" #取前5个元素 k[0:5] k[:5] #后5个元素 k[-5:] #vwxyz #每隔一个取一个 k[::2] #acegikmoqsuwy #原样复制一个 k[:] #演示迭代 d={'a':1,'b':2,'c':3} for key in d: print(key) #结果输出abc, 即输出key, 而且要注意dict的迭代顺序不像list是顺序排列的 for v in d.values(): print(v) #按值输出, 1,2,3 for k,v in d.items(): print(k+":"+str(v)) #按键值对输出,a:1,b:2,c:3 ary=range(10) for i,v in enumerate(ary): print(str(i)+" "+str(v)) #enumerate函数可以把一个list变为索引元素对,这样我们迭代元素就可以同时取得索引 for x,y in [(1,1),(2,4),(3,7)]: print(x,y) #for循环里,引用两个变量是比较常见的 #下面演示 列表生成式 k=list(range(1,11)) print(k) #显示 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] k=[x*x for x in range(1,11)] print(k) #显示 [1, 4, 9, 16, 25, 36, 49, 64, 81, 100] k=[x*(x+1) for x in range(1,11,2)] print(k) #显示 [2, 12, 30, 56, 90] #在列表生成器中我们还可以在后面附加if条件语句 def toUppers(L): return [x.upper() for x in L if isinstance(x,str)] print(toUppers(['hello','world',100])) #显示 ['HELLO', 'WORLD'] #在列表生成式中,也可以用多层 for 循环来生成列表 print([m*100+n*10+z for m in range(1,10) for n in range(0,10) for z in range(1,10) if m*100+n*10+z==z*100+n*10+m]) #结果 #[101, 111, 121, 131, 141, 151, 161, 171, 181, 191, 202, 212, 222, 232, 242, # 252, 262, 272, 282, 292, 303, 313, 323, 333, 343, 353, 363, 373, 383, 393, # 404, 414, 424, 434, 444, 454, 464, 474, 484, 494, 505, 515, 525, 535, 545, # 555, 565, 575, 585, 595, 606, 616, 626, 636, 646, 656, 666, 676, 686, 696, # 707, 717, 727, 737, 747, 757, 767, 777, 787, 797, 808, 818, 828, 838, 848, # 858, 868, 878, 888, 898, 909, 919, 929, 939, 949, 959, 969, 979, 989, 999] print([m+n for m in 'ABC' for n in 'XYZ']) #结果 ['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ'] #列出当前目录下的所有文件与目录名 import os print([d for d in os.listdir('.')]) #下面演示 生成器 #生成器类似于C#中的滞后执行机制,只在迭代时占用资源。其目的是不会一次把 #100万个列表一次载入内存。 list1=[x*x for x in range(10)] print(list1) #输出 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] #下面的g就是一个生成器 generator g=(x*x for x in range(10)) print(g) #输出 <generator object <genexpr> at 0x0000021FAC0A3B48> #如果要输出generator的每个元素,可以用next()函数 print(next(g)) #0 print(next(g)) #1 print(next(g)) #4 #正常的方式还是使用forgrgi循环迭代对象 for n in g: print(n) #斐波拉契数列生成的函数 def fib(max): n,a,b=0,0,1 while n<max: print(b) a,b=b,a+b n=n+1 return 'done' fib(6) #输出 1 1 2 3 5 8 #我们把上面的函数改成generator, 只需要把print(b) 改为yield b #这就是定义generator的另一种方法,一个函数中包含yield关键字,它就不 #是一个普通函数,而是一个generator 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(6) print(f) #输出 <generator object fib at 0x000001F82E3C3C50> #用for循环generator时,会发现拿不return的返回值,其实必须要捕获 #StopIteration错误,才可以。 g=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 #Generator return value: done #再举一个简单的例子,可以看到generator的执行流程 def odd(): print('step1') yield 1 print('step2') yield (3) print('step3') yield (5) #调用 o=odd() next(o) #step1 next(o) #step2 next(o) #step3 #next(o) #StopIteration #总结一下: #能用于for循环的类型有 #(一)集合类型 list,tuple,dict,set,str等 #(二) generator, 包括生成器和带yield的generator function #这些对象统称为可迭代的对象: Iterable #可以使用isinstance判断一个对象是否是Iterable对象: from collections import Iterable print(isinstance([],Iterable)) #True print(isinstance('abc',Iterable)) #True print(isinstance(100,Iterable)) #False #而可以被next()函数调用并不断返回下一个值的对象称为迭代器 Iterator #可以使用isinstance()判断是否为Iterator对象 from collections import Iterator print(isinstance((x for x in range(10)),Iterator)) print(isinstance([2,3,4],Iterator)) #生成器都是Iterator对象,但是list,dict,str虽然是Iterable,去不是Iterator #把list,dict,str转为Iterator可以使用iter()函数 print(isinstance(iter('abcdefg'),Iterator)) #结果 True #Iterator甚至可以表示一个无限大的数据流,例如全体自然数。而使用list是不可能存储全体自然数的
相关文章推荐
- 【Python】[高级特性]切片,迭代,列表生成式,生成器,迭代器
- Python高级特性(切片,迭代,列表生成式、生成器、迭代器)
- Python高级特性(切片 迭代 列表生成式 生成器 迭代器)学习笔记
- Python高级特性(切片,迭代,列表生成式,生成器,迭代器)
- python2.7学习笔记(6) ——高级特性:切片、迭代、列表生成式、生成器
- Python的高级特性之切片、迭代、列表生成式、生成器
- python切片、迭代、生成器、列表生成式等高级特性学习
- Python之高级特性(切片,迭代,列表生成式,生成器)
- 7.python高级特性:切片,迭代,列表生成式,生成器,迭代器
- Python高级特性-迭代(Iteration)-列表生成式-生成器
- Python的高级特性(切片,迭代,生成器,迭代器)
- 三、python高级特性(切片、迭代、列表生成器、生成器)
- Python笔记3——切片,迭代,列表生成式,生成器
- (入门)切片、迭代、列表生成式、生成器、迭代器
- Python笔记3——切片,迭代,列表生成式,生成器
- 初学python:切片、迭代、列表生成式、生成器
- Python学习 Day 4 函数 切片 迭代 列表生成式 生成器
- python: 切片,迭代,列表生成器,生成器,迭代器
- Python之列表生成式、生成器、可迭代对象与迭代器
- Python3 基础:高级特性-列表生成式和生成器