Prev: Python3Ⅱ:控制结构
Next: Python3Ⅳ:异常 & 文件
1 代码重用
1.1 重用代码
[ruby=Code reuse]代码重用[/ruby]在任何编程语言中都是很重要的一部分。增加代码量使其更难维护。 一个编程大项目如果想要成功,就不能不遵循[ruby=Don't Repeat Yourself]不要重复自己[/ruby],或DRY,原则。我们之前已经见过这样的一种方法:通过使用循环。在这一章里,我们会再探索两个:函数和模块。 质量低下且重复性高的代码被称作遵循WET原则,意指[ruby=Write Everything Twice]什么都写两遍[/ruby],或[ruby=We Enjoy Typing]我们享受打字[/ruby]。 Part题: 遵守DRY原则使代码: A. 永远循环 B. 更易维护 C. 质量低下且重复性高 |
1.2 函数(一)
你在之前的学习中已经用过[ruby=functions]函数[/ruby]了。 任何语句,如果前面是词,后面有包含值的圆括号,那么这就是一个函数调用。 下面是你已经见过的一些例子:
圆括号前的词是函数名,圆括号内的逗号分隔值是函数[ruby=arguments]参数[/ruby]。 Part题: 这个函数调用中有几个参数?
|
2 函数
2.1 函数(二)
除了用内置函数外,你可以用def语句创建你自己的函数。 下面是一个名为my_func的函数的例子。它不接受参数,并输出三次"spam"。它先被定义再被调用。函数内的语句只有在调用的时候才会执行。
结果:
每个函数内的代码块都以冒号 ( : ) 开头,并被[ruby=indented]缩进[/ruby]。 Part题: 填空定义一个名hello的函数:
|
2.2 函数(三)
你必须在调用函数之前先定义函数,就像你在使用变量前必须先赋值。
结果:
Part题: 重新排列代码,定义函数sayHi()并调用。
|
3 函数参数
3.1 参数(一)
所有目前为止我们见过的函数都是零参函数,调用时带着空的圆括号。 然而,大多数函数都要接受参数。 下面的例子定义了一个接受一个参数的函数。
结果:
如你所见,参数定义在圆括号内。 Part题: 下面代码的结果?
|
3.2 参数(二)
你也可以定义有不止一个参数的函数;用逗号分隔。
结果:
Part题: 填空定义一个函数,接受两个参数,输出它们的积。
|
3.3 参数(三)
函数参数在函数定义内可以当成变量来用,然而,在函数定义之外就用不了了。这也适用于其他在函数内创建的变量。
结果:
技术上来讲,[ruby=parameter]形参[/ruby]指函数定义中的变量,[ruby=arguments]实参[/ruby]指当函数被调用时作为参数的值。 Part题: 填空定义函数,当参数为偶数时输出"Yes",否则"No"。
|
4 从函数中返回
4.1 从函数中返回(一)
某些函数,像int或str,会返回一个值以供后续使用。 要让你的自定义函数做到这一点,你可以用return语句。 举例:
结果:
return语句在函数定义外的地方不可使用。 Part题: 填空定义一个函数,比较它两个实参的长度,并返回短的那个。
|
4.2 从函数中返回(二)
如果从函数中返回值,那么它就会停止执行。return语句后的任何语句都不会被执行。 多说无益:
输出:
Part题: 下面这个函数被调用后输出的最大数字是多少?
|
5 注释 & 文档字符串
5.1 注释
[ruby=Comments]注释[/ruby]是使代码更易懂的注解。它不会影响代码运行。 在Python中,注释用井号 (#)创建。在那一行内它后面的所有字符都被忽略。 例:
结果
Python没有像C等语言中有的多行注释。 Part题: 填空注释掉文字。
|
5.2 文档字符串
[ruby=Docstrings]文档字符串[/ruby] (documentation strings) 用途与注释类似,都用来解释代码。然而它更具体,语法也不同。它是通过在函数定义的第一行写一个描述函数的多行字符串创建的。
结果
不像普通的注释,文档字符串在程序运行时会保留。这允许程序员在运行时检查这些注释。 Part题: 文档字符串能包含多行文字么?( Y / N ) |
6 函数作对象
6.1 函数(四)
尽管函数与普通变量创建的方式不同,但函数也与其他类型的值无异。 它们可以(重新)赋值给变量,在之后就可以用这些标识符来引用。
输出
上面的例子将函数multiply赋给变量operation。现在,通过operation也可以调用函数了。 Part题: 下面代码的输出?
A. shout! B. word! C. speak! |
6.2 函数(五)
函数同样能作其他函数的实参。
结果
如你所见,do_twice函数以函数作实参,并在它的函数体内调用。 Part题: 填空将函数square作为实参传给函数test。
|
7 模块
7.1 模块(一)
[ruby=Modules]模块[/ruby]是人们写下来用于完成某个常见任务的一系列代码,例如生成随机数,或是数学方面的运算,等等。 使用模块的最基础方法就是将import 模块名加在你的代码上方,然后用模块名.变量的方法来访问模块中的某个变量。 举例,下面的例子导入了random模块生成随机数:
结果 >>>上面的代码用random模块中定义的randint函数输出1到6的范围内的5个随机数。 Part题: 下面代码用到了哪个模块?
A. sqrt B. math C. num |
7.2 模块(二)
有时候你只需要使用模块中的某个成员,这时你可以用import的另一种形式。 此种形式为from 模块名 import 变量,之后这个变量就可以直接使用了,就像它是在你的代码中定义的一样。
结果
用逗号分隔列表导入多个对象。例如:
用*导入模块中的所有对象。例:from math import * Part题: 填空只从math模块中导入cos和sqrt函数。
|
7.3 模块(三)
尝试导入一个不可用的模块会产生[ruby=导入错误]ImportError[/ruby]。
结果
Part题: 导入一个位置模块产生的是什么错误? A. [ruby=模块错误]ModuleError[/ruby] B. ImportError C. [ruby=找不到模块错误]UnknownModuleError[/ruby] |
7.4 模块(四)
你可以用as关键字将模块或对象导入为不同的名字。这主要用于当模块或对象的名字很长或很迷惑人的时候。 例:
结果:
Part题: 下面代码的输出是?
A. 5 B. 25 C. 产生错误 |
8 标准库 & pip
8.1 模块(五)
Python中的模块主要有三种类型:你自己写的,你从外部安装的,和Python自带的。 最后一种就叫做[ruby=standard library]标准库[/ruby],包含许多有用的模块。一些标准库中有用的模块有string、re、datetime、math、random、os、multiprocessing、subprocess、socket、email、json、doctest、unittest、pdb、argparse和sys。 能用标准库解决的问题包括字符串解析、数据序列化、测试、调试、日期操作、邮件、命令行参,还有很多! Python大量的标准库是它作为一门语言的中流砥柱。 Part题: 填空导入math模块。
|
8.2 标准库
标准库中有些模块是由Python写成,有些是由C写成。大多数都是跨平台的,但也有些是Windows或Unix专用。我们不会讲到所有的标准库;原因很简单,模块真的太多了。标准库的全部文档都可以在www.python.org找到。 Part题: Python自带模块也叫做? A. 标准库 B. import C. Unix |
8.3 模块(六)
很多第三方Python模块都存储在[ruby=Python Package Index]Python包索引[/ruby] (PyPI)中。 安装这些模块的最好办法就是使用一个叫做pip的程序。它默认会随较新的Python发行版一同安装。如果你没有,直接安装一个也不难。当你有它之后,从PyPI安装模块就变得很简单了。只要知道你想安装的库的名字,打开命令行(Windows是命令提示符),然后输入pip install 库名。完成后,就可以在你的代码中导入使用了。 用pip是在多数操作系统上安装库的常规手段,但是有的库有针对Windows的预编译二进制包。这些有用户界面的可执行文件让你像安装其他程序一样安装库。 输入pip命令时要在命令行,而不是Python解释器。 Part题: PyPI的意思是? A. [ruby=Python Project Index]Python项目索引[/ruby] B. [ruby=Python Package Installer]Python包安装程序[/ruby] C. [ruby=Python Package Index]Python包索引[/ruby] |
期末考试
1. 填空定义一个函数,接受两个参数,返回小的那个。
2. 重新排列代码,定义一个函数,计算从0到它的参数的数字之和。
3. 按照下面方式导入的randint函数应该怎么调用?
A. randint B. rnd_int C. random.rnd_int 4. 下面代码输出的最大数字是多少?
5. 下面代码的输出是?
|