函数
- 函数是组织代码、提高代码复用性的基本工具。
- 一个函数是组织好的、可重复使用的、用来实现单一或相关联功能的代码段。
- 函数类型:内置函数、自定义函数
定义函数
在 Python 中,使用 def 关键字来定义一个函数。
- 函数可以有参数,也可以没有参数。
python">def function_name(parameters):"""文档字符串(docstring)- 描述函数的作用,可选"""# 在这里写上函数要执行的操作...return value # 函数返回值,如果不写返回None。可以返回多个值(以元组形式)。
调用函数
定义好函数之后,可以通过函数名后面加上括号以及必要的参数来调用函数。
python">result = function_name(arguments)
# 这个代码只用于说明调用的格式,直接调用会报错,忽略报错即可。
# function_name 调用的函数名称
# arguments 参数
# 返回值赋值给result
- 形参;函数定义时括号内的参数
- 实参:函数调用时括号内的参数
- 形参相当于变量,实参相当于变量的值。
参数传递
Python 函数的参数传递可以是以下几种类型:
- 位置参数(必需参数):必须按照正确的顺序传入函数。
- 根据定义的参数位置绑定变量。
- 调用的参数数量必须和声明时一样。
- 位置参数要放在默认参数前面。
- 默认参数:可以给参数设置默认值,调用时如果不传该参数则使用默认值。
- 关键字参数:通过参数名来指定参数值,这样就不必担心参数的顺序。
- 关键参数可以和位置参数(必须参数)一起用,但是关键参数必须在位置参数(必须参数)的后面。
- 可变参数(不定长参数):可以使用 *args 和 **kwargs 来传递任意数量的参数。
- 加
*
的变量名会存放所有未命名的变量参数,参数传入的时候,个数没有限制。- 序列的打包:在定义函数的时候,在函数形参前加
*
,将元素打包成元组的形式。 - 序列的拆包:在函数执行的时候,在函数实参前加
*
,将序列进行拆包。
- 序列的打包:在定义函数的时候,在函数形参前加
- 加
示例
下面是一个简单的 Python 函数示例
python">def greet(name, greeting='Hello'):"""返回一个问候语"""return f"{greeting}, {name}!"# 调用函数
print(greet('Alice')) # 使用默认的问候语: Hello, Alice!
print(greet('Bob', 'Hi')) # 使用自定义的问候语: Hi, Bob!
下面是可变参数的示例,参数将以元组形式打包。
python">def my_add(*args):print(args)sum_ = 0for arg in args:sum_ += argreturn sum_
python"># 多个参数
my_add(1,2,3,4)
python"># 传入元组
my_add(*(1,2,3,4,5))
python"># 传入列表,列表会被转换成元组
my_add(*[1,2,3,4,5,6])
返回值
函数可以使用 return 语句来返回值。如果没有 return 语句,函数会在执行完毕后自动返回 None。
python">def add(a, b):return a + bresult = add(2, 3) # result 现在是 5
print(result)
文档字符串
良好的编程习惯是在每个函数开始处写上文档字符串,它用于解释函数的作用、参数和返回值。
python">def add(a, b):"""两个数相加并返回结果。参数:a -- 第一个加数b -- 第二个加数返回:int: 两个数的和"""return a + b
可以使用 __doc__
属性访问函数的文档字符串:
python">print(add.__doc__)
函数是对象
在 Python 中,函数是一等对象,这意味着它们可以像其他数据类型一样赋值给变量、作为参数传递、作为其他函数的返回值等。
python">def make_multiplier_of(n):"""返回一个函数,该函数将输入乘以 n"""def multiplier(x):return x * nreturn multiplier# 创建一个乘以 5 的函数
times5 = make_multiplier_of(5)# 使用该函数
print(times5(3)) # 输出 15
掌握函数是理解 Python 高级编程和软件工程实践的关键。
附件
本文对应的jupyter notebook源码链接,欢迎下载练习:https://download.csdn.net/download/fx_yzjy101/89767220
如有问题请留言。