函数
各位亦菲彦祖你们好,欢迎来到 Python 零基础系列课程的函数篇。相信你已经在之前的学习中体会到,把代码拆分成一个个小块(比如循环和条件语句)已经非常方便了;但是,当你想反复使用同一段代码时,却发现复制粘贴既冗余又容易出错。这个时候,我们就需要用到「函数」来实现代码的高复用。
本文将帮助你理解什么是函数以及如何正确地编写、调用函数,并带你走进 Python 中函数的种种用法。准备好就继续往下看吧!
1. 函数是什么
函数(Function)就是封装了一段可被重复调用执行的代码块。有了函数,我们就可以:
- 封装 独立的功能,让代码结构更清晰。
- 反复调用 相同的功能,大量减少重复代码。
函数的基本流程有两步:
- 定义函数 —— 把代码块封装好。
- 调用函数 —— 让封装好的代码块真正运行。
举个例子,如果我们想写一个能够计算 1 到 100 之间所有整数和的功能,每次都手动写循环太麻烦了,这时就可以把这个功能包装成一个函数。将来只要喊一句「这里需要用到那个求和功能了」,Python 就知道应该做什么。
2. 如何定义与调用函数
2.1 定义函数
在 Python 中,定义一个函数需要用到 def
关键字,格式如下:
def 函数名(参数列表):
# 函数体(这里写功能的逻辑代码)
...
return 返回值
def
:英文define
的缩写,用于声明一个函数。函数名
:顾名思义,用来区分不同函数,你可以用有意义的动词来表示它的功能,例如get_sum
、print_name
等。参数列表
:也称形参,表示在使用这个功能时可能需要传入的值,比如将要被计算的数字、字符串等等。return 返回值
:函数执行完毕后,通常都会把运算或处理的结果返回给调用者。
函数定义的小提示
- 函数名不能以数字开头,也不能与关键字重名(例如
if
、for
、while
)。 - 记得给函数名加小括号
()
以及冒号:
。
2.2 调用函数
在我们需要这个函数的地方,直接写上 函数名(参数)
就可以了。需要注意的是,函数不调用,自己不执行,只有当我们显式调用时,函数体才会被真正运行。
例如,定义一个计算 1+2+...+100
的函数并调用它:
def get_sum():
total = 0
for i in range(1, 101):
total += i
print(total)
# 调用函数
get_sum()
或者写成返回值的形式,方便二次处理:
def get_sum():
total = 0
for i in range(1, 101):
total += i
return total
result = get_sum()
print("1到100的和是:", result)
这样,如果以后要多次使用这个求和功能,只要调用 get_sum()
就可以了。
3. 函数的参数与返回值
3.1 参数
函数之所以能处理不同的数据,是因为可以把变量作为参数传入。函数在定义的时候可以设置参数,使用时根据需求填写不同的实参,从而得到各自对应的结果。
举个例子,求一个线性方程 y = kx + b
:
def f(x, k, b):
y = k * x + b
print(y)
f(5, 5, 6) # x=5, k=5, b=6
调用的时候会输出 5*5 + 6 = 31
。如果换成 f(10, 5, 6)
,就变成了 5*10+6=56
。这就是参数可变所带来的好处。
3.1.1 位置参数
当我们这样写 f(5, 5, 6)
时,Python 会把第一个实参 5
赋给 x
,第二个实参 5
赋给 k
,第三个实参 6
赋给 b
,这就是位置参数。如果搞乱了顺序,比如写成 f(5, 6, 5)
,结果就会大不相同。
3.1.2 关键字参数
为了避免位置记错带来的混乱,可以使用关键字参数指定参数名:
f(x=5, k=5, b=6)
甚至可以不按顺序写,比如:f(k=5, x=5, b=6)
。
3.1.3 默认参数
如果有些参数常常用相同的值,不想每次都传,可以给它设一个「默认值」:
def f(x, k=5, b=6):
y = k * x + b
return y
print(f(5)) # 使用默认k=5, b=6
print(f(5, b=10)) # 可以局部改动其中一个或两个参数
3.2 返回值
函数的返回值是函数最终的结果或产出。可以用 return
来返回一个值(或多个值),然后在函数外接着对这个值进行各种操作。
举例:我们把 y = 5*x + 6
封装成一个函数,需要最后把结果返回给外部:
def f(x):
y = 5 * x + 6
return y
这样,我们就可以在外部做更多的事,比如:
res = f(10)
print(res + 10)
一旦 Python 在函数中执行到 return
,函数就会立刻结束,不会再执行之后的任何代码。所以如果你在一个函数里写了两个以上的 return
语句,只有第一个会被执行到。
4. 不确定长度的参数
有时候,我们并不知道调用函数时要传多少个参数,Python 提供了很灵活的方法来处理这类场景。
4.1 *args
:收集多余的「位置参数」
如果函数定义里出现了 *args
,那么调用者传递的多余参数都会被「打包」成一个元组,赋值给 args
。
def print_args(*args):
print("参数类型:", type(args))
print("参数内容:", args)
print_args(3, 2, 1, 'wait!', 'uh...')
结果 args
会是 (3, 2, 1, 'wait!', 'uh...')
。
还可以搭配普通参数一起使用:
def print_args1(arg1, arg2, *args):
print('arg1:', arg1)
print('arg2:', arg2)
print('args:', args)
print_args1(1, 2, 3, 4, 5, 6)
这时 arg1
=1,arg2
=2,剩下的 3,4,5,6
会打包成元组给 args
。
4.2 **kwargs
:收集多余的「关键字参数」
如果用了 **kwargs
,那么在调用函数时多出来的关键字参数,就会被收集成一个字典,字典的 key 是参数名,value 是传入的值。
def print_kwargs(*arg, **kwargs):
print('位置参数:', arg)
print('关键字参数:', kwargs)
print_kwargs(1,2,3, name='Python', version='3.9')
这样你就可以随心所欲地往函数里加各种不同名称的参数了。
5. 一等公民函数
在 Python 中,函数其实和变量一样,也是一等公民,可以做以下事情:
- 在运行时创建
- 赋值给变量或数据结构
- 作为参数传给别的函数
- 作为函数的返回结果
例如,你可以用另一个变量名 d
指向原本函数 f
:
def f(x):
return 5 * x + 6
d = f
print(d(10)) # 相当于执行 f(10)
或者把函数当作参数传给另一函数:
def calc_sum(fn, N):
total = 0
for i in range(1, N+1):
total += fn(i)
return total
res = calc_sum(f, 5) # 这里把函数 f 当参数传进去
print(res) # 即 f(1) + f(2) + f(3) + f(4) + f(5)
这种用法在写更灵活、更高阶的函数时非常好用。
6. 练习题
各位亦菲彦祖你们好,学完以上内容后,让我们来做几个简单的练习吧:
-
线性方程
定义一个函数f(x, k=5, b=6)
,在函数内求y = k*x + b
并返回y
。- 在函数下方分别调用
f(5)
,f(5, k=10)
和f(5, b=100)
,并打印结果。 - 观察输出是否满足你对线性方程的预期。
- 在函数下方分别调用
-
求最大值
定义一个函数get_max(num1, num2)
,返回两个数中的最大值。- 分别输入(3,5)、(8,5)、(10,10),验证函数是否能够正确判断大小。
-
可变参数使用
定义一个函数changed_print(*args, sep=' ', end='\n')
,要求能像内置的print
一样接受多个任意类型的参数,并按照sep
分隔符进行拼接,在末尾加上end
结尾。- 提示:你可以考虑使用循环或字符串的
join()
方法,也可以参考内置print
函数的源码思路。
- 提示:你可以考虑使用循环或字符串的
-
求 1~N 的和
编写一个函数sum_test(n)
,返回1+2+...+n
的结果并打印。- 试着把这个函数当参数,传给另一个函数,验证一下 Python 一等公民函数的特性。
7. 总结
通过本文的学习,大家应该对 Python 中的函数有了一个初步的了解,也知道了函数在开发中的重要性。函数 不仅能提高代码的可读性,还能大大提升我们写代码的效率和复用程度。同时,默认参数、关键字参数、可变参数 也让我们在传参时变得更加灵活。
以后在写稍微大一点的项目时,会发现如果没有好好利用函数,把所有代码都写在一堆,代码量会非常庞大且难以维护。要成为真正的 Python 高手,务必掌握好函数的使用与设计,让代码风格更优雅、逻辑更清晰!
以上就是函数篇的全部内容了,各位亦菲彦祖你们好,继续加油,学完函数后,就可以写出更高可复用、更简洁的程序。在后续的学习中,如果你能灵活运用函数,轻松对付各种业务逻辑就不在话下。下次见啦~