函数
文章目录
1、函数的定义和使用
def 函数名(参数): # 形参
代码1
代码2
.....
# 调用函数
函数名(参数) # 实参
函数有实参和形参
,必须先定义再调用
。
例子:
def add_num(a,b):
result = a + b
print(result)
# 调用函数传入真实数据 10 和 20,真实数据为实参。
add_num(10,20)
————————————————————————————————————————————————————————————————————
# 输出结果
30
2、函数返回值
return的作用:
- 负责函数
返回值
(需用变量
接收)。 退出
当前函数 导致return下方
的所有代码不执行
。
return返回多个值:
return a,b
,返回多个数据
时,默认是元组类型
。- return后面可以连接
列表、元组或字典
,以返回多个值。
def 函数名(参数):
return 返回值
变量 = 函数名(参数)
例子:
def add_num1(a,b):
return a + b
def add_num2(a,b):
return a,b # 返回的是元组类型
c = add_num1(4,6)
d = add_num2(8,9)
print(c)
print(d)
————————————————————————————————————————————————————————————————————
# 输出结果
4
(8, 9)
3、函数的说明文档
函数文档 初级
写法
def 函数名(参数):
""" 说明文档位置 """
执行的代码1
....
例子:
def sum_num(a,b):
""" 求和函数 sum_num1 """
return a + b
help(sum_num)
————————————————————————————————————————————————————————————————————
# 输出结果
Help on function sum_num in module __main__:
sum_num(a, b)
求和函数 sum_num1
函数文档 高级
写法
def 函数名(参数):
"""
说明文档位置
:param a: 参数1
:param b: 参数2
:return : 返回值
"""
执行的代码1
.....
查看
说明文档
help(函数名)
# 例子
help(add_num)
4、函数嵌套
所谓函数嵌套调用
指的是一个函数里面又调用了另外一个函数。
体验函数嵌套实例
# 1、任意三个数之和
def sum_num(a,b,c):
return a + b + c
# 2、求三个数的平均值
def average_num(a,b,c):
sumresult = sum_num(a,b,c) # 调用前一个函数:嵌套
return sumresult/3
result = average_num(10,20,30)
print(result)
————————————————————————————————————————————————————————————————————
# 输出结果
20.0
5、变量 作用域
局部变量
所谓局部变量
是定义在函数体内部
的变量,在函数外部访问
则立即报错
。
def testA():
a = 100
print(a)
testA() # 100
print(a) # 报错:name 'a' is not defined
变量a是定义在
testA
函数内部
的变量
,在函数外部访问
则立刻报错。
**局部变量的作用:**在函数体内部
,临时存储数据
,即当函数调用完成后,则销毁
局部变量。
全局变量
所谓全局变量
,指的是在函数体内、外
都能生效的变量。
如果当有一个数据,在函数A和函数B都要使用,这时候使用全局变量
最合适。
a = 100
def testA():
print(f'函数A:{a}')
def testB():
print(f'函数B:{a}')
testA()
testB()
————————————————————————————————————————————————————————————————————
# 输出结果
函数A:100
函数B:100
全局变量的修改
a = 100
def testA():
a = 300 # 局部修改,不影响全局。
print(f'函数A:{a}')
def testB():
global a # global 关键字声明a是全局变量
a = 5
print(f'函数B:{a}')
testA() # 函数A:300
print(a) # 100,并不会改变
testB() # 函数B:5
print(a) # 5,使用global声明了全局变量,所以改变。
————————————————————————————————————————————————————————————————————
# 输出结果
函数A:300
100
函数B:5
5
6、函数的参数(进阶)
位置参数
位置参数:
- 调用函数时根据函数定义的
参数位置
来传递参数
。 传递
和定义参数
的顺序及个数
必须一致,否则会报错。
# info(信息)
def user_info(name,age,gender):
print(f'你的名字是{name},年龄是{age},性别是{gender}。')
user_info('zjh',15,'男')
————————————————————————————————————————————————————————————————————
# 输出结果
你的名字是zjh,年龄是15,性别是男
关键字参数
函数调用,通过“键 = 值”
形式加以指定。可以让函数更加清晰,容易使用
,同时也清除
了参数的顺序
需求。
位置参数
必须写在关键字参数
的前面
。否者会报错。
def user_info(name,age,gender):
print(f'你的名字是{name},年龄是{age},性别是{gender}')
# 调用函数传参
user_info('Rose', age=20, gender='女')
user_info('zjh', gender='男',age = 18)
# 位置参数必须写在关键字参数的前面 (下面是错误示范(报错))
user_info(age=20,gender='男','Tom')
user_info('zjh',age=18,'女')
————————————————————————————————————————————————————————————————————
# 输出结果
你的名字是Rose,年龄是20,性别是女
你的名字是zjh,年龄是18,性别是男
缺省参数(默认值)
缺省
参数也叫默认参数
,用于定义函数,为参数提供默认值
,调用函数时可以不传入该默认参数的值
。
- 注意:所有
位置参数
必须出现在默认参数
前,包括函数定义
和使用
。
def user_info(name,age,gender='男')
print(f'你的名字是{name},年龄是{age},性别是{gender}')
user_info('Rose',18,gender='女')
user_info('zjh',18)
————————————————————————————————————————————————————————————————————
# 输出结果
你的名字是Rose,年龄是18,性别是女
你的名字是zjh,年龄是18,性别是男
不定长参数(位置参数、关键字参数)
不定长参数指的就是不设定个数的参数
。用于不确定调用
的时候会传递多少个参数(不传递也可以)的场景。此时,可以用包裹位置参数
,或者包裹关键字参数
,来进行参数传递,会显得非常方便。
包裹 位置传递
- 传进的
所有参数
都会被args
变量收集,它会根据传进去参数的位置
合并成一个元组(tuple)
*args
作为 不定长位置参数传递,返回一个元组
。
# *args 作为 不定长位置参数传递
def user_info(*args):
print(args)
# 接收所有位置参数,返回一个元组
user_info('TOM')
user_info('TOM',20,'man')
user_info()
————————————————————————————————————————————————————————————————————
# 输出结果
('TOM',)
('TOM', 20, 'man')
()
包裹 关键字传递
- 传进的
所有关键字参数
都会被kwargs
变量收集,它会根据传进去关键字参数的位置
合并成一个字典(dict)
**kwargs
作为 不定长关键字参数传递,返回一个字典
。
# **kwargs 作为 不定长关键字参数传递
def user_info(**kwargs):
print(kwargs)
# 接收所有关键字参数,返回一个字典。
user_info()
user_info(name='Tom',age=19,id=110)
————————————————————————————————————————————————————————————————————
# 输出结果
{}
{'name': 'Tom', 'age': 19, 'id': 110}
注意:无论是
包裹位置传递
还是包裹关键字传递
,都是一个组包
的过程。组包:收集所有传入数据(输入的零散数据),返回一个
整体
。
7、拆包和交换变量值
元组 拆包
拆包: 将一个整体数据
单独拆开。
def return_num():
return 100,200
# 默认返回类型:元组
num = return_num()
print(num)
# 元组拆包
num1,num2 = return_num()
print(num1)
print(num2)
————————————————————————————————————————————————————————————————————
# 输出结果
(100, 200)
100
200
字典 拆包
拆包: 将一个整体数据
单独拆开。
- 字典进行拆包,只能获取到
key值
,只能通过key值查找
访问字典数据。
dict1 = {'name':'Tom','age':18}
a,b = dict1
# 字典进行拆包 取出来值是key
print(a) # name
print(b) # age
# 获取字典的数据
print(dict1[a])
print(dict1[b])
————————————————————————————————————————————————————————————————————
# 输出结果
name
age
Tom
18
交换变量的值
a, b = 1, 2
a, b = b, a
print(a) # 2
print(b) # 1
8、函数递归 与 lambda表达式
递归
递归是一种编程思想,应用场景:
- 日常开发中,如果要遍历一个
文件夹
下面所有的文件,通常会使用递归
来实现; - 快速排序 使用递归
递归的特点:
- 函数
内部
自己调用自己 - 必须有出口
- 返回值 返回函数上一次调用的地方(理解
流程图
)
应用:3以内数字 累加和
# 需求:3以内数据累加和:3 + 2 + 1 = 6
def sum_number(num):
# 出口
if num == 1:
return 1
# 函数内部调用自己
return num + sum_number(num-1)
a = sum_number(3)
print(a) # 6
流程图:
![image-20221024093245399](https://i-blog.csdnimg.cn/blog_migrate/79d8ce596080912f0111cc8a474654bc.png)
lambda 表达式(匿名函数)
lambda的应用场景:
- 如果一个函数有
一个返回值
,并且只有一句代码
,可以使用lambda简化。
lambda 表达式语法:
lambda 参数列表 :表达式(或返回值)
注意点:
- lambda 表达式的
参数
可有可无,函数的参数在lambda表达式中完全适用。 - lambda 表达式能
接收
任何数量的参数,但只能返回
一个表达式的值
实例对比:
实例1:无参数
的写法
# 函数
def fn1():
return 100
print(fn1) # 内存地址
print(fn1()) # 返回值
--------------------------------------------------------------------
# lambda 是一个匿名函数
# lambda 参数列表:表达式
fn2 = lambda:100
print(fn2) # lambda内存地址
print(fn2()) # 返回值
————————————————————————————————————————————————————————————————————
<function fn1 at 0x00000193CA4AE040>
100
<function <lambda> at 0x000001DC3C0DB940>
100
实例2:有参数
写法
# 设计 a + b函数
def add(a,b):
return a + b
result = add(3,2)
print(result)
--------------------------------------------------------------------
# lambda 表达式简化
fn1 = lambda a,b:a+b
print(fn1(3,2))
lambda的参数形式:
- 无参数
fn1 = lambda:100
print(fn1())
- 一个参数
fn1 = lambda a:a
print(fn1('Hello World'))
- 默认参数
# 位置参数必须在默认参数前
fn1 = lambda a,b,c=100:a+b+c
print(fn1(10,20)) # 130
- 不定长
位置
参数:*agrs
fn1 = lambda *args:args
print(fn1(1,2,4)) # (1, 2, 4)
print(fn1(10)) # (10,)
*args
作为 不定长位置参数传递,返回值是一个元组
。
- 不定长
位置
参数:**kwargs
fn1 = lambda **kwargs:kwargs
print(fn1(name='python',age=20))
**kwargs
作为 不定长关键字参数传递,返回一个字典
。
lambda的应用:
- 带
判断
的lambda
# lambda 两个数字比大小,谁大返回谁
fn1 = lambda a,b:a if a>b else b
fn1(1000,500) # 1000
列表
数据按字典key
的值排序
student = [
{'name':'TOM','age':20},
{'name':'ROSE','age':19},
{'name':'Jack','age':22}
]
# sort(key=None,reverse=False)
# 1、name key对于的值进行 升序排序
student.sort(key=lambda x:x['name'])
print(student)
student.sort(key=lambda x:x['name'],reverse=True)
print(student)
student.sort(key=lambda x:x['age'])
————————————————————————————————————————————————————————————————————
[{'name': 'Jack', 'age': 22}, {'name': 'ROSE', 'age': 19}, {'name': 'TOM', 'age': 20}]
[{'name': 'TOM', 'age': 20}, {'name': 'ROSE', 'age': 19}, {'name': 'Jack', 'age': 22}]
[{'name': 'ROSE', 'age': 19}, {'name': 'TOM', 'age': 20}, {'name': 'Jack', 'age': 22}]