文章目录
匿名函数,高阶函数,模块,包
1.匿名函数
与普通函数没区别,就是命名方式不一样,匿名函数没有名字
注意: 只有一句代码能实现功能的函数时使用匿名函数
语法:
函数名(本质是变量) = lambda 形参列表(形参至少一个):返回值
sum = lambda num1,num2=2: num1 + num2
print(sum(1,2))
2.实参高阶函数
参数是函数的函数就是实参高阶函数
给实参高阶函数传参的时候可以使用普通函数的函数名也可以使用匿名函数
3.python中常见的实参高阶函数
max ;min; sorted; 列表.sort ; map; reduce; filter
max(容器,*,key: 函数)
1)max(容器,函数)
按照函数制定的规则比较容器中元素的大小来获取最大值
函数的要求:
1)有且只有一个参数,这个参数代表前面容器中的每个元素
2)只有一个返回值,返回值就是比较对象
# 练习1:将names中的名字按照长度最小到到排序
names = ['李小名', '张三', '古丽热巴', '小花', '王大富']
print(sorted(names, key=lambda item: len(item)))
# 练习2:求students中年龄最大的学生
students = [
{'name': '张三', 'score': 38, 'age': 18},
{'name': '小明', 'score': 99, 'age': 25},
{'name': '李四', 'score': 89, 'age': 19},
{'name': '老王', 'score': 70, 'age': 30},
{'name': '小花', 'score': 65, 'age': 26}
]
print(max(students, key=lambda stu: stu['age']))
2)map(函数,容器<1或多个>)
根据函数条件将容器中的元素变成一个新的容器,新容器是个特殊的容器,需要转换成我们认识的容器
**函数要求:**a. 有且只有一个参数,代表容器中的每个元素
b. 需要一个返回值,返回值就是新容器中的元素
map(函数,容器1,容器2)
**函数要求:**a. 有且只有两个参数,分别代表后面两个容器中的每个元素
b. 需要一个返回值,返回值就是新容器中的元素
map(函数,容器1,容器2,…容器n)
**函数要求:**a. 有且只有n个参数,分别代表后面n个容器中的每个元素
b. 需要一个返回值,返回值就是新容器中的元素
# 练习1:提取nums中所有元素的个位数
nums = [19, 108, 44, 37, 82, 91, 86]
result = list(map(lambda item: item % 10, nums))
print(result)
# 练习2:将scores中的分为转换成对应的通过关系
scores1 = [90, 56, 89, 99, 45, 34, 87]
# ['通过', '不通过', '通过', ....]
result = list(map(lambda item: '通过' if item >= 60 else '不通过', scores1))
print(result)
# 练习3:将nums1中是元素的个位数作为新容器中元素的十位数,nums2中元素的十位数作为新容器中元素的个位数
nums1 = [89, 34, 89, 20, 192, 93]
nums2 = [102, 89, 37, 82, 26, 1293]
# [90, 48, 93, 8, 22, 39]
result = list(map(lambda item1, item2: item1 % 10 * 10+item2 // 10 % 10, nums1, nums2))
print(result)
# 练习4:已经两个列表A和B,用map函数创建一个字典,A中的元素是key,B中的元素是value
# 拼成元组/列表转字典
A = ['name', 'age', 'sex']
B = ['张三', 18, '女']
# 新字典: {'name': '张三', 'age': 18, 'sex': '女'}
print(dict(map(lambda a, b: (a, b), A, B)))
3)filter(函数,容器)
提取容器中所有满足函数条件的元素
**函数要求:**a. 有且只有一个参数,代表容器中的每个元素
b. 需要一个返回值,返回值就是对应的提取条件
# 练习1:提取字符串中所有的中文字符
str1 = 'sjs健康os02-技术上ss=2e 块'
result = filter(lambda item: '\u4e00' <= item <= '\u9fa5', str1)
print(''.join(result))
4)reduce(函数,容器,初始值)
将容器中的元素按照函数条件合并成一个数据
**函数要求:**a. 有且只有两个参数,第一个指向初始值,第二个指向容器中的每个元素
b. 需要一个返回值,就是合并规则
reduce需要从functools模块导入
from functools import reduce
nums = [2, 3, 4, 5, 1]
# 根据不同合并方式设定不同初始值
# 2+3+4+5+1 初始值为0
# 2*3*4*5*1 初始值为1
# 23451 初始值为''
# 练习1: 求nums中所有元素的个位数的和
from functools import reduce
scores = [90, 56, 89, 99, 45, 34, 87]
result = reduce(lambda i, item: i + item % 10, scores, 0)
print(result)
# 练习2:求students中所有学生的总成绩
students = [
{'name': '张三', 'score': 38, 'age': 18},
{'name': '小明', 'score': 99, 'age': 25},
{'name': '李四', 'score': 89, 'age': 19},
{'name': '老王', 'score': 50, 'age': 30},
{'name': '小花', 'score': 65, 'age': 26}
]
result = reduce(lambda i, stu: i + stu['score'], students, 0)
print(result)
3.模块导入
导入方式:
a)import 模块名 模块名.xx
b) from 模块名 import 内容1, 内容2, … 可以直接使用导入的模块中的对应内容
**c) from 模块名 import *** 可以直接使用模块中所有内容
d)from 模块名 as xx 模块重命名,模块名太长等等
e)from 模块名 import 内容 as 新内容名 内容<函数,变量>重命名,内容与代码变量同名等
导入原理:
当执行到导入模块的代码时,系统会自动进入这个模块,执行这个模块中的所有代码。
将函数外其他要执行的代码放到下面判断下
if __name__ == '__mian__': # __读->'荡嘚' 下面->荡嘚name
当别人调用该模块时该if语句中代码不会被执行
包
1.什么是包
# 包就是包含__init__.py文件的文件夹
2.导入包/文件夹中的模块
a)import 包名 导入指定包后,使用’包名.xxx’去使用包中的init.py文件中任何内容
b)import 包名.模块名 导入指定包中的指定模块,使用’包名.模块名.xxx’使用模块中所有内容,可以直接重命名使用方便点
c)from 包名 import 模块名1,模块名2,内容1,内容2,… ’模块名.内容‘ ’内容’ - 直接调用
d)from 包名.模块名 import 内容1,内容2,… 导入指定包中的指定模块,可直接使用内容