零基础学 Python——函数(一)

函数

各位亦菲彦祖你们好,欢迎来到 Python 零基础系列课程的函数篇。相信你已经在之前的学习中体会到,把代码拆分成一个个小块(比如循环和条件语句)已经非常方便了;但是,当你想反复使用同一段代码时,却发现复制粘贴既冗余又容易出错。这个时候,我们就需要用到「函数」来实现代码的高复用。

本文将帮助你理解什么是函数以及如何正确地编写、调用函数,并带你走进 Python 中函数的种种用法。准备好就继续往下看吧!


1. 函数是什么

函数(Function)就是封装了一段可被重复调用执行的代码块。有了函数,我们就可以:

  1. 封装 独立的功能,让代码结构更清晰。
  2. 反复调用 相同的功能,大量减少重复代码。

函数的基本流程有两步:

  1. 定义函数 —— 把代码块封装好。
  2. 调用函数 —— 让封装好的代码块真正运行。

举个例子,如果我们想写一个能够计算 1 到 100 之间所有整数和的功能,每次都手动写循环太麻烦了,这时就可以把这个功能包装成一个函数。将来只要喊一句「这里需要用到那个求和功能了」,Python 就知道应该做什么。


2. 如何定义与调用函数

2.1 定义函数

在 Python 中,定义一个函数需要用到 def 关键字,格式如下:

def 函数名(参数列表):
    # 函数体(这里写功能的逻辑代码)
    ...
    return 返回值
  • def:英文 define 的缩写,用于声明一个函数。
  • 函数名:顾名思义,用来区分不同函数,你可以用有意义的动词来表示它的功能,例如 get_sumprint_name 等。
  • 参数列表:也称形参,表示在使用这个功能时可能需要传入的值,比如将要被计算的数字、字符串等等。
  • return 返回值:函数执行完毕后,通常都会把运算或处理的结果返回给调用者。
函数定义的小提示
  1. 函数名不能以数字开头,也不能与关键字重名(例如 ifforwhile)。
  2. 记得给函数名加小括号 () 以及冒号 :

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 中,函数其实和变量一样,也是一等公民,可以做以下事情:

  1. 在运行时创建
  2. 赋值给变量或数据结构
  3. 作为参数传给别的函数
  4. 作为函数的返回结果

例如,你可以用另一个变量名 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. 练习题

各位亦菲彦祖你们好,学完以上内容后,让我们来做几个简单的练习吧:

  1. 线性方程
    定义一个函数 f(x, k=5, b=6),在函数内求 y = k*x + b 并返回 y

    • 在函数下方分别调用 f(5), f(5, k=10)f(5, b=100),并打印结果。
    • 观察输出是否满足你对线性方程的预期。
  2. 求最大值
    定义一个函数 get_max(num1, num2),返回两个数中的最大值。

    • 分别输入(3,5)、(8,5)、(10,10),验证函数是否能够正确判断大小。
  3. 可变参数使用
    定义一个函数 changed_print(*args, sep=' ', end='\n'),要求能像内置的 print 一样接受多个任意类型的参数,并按照 sep 分隔符进行拼接,在末尾加上 end 结尾。

    • 提示:你可以考虑使用循环或字符串的 join() 方法,也可以参考内置 print 函数的源码思路。
  4. 求 1~N 的和
    编写一个函数 sum_test(n),返回 1+2+...+n 的结果并打印。

    • 试着把这个函数当参数,传给另一个函数,验证一下 Python 一等公民函数的特性。

7. 总结

通过本文的学习,大家应该对 Python 中的函数有了一个初步的了解,也知道了函数在开发中的重要性。函数 不仅能提高代码的可读性,还能大大提升我们写代码的效率和复用程度。同时,默认参数关键字参数可变参数 也让我们在传参时变得更加灵活。

以后在写稍微大一点的项目时,会发现如果没有好好利用函数,把所有代码都写在一堆,代码量会非常庞大且难以维护。要成为真正的 Python 高手,务必掌握好函数的使用与设计,让代码风格更优雅、逻辑更清晰!

以上就是函数篇的全部内容了,各位亦菲彦祖你们好,继续加油,学完函数后,就可以写出更高可复用、更简洁的程序。在后续的学习中,如果你能灵活运用函数,轻松对付各种业务逻辑就不在话下。下次见啦~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杨胜增

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值