Skip to content

函数 def 语句

函数是带名字的代码块,用于完成具体的工作。

python
# 1. 定义函数
def say_hello():
    print('Hello, world!')
# 2. 调用函数
say_hello()
def
[ def ]
定义

1. 函数的参数

函数可以接受参数,参数用于传递信息给函数。

python
def say_hello(name):
    print('Hello, ' + name + '!')

say_hello('Ly')

1.1 实参和形参

  • 函数定义时,函数名后面括号中的参数称为形参(parameter)。
python
# name 是形参
def say_hello(name):
    print('Hello, ' + name + '!')
  • 函数调用时,传递给函数的参数称为实参(argument)。
python
# 'Ly' 是实参
say_hello('Ly')

1.2 位置实参 和 关键字实参

鉴于函数定义中可能包含多个形参,因此函数调用中也可能包含多个实参。向函数传递实参的方式很多,可使用位置实参,这要求实参的顺序与形参的顺序相同;也可使用关键字实参,这要求每个实参都有一个对应的形参名。

  • 位置实参
python
def say_hello(name, age):
    print('Hello, ' + name + '! You are ' + str(age) + ' years old.')

say_hello('Ly', 18) # 位置实参,顺序与形参相同
  • 关键字实参
python
say_hello(age=18, name='Ly') # 关键字实参,顺序可以不同

1.3 默认值

编写函数时,可给每个形参指定默认值。在调用函数时,如果没有给形参提供实参,Python将使用默认值。

python
def say_hello(name='world'):
    print('Hello, ' + name + '!')

say_hello() # 使用默认值, name='world'
say_hello('Ly') # 覆盖默认值 name='Ly'

1.4 传递列表

当函数需要处理多个值时,可将这些值存储在列表中,将列表传递给函数。

python
def say_hello(names):
    for name in names:
        print('Hello, ' + name + '!')

say_hello(['Ly', 'Alice', 'Bob'])

要将列表的副本传递给函数,可以像下面这样做:

python
def say_hello(names[:]):
    for name in names:
        print('Hello, ' + name + '!')

names = ['Ly', 'Alice', 'Bob']
say_hello(names) # 传递列表的副本

1.5 传递任意数量的实参

有时候,你可能不知道函数需要接受多少个实参,好在Python允许函数从调用语句中收集任意数量的实参。

python
def make_pizza(*toppings):
    print(toppings)

make_pizza('pepperoni') # ('pepperoni',)
make_pizza('mushrooms', 'green peppers', 'extra cheese') # ('mushrooms', 'green peppers', 'extra cheese')

在函数定义中,*toppings 中的星号让Python创建一个名为 toppings 的空元组,并将收到的所有值都封装到这个元组中。

1.6 结合使用位置实参和任意数量实参

如果要让函数接受不同类型的实参,必须在函数定义中将接纳任意数量实参的形参放在最后。Python先匹配位置实参和关键字实参,再将余下的实参都收集到最后一个形参中。

python
def make_pizza(size, *toppings):
    print('Making a ' + str(size) + '-inch pizza with the following toppings:')
    for topping in toppings:
        print('- ' + topping)

make_pizza(16, 'pepperoni') # Making a 16-inch pizza with the following toppings: - pepperoni
make_pizza(12, 'mushrooms', 'green peppers', 'extra cheese') # Making a 12-inch pizza with the following toppings: - mushrooms - green peppers - extra cheese

2. 返回值

函数返回的值被称为返回值

python
def add(a, b):
    return a + b

result = add(1, 2)
print(result) # 3

3. 将函数存储在模块中

要让函数是可导入的,得先创建模块。模块是扩展名为.py的文件,包含要导入到程序中的代码。

下面来创建一个包含函数make_pizza()的模块。为此,我们将文件pizza.py中除函数make_pizza()之外的其他代码都删除:

3.1 导入整个模块

  • pizza.py
python
# pizza.py
def make_pizza(size, *toppings):
    print('Making a ' + str(size) + '-inch pizza with the following toppings:')
    for topping in toppings:
        print('- ' + topping)

def say_hello(name):
    print('Hello, ' + name + '!')
  • 导入模块
python
# 导入模块pizza
import pizza

# 调用模块pizza中的函数make_pizza()
pizza.make_pizza(16, 'pepperoni') # Making a 16-inch pizza with the following toppings: - pepperoni

# 调用模块pizza中的函数say_hello()
pizza.say_hello('Ly') # Hello, Ly!

这就是一种导入方法:只需编写一条import语句并在其中指定模块名,就可在程序中使用该模块中的所有函数。如果你使用这种import语句导入了名为module_name.py的整个模块,就可使用下面的语法来使用其中任何一个函数

3.2 导入模块中的特定函数

python
# 导入模块pizza中的函数make_pizza()
from pizza import make_pizza

# 调用模块pizza中的函数make_pizza()
make_pizza(16, 'pepperoni') # Making a 16-inch pizza with the following toppings: - pepperoni

3.3 使用as给函数指定别名

如果要在程序中使用的函数的名称可能与程序中已经存在的名称冲突,或者函数的名称太长,可指定别名。要指定函数的别名,需要在导入语句中使用as关键字。

python
# 导入模块pizza中的函数make_pizza(),并指定别名mp
from pizza import make_pizza as mp

# 调用模块pizza中的函数make_pizza()
mp(16, 'pepperoni') # Making a 16-inch pizza with the following toppings: - pepperoni

3.4 导入模块中的所有函数

使用星号(*)运算符可让Python导入模块中的所有函数:

python
# 导入模块pizza中的所有函数
from pizza import *

# 调用模块pizza中的函数make_pizza()
make_pizza(16, 'pepperoni') # Making a 16-inch pizza with the following toppings: - pepperoni

# 调用模块pizza中的函数say_hello()
say_hello('Ly') # Hello, Ly!

谨慎使用import *

import语句中的星号让Python将模块pizza中的每个函数都复制到这个程序文件中。由于导入了每个函数,可通过名称来调用每个函数,而无需使用句点表示法

4. 函数编写约束

  • 每个函数都应包含简要地阐述其功能的注释,该注释应紧跟在函数定义后面,并采用文档字符串格式。
  • 如果程序或模块包含多个函数,可使用两个空行将相邻的函数分开,这样将更容易知道前一个函数在什么地方结束,下一个函数从什么地方开始。
  • 所有的import语句都应放在文件开头,唯一例外的情形是,在文件开头使用了注释来描述整个程序。

京ICP备2024093538号-1