流程控制在任何编程语言里都是一个比较重要的部分,同其他语言一样,python下常用的流程控制语句有if……elif……else、while、for、break、continue,也有其他语言可能没有的语句 如try、with、pass、del、exec、eval 等。本篇就结合示例做一个简单的总结。
注:流程控制和编程语句区分上并不是特别明显,具体可以查看维基百科上python的定义 ,其将流程控制也划到了语句的范畴(从这里看 语句 > 流程控制,并包含流程控制)。所以本篇主要做流程控制的总结,并顺带做其他相关语句的小结。
一、if 语句
if 语句是python 中使用频率最多的流程控制语句之一 ,由于python 中没有switch……case 语句,所以在python 中要使用if 语句来实现。其流程为: if … elif … elif …else ,这里可以用0或多个 elif分支,关键字elif 是 else if的缩写 ,而else 关键字可选 。示例:
>>> x = int(input("Please enter an integer: "))
Please enter an integer: 42
>>> if x < 0:
... x = 0
... print('Negative changed to zero')
... elif x == 0:
... print('Zero')
... elif x == 1:
... print('Single')
... else:
... print('More')
...
注:这里每个控制关键字一行结尾处都有一个” : ” 号,每层关键字控制后有严格的缩进表示。其用于代替其他语言中的大括号的作用。
二、for 语句
Python 中的 for 语句与你在 C 或是 Pascal 中使用的略有不同. 不同于在 Pascal 中总是依据一个等差的数值序列迭代, 也不同于在 C 中允许用户同时定义迭代步骤和终止条件, Python 中的 for 语句在任意序列 (列表或者字符串) 中迭代时, 总是按照元素在序列中的出现顺序依次迭代。示例:
>>> # Measure some strings:
... words = ['cat', 'window', 'defenestrate']
>>> for x in words:
... print(x, len(x))
...
cat 3
window 6
defenestrate 12
在迭代过程中修改迭代序列不安全(只有在使用链表这样的可变序列时才会有这样的情况)。如果你想要修改你迭代的序列(例如,复制选择项),你可以迭代它的复本。使用切割标识就可以很方便的做到这一点:
>>> for w in words[:]: # Loop over a slice copy of the entire list.
... if len(w) > 6:
... words.insert(0, w)
...
>>> words
['defenestrate', 'cat', 'window', 'defenestrate']
需要特别注意的是,for也可以和else进行组合进行循环,如下:
for x in range(1,5):
if x == 6 :
print "found the number",x
break;
else:
print "not found!"
关于for和while循环结合else语句使用的情况,在python 官方文档中有相应的解释,如下:
Loop statements may have an else clause; it is executed when the loop terminates through exhaustion of the list (with for) or when the condition becomes false (with while), but not when the loop is terminated by a break statement.
翻译:循环语句后可以有一个else从句,这个else从句在因为for循环中list全部遍历完或者因为while循环中条件不满足而执行,而如果循环中有break语句执行了则else从句就不执行了。。再来一个例子:
#!/usr/bin/python
import time
for x in range(1,11):
print x
time.sleep(1)
else:
print "ending"
三、while语句
Python的while语句和C语言几乎一样,只是判断条件没有括号围着。
示例:
#!/usr/bin/env python
x = 0
while x <= 100:
x += 1
print x
如果想使用死循环,可以将条件改成True ,如下
#!/usr/bin/env python
x = 0
while True:
x += 1
print x
再一个示例:
a, b = 0, 1
fib = []
while len(fib) < 10: #循环条件没有括号
a, b = b, a+b #对两个值同时赋值,相当于a=b,b=a+b
fib.append(b)
print fib
同for语句一样,while也可以和else结合使用,示例如下:
#!/usr/bin/python
x = ""
while x != "q":
print "hello"
x = raw_input("please input something,q for quit:")
if not x:
break
if x == "c":
continue
print "one more time---"
else:
print "ending......"
四、break和continue
break和continue也是从C语言借鉴过来的,break跳出当层循环,continue开始执行循环下一轮。结合for……else……break的示例:
factor = []
for n in range(2, 20):
for x in range(2, n):
if n%x == 0:
print n, "=", x, "*", n/x
break;
else: # 这个else是和第3行的for匹配的
factor.append(n)
print factor
break与continue的区别:当break语句在循环结构中执行时,它会导致立即跳出循环结构。,当continue语句在循环结构中执行时,并不会退出循环结构,而是立即结束本次循环,重新开始下一轮循环。示例:
#break语句
for x in range(10):
if x==5:
break
print x
#输出0-4
#continue语句
for x in range(10):
if x==5:
continue
print x
#输出0-9(5除外,当值为5时,则跳出本次循环,立即执行下次循环)
五、pass语句
pass语句主要出现在复合语句中,if,while,for都是复合语句(compound statement), 复合语句就是包含其他语句的语句,除了if,while,for还有with,try以及函数和类定义。而在复合语句中,如果我们什么都不需要做,就可以用pass,这就像C语言中只是一个分号的空语句。示例:
while True:
pass
运行该示例代码后,程序会一直等待键盘Ctrl + C 来终止。
六、with语句
with 语句是从 Python 2.5 开始引入的一种与异常处理相关的功能。with 语句适用于对资源进行访问的场合,确保不管使用过程中是否发生异常都会执行必要的“清理”操作,释放资源,比如文件使用后自动关闭、线程中锁的自动获取和释放等。
示例:
with open('/proc/2/status') as f:
for line in f:
if line.startswith('FDSize'):
print 'fdsize:' , line.split(":")[1].strip()
with的详细说明,请参看我摘录的另一篇博文 理解Python的With语句 。
七、del 语句
Python解释器通过垃圾回收可以将内存中没有任何引用的对象给清理掉。也可以通过del语句直接将一个对象从内存中清除,如下:
x = ['hello','world']
del x
print x
#删除完对象,再pirnt时,会报错 NameError: name 'x' is not defined
八、exec与eval
使用exec语句可以执行存储在字符串中的Python代码,通过使用eval语句可以计算以字符串形式书写的Python表达式。示例如下:
>>> exec "print 'hello,world'"
hello,world
>>> eval(raw_input("Enter an arithmetic expression:"))
Enter an arithmetic expression:25+34
59
>>> eval("2*3")
6
注:在Python中使用exec执行Python代码字符串和通过eval语句计算Python表达式,这样的做法并不推荐,因为这样会有潜在的严重漏洞。 因为可能会有用户提供一些恶意的字符串作为代码或表达式来执行,这样程序会有潜在失去控制的危险。
流程控制及相关语句的总结,到此先划一个句号(再写就偏题了,本身后半部分已经非流程控制的范畴)。像try……except……finally 、assert、yield、raise 语句于再单独做篇幅进行总结。