函数入门
如何让代码可以被重复使用?如何提高代码的可读性和可维护性?方法之一便是使用函数。函数就是组织在一起的、可以被其他代码调用的、实现特定功能的一段代码。
目标:掌握函数的编写方式以及函数的基本使用。
概要:
- 初识函数
- 函数的参数
- 函数的返回值
定义函数
在Python中,用关键字def定义函数,其语法为
# 定义函数
def 函数名():
函数内编写代码
return 返回值
...
# 执行函数
函数名()
例如,我们定义一个求某数的n次方的函数,示例如图所示。
简化power函数
为了进一步理解函数的概念和用法,下面再以斐波那契数列(Fibonacci sequence)的函数定义做进一步说明。斐波那契数列的定义可简要表述为:第一项和第二项的值均为1,其后每一项的值为其前两项的值之和。其函数定义及调用如下图所示。
斐波那契数列的定义可简要表述为:第一项和第二项的值均为1,其后每一项的值为其前两项的值之和。
函数的参数
在定义函数时,如果在括号中添加
变量
,我们称它为函数的形式参数。
默认参数值
在某些情况下,我们可能需要以默认参数值调用函数。例如,下图中关于求某数的n次方的函数,我们希望默认情况下为求平方。也就是说,如果不提供n的值,则默认n为2。
不定长参数
在某些情况下,我们在定义函数时可能不知道需要传递的参数的个数。在这种情况下,我们可以使用*args
和**kwargs
的方式来传递所有参数。其中,“”表示将未命名参数以元组的形式传入;“*”表示将命名参数以字典的形式传入。
args及kwargs并不是Python的关键字,只是惯例写法而已。有了“”和“**”这样的不定长参数传递方式,函数就可以处理任何形式和数量的参数了。
# 1. ** 必须放在 * 的后面
def func1(*args, **kwargs):
print(args, **kwargs)
# 2. 参数和动态参数混合时,动态参数只能放在最后。
def func2(a1, a2, a3, *args, **kwargs):
print(a1, a2, a3, args, **kwargs)
# 3. 默认值参数和动态参数同时存在
def func3(a1, a2, a3, a4=10, *args, a5=20, **kwargs):
print(a1, a2, a3, a4, a5, args, kwargs)
func3(11, 22, 33, 44, 55, 66, 77, a5=10, a10=123)
函数返回值
在开发过程中,我们希望函数可以帮助我们实现某个功能,但让函数实现某功能之后有时也需要有一些结果需要反馈给我们,这里就需要使用返回值了。
在了解了返回值的基本使用之后,接下来在学3个关键知识:
- 返回值可以是任意类型,如果函数中没写return,则默认返回None
def func():
return [1,True,(11,22,33)]
result = func()
print(result)
def func():
value = 1 + 1
ret = func()
print(ret) # None
当在函数中`未写返回值` 或 `return` 或 `return None` ,执行函数获取的返回值都是None。
def func():
value = 1 + 1
return # 或 return None
ret = func()
print(ret) # None
- return后面的值如果有逗号,则默认会将返回值转换成元组再返回。
def func():
return 1,2,3
value = func()
print(value) # (1,2,3)
- 函数一旦遇到return就会立即退出函数(终止函数中的所有代码)
def func():
print(1)
return "结束吧"
print(2)
ret = func()
print(ret)