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

2016-12-18数据库

while循环结构;数据结构

 while语句是Python语言中最通用的迭代结构。app

while语句最完整的书写格式是:首行以及测试表达式,有一列或多列缩进语句的主体以及一个可选的else部分(控制oop

权离开循环而又没有碰到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=' '关键字参数,使全部输出都出如今同一行,之间用空格隔开。ui

Python中没有其余语言中所谓的“do...until(while)”循环语句。不过能够在循环主体底部以一个测试和break来实现相似的功能。spa

1 while True:
2     ...loop body...
3     if exitTest():break

break:跳出最近所在的循环(跳过整个循环语句);code

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']
相关文章
相关标签/搜索