2016-12-18
while循环结构;
while语句是Python语言中最通用的迭代结构。
while语句最完整的书写格式是:首行以及测试表达式,有一列或多列缩进语句的主体以及一个可选的else部分(控制
权离开循环而又没有碰到Break语句时会执行)。Python会一直计算开头的测试,然后执行循环主体内的语句,直到测试返回值为假。
1 while <test>: #Loop test 2 <statements1> #Loop body 3 else: #Optional else 4 <statements2> #Run if didn‘t exit loop with break
下面的例子会不断切掉字符串第一个字符,直到字符串为空返回假为止。这样直接测试对象,而不是使用更冗长的等效写法(while != ‘’),可以说是一种典型的写法。
1 x = ‘spam‘ 2 while x: #while x is not empty 3 print (x, end=‘ ‘) 4 x = x[1:] #strip first character off x
这里使用end=‘ ‘关键字参数,使所有输出都出现在同一行,之间用空格隔开。
Python中没有其他语言中所谓的“do...until(while)”循环语句。不过可以在循环主体底部以一个测试和break来实现类似的功能。
1 while True: 2 ...loop body... 3 if exitTest():break
break:跳出最近所在的循环(跳过整个循环语句);
continue:跳到最近所在循环的开头出(来到循环的首行);
1 x = 10 2 while x: 3 x = x-1 4 if x % 2 != 0:continue 5 print (x, end= ‘ ‘)
continue应该谨慎使用。
上述代码的等效替换:
1 x = 10 2 while x: 3 x = x-1 4 if x % 2 == 0: 5 print (x, end= ‘ ‘)
pass:什么事也不做,只是一个占位语句;
循环else块:只有当循环正常离开时才执行(也就是没有碰到break语句)。
加入break和continue语句后while循环的一般格式:
1 while <test1>: 2 <statements1> 3 if <test2>:break #Exit loop now,skip else 4 if <test3>:continue #Go to of loop now,to test1 5 else: 6 <statements2> #Run if we didn‘t hit a ‘break‘
break和continue语句可以出现在while(或for)循环主体的任何地方,但通常会进一步嵌套在if语句中,根据默写条件采取对应的操作。
for循环结构:
for循环在Python中是一个通用的序列迭代器:可以遍历任何有序的序列对象内的元素。for语句可用于字符串、列表、元组以及其他内置可迭代对象以及能够
通过类所创建的新对象。
Python for循环的首行定义了一个赋值目标(或一些目标),以及你想遍历的对象。
1 for <target> in <object>: #Assign object items to target 2 <statements> #Repeated loop body:use target 3 else: 4 <statements> #if we didn‘t hit a ‘break‘
for循环的完整格式:
1 for <target> in <object>: #Assign object items to target 2 <statements> 3 if <test> : break #Exit loop now : skip else 4 if <test> : continue #Go to top of loop now 5 else: 6 <statements>
for循环中的元组赋值
如果迭代元组序列,循环目标本身实际上可以是目标元祖。这只是元组解包的赋值运算的一个例子而已。记住,for循环把序列对象元素赋值给目标,
而赋值运算在任何地方工作起来都是相同的。
T = [(1,2),(3,4),(5,6)] for (a,b) in T: #Tuple assignment at work print (a,b)
这种形式通常和zip一起调用,以实现并行遍历。在Python中,它通常还和SQL数据库一起使用,其中,查询结果表作为这里使用的列表这样的序列的序列而返回——外围的
列表就是数据库表,嵌套的元组是表中的行,元组赋值和列对应。
for循环中的元组是的使用items方法来遍历字典中的键和值变得很方便,而不必再遍历键并手动地索引以获取值:
1 D = {‘a‘:1,‘b‘:2,‘c‘:3} 2 for key in D: 3 print(key,‘=>‘,D[key]) #Use dict keys iterator and index
注意:for循环中的元组赋值并非是一种特殊情况,这一点很重要;单词for之后的任何赋值目标在语法上都是有效。尽管我们总是在for循环中手动地赋值以解包:
1 T = [(1,2),(3,4),(5,6)] 2 for both in T: 3 a,b = both #Manual assignment equivalent 4 print(a,b)
任何嵌套的序列结构都可以按照这种方式解包,只不过因为序列赋值是如此通用:
for ((a,b),c) in [((1,2),3),[‘xy‘,6]]: print(a,b,c)
在Python3.0以后的的版本中,由于一个序列可以赋值给一组更为通用的名称(其中有一个带有星号的名称收集多个元素),我们可以在for循环中使用同样的语法来提取
嵌套的序列的部分:
1 for (a,*b,c) in [(1,2,3,4),(5,6,7,8)]: 2 print (a,b,c) 3 4 输出结果: 5 1 [2, 3] 4 6 5 [6, 7] 8
这种方式可以用来表示为嵌套序列的数据的行中选取多个列。
嵌套for循环:
本例是在for中示范循环else分句以及语句嵌套。考虑到对象列表(元素)以及键列表(测试),这段代码会在对象列表中搜索每个键,然后报告其搜索结果。
1 items = ["aaa",111,(4,5),2.01] 2 tests = [(4,5),3.14] 3 for key in tests: 4 for item in items: 5 if item == key: 6 print (key,"was found") 7 break 8 else:print(key,"not found!") 9 10 11 12 运行结果 13 (4, 5) was found 14 3.14 not found!
因为这里的嵌套if会在找到相符结果时执行break,而循环else分句是认定如果来到此处,搜索就失败了。注意这里的嵌套。当这段代码执行时,同时有两个循环在运行:外层
循环扫描键列表,而内层循环为每个键扫描元素列表。循环else分句的嵌套是很关键的,其缩进至和内层for循环首行相同的层次,所以是和内层循环相关联的(而不是if或外层
的for)。
注意:如果我们采用in运算符测试成员关系,这个示例就会比较易于编写。因为in会隐形的扫描列表来找到匹配,因此可以取代内层循环。
1 for key in tests: 2 if key in items: 3 print(key, "was found") 4 else: 5 print(key, "not found") 6 7 8 输出结果: 9 (4, 5) was found 10 3.14 not found
一般来说,基于对简洁和性能的考虑,让Python尽可能多做一点工作。
本例子以for执行典型的数据结构任务:收集两个序列(字符串)中相同元素。这差不多是简单的集合交集的例程。在循环执行后,res引用的列表中包含seq1和seq2中
找到的所有元素。
1 res = [] #start empty 2 for x in seq1: #Scan first sequence 3 if x in seq2: #Common item? 4 res.append(x) #Add to result end 5 6 运行结果: 7 res 8 [‘s‘, ‘a‘, ‘m‘]