《Python语言程序设计》学习笔记
笔记选自《Python语言程序设计》[美]梁勇 著
本篇笔记没有记录用python绘画的turtle库
第6章 函数
- 定义一个函数:
def functionName(list of parameters):
# Function body
-
程序里通常定义一个包含程序主要功能的名为
main
的函数 -
实际上,不管你是否使用
return
,所有Python的函数都将返回一个值。如果某个函数没有返回值,默认情况下,它返回一个特殊值None
。因此,无返回值函数,也被称作None函数。None函数可以赋值给一个变量来表明这个变量不指向任何对象。 -
None函数 不是一定需要return语句。但他能用于终止函数并将控制权返回函数调用者,语法是:
return
或return None
。 -
位置参数和关键字参数:
位置参数:实参必须和函数头中定义的形参在顺序、个数和类型上匹配。
关键字参数:使用关键字参数调用函数,通过name=value
的形式传递每个参数,和位置参数可混合使用,但是位置参数不能出现在任何关键字参数之后
def f(p1, p2, p3):
f(30, p2 = 4, p3 = 10) # 正确
f(30, p2 = 4, 10) # 错误
- 模块化代码:可以将函数的定义放在一个被称为模块的文件中,这种文件的后缀名是.py。之后这些模块可以被导入到程序中重复使用。
from GCDFuction import gdc #从模块GCDFuction中导入gcd函数
gcd() #调用gcd函数
或
import GCDFunction #导入GCDFuction模块
GCDFuction.gcd() #调用gcd函数
-
尽管许多语言支持在同一个模块里定义两个同名的函数,但是Python并不支持这个特点。通过默认参数你只可以定义函数一次,但可以通过许多不同的方式调用函数。这和在其他语言中定义同名的多个函数的效果一样。如果在一个模块里定义了两个同名函数,不会出现语法错误,但后者取代了先前的函数。
-
global语句:将一个局部变量的作用域绑定为全局的。也可以在函数中创建一个变量,然后在函数外使用。
可以定义全局变量以便模块中的所有函数都能使用它。
x = 1
def increase():
global x
x = x+1
print(x) # Displays 2
increase() # Displays 2
print(x)
# 这里函数里的x和函数外的x是一样的。
- 默认参数:当函数被调用时无参数,那么这些默认值就会被传递给实参。
def printArea(width=1, height=2):
printArea()
printArea(height=5, width=3)
printArea(height=5)
函数可以混用默认值参数和非默认值参数,默认值参数必须定义在默认值参数之前。
python不支持在同一个模块里定义两个同名的函数,可以通过默认参数形式实现同样效果。
- 返回多个值:Python的
return
语句可以返回多个值。
当它被调用时,需要同时赋值传递这些返回值。
def sort(number1, number2):
# …
return number1,number2
n1,n2=sort(2, 3)
本章总结
- 程序模块化和可重用性是软件工程的中心目标之一。函数可以实现这个目标。
- 函数头由关键字
def
开始,接下来是函数名和形式参数,最后以冒号结束。 - 形式参数是可选的;也就是说,函数可以不包含任何形式参数。
- 无返回值的函数被称为
void
或None
函数。 - 一个
return
语句可以在void
函数中用来终止函数并将程序控制权返回给函数的调用者。有时,这对保证函数控制流正常是非常有用的。 - 传给函数的参数必须和定义在函数头里的形参在数目、类型和顺序上保持一致。
- 当程序调用一个函数时,程序的控制权就转移到被调用的函数。当执行到函数的
return
语句或执行到函数的最后一条语句时,被调用的函数就将控制权转给调用者。 - 带返回值函数也可以当作Python语句被调用。在这种情况下,函数的返回值被忽略。
- 函数参数可以当作位置参数或关键字参数传递。
- 当调用一个带形式参数的函数时,实参的值就被传给形参。这种程序设计术语讲的就是值传递。
- 函数中创建的变量被称为局部变量。局部变量的作用域从它被创建的位置开始,直到函数返回为止都存在。变量必须在使用前被创建。
- 全局变量被定义在所有函数之外,而且它们可以被所有函数访问。
- Python允许用默认参数值定义函数。当无参数调用函数时,默认值就被传给形参。
- Python的
return
语句可以返回多个值。 - 函数抽象是通过将函数的使用和实现分开实现。一个用户可以在不知道函数是如何实现的情况下使用函数。函数的实现细节被封装在函数内,并对调用该函数的用户来说是隐藏的。这被称为信息隐藏或封装。
- 函数抽象将程序模块化为整齐、分层的形式。程序被写成简洁函数的集合,这样使程序更易于编写、调试、维护和修改。这种编写风格会提高函数的可重用性。
- 当实现一个大程序时,使用自顶向下或自底向上的编写方法。不要一次性编写整个程序。这个方法似乎要占用更多的编码时间(因为要反复地运行这个程序),但它实际上更省时间和更易于测试。
关键术语
英文 | 中文 |
---|---|
actual parameter | 实际参数 |
argument | 实参 |
caller | 调用者 |
default argument | 默认参数 |
divide and conquer | 分治 |
formal parameters(i.e., patameter) | 形式参数(即形参) |
functions | 函数 |
function asbtraction | 函数抽象 |
function header | 函数头 |
global variable | 全局变量 |
immutable objects | 不可变对象 |
information hiding | 信息隐藏 |
keyword arguments | 关键字参数 |
local variable | 局部变量 |
None function | None函数 |
parameters | 参数 |
pass-by-value | 传值 |
positional arguments | 位置参数 |
return value | 返回值 |
scope of a variable | 变量的作用域 |
stepwisw refinement | 逐步求精 |
stub | 待完善方式 |