一. 函数的返回值
1. 返回值的定义
- 返回值就是从函数内部传递到函数外部的数据(实现函数功能的时候可能会产生新的数据,这个数据如果不通过函数的返回值返回,在函数外部是无法使用这个数据的)
#错误代码
def sum(num1,num2):
result = num1 + num2
print(result)
sum(100,200)
print(result)
### 会报错
2.如何将数据作为函数返回值返回
- return关键字后面的表达式结果就是函数返回值
3.函数外部如何获取函数返回值:
- 获取函数调用表达式的值就是获取函数的返回值
注意:
- 如果执行函数遇到了return,return后面的值就是函数的返回值。如果没有遇到return,函数的返回值是None。
- 如果实现函数的功能产生了新的数据,这个新的数据应该作为函数的返回值返回,而不是打印。
二. return返回值的作用
-
将数据作为函数返回值返回
- 提前结束函数 ----- 如果执行函数体的时候遇到return,函数直接结束
def func1():
print('hello world')
return
print('+++++')
func1()
#hello world
## 查看是否都是中文
def func1(str1:str):
for x in str1:
if not '\u4e00' <= x <= '\u9fa5':
return False
return True
print(func1('hello _1world'))
# 直接用return
## 判断用户名是否合法
def func1(str1:str):
if not str1[0].isupper():
return False
count = 0
for x in str1[1:]:
if not (x.isupper() or x.islower() or x.isdigit()):
return False
elif x.isdigit():
count += 1
if count == 0:
return False
三. 全局变量和局部变量
根据变量作用域的不同可以将变量分为两种:全局变量和局部变量
1.全局变量
- 定义:没有定义在函数或者类里面的变量就是全局变量;全局变量的作用域是从定义开始到程序结束。
a = 100
print(f"外面使用a:{a}")
for x in range(5):
b = 200
print(f"外面使用a:{a}")
def func2():
print(f"外面使用a:{a}")
func2()
------- a 和 x和b 都属于全局变量,对于x,和b,因为它们也没有写在函数和类中,所以都是全局变量,在任何地方都可以使用
2.局部变量
- 定义:定义在函数中的变量就是局部变量(包括形参);局部变量的作用是从定义开始到函数结束
def func2(m):
n = '小明'
print(f"函数里面才能使用m和n:{m},{n}")
func2(110)
# m / n是局部变量
3. global关键字
- 全局变量默认保存在全局栈区间,局部变量默认保存在函数对应的临时栈区间
- 全局栈区间: 程序开始运行时创建的,程序运行结束后自动释放
- 函数对应的临时栈区间: 调用函数的时候创建,函数调用结束就释放。
注意:可以在函数中通过global关键字修改局部变量的保存方式,让局部变量保存在全局栈区间中。
def fun3():
global weight
weight = 30
### 局部变量运行结束后会被释放,全局变量会一直保留
- 在函数中定义全局变量使用global
- 在函数中修改全局变量也使用global
四. 匿名函数
1.定义:
- 本质还是函数(匿名函数是可以用一条语句来实现函数功能的)
2. 语法:
- lambda 形参列表:返回值
函数名 = lambda 行参列表:返回值
sum2 = lambda num1,num2: num1+num2
print(sum2(10,50))
# 60
练习
# 练习:定义一个匿名函数获取一个整数的十位数
ten = func6 = lambda num1: num1 // 10 % 10
print(ten(23))
# 练习:定义一个匿名函数求整数列表中所有元素的个位数的和
k =lambda lst: sum([x % 10 for x in lst])
print(k([101,102]))
五. 实参高阶函数 --- 有一个参数是函数的函数
1. 参数是函数的参数如何传参:
- a. 传满足条件的普通函数的函数名
- b. 传一个满足条件的匿名函数
**2.常用的实参高阶函数用法:max、min、sorted、列表.sort、map、filter、reduce
1. max、 min、sorted、 列表.sort
- max(容器) ----- 直接比较容器中元素的大小求最大值
- max(容器,key = 函数) ------ 按照函数定制规则比较容器中元素大小求最大值
- 函数的要求:
- a. 有且只有一个参数,这个参数指向容器中的每个元素
- b. 需要一个返回值,返回值就是比较对象
- 案例: 求nums中个位数最大的元素
- 函数的要求:
nums = [19,872,76,54,32,110]
## 这里用匿名函数
result = max(nums, key=lambda item: item % 10)
print(result)
#19
- 案例: 求学生分数最高的
students = [
{'name':'张三', 'age':19, 'score':89},
{'name': '李三', 'age': 23, 'score': 28},
{'name': '王五', 'age': 20, 'score': 99},
{'name': '小明', 'age': 29, 'score': 70},
{'name': '小红', 'age': 18, 'score': 56}
]
result1 = max(students,key=lambda item: item['score'])
print(result1)
- 案例:求绝对值最大的数字
# 案例:求nums中绝对值最大的元素
nums3 = [19, -872, 76, 54, -32, 110]
result3 = max(nums3,key=lambda x:x**2)
print(result3)
nums3 = [19, -872, 76, 54, -32, 110]
result3 = max(nums3,key=lambda x:abs(x))
print(result3)
- 案例:将nums中元素绝对值升序排序
- 案例:将学生列表按年龄降序排列
2. map 基于原来容器中的元素创建新的容器
- a.map( 函数,容器)
函数要求:有且只有一个参数,这个参数代表后面这个容器中每个元素
需要一个返回值,返回值就是新的容器中元素
- map(函数,容器1,容器2,....)
-
有且只有两个参数,分别对应代码后面两个容器中的每个元素 需要一个返回值,返回值就是新的容器中的元素
-
练习:使用map将nums中所有的元素都乘以100
nums = [19, 872, 76, 54, 32, 110]
# 练习:使用map将nums中所有的元素都乘以100
nums = [19, 872, 76, 54, 32, 110]
result = map(lambda x : x*100,nums)
print(list(result))
练习:map(pass,,keys,values)容器先写上, 在lambda 写上
map(lambda k,v: (k,v) , keys,values) ) 是需要几个参数,最后写(k,v)输出样式
# 练习: 基于keys和values的内容创建一个字典
keys = ['name', 'age', 'gender']
values = ['小明', 18, '男']
# {'name': '小明', 'age': 18, 'gender': '男'}
result2 = dict(map(lambda k,v: (k,v),keys,values ))
print(result2)
3.filter
- filter(函数,容器) -- 按照函数制定的规则提取容器中的元素
函数要求: 有且只有一个参数,代码容器中的每个元素
需要有一个返回值,返回值就需要提取的数据满足条件
案例:提取nums中所有的偶数
nums = [19, 872, 76, 54, 32, 110]
result = filter(lambda item: item % 2 == 0, nums)
print(list(result))
4. reduce
- reduce(函数,容器,初始值) --- 将容器中元素按照函数制定的规则合并成一个数据
- 加法合并 初始值为0, 乘法为1, 字符串拼接为空串
- 函数要求:有且只有两个参数,第一个参数对应初始值,第二个参数对应容器的每个元素
- 注意:reduce 使用前需要先倒入: from functools import reduce
练习:
nums = [19, 872, 76, 54, 32, 110]
#求和
result = reduce(lambda i,item: i + item ,nums,0)
print(result)
# 个位求和
result1 = reduce(lambda i,item: i + item % 10, nums, 0)
print(result1)
#字符串拼接
result5 = reduce(lambda i,item: i+str(item),nums,'')
print(result5)
#19872765432110
# 乘法
#1是初始值,因为是乘法,初始值为1, lambda后面两个参数,第一个是初始值,
#第二个是对用所有元素
result3 = reduce(lambda i,item: i * item,nums,1)
print(result3)
# 计算求和
list1 =['23','344','90','67']
result4 = reduce(lambda i,item:i+int(item) ,list1,0 )
print(result4)