- 译者序
- 前言
- 第1章 问答环节
- 第2章 Python 如何运行程序
- 第3章 如何运行程序
- 第4章 介绍 Python 对象类型
- 第5章 数字
- 第6章 动态类型简介
- 第7章 字符串
- 第8章 列表与字典
- 第9章 元组、文件及其他
- 第10章 Python 语句简介
- 第11章 赋值、表达式和打印
- 第12章 if 测试和语法规则
- 第13章 while 和 for 循环
- 第14章 迭代器和解析,第一部分
- 第15章 文档
- 第16章 函数基础
- 第17章 作用域
- 第18章 参数
- 第19章 函数的高级话题
- 第20章 迭代和解析,第二部分
- 第21章 模块:宏伟蓝图
- 第22章 模块代码编写基础
- 第23章 模块包
- 第24章 高级模块话题
- 第25章 OOP:宏伟蓝图
- 第27章 更多实例
- 第28章 类代码编写细节
- 第29章 运算符重载
- 第30章 类的设计
- 第31章 类的高级主题
- 第32章 异常基础
- 第34章 异常对象
- 第35章 异常的设计
- 第36章 Unicode 和字节字符串
- 字符串基础知识
- Python 的字符串类型
- 文本和二进制文件
- Python 3.0 中的字符串应用
- 转换
- 编码 Unicode 字符串
- 编码非ASCII文本
- 编码和解码非ASCII文本
- 其他 Unicode 编码技术
- 转换编码
- 在 Python 2.6 中编码 Unicode 字符串
- 源文件字符集编码声明
- 使用 Python 3.0 Bytes 对象
- 序列操作
- 创建 bytes 对象的其他方式
- 混合字符串类型
- 使用 Python 3.0(和 Python 2.6)bytearray 对象
- 使用文本文件和二进制文件
- Python 3.0 中的文本和二进制模式
- 类型和内容错误匹配
- 使用 Unicode 文件
- 在 Python 3.0 中处理 BOM
- Python 2.6 中的 Unicode 文件
- Python 3.0 中其他字符串工具的变化
- Struct二进制数据模块
- pickle对象序列化模块
- XML解析工具
- 本章小结
- 本章习题
- 习题解答
- 第37章 管理属性
- 第38章 装饰器
- 第39章 元类
- 附录A 安装和配置
- 附录B 各部分练习题的解答
- 作者介绍
- 封面介绍
编写函数
在这一章,我们将会解释在Python中如何去编写一个函数。我们编写的函数使用起来就像内置函数一样:它们通过表达式进行调用,传入一些值,并返回结果。但是编写一个新的函数要求我们使用一些尚未介绍过的额外的概念。此外,函数在Python中同在像C这样的编译语言中表现非常不同。下面是一个关于Python函数背后的一些主要概念的简要介绍,我们都会在本书这一部分学习。
·def是可执行的代码。Python的函数是由一个新的语句编写的,即def。不像C这样的编译语言,def是一个可执行的语句——函数并不存在,直到Python运行了def后才存在。事实上,在if语句、while循环甚至是其他的def中嵌套是合法的(甚至在某些场合还很有效)。在典型的操作中,def语句在模块文件中编写,并自然而然地在模块文件第一次被导入的时候生成定义的函数。
·def创建了一个对象并将其赋值给某一变量名。当Python运行到def语句时,它将会生成一个新的函数对象并将其赋值给这个函数名。就像所有的赋值一样,函数名变成了某一个函数的引用。函数名其实并没有什么神奇——就像你将看到的那样,函数对象可以赋值给其他的变量名,保存在列表之中。函数也可以通过lambda表达式(在稍后章节会介绍的高级概念)来创建。
·lambda创建一个对象但将其作为结果返回。也可以用lambda表达式创建函数,这一功能允许我们把函数定义内联到语法上一条def语句不能工作的地方(这是一个更加高级的概念,我们推迟到第19章介绍)。
·return将一个结果对象发送给调用者。当函数被调用时,其调用者停止运行直到这个函数完成了它的工作,之后函数才将控制权返回调用者。函数是通过return语句将计算得到的值传递给调用者的,返回值成为函数调用的结果。
·yield向调用者发回一个结果对象,但是记住它离开的地方。像生成器这样的函数也可以通过yield语句来返回值,并挂起它们的状态以便稍后能够恢复状态。这是本书稍后要介绍的另一个高级话题。
·global声明了一个模块级的变量并被赋值。在默认情况下,所有在一个函数中被赋值的对象,是这个函数的本地变量,并且仅在这个函数运行的过程中存在。为了分配一个可以在整个模块中都可以使用的变量名,函数需要在global语句中将它列举出来。通常情况下,变量名往往需要关注它的作用域(也就是说变量存储的地方),并且是通过实赋值语句将变量名绑定至作用域的。
·nonlocal声明了将要赋值的一个封闭的函数变量。类似的,Python 3.0中添加的nonlocal语句允许一个函数来赋值一条语法封闭的def语句的作用域中已有的名称。这就允许封闭的函数作为保留状态的一个地方——当一个函数调用的时候,信息被记住了——而不必使用共享的全局名称。
·函数是通过赋值(对象引用)传递的。在Python中,参数通过赋值传递给了函数(也就是说,就像我们所学过的,使用对象引用)。正如你将看到的那样,Python的模式中,调用者以及函数通过引用共享对象,但是不需要别名。改变函数中的参数名并不会改变调用者中的变量名,但是改变传递的可变对象可以改变调用者共享的那个对象。
·参数、返回值以及变量并不是声明。就像在Python中所有的一样,在函数中并没有类型约束。实际上,从一开始函数就不需要声明:可以传递任意类型的参数给函数,函数也可以返回任意类型的对象。其结果就是,函数常常可以用在很多类型的对象身上,任意支持兼容接口(方法和表达式)的对象都能使用,无论它们是什么类型。
如果说前面有些内容介绍得不够深入的话,请别担心——我们将会在本书的这一部分通过真实的代码去探索所有以上的这些概念。让我们开始介绍前面这些概念并看一些例子。
def语句
def语句将创建一个函数对象并将其赋值给一个变量名。Def语句一般的格式如下所示。
就像所有的多行Python语句一样,def包含了首行并有一个代码块跟随在后边,这个代码块通常都会缩进(或者就是在冒号后边简单的一句)。而这个代码块就成为了函数的主体——也就是每当调用函数时Python所执行的语句。
def的首行定义了函数名,赋值给了函数对象,并在括号中包含了0个或以上的参数(有些时候称为是形参)。在函数调用的时候,在首行的参数名赋值给了括号中的传递来的对象。
函数主体往往都包含了一条return语句。
Python的return语句可以在函数主体中的任何地方出现。它表示函数调用的结束,并将结果返回至函数调用处。return语句包含一个对象表达式,这个对象给出的函数的结果。return语句是可选的。如果它没有出现,那么函数将会在控制流执行完函数主体时结束。从技术角度来讲,一个没有返回值的函数自动返回了none对象,但是这个值是往往被忽略掉的。
函数也许会有yield语句,这在每次都会产生一系列值时被用到,这在第20章我们研究函数的高级话题时才会讨论到。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论