函数实现
函数实现
之前的学习用到了内置的函数,如 print、input、len
等等。这节学习如何创建一个自己的函数。
一、介绍
函数是由多行代码组成的代码块,并包含一个名字。当你定义好一个函数后,就可以多次调用相同的函数,无需重复编写相同的代码。
特点
- 重用代码
- 提高可读性
- 隐藏功能的实现细节
二、定义函数
比如我们要定义一个函数,来计算一个圆的面积。可以这样定义。
- 首先使用
def
关键字开始表明要定义一个函数 def
加空格后是函数名称,由开发者来定义(名称需要有意义,符合函数实际执行的功能)- 函数名称后紧挨着的是由括号括起来的,里面是函数的参数,称为形参,多个参数用逗号隔开
- 最后以冒号结尾
- 紧跟着后面的行都需要进行缩进,缩进的行为该函数内部的代码
- 使用return可以返回结果
def 函数名称(形参1,形参2...形参n):
代码体
return 变量
这样就定义好了一个函数。
三、函数的使用
使用函数的时候只需要通过函数名加括号,括号内为需要给函数传递参数的值(称为实参),需要保证传递的参数个数和定义的个数相同。
def calc_area(r):
area = 3.14 * r * r
return area
area1 = calc_area(16)
print(f"半径为16的圆的面积是{area1}")
area2 = calc_area(2)
print(f"半径为2的圆的面积是{area2}")
半径为16的圆的面积是803.84
半径为2的圆的面积是12.56
显然通过定义好函数后,我们可以多次的调用,复用重复的代码,提升代码的可读性。同时通过参数指定每次执行函数需要改变的地方。
参考上述的代码,你可以定义一个计算长方形周长的函数
四、参数传递
当函数的定义包含多个形参的时候,参数的传递有多种方式将实参和形参对应起来。
1. 位置传递
位置传递是最常用的一种方式,将实参按顺序挨个与形参关联起来。
比如要定义一个计算长方形面积的函数。
def calc_area(x, y):
print(f"一边的长度为{x}, 另一边的长度为{y}")
return x * y
area = calc_area(3, 4)
print(f"长为3, 宽为4的长方形的面积为 {area}")
一边的长度为3, 另一边的长度为4
长为3, 宽为4的长方形的面积为 12
可以看到,Python 自动把第一个实参 3 赋值给了 x,第二个实参 4 赋值给了 y。
2. 指定参数名称
在实参传递时,也可以手动指定需要传递给的形参。
calc_area(y = 3, x = 4)
因为指定名字后,即使顺序不一致,也能得到同样的结果。
3. 实参的默认值
在函数定义时,可以给形参指定默认值。这样使用函数时,可以不传递这个参数,函数内部使用默认值进行计算。
def greet(name, greeting="Hello"):
return f"{greeting}, {name}!"
# 调用函数时传递两个参数 name,greeting
print(greet("Alice", "Hi"))
# 调用函数时只传递一个参数 name
print(greet("Bob"))
Hi, Alice!
Hello, Bob!
4. 不定参数
Python 函数支持使用不定参数来处理任意数量的输入参数。主要有两种类型的不定参数:序列传参和字典传参。
序列传参
在函数定义中使用 *args
可以接收任意数量的位置参数,并将它们作为一个元组传递给函数。
def print_func(*args):
for arg in args:
print(arg)
print_func(1, 2, 3)
1
2
3
在调用 example_func
时,传递了三个位置参数 1, 2, 3
,它们在函数内部被作为一个元组 args
接收和处理。
字典传参
在函数定义中使用 **kwargs
可以接收任意数量的关键字参数,并将它们作为一个字典传递给函数。
示例:
def print_func(**kwargs):
for key, value in kwargs.items():
print(f"{key}: {value}")
example_func(a=1, b=2, c=3)
a: 1
b: 2
c: 3
在调用 example_func
时,传递了三个关键字参数 a=1, b=2, c=3
,它们在函数内部被作为一个字典 kwargs
接收和处理。
五、类型声明
类型声明用于明确函数参数和返回值的预期类型,这有助于提高代码的可读性和可维护性。虽然 Python 是动态类型语言,但通过类型提示(type hints),我们可以给出变量和函数的类型信息。
参数类型声明
参数类型声明通过在参数名后面添加冒号 :
和类型来实现。在函数定义时,可以为每个参数指定一个类型提示。
def greet(name: str, age: int) -> None:
print(f"Hello, {name}. You are {age} years old.")
greet("Alice", 30)
Hello, Alice. You are 30 years old.
name
参数被声明为 str
类型,age
参数被声明为 int
类型。这意味着在调用 greet
函数时,期望传入一个字符串和一个整数。
返回值类型声明
返回值类型声明通过在函数定义的参数列表后面使用箭头 ->
和类型来实现,表示函数的返回值类型。
def add(a: int, b: int) -> int:
return a + b
result = add(3, 4)
print(result)
7
add
函数被声明为接受两个 int
类型的参数,并返回一个 int
类型的值。