匿名函数
1.什么是匿名函数(lambda)
无名字的函数
:冒号左边是参数, 右边是返回值
关键字:lambda :
PS: 原因,因为没有名字,函数的调用 函数名 + () 即lambda :
匿名函数需要一次性使用。 注意: 匿名函数单独使用毫无意义,它必须配合 “内置函数” 一起使用的才有意义。
func = lambda : 1 print(func()) # 匿名函数单独使用毫无意义,因为没有函数名,所以需要赋值给其他变量名
内置函数
1.什么是内置函数
python提前内置的函数
range() # 算是一个生成器print() # 打印返回值len() # 检查序列长度max() # 输出最大值min() # 输出最小值sorted # 默认reverse是False,对可迭代对象从小到大排序mapfiltersorted:
内置函数和匿名函数相结合dict1 = { 'tank': 100, 'egon': 500, 'sean': 200, 'jason': 50}# 先遍历dict1里面的值,因为是字典,索引会遍历key,将其赋值x,再通过索引key得到value给sorted排序,最好输出keynew_dict = sorted(dict1,key = lambda x:dict1[x],reverse=True) print(new_dict)输出结果['egon', 'sean', 'tank', 'jason']
2.内置函数举例
-
max: 获取可迭代对象中最大值
l1 = [1, 2, 3, 4, 5, ]l2 = { 'sean':500,'agon':700,'tank':200,'jason':400}l = max(l1)l3 = max(l2,key = lambda x:l2[x]) # 配合匿名函数print(l)print(l3)输出结果:5agon
-
min: 获取可迭代对象中最小值
l1 = [1, 2, 3, 4, 5, ]l2 = { 'sean':500,'agon':700,'tank':200,'jason':400}l = min(l1)l3 = min(l2,key = lambda x:l2[x]) # 配合匿名函数print(l)print(l3)输出结果:1tank
-
sorted: 对可迭代对象中的数据进行排序 默认是: 升序 reverse=True: 降序
l1 = [1, 3, 7, 2, 5, ]l2 = {'sean':500,'agon':700,'tank':200,'jason':400}l = sorted(l1)l3 = sorted(l2,key = lambda x:l2[x])l4 = sorted(l2,key = lambda x:l2[x],reverse=True) #将False改为True会成降序排列print(l)print(l3)[1, 2, 3, 5, 7]['tank', 'jason', 'sean', 'agon']['agon', 'sean', 'jason', 'tank']
-
map:映射
map(函数地址,可迭代对象)---->得到一个map对象(类似与生成器迭代器这种对象)
map会将可迭代对象中的每一个值进行修改,然后映射一个map对象中,可以再将map对象转换成列表或元组
注意:这种转换只有一次 (类似于可迭代对象中元素被取完就没有值了一样)
name_list = ['sean','agon','tank','jason']new_name_list = map(lambda name:name + '吃生蚝' if name == 'tank' else name + 'DBJ',name_list)print(new_name_list) # 返回的结果是map对象print(list(new_name_list))输出结果:<map object at 0x000002539D258D48> ['seanDBJ', 'agonDBJ', 'tank吃生蚝', 'jasonDBJ']
-
reduce:合并
reduce(函数地址,可迭代对象,初始值),一般初始值默认为None
from functools import reduce # 导入模块l1 = reduce(lambda x,y:x+y,range(1,11))print(l1)
-
filter: 过滤
filter(函数地址, 可迭代对象) -----> filter 对象
name_list = ['egon_dsb', 'jason_dsb', 'sean_dsb', '大饼_dsb', 'tank']filter_obj = filter(lambda name: name.endswith('_dsb'), name_list) # 将尾部为非'_dsb'的过滤掉print(filter_obj) # 结果是个filiter对象print(list(filter_obj))输出结果:<filter object at 0x00000274BC5F8D48> ['egon_dsb', 'jason_dsb', 'sean_dsb', '大饼_dsb']
函数递归
函数不仅可以嵌套定义,也可以嵌套调用
函数递归指的是重复 “直接调用或间接调用” 函数本身,这是一种函数嵌套调用的表现形式。
直接调用: 指的是在函数内置,直接调用函数本身。
# 直接调用def func(): print('你好') func()func()
间接调用: 两个函数之间相互调用间接造成递归。
# 间接调用def func1(): print('你好啊帅哥') func2()def func2(): print('你好啊美眉') func1()func1()
了解: 两种情况下的递归调用都是一个无限循环的过程,但在python对函数的递归调用的深度做了限制,因而并不会像大家所想的那样进入无限循环,会抛出异常,
# 递归深度: python中有递归默认深度: 限制递归次数一般为998, 1000PS: 但是在每一台操作系统中都会根据硬盘来设置默认递归深度。# 获取递归深度: 了解 sys.getrecursionlimit()# 设置递归深度: 了解 sys.setrecursionlimit(深度值) import sys # 获取操作系统资源的模块print(sys.getrecursionlimit())输出结果: 1000
# 注意: 单纯的递归调用时没有任何意义的。
想要递归有意义,必须遵循两个条件:
-
回溯: 指的是重复地执行, 每一次执行都要拿到一个更接近于结果的结果, 回溯必要有一个终止条件。
-
递推: 当回溯找到一个终止条件后,开始一步一步往上递推。
age5 == age4 + 2 age4 == age3 + 2 age3 == age2 + 2 age2 == age1 + 2 age1 == 18 # 回溯终止的结果0 # result = age(n - 1) + 2
def age(n): if n == 1: return 18 # 这里写return才能实现递推 return age(n - 1) + 2res = age(5)print(res) 输出结果: 26
模块
什么是包 包指的是内部包含__init__.py的文件夹。包的作用: 存放模块,包可以更好的管理模块。一 什么是模块? - 模块是一系列功能的结合体。 # 相当于与模块包着一堆函数与代码。 - 模块本质上是一个个的.py文件。 - 模块的三种来源: 1.python内置的模块: (python解释器的) 比如: sys\time\os\turtle 2.第三方的模块: (别人写的) 比如: requests 3.自定义的模块: (自己写的) 比如: 自己定义的demo.py文件 - 模块的四种表现形式: 1.使用python编写的py文件。(了解) 2.编译后的共享库DLL或者是C或者C++库。(了解) 3.包下面带有__init__.py的一组py文件。 - py_demo - __init__.py - demo.py - demo2.py 4.python解释器下的py文件。 - python解释器下的文件夹 - 一个个的py文件二 为什么要使用模块? 模块可以帮我们更好地管理功能代码,比如: 函数... 可以将项目拆分成一个个的功能,分别存放在不同的py文件(模块)中。三 如何创建,编写模块,并使用模块? - 鼠标右键创建py文件 - 在py文件编写python代码 - 在一个文件中,通过import关键字导入模块 import 模块名 # 注意: import 模块时,模块不能加.py后缀- 在使用模块阶段,必须要注意,谁是执行文件,谁是被导入文件(被导入的模块)- 模块在首次导入时,就已经固定好了,当前文件查找的顺序是先从内存中查找- 模块在导入时发生的事情: 1.会先执行当前执行文件,并产生执行文件中的名称空间。 2.当执行到导入模块的代码时,被导入的模块会产生一个模块的名称空间。 3.会将被导入模块的名称空间加载到内存中。- 给模块起别名 as import 模块 as 模块的别名- 模块的导入方式 - import 模块 - 在执行文件中直接import导入 - from 包/模块 import 模块/(函数名、变量名、类名) - 在执行文件中直接import导入- 循环导入问题: - model1.py from model2 import name name = 'jason' - model2.py from model1 import name name = 'tank' - 解决循环导入问题: 1.需要查找的名字放在导入模块的上方 2.在函数内部导入,将模块变成函数名称空间中的名字- 软件开发目录规范: 注意: 每一次写项目时,都要新建一个文件夹与项目工程,必须让项目文件夹作为项目根目录。- 项目的文件夹 - conf: - 用于存放配置文件的文件夹 - core: - 核心业务代码 .py - interface: - 接口, 接口内写获取数据前的逻辑代码,通过后才能获取数据 - db: - 用于存放文件数据 - lib: - 存放公共功能文件 - log: - 用于存放日志文件,日志用于记录用户的操作记录 - bin: - 里面存放启动文件 / - 启动文件 - readme.txt: - 项目说明书, 用户告诉使用者项目的操作