无名字的函数
:冒号左边是参数, 右边是返回值
关键字:lambda :
PS: 原因,因为没有名字,函数的调用 函数名 + () 即lambda :
匿名函数需要一次性使用。 注意: 匿名函数单独使用毫无意义,它必须配合 “内置函数” 一起使用的才有意义。
func = lambda : 1 print(func()) # 匿名函数单独使用毫无意义,因为没有函数名,所以需要赋值给其他变量名
python提前内置的函数
range() # 算是一个生成器
print() # 打印返回值
len() # 检查序列长度
max() # 输出最大值
min() # 输出最小值
sorted # 默认reverse是False,对可迭代对象从小到大排序
map
filtersorted:
内置函数和匿名函数相结合
dict1 = {
‘tank‘: 100,
‘egon‘: 500,
‘sean‘: 200,
‘jason‘: 50
}
# 先遍历dict1里面的值,因为是字典,索引会遍历key,将其赋值x,再通过索引key得到value给sorted排序,最好输出key
new_dict = sorted(dict1,key = lambda x:dict1[x],reverse=True)
print(new_dict)
?
?
输出结果
[‘egon‘, ‘sean‘, ‘tank‘, ‘jason‘]
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)
?
输出结果:
5
agon
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)
?
输出结果:
1
tank
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(函数地址,可迭代对象,初始值),若不设置初始值,会将可迭代对象的第一个值作为初始值
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, 1000
PS: 但是在每一台操作系统中都会根据硬盘来设置默认递归深度。
# 获取递归深度: 了解
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) + 2
?
res = 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.会将被导入模块的名称空间加载到内存中。
?