好文档 - 专业文书写作范文服务资料分享网站

Python项目开发实战

天下 分享 时间: 加入收藏 我要投稿 点赞

Python项目开发实战 1.3.4 迭代 Python提供了几种迭代的方法。最基本也最常见的就是while循环。while循环如下所示: while BooleanExpression: aBlockOfCode else: anotherBlock 注意在while语句的末端有一个冒号(:)。这表示在它之后跟着代码块。也要注意代码块的缩进。原则上,只要BooleanExpression的值还是True,代码块就会被执行。然而,有两种方法可以忽略BooleanExpression的值,直接退出while循环。它们是break语句和return语句。break语句会立刻退出循环。如果循环是在一个函数定义中,return语句也可以起到这个作用。return语句会立刻退出函数,所以也会退出函数内的任意循环。 else子句是可选的,而且在实际中也很少被用到。它会在BooleanExpression为False时执行,包括循环正常退出的情况。如果循环是被break或return语句退出的,则else子句就不会被执行。 while循环的一个惯用语法是把True作为测试条件来创建一个无限的循环,然后在循环体内部放置一个break测试。在下面的示例中,循环会读取用户命令并处理它们。如果命令包含字母q,循环就会退出。 while True: command = input('Enter a command[rwq]: ') if 'q' in command.lower(): break if command.lower() == 'r': # process 'r' elif command.lower() == 'w': # process 'w' else: print('Invalid command, try again') break有一个名为continue的同伴语句。break会退出语句块和循环,然而continue只会退出当前循环迭代的语句块。控制权又会回到while语句。如果while的测试条件为True,一个新的代码块迭代就会开始。 Python中的下一个重要的循环构造是for循环。它看起来如下所示: for item in : code block else: another code block for循环将各项从可迭代对象中取出,并且对每一项都执行代码块。可以像之前在while循环中描述的那样使用break或者return来终止循环。可以像之前那样使用continue来终止循环中的单次迭代。 18 第1章 Python核心知识回顾 当所有迭代都执行完毕后,else代码块就会被执行。如果使用break或者return退出循环,它就不会被执行。 可迭代对象是任何遵守Python迭代器协议的对象。实际上,它经常是一个容器,比如一个列表、元组,或者是一个可以返回一些值的函数,比如range()。open函数返回一个文件迭代器。它有助于你在不需要先把文件读入内存的情况下循环遍历一个文件。也可以定义自己的自定义迭代类。 for循环中有一个经常用到的函数是enumerate()。这个函数返回包含迭代对象和一个序列数的元组。在默认情况下,序列数等同于列表的下标。这意味着for代码块可以更加轻松地直接更新可迭代对象。enumerate()接受第二个可选参数。这个参数指定了序列数的开始数字。例如,可以使用这个参数来使文件中的行数从1而不是默认的0开始。 下面这个示例通过打印一个文件和关联的行数来说明这些知识点: for number, line in enumerate(open('myfile.txt')): print(number, '\\t', line) 最后,Python有两个内嵌循环结构。你已经在本章早些时候列表的讨论中看到了它们中的一个:列表推导。 列表推导是一种更一般的循环形式的特定应用。这种循环形式被称为生成器表达式。在有些地方,如果不使用它,可能就需要使用一个字面值的序列。如果回想一下本章早些时候列表推导的示例,你使用生成器表达式把1~10的偶数的平方填充进了列表,如下所示: >>> [n*n for n in range(1,11) if not n*n % 2] [4, 16, 36, 64, 100] 在方括号内的部分就是一个生成器表达式。它的一般形式如下: for in if 通过比较这个一般式和列表推导的示例,你会发现在示例中的结果表达式就是n*n,循环变量是n,可迭代对象是range(1,11)。筛选表达式是if not n*n % 2。 也可以像这样把它重写成常见的for循环: result = [] for n in range(1,11): if n*n % 2: result.append(n) 关于生成器表达式,有一点特别重要的是它们并不是一次就生成所有数据。更确切地说,它们根据需要来生成(由此得名)数据项。这样当处理大型数据集时,它可以极大地帮助节省内存资源。在本章后面,你会在名为generator function的一种特殊的函数类型中学到更多关于生成器表达式的知识。 19 Python项目开发实战 1.3.5 异常处理 有两种方法可以处理错误。第一种要在每个动作被执行时显式地检查它,另一种则尝试执行操作并且依赖系统在发生错误时产生一个错误条件或异常(exception)。尽管第一种方法在一些情况下非常适用,但在Python中,第二种方法则更为常用。Python通过try/except/else/finally构造来支持这种技术。它的一般表达式看起来如下所示: try: A block of application code except as : A block of error handling code else: Another block of application code finally: A block of clean-up code except、else和finally都是可选的。但是如果使用try语句,则except和finally必须至少存在一个。结构中可以有多个except语句,但是只可以有一个else或finally语句。如果不需要异常详情,则可以省略except语句行的as…部分。 try语句块被执行,如果发生了错误,就会测试异常类。如果存在与错误类型匹配的异常语句,就会执行相应的语句块(如果有多个异常语句块都指定同一个异常类型,则只有第一个匹配语句会被执行)。如果不存在匹配的except语句,异常会被向上传播一直到达顶层的解释器。Python会产生其常规的错误追溯报告。注意,一个空的except语句可以捕捉任何错误类型。然而,这通常是一个糟糕的主意,因为它可能隐藏任何发生在非预期中的错误。 如果try代码块在没有任何错误的情况下执行成功,else代码块就会执行。在实际中,else很少被用到。不管是否有错误被捕捉或向上传播,也不管else语句是否被执行,finally语句总是会被执行。这在锁定状态下提供了一个释放任何计算资源的机会。即使是在使用break或return语句退出try/except子句的情况下,finally语句依然会被执行。 可以使用单一的except语句来处理多种异常类型。如果想要这样做,就要把异常类放在一个元组内(需要使用圆括号)。一个任意的异常对象包含异常发生位置的具体信息,同时提供了一个字符串转换方法。这样就可以通过打印这个对象来提供一个有意义的错误消息。 可以在你自己的代码中抛出异常,也可以使用任意现有的异常类型或通过创建一个Exception类的子类来定义你自己的异常类型。还可以给你抛出的异常传递参数,并且在except子句中使用错误对象的args特性来访问这些存在于异常对象中的参数。 下面这个示例抛出了带有一个自定义参数的ValueError异常,然后捕获这个错误并将给定的参数打印出来。 >>> try: ... raise ValueError('wrong value') ... except ValueError as error: ... print (error.args) 20 第1章 Python核心知识回顾 ... ('wrong value',) 注意,你没有得到一个完整的回溯,只是打印了except代码块中的输出。也可以只是简单调用无参数的raise来处理它,然后重新抛出原异常。 1.3.6 上下文管理 Python有一个运行时上下文(context)的概念。它通常包括一个临时性的资源。这个资源就是你的程序想要交互的一些东西。一个常见的示例可能是一个打开的文件或一个并发执行的线程。为了处理这个,Python使用了关键字with和一个上下文管理器(context manager)协议。这个协议帮助你定义你自己的上下文管理器类,但是你在大部分情况下还是会使用Python提供的管理器。 你通过调用with语句来使用一个上下文管理器: with open(filename, mode) as contextName: process file here 上下文管理器保证文件在使用后会被关闭。这对于上下文管理器来说是相当常用的功能。它可以保证宝贵的资源在使用后会被释放,或者对首次使用的资源采取适当的共享预防措施。上下文管理器通常可以避免使用try/finally结构。contextlib模块为构建你自己的上下文管理器提供了支持。 现在你已经看到了Python可以处理的不同数据类型,以及在处理过程中可以使用的控制结构。现在是时候去探索如何在你的Python程序中读入和输出数据。这就是下一节的主题。 1.4 在Python中读取和输出数据 基本的数据输入和输出对于任何编程语言来说都是必要的。需要考虑你的程序会如何与用户和存储在文件中的数据进行交互。 1.4.1 与用户交互 如果想要通过stdout发送数据给用户,则可以使用已经多次见到的print()函数。在这部分,你会学到如何更加精确地控制输出。如果想要从用户读取数据,则可以使用input()函数。它会提示用户输入然后从stdin中返回原始字符的字符串。 相比第一次出现,print()函数由于有几个可选参数要变得更加复杂些。最简单的用法是:你只是把一个字符串传给它,然后print()函数会在stdout上显示字符串,后面跟一个行结束符(eol)。稍微复杂点的用法是:可以一次性地传多个项给print(),然后它会转换并且依次展示这些项。这些项之间用空格分隔。 上段文字在print()函数的行为中确定了三个固定元素: 21 Python项目开发实战 ● 它在stdout上展示输出。 ● 它用一个eol符号结束。 ● 它用空格分隔多个项。 实际上,以上这些没有一个是固定的,print()允许使用可选参数来修改任意或全部元素。可以通过指定一个file参数来修改输出;分隔符是通过sep参数来定义的,而结束字符是通过end参数定义的。下面这行打印了臭名昭著的拥有两个字符串的\world\信息,用连字符(-)分隔,以\作为结束标记,并把它输出到文件中: with open(\print(\这样,文件的内容应该是:\。 字符串format()方法在与print()结合在一起时才会真正地体现它的作用。这个组合可以整洁清晰地分开呈现你的数据。此外,在打印长列表的对象和字符串片段时,使用format()通常会更加高效。Python文档中有许多如何使用format()的示例。 也可以使用input()函数与用户进行交流。这个函数会读取用户对给定屏幕上的提示的响应值。需要自己负责把返回的字符转换成任何显示的数据类型,并且要处理转换中出现的任何错误。 下面这个示例要求用户输入一个数字。如果数字太高或者太低,它会打印一个警告(如果愿意的话,它可以形成一个猜测游戏的核心)。 target = 66 while True : value = input(\try: value = int(value) break except ValueError: print(\ if value > target: print (value, \elif int(value) < target: print(\注意:在Python版本2中,使用的是raw_input()函数,而不是input()。在版本2中,input()函数有非常不同的表现。它会对用户输入的任何东西都进行求值。这会产生一个安全问题,因为用户可能输入恶意代码。版本3移除了版本2的input()函数,然后把raw_input()重命名为input()。 22

Python项目开发实战

Python项目开发实战1.3.4迭代Python提供了几种迭代的方法。最基本也最常见的就是while循环。while循环如下所示:whileBooleanExpression:aBlockOfCodeelse:anotherBlock注意在while语句的末端有一个冒号(:)。这表示在它之后跟着代码块。也要注意代码块的缩进。原则上,只要BooleanExpressio
推荐度:
点击下载文档文档为doc格式
3ewa54p63e9y6yn8bcwn
领取福利

微信扫码领取福利

微信扫码分享