首页 > 代码库 > 循环语句(for、while)(一)

循环语句(for、while)(一)

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]

 

循环语句(for、while)(一)