流程控制在任何编程语言里都是一个比较重要的部分,同其他语言一样,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 关键字可选 。示例:

 1>>> x = int(input("Please enter an integer: "))
 2Please enter an integer: 42
 3>>> if x < 0:
 4...      x = 0
 5...      print('Negative changed to zero')
 6... elif x == 0:
 7...      print('Zero')
 8... elif x == 1:
 9...      print('Single')
10... else:
11...      print('More')
12...

注:这里每个控制关键字一行结尾处都有一个” : ” 号,每层关键字控制后有严格的缩进表示。其用于代替其他语言中的大括号的作用。

二、for 语句

Python 中的 for 语句与你在 C 或是 Pascal 中使用的略有不同. 不同于在 Pascal 中总是依据一个等差的数值序列迭代, 也不同于在 C 中允许用户同时定义迭代步骤和终止条件, Python 中的 for 语句在任意序列 (列表或者字符串) 中迭代时, 总是按照元素在序列中的出现顺序依次迭代。示例:

1>>> # Measure some strings:
2... words = ['cat', 'window', 'defenestrate']
3>>> for x in words:
4...     print(x, len(x))
5...
6cat 3
7window 6
8defenestrate 12

在迭代过程中修改迭代序列不安全(只有在使用链表这样的可变序列时才会有这样的情况)。如果你想要修改你迭代的序列(例如,复制选择项),你可以迭代它的复本。使用切割标识就可以很方便的做到这一点:

1>>> for w in words[:]:  # Loop over a slice copy of the entire list.
2...     if len(w) > 6:
3...         words.insert(0, w)
4...
5>>> words
6['defenestrate', 'cat', 'window', 'defenestrate']

需要特别注意的是,for也可以和else进行组合进行循环,如下:

1for x in range(1,5):
2    if x == 6 :
3       print "found the number",x
4       break;
5else:
6     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从句就不执行了。。再来一个例子:

1#!/usr/bin/python
2import time
3for x in range(1,11):
4    print x
5    time.sleep(1)
6else:
7    print "ending"

三、while语句

Python的while语句和C语言几乎一样,只是判断条件没有括号围着。

示例:

1#!/usr/bin/env python
2x = 0
3while x <= 100:
4     x += 1
5     print x

如果想使用死循环,可以将条件改成True ,如下

1#!/usr/bin/env python
2x = 0
3while True:
4     x += 1
5     print x

再一个示例:

1a, b = 0, 1
2fib = []
3while len(fib) < 10:    #循环条件没有括号
4    a, b = b, a+b   #对两个值同时赋值,相当于a=b,b=a+b
5    fib.append(b)
6print fib

同for语句一样,while也可以和else结合使用,示例如下:

 1#!/usr/bin/python
 2x = ""
 3while x != "q":
 4    print "hello"
 5    x = raw_input("please input something,q for quit:")
 6    if not x:
 7        break
 8    if x == "c":
 9        continue
10    print "one more time---"
11else:
12    print "ending......"

四、break和continue

break和continue也是从C语言借鉴过来的,break跳出当层循环,continue开始执行循环下一轮。结合for……else……break的示例:

1factor = []
2for n in range(2, 20):
3    for x in range(2, n):
4        if n%x == 0:
5            print n, "=", x, "*", n/x
6            break;
7    else:                  # 这个else是和第3行的for匹配的
8        factor.append(n)
9print factor

break与continue的区别:当break语句在循环结构中执行时,它会导致立即跳出循环结构。,当continue语句在循环结构中执行时,并不会退出循环结构,而是立即结束本次循环,重新开始下一轮循环。示例:

 1#break语句
 2for x in range(10):
 3    if x==5:
 4        break
 5    print x
 6#输出0-4
 7#continue语句
 8for x in range(10):
 9    if x==5:
10        continue
11    print x
12#输出0-9(5除外,当值为5时,则跳出本次循环,立即执行下次循环)

五、pass语句

pass语句主要出现在复合语句中,if,while,for都是复合语句(compound statement), 复合语句就是包含其他语句的语句,除了if,while,for还有with,try以及函数和类定义。而在复合语句中,如果我们什么都不需要做,就可以用pass,这就像C语言中只是一个分号的空语句。示例:

1while  True:
2      pass

运行该示例代码后,程序会一直等待键盘Ctrl + C 来终止。

六、with语句

with 语句是从 Python 2.5 开始引入的一种与异常处理相关的功能。with 语句适用于对资源进行访问的场合,确保不管使用过程中是否发生异常都会执行必要的“清理”操作,释放资源,比如文件使用后自动关闭、线程中锁的自动获取和释放等。

示例:

1with open('/proc/2/status') as f:
2    for line in f:
3        if line.startswith('FDSize'):
4            print 'fdsize:' , line.split(":")[1].strip()

with的详细说明,请参看我摘录的另一篇博文 理解Python的With语句

七、del 语句

Python解释器通过垃圾回收可以将内存中没有任何引用的对象给清理掉。也可以通过del语句直接将一个对象从内存中清除,如下:

1x = ['hello','world']
2del x
3print x
4
5#删除完对象,再pirnt时,会报错 NameError: name 'x' is not defined

八、exec与eval

使用exec语句可以执行存储在字符串中的Python代码,通过使用eval语句可以计算以字符串形式书写的Python表达式。示例如下:

1>>> exec "print 'hello,world'"
2hello,world
3>>> eval(raw_input("Enter an arithmetic expression:"))
4Enter an arithmetic expression:25+34
559
6>>> eval("2*3")
76

注:在Python中使用exec执行Python代码字符串和通过eval语句计算Python表达式,这样的做法并不推荐,因为这样会有潜在的严重漏洞。 因为可能会有用户提供一些恶意的字符串作为代码或表达式来执行,这样程序会有潜在失去控制的危险。

流程控制及相关语句的总结,到此先划一个句号(再写就偏题了, 本身后半部分已经非流程控制的范畴)。像try……except……finally 、assert、yield、raise 语句于再单独做篇幅进行总结。