失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > python的高级特性:切片 迭代 列表生成式 生成器 迭代器

python的高级特性:切片 迭代 列表生成式 生成器 迭代器

时间:2024-03-22 16:43:29

相关推荐

python的高级特性:切片 迭代 列表生成式 生成器 迭代器

python的高级特性:切片,迭代,列表生成式,生成器,迭代器

1 #演示切片 2 k="abcdefghijklmnopqrstuvwxyz" 3 #取前5个元素 4 k[0:5] 5 k[:5] 6 #后5个元素 7 k[-5:] #vwxyz 8 #每隔一个取一个 9 k[::2] #acegikmoqsuwy 10 #原样复制一个 11 k[:] 12 13 #演示迭代 14 d={'a':1,'b':2,'c':3} 15 for key in d: 16print(key) 17 #结果输出abc, 即输出key, 而且要注意dict的迭代顺序不像list是顺序排列的 18 19 for v in d.values(): 20print(v) 21 #按值输出, 1,2,3 22 23 for k,v in d.items(): 24print(k+":"+str(v)) 25 #按键值对输出,a:1,b:2,c:3 26 27 ary=range(10) 28 for i,v in enumerate(ary): 29print(str(i)+" "+str(v)) 30 #enumerate函数可以把一个list变为索引元素对,这样我们迭代元素就可以同时取得索引 31 32 for x,y in [(1,1),(2,4),(3,7)]: 33print(x,y) 34 #for循环里,引用两个变量是比较常见的 35 36 37 #下面演示 列表生成式 38 k=list(range(1,11)) 39 print(k) 40 #显示 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 41 42 k=[x*x for x in range(1,11)] 43 print(k) 44 #显示 [1, 4, 9, 16, 25, 36, 49, 64, 81, 100] 45 46 k=[x*(x+1) for x in range(1,11,2)] 47 print(k) 48 #显示 [2, 12, 30, 56, 90] 49 50 #在列表生成器中我们还可以在后面附加if条件语句 51 def toUppers(L): 52return [x.upper() for x in L if isinstance(x,str)] 53 54 print(toUppers(['hello','world',100])) 55 #显示 ['HELLO', 'WORLD'] 56 57 58 #在列表生成式中,也可以用多层 for 循环来生成列表 59 print([m*100+n*10+z for m in range(1,10) for n in range(0,10) 60 for z in range(1,10) if m*100+n*10+z==z*100+n*10+m]) 61 62 #结果 63 #[101, 111, 121, 131, 141, 151, 161, 171, 181, 191, 202, 212, 222, 232, 242, 64 # 252, 262, 272, 282, 292, 303, 313, 323, 333, 343, 353, 363, 373, 383, 393, 65 # 404, 414, 424, 434, 444, 454, 464, 474, 484, 494, 505, 515, 525, 535, 545, 66 # 555, 565, 575, 585, 595, 606, 616, 626, 636, 646, 656, 666, 676, 686, 696, 67 # 707, 717, 727, 737, 747, 757, 767, 777, 787, 797, 808, 818, 828, 838, 848, 68 # 858, 868, 878, 888, 898, 909, 919, 929, 939, 949, 959, 969, 979, 989, 999] 69 70 print([m+n for m in 'ABC' for n in 'XYZ']) 71 #结果 ['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ'] 72 73 #列出当前目录下的所有文件与目录名 74 import os 75 print([d for d in os.listdir('.')]) 76 77 #下面演示 生成器 78 #生成器类似于C#中的滞后执行机制,只在迭代时占用资源。其目的是不会一次把 79 #100万个列表一次载入内存。 80 list1=[x*x for x in range(10)] 81 print(list1) 82 #输出 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] 83 84 #下面的g就是一个生成器 generator 85 g=(x*x for x in range(10)) 86 print(g) 87 #输出 <generator object <genexpr> at 0x0000021FAC0A3B48> 88 #如果要输出generator的每个元素,可以用next()函数 89 print(next(g)) #0 90 print(next(g)) #1 91 print(next(g)) #4 92 #正常的方式还是使用forgrgi循环迭代对象 93 for n in g: 94print(n) 95 96 #斐波拉契数列生成的函数 97 def fib(max): 98n,a,b=0,0,1 99while n<max:100 print(b)101 a,b=b,a+b102 n=n+1103return 'done'104 fib(6)105 #输出 1 1 2 3 5 8106 107 #我们把上面的函数改成generator, 只需要把print(b) 改为yield b108 #这就是定义generator的另一种方法,一个函数中包含yield关键字,它就不109 #是一个普通函数,而是一个generator110 def fib(max):111n,a,b=0,0,1112while n<max:113 yield b114 a,b=b,a+b115 n=n+1116return 'done'117 118 f=fib(6)119 print(f)120 #输出 <generator object fib at 0x000001F82E3C3C50>121 122 #用for循环generator时,会发现拿不return的返回值,其实必须要捕获123 #StopIteration错误,才可以。124 g=fib(6)125 while True:126try:127 x=next(g)128 print('g:',x)129except StopIteration as e:130 print('Generator return value:',e.value)131 break;132 133 #输出134 #g: 1135 #g: 1136 #g: 2137 #g: 3138 #g: 5139 #g: 8140 #Generator return value: done141 142 #再举一个简单的例子,可以看到generator的执行流程143 def odd():144print('step1')145yield 1146print('step2')147yield (3)148print('step3')149yield (5)150 151 #调用152 o=odd()153 next(o) #step1154 next(o) #step2155 next(o) #step3156 #next(o) #StopIteration157 158 #总结一下:159 #能用于for循环的类型有160 #(一)集合类型 list,tuple,dict,set,str等161 #(二) generator, 包括生成器和带yield的generator function162 #这些对象统称为可迭代的对象: Iterable163 164 #可以使用isinstance判断一个对象是否是Iterable对象:165 from collections import Iterable166 print(isinstance([],Iterable))#True167 print(isinstance('abc',Iterable)) #True168 print(isinstance(100,Iterable)) #False169 170 #而可以被next()函数调用并不断返回下一个值的对象称为迭代器 Iterator171 #可以使用isinstance()判断是否为Iterator对象172 from collections import Iterator173 print(isinstance((x for x in range(10)),Iterator))174 print(isinstance([2,3,4],Iterator))175 176 #生成器都是Iterator对象,但是list,dict,str虽然是Iterable,去不是Iterator177 #把list,dict,str转为Iterator可以使用iter()函数178 print(isinstance(iter('abcdefg'),Iterator))179 #结果 True180 181 #Iterator甚至可以表示一个无限大的数据流,例如全体自然数。而使用list是不可能存储全体自然数的

如果觉得《python的高级特性:切片 迭代 列表生成式 生成器 迭代器》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。