1.函数:函数是组织好的、可重复使用的、用来实现特定功能的代码片段。
(1)函数定义与调用
定义函数
def 函数名(参数列表):
函数体
......
return 返回值
调用函数 函数名(参数)
python
# 定义函数
def out_line():
print('---------------------------')
# 调用函数
out_line()
# 计算长方形的面积
def rectangle_area(l, w):
area = l * w
return area
# 调用函数
r_area = rectangle_area(20, 10)
print(r_area)
函数多个返回值
python
def circle_area_len(r):
return 3.14 * r* r , 2 * 3.14 * r
# 封装到元组中
al = circle_area_len(10)
print(al)
# 元组解包
area, len = circle_area_len(10)
print(area, len)
注意:
(1) 函数定义时的参数列表与返回值语句是可有可无的(由需求确定),函数必须先定义后调用执行(函数定义时,内部代码并未执行,在调用时才执行)。
(2) 函数定义时如果有多个参数,多个参数之间使用逗号(,)分隔 。
(3) return语句只有返回功能,而没有输出打印的功能,如果要输出,需要结合print()函数来实现 。
案例:定义一个函数:计算传入的字符串中元音字母的个数(元音字母为 aeiouAEIOU)
python
def count_aeiou(s):
"""
统计字符串中元音字母的个数
:param s: 字符串
:return: 元音字母的个数
"""
num = 0
for w in s:
if w in "aeiouAEIOU":
num += 1
return num
print(count_aeiou("Hello Python Hello World OK"))
2.函数说明文档
函数的说明文档(Docstring)是写在函数开头,用三个引号包裹的字符串,用于解释函数的功能、参数、返回值等信息,方便调用者清楚函数的具体作用及细节。
python
# 定义一个函数, 根据半径, 计算圆的周长、面积
def circle_area_len(r):
"""
该函数用于根据圆的半径, 计算圆的面积和圆的周长
param r: 圆的半径
return: 圆的面积 ,圆的周长
"""
return 3.14 * r * r, 2 * 3.14 * r
al = circle_area_len(10)
print(al)
3.函数的嵌套调用
嵌套调用指的是在一个函数中,又调用了另外一个函数。函数调用遵循栈结构,最后被调用的函数最先返回LIFO(Last In First Out,后进先出)
python
def function_a():
print("a ... before")
function_b()
print("a ... after")
def function_b():
print("b ... before")
function_c()
print("b ... after")
def function_c():
print("c ...")
function_a()
4.函数变量作用域
变量的作用域指的是变量的作用范围(标识这个变量在哪里可以使用,在哪儿不可以使用)。
(1) 全局变量:在函数之外定义的变量,称之为全局变量,在整个文件中(包括函数内)都可以使用(通常定义在文件的顶部)。
(2) 局部变量:在函数内部定义的变量,称之为局部变量,只能在该函数内部使用,外部无法访问(函数执行完毕后,会自动销毁其内部局部变量) 。
python
num1 = 1
# 全局变量
def fun1():
num1 = 100 # 局部变量
print(num1)
fun1() # 100
print(num1) # 1
num1 = 1
# 全局变量
def fun1():
global num1
num1 = 100 # 修改全局变量num1
print(num1)
fun1() # 100
print(num1) # 100
注意:在基于global声明全局变量时,要先声明,再使用。
5.函数传参方式:传参方式指的是,在调用函数时,传递实参的方式。
(1) 位置参数:调用函数时根据函数定义时的位置来传递参数。
要求:调用函数时参数顺序与定义函数时参数顺序完全一致
python
# 定义函数
def reg_stu(name, age, gender, city):
print(f"注册成功,姓名:{name}, 年龄:{age}, 性别:{gender}, 城市:{city}")
return {"name": name, "age": age, "gender": gender, "city": city}
# 调用函数
stu = reg_stu("张三", 18, "男", "北京")
print(stu)
(2) 关键字参数:调用函数时以函数定义时形参名称作为关键字,以 "键=值" 的形式来传递参数(不要求顺序)。
要求:如果位置参数与关键字参数混用, 关键字参数必须在位置参数之后(关键字参数之间,没有顺序要求)
python
# 定义函数
def reg_stu(name, age, gender, city):
print(f"注册成功,姓名:{name}, 年龄:{age}, 性别:{gender}, 城市:{city}")
return {"name": name, "age": age, "gender": gender, "city": city}
# 调用函数
stu = reg_stu(name="张三", age=18, gender="男", city="北京")
print(stu)
stu2 = reg_stu(gender="男", name="王武", city="上海", age=22)
print(stu2)
stu2 = reg_stu("赵四", 28, gender="男", city="上海")
print(stu2)
(3) 默认参数:默认参数也称为缺省参数,用于在定义函数时,为参数提供默认值,调用函数时,可以不传递有默认值的参数。
python
# 定义函数
def reg_stu(name, age, gender, city='北京'):
print(f"注册成功,姓名:{name}, 年龄:{age}, 性别:{gender}, 城市:{city}")
return {"name": name, "age": age, "gender": gender, "city": city}
# 调用函数
stu = reg_stu("张三", 18, "男")
print(stu)
stu = reg_stu("赵四", 22, "男", "深圳")
print(stu)
注意:
-
默认参数必须放在没有默认值的参数列表的后面,一个函数在定义时是可以设置多个默认参数的。
-
函数调用时,如果为默认参数传递了值,则会修改默认的参数值;如果没有传递该参数,则直接使用默认值。
(4) 不定长参数:也叫可变参数,用于函数定义及调用时参数个数不确定(0个或多个)的场景。
- 位置传递
python
# 定义函数
def calc_data(*args):
min_data = min(args)
max_data = max(args)
avg_data = sum(args) / len(args)
return min_data, max_data, round(avg_data,1)
# 调用函数
data = calc_data(10, 20, 30, 40, 50, 60, 70, 80, 90, 100)
print(data)
data = calc_data(100, 200, 300, 400, 500)
print(data)
注意:
1.传递的所有匹配的位置参数都会被args变量收集,这些参数会合并封装为一个元组,args是元组类型(注意并不会封装关键字参数)。
2.args只是约定俗成的变量名,并不是关键字,这里可以使用任何合法的变量名(如 *data)
- 关键字传递
python
# 定义函数
def calc_data(*args, **kwargs):
min_data = min(args)
max_data = max(args)
avg_data = sum(args) / len(args)
if kwargs.get('round'):
avg_data = round(avg_data, kwargs.get('round'))
return min_data, max_data, avg_data
data = calc_data(100, 200, 300, 400, round=2, count=0)
print(data)
data = calc_data(33, 11, 28, 91, 32, 75, 49)
print(data)
注意:
1.参数是以 "键=值" 形式传递的关键字参数,这些 "键=值" 参数都会被kwargs接受,并合并封装为一个字典类型。
2.kwargs只是约定俗成的变量名,并不是关键字,这里可以使用任何合法的变量名(**options)。
-
*args:不定长位置参数,函数调用时,通过位置参数传递多个参数封装到一个元组(tuple)中,*args适用于处理数量不确定的数据
-
**kwargs:不定长关键字参数,函数调用时,通过关键字参数传递多个参数封装到一个字典(dict),**kwargs适用于处理数量不确定的选项(函数的配置参数,用来定制函数的行为)
python
# 定义函数
def reg_stu(name, age, gender, city):
print(f"注册成功, 姓名: {name}, 年龄: {age}, 性别: {gender}, 城市: {city}")
return {"name": name, "age": age, "gender": gender, "city": city}
# 传参方式一: 位置参数
stu = reg_stu("张三", 18, "男", "北京")
print(stu)
# 传参方式二: 关键字参数
stu = reg_stu(name="王林", age=28, gender="男", city="北京")
print(stu)
stu = reg_stu(age=20, gender="女", city="北京", name="李慕婉")
print(stu)
# 传参方式三: 位置参数 + 关键字参数 ---> 位置参数在前, 关键字参数在后
stu = reg_stu("李慕婉", 20, gender="女", city="北京")
print(stu)
(5) 参数类型:
普通参数:数字、布尔、字符串、列表、元组、集合、字典等。
特殊参数:函数。
python
# 参数类型是函数
def add (x, y):
return x+y
def subtract (x, y):
return x-y
def calc(x, y, oper):
return oper(x, y)
result = calc(10, 20, add)
print(result)
6.匿名函数:匿名函数指的是没有名称的函数,需要通过lambda表达式来声明函数,可以简化简单函数的编写(单行表达式)。
python
# 定义匿名函数
# lambda 参数列表 : 函数体
lambda : print('-------------------------')
lambda x, y: x + y
计算两个数之和
python
def add(x, y):
return x + y
add = lambda x, y : x + y
print(add(100,200))
注意:
-
函数逻辑比较简单(单行表达式)且只在一个地方使用时,可以考虑使用匿名函数,简化书写(通常作为高阶函数的参数使用)。
-
匿名函数中可以返回结果,也可以不返回结果 。返回结果时,不需要写return,表达式的运行结果就是要返回的结果。
6.类型注解:类型注解是Python中的一种语法特性,用于明确标识变量、函数参数和返回值的数据类型,从而使代码更清晰、更安全、更易维护。
python
# 定义变量
a: int = 695
score: float = 98.5
hobby: str = "Python"
flag: bool = True
pic: None = None
names: list[str] = ["A", "C", "E"]
phones: set[str] = {"13309091111", "15209109121"}
options: dict[str, int] = {"count": 0, "total": 0}
goods: tuple[str,int,int] = ("手机", 5999, 1)
7.函数类型注解
为函数添加类型注解,其实主要就是为函数的参数和返回值添加类型注解,具体语法如下:
python
def calc(scores: list[int]) -> float:
return sum(scores) / len(scores)
def calc_data(scores: list[int]) -> tuple[int, int, float]:
max_v = max(scores)
min_v = min(scores)
avg_v = sum(scores) / len(scores)
return max_v, min_v, avg_v
注意:对于需要团队协作开发和长期维护的项目,推荐使用类型注解