<>1 while循环
<>1.1 一般形式
while语句最完整的形式是:首行以及测试表达式有一行或多行正常缩进语句构成的主体以及一个可选的else部分(else
部分会在控制权离开循环而又没有碰到break语句时执行)。Python会一直计算头部的测试,然后执行循环主体内的语句,直至测试返回假值为止:
while test: statements else: statements
<>1.2 示例
下面的例子会不断切掉字符串的第-一个字符,直至字符串为空返回假为止。这样直接测试对象,而不是使用更冗长的等效写法(while x != ' ':)
,可以说是一种很典型的用法:
x='spam' while x: print(x,end=' ') x=x[1:] # spam pam am m
<>2 break、continue、pass和循环的else
在Python中:
* break:跳出最近所在的外围循环(跳过整个循环语句)
* continue:跳到最近所在外围循环的头部(来到循环的头部行)
* pass:什么事也不做,只是一条空占位语句
* 循环else块:当且仅当循环正常离开时才会执行(也就是没有碰到break语句)。
<>2.1 一般循环形式
加入break和continue语句后,while循环的一般形式如下所示:
while test: statements # 直接离开循环,且不else语句 if test: break # 重新执行循环,不考虑else语句 if
test: continue else: statements
break和continue可以出现在while(或for)循环主体的任何位置,但通常会进一步嵌套在if语句中,从而根据某些条件来采取对应的操作。
<>2.2 pass
pass语句是无运算的占位语句,当语法要求有一条语句却没有任何实际的语句可写时,就可以使用它。它通常用于为复合语句编写一个空的主体。例如,如果想写个无限循环,每次迭代时什么也不做,就写个pass:
while True: pass
因为主体只是空语句,所以Python会陷入死循环。对于语句而言,pass 几乎就和对象中的None一样,表示什么也没有。
以后我们会看到pass更有意义的用处,例如忽略try语句所捕获的异常,以及定义空的类对象,用于携带属性并扮演其他编程语言中“结构体"或“记录”的角色。pass时常表示”以后会填上”,也就是暂时填充函数的主体:
def func1(): pass def func2(): pass
如果函数体为空就会得到语法错误,因此我们可以使用pass来替代。
<>2.3 continue
continue语句会立即跳到循环的顶端。此外,它偶尔也帮你避免语句嵌套。下面的例子使用continue跳过奇数:
x=10 while x: x=x-1 if x%2 != 0: continue print(x,end=' ') # 8 6 4 2 0
Python 没有“go to”语句,但因为continue让程序执行时实现跳跃,有关使用“go
to”所面临的许多关于可读性和可维护性的警告都适用。continue应该少用,尤其是刚开始使用Python的时候。例如,如果将print放在if下面,那么上个例子可能就会更清楚一些:
x=10 while x: x=x-1 if x%2 ==0: print(x,end=' ')
<>2.4 break
break语句会导致立刻从一个循环退出。因为在碰到break时,位于break后的循环体代码都不会被执行,所以有时可以引入beak来避免嵌套化。例如,以下是建安的交互式命令行下的循环,同构input输入数据,并在用户输入“stop”时退出结束:
while True: name=input("Enter name:') if name == 'stop': break age=input(
'Enter age:') print('hello',name'=>',int(age)**2)
<>2.5 循环的else
当与循环的else分句组合使用时,break语句通常可以代替其他编程语言中指示循环是否正常结束状态的标志位。例如,下面的程序通过搜索是否存在一个大于1的因数,来判断正整数y是否为质数:
x=y//2 while x>1: if y%x==0: print(y,'has facor',x) break x-=1 else: print(y,
'is prime')
除了在循环内设置标志位并在循环退出时进行测试外,你也可以像上面那样,在找到因数的位置使用break语句。因此,循环else分句可以视为只有在没有找到因数时才会执行。如果你没碰到break,那么该数就是质数。你可以跟踪这段代码来看看它是如何工作的。
如果循环主体从没有执行过,循环else分句也会执行,因为此时你也没有在循环体中执行break语句。也就是说在while循环中,如果首行的测试-开始就是假,那么else也会执行。因此在.上面的例子中,如果x-开始就小于或等于1
(例如,如果y是2),那么你还是会得到“is prime"的信息。
<>3 for循环
for循环在Python中是一个通用的序列迭代器:它可以遍历任何有序序列或其他可迭代对象内的元素。for语句可用于字符串、列表、元组或其他内置可迭代对象,以及之后我们通过类所创建的用户定义的新对象。
<>3.1 一般形式
Python for循环的首行指定了一个(或一些)赋值目标,以及我们想遍历的对象。首行后面是我们想重复的语句块:
for target in object: statements else: statements
当Python运行for循环时,会逐个将可迭代对象object中的元素赋值给名称target,然后为每个元素执行循环主体。循环主体一般使用被赋值的目标来引用序列中当前的元素,就好像它是遍历序列的游标。
for头部行中用作赋值目标的名称通常是for语句所在的作用域中的变量(可能是新的)。这个名称没什么特别的,甚至可以在循环主体中修改,但当控制权再次回到循环顶端时,就会自动被设成序列中的下一个元素。循环之后,这个变量一般还是引用了最近所用过的元素,也就是序列中最后的元素,除非通过一个break语句退出了循环。
for语句也支持-一个可选的else块,它的效果与在while循环中一样:如果循环离开时没有碰到break语句,就会执行(
也就是序列所有元素都访问过了)。之前介绍过的break语句和continue语句也可用在for循环中,与while循环一样。for 循环的完整形式如下:
for target in object: statements if test: break if test:continue else:
statements
<>3.2 示例
<>3.2.1 其他数据类型
任何序列都可以用于for循环,因为for循环是一个泛化工具。例如,for循环可用于字符串和元组:
S='lumberjack' T=('and','I am','okay') for x in S: print(x,end=' ') # l u m b
e r j a c k for x in T: print(x,end=' ') # and I am okay <>3.2.2 for循环中的元组赋值
待补充 423
<>3.3 请留意:文件扫描器
<>4 编写循环的技巧
<>4.1 计数器循环:range
<>4.2 序列扫描:while和range vs for
<>4.3 序列乱序器:range和len
<>4.4 非穷尽遍历:range vs 分片
<>4.5 修改列表:range vs推导
<>4.6 并行遍历:zip和map
<>4.7 同时给出偏移量和元素:enumerate
<>4.8 请留意:shell命令及其他