python进阶学习笔记2-循环

作者:Vamei 出处:http://www.cnblogs.com/vamei

05、循环

  • range()
S='abcdefghijklmn'
for i in range(0,len(S),2):
	print(S[i])
#下限0,上限len(S),步长2
  • enumerate()
enumerate()可以在每次循环中同时得到下标和元素:
for (index,char) in enumerate(S):
	print(index,char)
输出:
0 a
1 b
2 c
3 d
4 e
5 f
6 g
7 h
8 i
9 j
10 k
11 l
12 m
13 n

实际上,enumerate()在每次循环中,返回的是一个包含两个元素的(tuple),两个元素分别赋予index和char

  • zip()
如果你有多个 等长的序列,然后想要每次循环时从各个序列分别取出一个元素,可以利用zip()方便地实现:

ta=[1,2,3]
tb=[9,8,7]
tc=['a','b','c']
for (a,b,c) in zip(ta,tb,tc):
	print(a,b,c)
输出:
1 9 a
2 8 b
3 7 c

06、循环对象

  • 循环对象

循环对象是这样一个对象,它包含有一个next()方法(__next__()方法,在python 3x中), 这个方法的目的是进行到下一个结果,而在结束一系列结果之后,举出StopIteration错误

当一个循环结构(比如for)调用循环对象时,它就会每次循环的时候调用next()方法,直到StopIteration出现,for循环接收到,就知道循环已经结束,停止调用next()。

假设我们有一个test.txt的文件:

1234
abcd
efg

我们运行一下python命令行:

python进阶学习笔记2-循环_第1张图片

open()返回的是一个循环对象,包含有__next__()方法。__next__()每次返回新一行的内容,达到文件末尾时返回StopIteration。这样,我们相当于手工进行了循环。

自动进行的话,就是:

for line in open('test.txt','r'):
	print(line)

在这里,for结构自动调用__next()__方法,将该方法的返回值赋予给line。循环知道出现StopIteration的时候结束。

  • 表推导
L=[]
for x in range(10):
	L.append(x*x)
等价于
LL=[x**2 for x in range(10)]#x**2是x的二次方
x1=[1,3,5]
y1=[9,12,13]
LLL=[x**2 for (x,y) in zip(x1,y1) if y>10]
print(LLL)
输出:
[9, 25]

生成器

生成器的编写方法和函数定义类似,只是在return的地方改为yield。生成器中可以有多个yield。当生成器遇到一个yield时,会暂停运行生成器,返回yield后面的值。当再次调用生成器的时候,会从刚才暂停的地方继续运行,直到下一个yield。生成器自身又构成一个循环器,每次循环使用一个yield返回的值。

下面是一个生成器:
def gen():
	a=100
	yield a
	a=a*8
	yield a
	yield 1000
该生成器共有三个yield, 如果用作循环器时,会进行三次循环。
for i in gen():
	print(i)











你可能感兴趣的:(python进阶学习笔记2-循环)