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:
 16     print(key)
 17 #结果输出abc, 即输出key, 而且要注意dict的迭代顺序不像list是顺序排列的
 18
 19 for v in d.values():
 20     print(v)
 21 #按值输出, 1,2,3
 22
 23 for k,v in d.items():
 24     print(k+":"+str(v))
 25 #按键值对输出,a:1,b:2,c:3
 26
 27 ary=range(10)
 28 for i,v in enumerate(ary):
 29     print(str(i)+" "+str(v))
 30 #enumerate函数可以把一个list变为索引元素对,这样我们迭代元素就可以同时取得索引
 31
 32 for x,y in [(1,1),(2,4),(3,7)]:
 33     print(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):
 52     return [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:
 94     print(n)
 95
 96 #斐波拉契数列生成的函数
 97 def fib(max):
 98     n,a,b=0,0,1
 99     while n<max:
100         print(b)
101         a,b=b,a+b
102         n=n+1
103     return  ‘done‘
104 fib(6)
105 #输出 1 1 2 3 5 8
106
107 #我们把上面的函数改成generator, 只需要把print(b) 改为yield b
108 #这就是定义generator的另一种方法,一个函数中包含yield关键字,它就不
109 #是一个普通函数,而是一个generator
110 def fib(max):
111     n,a,b=0,0,1
112     while n<max:
113         yield b
114         a,b=b,a+b
115         n=n+1
116     return  ‘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:
126     try:
127         x=next(g)
128         print(‘g:‘,x)
129     except StopIteration as e:
130         print(‘Generator return value:‘,e.value)
131         break;
132
133 #输出
134 #g: 1
135 #g: 1
136 #g: 2
137 #g: 3
138 #g: 5
139 #g: 8
140 #Generator return value: done
141
142 #再举一个简单的例子,可以看到generator的执行流程
143 def odd():
144     print(‘step1‘)
145     yield  1
146     print(‘step2‘)
147     yield (3)
148     print(‘step3‘)
149     yield (5)
150
151 #调用
152 o=odd()
153 next(o)  #step1
154 next(o)  #step2
155 next(o)  #step3
156 #next(o)  #StopIteration
157
158 #总结一下:
159 #能用于for循环的类型有
160 #(一)集合类型  list,tuple,dict,set,str等
161 #(二) generator, 包括生成器和带yield的generator function
162 #这些对象统称为可迭代的对象: Iterable
163
164 #可以使用isinstance判断一个对象是否是Iterable对象:
165 from collections import Iterable
166 print(isinstance([],Iterable))     #True
167 print(isinstance(‘abc‘,Iterable)) #True
168 print(isinstance(100,Iterable))  #False
169
170 #而可以被next()函数调用并不断返回下一个值的对象称为迭代器 Iterator
171 #可以使用isinstance()判断是否为Iterator对象
172 from collections import Iterator
173 print(isinstance((x for x in range(10)),Iterator))
174 print(isinstance([2,3,4],Iterator))
175
176 #生成器都是Iterator对象,但是list,dict,str虽然是Iterable,去不是Iterator
177 #把list,dict,str转为Iterator可以使用iter()函数
178 print(isinstance(iter(‘abcdefg‘),Iterator))
179 #结果  True
180
181 #Iterator甚至可以表示一个无限大的数据流,例如全体自然数。而使用list是不可能存储全体自然数的

原文地址:https://www.cnblogs.com/hackpig/p/8150373.html

时间: 2024-10-09 22:35:29

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

python学习日常-切片&amp;迭代&amp;列表生成式

切片:顾名思义,就是将一个东西切成一块一块的,python中的切片就是将数组切成一片一片的 L=list(range(1,100)); L(f:e:p)#f代表开始切的位置,e代表结束的位置(但不包括),p代表切的间隔. 比如L(10:26:2)代表从第10位开始切(即从数字为11开始)到26结束(即数字27),但是不包括第26位,其中间隔为2. 切片也支持从后面切比如L(-10:-1:none)就是从倒数第10位开始切到最后一位. 值得注意的是切片的三个参数都是可以缺省的. 迭代:非常简单的一

python列表生成式&amp;生成器&amp;迭代器

一.列表生成式 什么是列表生成式? 列表生成式是快速生成列表的一种方式.(貌似有些废话) 更专业点的说法:列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式. 在python2.7里 举个例子,要生成list [1,2,3,4,5],可以用range(1,6) >>> range(1,6) [1, 2, 3, 4, 5] 但是如果要生成[1x1,2x2,3x3,4x4,5x5]怎么做呢? 普通青年做法: >>&

[3][高级特性]切片[1]

[3][高级特性]切片[1] 取一个list或tuple的部分元素是非常常见的操作.比如,一个list如下: >>> L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack'] 取前3个元素,应该怎么做? >>> L[0:3] ['Michael', 'Sarah', 'Tracy'] L[0:3]表示,从索引0开始取,直到索引3为止,但不包括索引3.即索引0,1,2,正好是3个元素. >>> L[:3] ['Mi

python-基础 生成式 生成器 迭代器 JSON pickl

目录 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 1.列表生成式,迭代器&生成器 列表生成式 列表生成式,是Python内置的一种极其强大的生成list的表达式. 现在有个需求,看列表[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],我要求你把列表里的每个值加1,你怎么实现? 1 >>> a 2 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 3 >>> b =

Python的高级特性之切片、迭代、列表生成式、生成器

切片 切片就是获取一个list.tuple.字符串等的部分元素 1 l = range(100) 2 #取[0,5)元素 3 print(l[:5]) #[0, 1, 2, 3, 4] 4 #在[0,99]中每隔10个元素取一个 5 print( l[::10]) #[0, 10, 20, 30, 40, 50, 60, 70, 80, 90] 6 #取最后五个元素 7 print( l[-5 : ]) #[95, 96, 97, 98, 99] 8 9 str = "www.genekang.

python函数高级特性

掌握了Python的数据类型.语句.函数,基本可以编写出很多有用的程序了.但是Python中,代码不是越多越好,而是越少越好.代码不是越复杂越好,而是越简单越好.基于这一思想,我们来介绍python中非常有用的高级特性,1行代码能实现的功能绝不用5行代码,请始终牢记,代码越少,开发效率越高. 切片(Slice) 取一个list或tuple的部分元素是非常常见的操作,比如,一个list如下: L=['Micheal','Sarah','Bob','Jack'] 当我们要取前N个元素,使用循环操作很

Python的高级特性有哪些?

本文和大家分享的主要是python开发中的一些新特性,一起来看看吧,希望对大家有所帮助. 列表生成式(List Comprehensions) 切片和迭代就不说了,这里直接先看一下列表生成式吧,从名字就能大概猜出这是生成列表的一些方法,比如:如何生成 [1*1, 2*2, ... ,10*10] ?可以用循环不断向列表尾部添加元素,如果使用 pythonic 的方法,也就是列表生成式,则是: >>> [x * x for x in range(1, 11)] [1, 4, 9, 16,

python相关高级特性的总结

一.切片 切片操作是对于一个list和tuple取其中部分的操作,操作步骤就是在一个已初始化完成的list或tuple后加[x?x],x为任意数值,来对列表进行部分取值操作. L=[1,2,3,4,5,6,7,8,9] print(L[0:3]) 输出 [1,2,3] 利用上述代码可以取list前三个元素,当然索引取负数也是可以的 L=[1,2,3,4,5,6,7,8,9] print(L[-1:]) 输出 [9] 我们也可以在100个数字中取偶数 L=list(range(100)) prin

python之高级特性

掌握了Python的数据类型.语句和函数,基本上就可以编写出很多有用的程序了. 比如构造一个1, 3, 5, 7, ..., 99的列表,可以通过循环实现: L = [] n = 1 while n <= 99: L.append(n) n = n + 2 取list的前一半的元素,也可以通过循环实现. 但是在Python中,代码不是越多越好,而是越少越好.代码不是越复杂越好,而是越简单越好. 基于这一思想,我们来介绍Python中非常有用的高级特性,1行代码能实现的功能,决不写5行代码.请始终