[python]程序结构与控制流

1. 条件语句

if、else与elif语句用于控制条件代码的执行。条件语句的一般格式如下:

if expression:
    statements
elif expression:
    statements
elif expression:
    statements
...
else:
    statements

如果不需要执行任何操作,可以省略条件语句的else和elif子句。如果特定子句下不存在要执行的语句,可以使用pass语句。

2. 循环与迭代

可以使用for和while语句实现循环,例如:

while expression:
    statements

for i in s:
    statements

while语句反复执行循环体中的语句。直到相关表达式求值为false。for语句迭代s中的所有元素,直到再元可用元素。for语句仅适用于可支持迭代的对象。
如果迭代中使用的元素是元素大小完全一致的序列,每次迭代时,会把相应序列的各个元素赋值给变量x、y和z。尽管使用这行代码时s大多为元组序列,但s中的各项可以为任意类型的序列,包括列表、生成器和字符串。
循环时,除了数据值之外,有时还需要跟踪数字索引,可以使用内置函数enumerate(),例如:

for i,x in enumerate(s):
    statements

enumerate(s)创建了一个迭代器,其返回值就是一个元组的序列(0, s[0])、(1, s[1])、(2, s[2])等等。关于迭代的另一个常见问题是并行迭代两个以上的序列,可以使用zip()函数,例如:

for x, y in zip(s, t):
    statements

zip(s, t)将序列s和t组合成一个元组序列(s[0], t[0])、(s[1], t[1])、(s[2], t[2])等等。如果s和t的长度不等,则用完长度最短的索引为止。
使用break语句可从循环中跳出,例如:

for line in open("foo.txt"):
    stripped = line.strip()
    if not stripped:
        break # 遇到空行,停止读取

使用continue语句可以跳到循环的下一次迭代,例如:

for line in open("foo.txt"):
    stripped = line.strip()
    if not stripped:
        continue # 跳过空行

3. 异常

异常会中断程序的正常控制流。使用raise语句可以引发异常。raise语句的一般格式是raise Exception([value]),其中Exception是异常类型,而value是一个指定异常相关细节的可选值,例如:

raise RuntimeError("unrecoverable Error")

如果raise语句没有带任何参数,将会再次引发最近一次生成的异常。使用try和except语句可以捕捉异常,例如:

try:
    f = open(‘foo‘)
except IOError as e:
    statements

出现异常时,解释器将停止执行try代码块中的语句,并寻找可匹配该异常的except子句。执行完except子句后,控制权就会传递给出现在try-except代码块之后的第一条语句。try-except语句可以嵌套使用。如果异常传递到程序的最顶级却仍未被捕获,解释器就会终止程序运行。
except语句的可选修饰符as var提供了一个变量名称,如果出现异常,就会在其中放置一个提供给raise语句的异常类型的实例。异常处理程序可以检查该值,也可以使用isinstance()函数检查异常类型。
处理程序可以捕获多种类型的异常,使用Exception可以捕获除与程序退出相关之外的所有异常,例如:

try:
    do something
except (IOError, TypeError) as e:
    # 处理I/O、类型异常
except Exception as e:
    # 处理所有异常

使用except语句时如果不带任何异常类型,也会捕获所有异常,例如:

try:
    do something
except:
    # 处理所有异常

try语句也支持else子句,它必须跟在最后一个except子句后面。如果try代码块中的代码没有引发异常,就会执行else子句中的代码,例如:

try:
    f = open(‘foo‘, ‘r‘)
except IOError as e:
    # 处理I/O异常
else:
    data = f.read()
    f.close()

finally语句为try代码块中的代码定义了结束操作,例如:

f = open(‘foo‘, ‘r‘)
try:
    # do something
finally:
    f.close()

finally用于提供一些代码,无论是否出现错误,都必须执行该代码。如果没有引发异常,finally子句中的代码将在try代码块中的代码执行完毕后立即执行。如果引发了异常,控制权首先传递给finally子句的第一条语句。这段代码执行完毕后,将交由另一个异常处理程序进行处理。
如果要创建新异常,就定义父类为Exception的新类,例如:

class NetworkError(Exception):
    pass

可用如下方式使用这个异常:

raise NetworkError("Cannot find host.")

引发异常时,将提供给raise语句的可选值用作异常的类构造函数的参数。通常它就是一个表示消息的字符串,但用户自定义的异常可以带有一个或多个异常值,例如:

class DeviceError(Exception):
    def __init__(self,errno,msg):
        self.args = (errno,msg)
        self.errno = errno
        self.errmsg = msg
raise DeviceError(1, ‘Not Responding‘)

包含__init__()方法参数的元组赋值给属性self.args。打印异常跟踪消息时就需要用到这个属性。如果不定义该属性,出现错误时,用户就无法看到关于异常的有用信息。

4. 上下文管理与with语句

with语句支持在由上下文管理器对象控制的运行时上下文中执行一系列语句,例如:

with open("debuglog", "a") as f:
    f.write("Debugging\n")
    statements
    f.write("Done\n")

import threading
lock = threading.Lock()
with lock:
    statements

在第一小段代码中,当控制流离开with语句后面的代码块时,with语句将自动关闭已打开的文件。在第二小段代码中,当控制流进入with语句后面的代码块时自动请求一个锁定,而在控制流离开时又自动释放了这个锁定。
with obj语句在控制流进入和离开其后的相关代码块时,允许对象obj管理所发生的事情。执行with obj语句时,它执行方法obj.__enter__()来指示正在进入一个新的上下文。当控制流离开该上下文时,就会执行方法obj.__exit__(type, value, traceback)。如果没有引发异常,__exit__()方法的3个参数均被设为None。否则,它们将包含与导致控制流离开上下文的异常相关的类型、值和跟踪信息。__exit__()方法返回True或False,分别指示被引发的异常得到了还是没有得到处理。
with obj语句接受一个可选的as var说明符,如果指定了该说明符,obj.__enter__()方法的返回值将保存在var中。with语句只对支持上下文管理协议(__enter__()和__exit__()方法)的对象有效。用户定义的类可以实现这些方法,从而定义它们自己的自定义上下文管理。例如:

class ListTransaction(object):
    def __init__(self, thelist):
        self.thelist = thelist
    def __enter__(self):
        self.workingcopy = list(self.thelist)
        return self.workingcopy
    def __exit__(self, type, value, tb):
        if type is None:
            self.thelist[:] = self.workingcopy
        return False

5. 断言与debug

assert语句可以在程序中引入调试代码。assert的一般格式为:

    assert test [, msg]

其中test是一个表达式,其值应该为True或False。如果test求值为False,assert就会引发AssertionError异常并使用在assert中提供的可选消息msg,例如:

    def write_date(file, data):
        assert file, "write_data: file not defined"

除了assert语句之外,Python还提供内置的只读变量__debug__,除非解释器运行在最优模式中,不则它的值为True。程序可以在需要时检查这个变量。

原文地址:http://blog.51cto.com/hanviseas/2160029

时间: 2024-11-12 10:17:04

[python]程序结构与控制流的相关文章

【Python】05、python程序结构控制语句

一.程序结构 程序结构:语句和表达式按照什么样的顺序执行 所有语言无非就三种程序结构:        顺序:默认结构 语句从上到下依次一行一行的执行,        分支:选择一个分支执行,永远最多只执行一个分支        循环: 二.分支结构语句 1.Python的比较操作 所有的Python对象都支持比较操作,可用于测试相等性.相对大小等 如果是复合对象,Python会检查其所有部分,包括自动遍历各级嵌套对象,直到可以得出最终结果 测试操作符: " =="操作符测试值的相等性

python 程序结构

程序结构: day5-atm/ ├── README ├── atm #ATM主程目录 │   ├── __init__.py │   ├── bin #ATM 执行文件 目录 │   │   ├── __init__.py │   │   ├── atm.py #ATM 执行程序 │   │   └── manage.py #ATM 管理端,未实现 │   ├── conf #配置文件 │   │   ├── __init__.py │   │   └── settings.py │   ├─

Python程序结构

The reload built-in function has been moved to importlib module in Python 3.4 from importlib import reload 参考: http://blog.csdn.net/leexide/article/details/39908279 http://www.cnblogs.com/feeland/p/4401758.html http://blog.sina.com.cn/s/blog_615c388d

python基础(3)—— 程序结构

python和其他的编程语言一样,也有三种程序结构.顺序结构,选择结构,循环结构. 1.顺序结构 顺序结构按照顺序执行程序,不做过多解释. 2.选择结构     2.1 if 语句 if condition: expression 示例: [[email protected]]# cat if.py #!/usr/bin/env python if 3 < 5: print "3 less than 5" # 语句块里面可以是多个语句if 3 > 4: print &quo

python基础II(list、tuple、简单程序结构)

创建list Python内置的一种数据类型是列表:list.list是一种有序的集合,可以随时添加和删除其中的元素. 比如,列出班里所有同学的名字,就可以用一个list表示: >>> ['Michael', 'Bob', 'Tracy'] ['Michael', 'Bob', 'Tracy'] list是数学意义上的有序集合,也就是说,list中的元素是按照顺序排列的. 构造list非常简单,按照上面的代码,直接用 [ ] 把list的所有元素都括起来,就是一个list对象.通常,我们

Python程序的常见错误(收集篇)

关于Python Python是一门解释性的,面向对象的,并具有动态语义的高级编程语言.它高级的内置数据结构,结合其动态类型和动态绑定的特性,使得它在快速应用程序开发(Rapid Application Development)中颇为受欢迎,同时Python还能作为脚本语言或者胶水语言讲现成的组件或者服务结合起来.Python支持模块(modules)和包(packages),所以也鼓励程序的模块化以及代码重用. 关于本文 Python简单.易学的语法可能会误导一些Python程序员(特别是那些

CSDN日报20170319——《人工智能风口, Python 程序员的狂欢与企业主的哀嚎》

[程序人生]人工智能风口, Python 程序员的狂欢与企业主的哀嚎 作者:赖勇浩 人工智能风口有多火?估计很多人已经感受到了,我在这里引用一下新智元的报道: "2017年短短不到三个月的时间,国内AI获投项目已有36个,千万级别融资占据半数以上." 嗯,就是那么霸道.两会刚刚结束,"人工智能"首次被列入政府工作报告,随之而来的是人工智能板块领跑大盘涨势,无疑,这一切将刺激人工智能在多个领域的全面发展. [深度学习]NeuralFinder :集成人工生命和遗传算法

Python程序员的10个常见错误(转)

add by zhj:虽然学Python也有两年了,但这些问题的确容易犯,看来对Python的理解还有些地方不深入.先转了,有时间再好好看 译文:http://blog.jobbole.com/68256/ 本文由 伯乐在线 - datorhjaelten 翻译.未经许可,禁止转载!英文出处:toptal.欢迎加入翻译小组. 关于Python Python是一门解释性的,面向对象的,并具有动态语义的高级编程语言.它高级的内置数据结构,结合其动态类型和动态绑定的特性,使得它在快速应用程序开发(Ra

Python程序练习3--模拟购物车

1.功能简介 此程序模拟用户登陆商城后购买商品操作.可实现用户登陆.商品购买.历史消费记查询.余额和消费信息更新等功能.首次登陆输入初始账户资金,后续登陆则从文件获取上次消费后的余额,每次购买商品后会扣除相应金额并更新余额信息,退出时也会将余额和消费记录更新到文件以备后续查询. 2.实现方法 架构: 本程序采用python语言编写,将各项任务进行分解并定义对应的函数来处理,从而使程序结构清晰明了.主要编写了六个函数: (1)login(name,password) 用户登陆函数,实现用户名和密码