Python函数入门


函数入门

在 Python 中,函数(Function) 是一段封装了特定功能的可重用代码块,通过函数名调用,能让代码更简洁、模块化,便于维护和复用。

一、为什么需要函数?

假设你需要多次计算两个数的和,如果每次都写一遍加法代码,会导致重复冗余。而函数可以将这段加法逻辑封装起来,需要时直接调用,减少重复代码。

二、函数的基本结构

def 关键字定义函数,语法如下:

def 函数名(参数1, 参数2, ...):
    """函数文档字符串(可选,说明函数功能)"""
    函数体实现功能的代码块需缩进
    return 返回值可选默认返回 None
  • 函数名:遵循变量命名规则(字母、数字、下划线,不能以数字开头),建议见名知意(如 addcalculate_area)。
  • 参数:函数接收的输入(可选,无参数则写空括号 ())。
  • 函数体:实现具体功能的代码,必须缩进(4个空格)。
  • return:指定函数的返回结果(可选),执行到 return 后函数立即结束。

三、函数的定义与调用

1. 无参数、无返回值的函数

# 定义函数:打印问候语
def say_hello():
    """打印简单的问候语"""
    print("Hello, Python!")

# 调用函数:函数名+括号
say_hello()  # 输出:Hello, Python!

2. 带参数的函数

参数是函数的“输入”,让函数更灵活(可处理不同数据)。

# 定义函数:计算两数之和(带两个参数)
def add(a, b):
    """返回a和b的和"""
    result = a + b
    return result  # 返回计算结果

# 调用函数:传入实际参数(实参)
sum1 = add(3, 5)  # 实参3、5分别传给形参a、b
print(sum1)  # 输出:8

sum2 = add(10, 20)
print(sum2)  # 输出:30
  • 形参(parameter):定义函数时的参数(如 ab),是“形式上的参数”。
  • 实参(argument):调用函数时传入的参数(如 35),是“实际的数据”。

3. 带默认参数的函数

默认参数允许函数在调用时省略部分参数(使用预设值),需放在位置参数后面。

# 定义函数:计算a与b的乘积,b的默认值为1
def multiply(a, b=1):
    """返回a乘以b的结果,b默认是1"""
    return a * b

# 调用时可省略默认参数
print(multiply(5))    # 只传a,b用默认值1 → 5*1=5
print(multiply(5, 3)) # 传a和b,覆盖默认值 → 5*3=15

4. 关键字参数调用

调用函数时,可通过“参数名=值”的形式指定参数,无需严格按顺序传递。

def introduce(name, age):
    print(f"我叫{name},今年{age}岁")

# 按位置传参(需顺序一致)
introduce("小明", 18)  # 输出:我叫小明,今年18岁

# 按关键字传参(顺序可换)
introduce(age=20, name="小红")  # 输出:我叫小红,今年20岁

四、函数的返回值

  • return 语句指定返回值,函数执行到 return 后会立即结束。
  • 若没有 return,函数默认返回 None(表示“无值”)。
  • 函数可返回多个值(本质是返回一个元组,可直接解包)。

示例:返回多个值

# 定义函数:返回一个数的平方和立方
def square_and_cube(x):
    square = x **2
    cube = x** 3
    return square, cube  # 实际返回 (square, cube) 元组

# 调用函数,接收多个返回值
s, c = square_and_cube(3)  # 解包元组,s=9,c=27
print(s, c)  # 输出:9 27

五、函数的文档字符串(docstring)

函数内首行的字符串(用 """''' 包裹),用于说明函数功能、参数、返回值等,可通过 help(函数名) 查看。

def calculate_area(radius):
    """
    计算圆的面积

    参数:
        radius: 圆的半径(正数)
    返回:
        圆的面积(π * radius²)
    """
    import math
    return math.pi * radius **2

# 查看文档
help(calculate_area)  # 输出函数的说明文档

六、函数的作用域

  • 局部变量:函数内部定义的变量,仅在函数内部有效(外部无法访问)。
  • 全局变量:函数外部定义的变量,可在函数内部读取(若要修改需用 global 声明)。

示例:局部变量与全局变量

# 全局变量
global_var = 100

def test_scope():
    # 局部变量(仅在函数内有效)
    local_var = 200
    print("函数内访问全局变量:", global_var)  # 可读取全局变量
    print("函数内访问局部变量:", local_var)

test_scope()
# print(local_var)  # 报错:外部无法访问局部变量

七、综合示例:简易计算器函数

def calculator(a, b, op):
    """
    简易计算器:实现加减乘除
    参数:
        a: 第一个数字
        b: 第二个数字
        op: 运算符(+、-、*、/)
    返回:
        计算结果(除法时除数为0返回"错误")
    """
    if op == "+":
        return a + b
    elif op == "-":
        return a - b
    elif op == "*":
        return a * b
    elif op == "/":
        if b == 0:
            return "错误:除数不能为0"
        else:
            return a / b
    else:
        return "错误:不支持的运算符"

# 调用函数测试
print(calculator(10, 5, "+"))  # 15
print(calculator(10, 0, "/"))  # 错误:除数不能为0
print(calculator(7, 3, "%"))   # 错误:不支持的运算符

总结

  • 函数通过 def 定义,用 函数名() 调用,核心是“封装功能、重复使用”。
  • 参数让函数更灵活(位置参数、默认参数、关键字参数)。
  • 返回值用 return 指定,可返回单个值或多个值(元组)。
  • 文档字符串提升函数可读性,作用域区分变量的访问范围。

多写函数能让代码更简洁,减少冗余,是编程的核心技能之一。

如何让代码可以被重复使用?如何提高代码的可读性和可维护性?方法之一便是使用函数。函数就是组织在一起的、可以被其他代码调用的、实现特定功能的一段代码。

目标:掌握函数的编写方式以及函数的基本使用。

概要:

  • 初识函数
  • 函数的参数
  • 函数的返回值

定义函数

在Python中,用关键字def定义函数,其语法为

# 定义函数
def 函数名():
    函数内编写代码
    return 返回值
    ...

# 执行函数
函数名()

例如,我们定义一个求某数的n次方的函数,示例如图所示。

image-20211215090306176

简化power函数

image-20211215090409767

为了进一步理解函数的概念和用法,下面再以斐波那契数列(Fibonacci sequence)的函数定义做进一步说明。斐波那契数列的定义可简要表述为:第一项和第二项的值均为1,其后每一项的值为其前两项的值之和。其函数定义及调用如下图所示。

斐波那契数列的定义可简要表述为:第一项和第二项的值均为1,其后每一项的值为其前两项的值之和。

image-20211215090620283

函数的参数

在定义函数时,如果在括号中添加变量,我们称它为函数的形式参数。

默认参数值

在某些情况下,我们可能需要以默认参数值调用函数。例如,下图中关于求某数的n次方的函数,我们希望默认情况下为求平方。也就是说,如果不提供n的值,则默认n为2。

image-20211215090927771

不定长参数

在某些情况下,我们在定义函数时可能不知道需要传递的参数的个数。在这种情况下,我们可以使用*args**kwargs的方式来传递所有参数。其中,“”表示将未命名参数以元组的形式传入;“*”表示将命名参数以字典的形式传入。

image-20211215091113115

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

当在函数中未写返回值returnreturn 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)