本文介绍python中的while循环、for循环。在python中for可以用于循环,也可用于另一种近亲的列表解析,列表解析是python中非常重要的特性,详细内容见后面的文章。
一般来说,python写for循环比写while更容易、方便,而且python中的for比while效率要更高,如果可以,用for而不是while。
while循环
python中的while/for循环和其它语言的while循环有些不一样,它支持else分支。结构如下:
while <CONDITION>:
CODE
else:
CODE_ELSE
注意,condition部分只能是表达式,不能是语句,所以condition中不能包含赋值语句,如while a = x:
是错误的。
while和for的else分支表示当正常退出while/for循环的时候所执行的代码分支。所谓正常退出,是指不是通过break跳出的情况,也就是正常把所有循环条件轮完的情况。这对于那些需要通过设置标志位来判断的情况来说非常方便,而标志位通常是用于离开循环的时候,提供一个额外的标记、通知功能,比如退出循环时想找的数据是否找到。
例如搜索一个列表,并在退出时告知是否找到。如果使用标志位来实现,如下:
found = False while x and not found: if match(x[0]): print("found it") found = True else: x = x[1:] if not found: print("not found")
如果通过else,则逻辑更清晰:
while x: if match(x[0]): print("found it") break x = x[1:] else: print("not found")
再例如,判断一个数(如下面的y)是否是质数。
y = 21 x = y // 2 while x > 1: if y % x == 0: print( y, "has a factor: ", x) break x -= 1 else: print("y is a prime")
想象一下如果不使用while的else,上面的功能该如何实现。
pass、break、continue、else
这几个关键字都能用在while/for中。
- break:退出整个循环(while/for),如果嵌套了循环,则退出break所在的那个层次
- continue:直接跳到下一次循环
- else:在循环正常退出(不是break中断的循环)时执行的所执行的默认代码块
- pass:在python中作为空的占位符,表示什么也不做。比如:
- if x:pass
- while x:pass
- def x():pass
- class x:pass
在python 3.x中,pass的另一种方式是...
,它也表示什么也不做的占位符。
for循环
python中的for是一个通用的序列迭代器,和bash的for语法类似。python中没有for(i=0;i<N;i++)
的语法,但for结合range可以实现一样的功能,后文介绍。
for语法:
for i in <Sequence>: CODE else: CODE_ELSE
每次迭代时,for从序列中取一个元素赋值给控制变量i,下一轮迭代取下一个元素再赋值给i。和其它语言不太一样,for中的控制变量不会在for循环完后消失,它会保持最后一个被迭代的元素值。之所以会这样,是因为其它语言中for是一个代码块,而python中for不算是代码块,也就是说没有自己的名称空间。
实际上不止序列,只要是可迭代的对象,都能用for进行遍历。关于什么是可迭代的,将专门在迭代器相关的文章中解释。
例如,遍历一个字符串,因为它是序列
for i in 'xiaofang': print(i) print("var i after: ",i) # 输出g
遍历一个列表:
L = ["aa","bb","cc"] for i in L: print(i)
嵌套:
L = ["aa","bb","cc"] for i in L: for j in i: