python基础(四)流程控制

流程控制在任何编程语言里都是一个比较重要的部分,同其他语言一样,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 语句于再单独做篇幅进行总结。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注