Python 函数--详细整理

122 阅读7分钟

Python 函数

Python 是一种强大的编程语言,函数是 Python 编程中的基本构建块之一,它可以帮助我们将代码模块化,提高代码的可重用性可维护性

1 函数定义

Python 中的函数可以使用 def 关键字定义,定义语法如下:

def 函数名(参数列表):
    函数体
def function_name(arguments):
    """docstring"""
    # function body
    return [expression]

函数定义语法由以下组成:

  1. def: Python 中定义函数的关键字。
  2. function_name: 函数名称,由字母、数字和下划线组成,不能以数字开头。
  3. arguments: 参数列表,由逗号分隔的形式参数和关键字参数组成。
  4. docstring: 函数文档字符串,用于描述函数的功能和使用方法。
  5. function body: 函数体,包含了执行函数需要执行的语句。
  6. return: 函数结果返回关键字,返回值可以为表达式或者省略。

以下是一个简单的函数定义示例:

def greet(name):
    """向名字问好"""
    print(f"Hello, {name}!")

这个函数名称为 greet,参数为 name,函数文档字符串描述了函数的功能,函数体打印了传入名称的问候语。

2 函数调用

定义函数后,我们就可以通过函数名调用函数,将需要输入的数据传递给函数,让函数执行并返回结果,调用语法如下:

function_name(arguments)

以下是一个简单的函数调用示例:

greet('Alice')

这个函数调用传入参数 Alice,函数体内部打印了 Hello, Alice!

3 函数参数

Python 中的函数可以接受两种类型的参数:位置参数和关键字参数。

3.1 位置参数

位置参数是函数定义的参数,按顺序传递给函数,调用时必须提供与函数定义的位置参数相同数量的参数。例如:

def greet(name, age):
    """向给定的名字和年龄发问候"""
    print(f"Hello, {name}. You are {age} years old.")

greet('Alice', 20)

这个函数定义了两个位置参数,调用时必须按照顺序传入相同数量的参数,函数体内部打印了 Hello, Alice. You are 20 years old.

3.2 关键字参数

关键字参数是通过名称指定的参数,调用时不必按顺序传递。关键字参数必须指定参数名和值。例如:

def greet(name, age):
    """向给定的名字和年龄发问候"""
    print(f"Hello, {name}. You are {age} years old.")

greet(age=20, name='Alice')

在函数调用时,指定参数名称和值,函数体内部仍然可以按照参数位置进一步操作。

3.3 默认参数

如果函数定义中指定了缺省值,调用函数时可以省略该参数,使用定义时的缺省值。例如:

def greet(name, age=18):
    """向给定的名字和年龄发问候"""
    print(f"Hello, {name}. You are {age} years old.")

greet('Alice')

在函数定义时,指定了 age 参数具有默认值 18,在函数调用时可以不传递 age 参数,函数体内部打印了 Hello, Alice. You are 18 years old.

3.4 可变参数

如果想要传入可变数量位置参数,请在参数名前面加上 * 号,可以接受一个任意数量的参数,这些参数将作为元组传递给函数体。例如:

def greet(name, *args):
    """向给定的名字和年龄发问候"""
    print(f"Hello, {name}. You have {len(args)} arguments: {args}")

greet('Alice', 'Bob', 'Charlie', 'David')

# 输出 Hello, Alice. You have 3 arguments: ('Bob', 'Charlie', 'David')

在这个函数内部,使用 *args 来指定参数数量可变,所有的额外参数将作为元组传递给函数体,函数体。

如果想要传入可变数量关键字参数,请在参数名前面加上 ** 号,可以接受一个任意数量的关键字参数,这些参数将作为字典传递给函数体。例如:

def greet(name, **kwargs):
    """向给定的名字和年龄发问候"""
    print(f"Hello, {name}. You have {len(kwargs)} arguments: {kwargs}")

greet('Alice', Bob=20, Charlie=23, David=18)

在这个函数内部,使用 **kwargs 来指定参数数量可变,所有的额外参数将作为字典传递给函数体,函数体输出 Hello, Alice. You have 3 arguments: {'Bob': 20, 'Charlie': 23, 'David': 18}

  • 加了 * 的参数会以元组的形式导入

  • 加了** 的参数会以字典的形式导入

  • / 之前的参数只能通过位置传递

  • * 之后的参数只能通过关键字传递,参数中星号 * 可以单独出现

下面是一个例子:

def func(a, b, /, c, d, *, e, f):
    print(a, b, c, d, e, f)

func(1, 2, 3, 4, e=5, f=6)

这个函数可以接受 6 个参数,其中 / 前面的两个参数 a 和 b 只能通过位置传递,不能通过关键字传递; / 后面的两个参数 c 和 d 既可以通过位置传递,也可以通过关键字传递;* 后面的两个参数 e 和 f 只能通过关键字传递,不能通过位置传递。 因此,下面的调用都是合法的:

func(1, 2, 3, 4, e=5, f=6)
func(1, 2, c=3, d=4, e=5, f=6)
func(1, 2, 3, d=4, e=5, f=6)

而下面的调用将会抛出异常:

func(a=1, b=2, c=3, d=4, e=5, f=6)  # 不能通过关键字传递 a 和 b
func(1, 2, c=3, d=4, 5, 6)  # 不能通过位置传递 e 和 f

4 函数作用域

Python 中的函数有自己的作用域,定义在函数之内的变量称为局部变量,只能在函数内部使用,无法在函数外部访问。 而在函数之外定义的变量称为全局变量,可以被整个程序访问。

函数作用域的规则可以总结为以下几点:

  1. 函数内部可以访问全局变量。
  2. 函数内部定义的变量是局部变量,只能在函数内使用。
  3. 函数内部可以修改全局变量,但需要在函数内部指定 global 关键字。

以下是一个修改全局变量的例子:

x = 0

def increment():
    global x
    x += 1

increment()
print(x)

在这个例子中,函数体内使用 global 关键字来指定 x 是全局变量,函数体内部将全局变量 x 的值增加了 1,最终输出 1

5 函数返回值

Python 中的函数可以返回单个值或者多个值。如果返回多个值,Python 会将返回值封装为元组。

以下是一个返回单个值的函数示例:

def add_numbers(x, y):
    """将两个数字相加并返回结果"""
    return x + y

result = add_numbers(3, 4)
print(result)

这个函数接受两个数字作为输入,将它们相加并返回结果。函数调用返回结果并将其赋值给变量 result,最终输出 7

以下是一个返回多个值的函数示例:

def get_name_stats(name):
    """返回给定名字的长度和第一个字母"""
    length = len(name)
    first_letter = name[0]
    return length, first_letter

name_length, name_first_letter = get_name_stats('Alice')
print(name_length)
print(name_first_letter)

这个函数接受一个名字作为输入,返回该名字的长度和第一个字母。函数调用同时返回两个值并将其赋值给 name_lengthname_first_letter,最终输出先输出 5,然后输出 A

6 Lambda 函数

Lambda 函数是一种匿名函数,它可以在一行代码中定义一个简单的函数,通常用于规模较小的函数体。Lambda 函数由 lambda 关键字引入,接受任意数量的参数(但是只能有一个表达式),并返回表达式的值。以下是一个简单的 Lambda 函数示例:

f = lambda x: x ** 2
print(f(4))

这个 Lambda 函数接受一个参数 x,返回 x 的平方,并将其赋值给变量 f,最终输出 16

Lambda 函数通常用于需要传递一个简单的函数体作为另一个函数的参数,例如 map()filter() 函数。.

匿名函数:lambda [arg1 [,arg2,.....argn]]:expression