内置函数的补充,递归,以及模块
1、内置函数的补充
'''
map: 映射
map(函数地址, 可迭代对象) ---> map对象
map会将可迭代对象中的每个值进行修改,而后映射一个map对象中,
能够再将map对象转换成列表/元组。(以第一次要转的类型为主)
注意: 只能转一次。
reduce: 合并
reduce(函数地址, 可迭代对象, 初始值默认为0)
reduce(函数地址, 可迭代对象, 初始值)
filter: 过滤
filter(函数地址, 可迭代对象) --> filter 对象
'''
一、map
用法:map(函数地址,可迭代对象)--->map对象(本质是一个生成器即迭代器)
经过print(list(map对象))显示或for循环显示内容,但注意的是这个map对象只可以使用一次,即谁 先用就显示出来,第二次就没这个对象了,只可以获得一个空的值好比()或[]
a、经过list(map对象显示)
name_list = ['sean', 'egon', 'jason', 'tank', 'yafeng']
map_obj = map(lambda name: name + '666' if name == 'yafeng' else name + '_大宝剑', name_list)#获得一个map对象
print(map_obj)
>>> <map object at 0x000002855AC051C8>
print(list(map_obj))#map_obj ---> 生成器(迭代器) ----> 返回的是一个map对象
#经过list(map_obj)显示,,注意不是列表不能直接输出,能够经过for循环或者list()来显示。
>>>['sean_大宝剑', 'egon_大宝剑', 'jason_大宝剑', 'tank_大宝剑', 'yafeng666']
b经过for循环显示
name_list = ['sean', 'egon', 'jason', 'tank', 'yafeng']
map_obj = map(lambda name: name + '666' if name == 'yafeng' else name + '_大宝剑', name_list)#获得一个map对象
print(map_obj)
>>><map object at 0x000002855AC051C8>
#也能够经过for循环来取出内容
ls = []
for i in map_obj:
ls.append(i)
print(ls)
>>>['sean_大宝剑', 'egon_大宝剑', 'jason_大宝剑', 'tank_大宝剑', 'yafeng666']
#值得注意的是该map_obj只能使用一次,用完就没了,谁先用谁先得,因此若是同时使用后面打印的结果是一个空列表
二、reduce
用法:reduce(函数地址,可迭代对象,起始值)#起始值默认为0 --->reduce对象
#需求:求1--100的和
#普通方法
sum = 0
for i in range(1, 101):
sum += i
print(sum)
>>>5050
# reduce方法(须要先导入这个模块才可使用)
from functools import reduce
res = reduce(lambda x, y: x + y, range(1, 101), 0)
print(res)
>>>5050
#也能够改变起始值
from functools import reduce
res = reduce(lambda x, y: x + y , range(1, 101), 1000)
print(res)
>>>6050
三、filter(过滤)
用法:filter(函数地址,可迭代对象) ---->filter对象
name_list = ['egon_大宝剑', 'jason_大宝剑',
'sean_大宝剑', 'tank_大宝剑', 'yafeng']
# 需求将后缀为_大宝剑的名字 “过滤出来”(我要拿到的,不是舍去)
filter_obj = filter(lambda name: name.endswith('_大宝剑'), name_list)
print(filter_obj)#获得一个filter对象<filter object at 0x0000026E2FD02208>
print(list(filter_obj))#经过列表显示
>>>['egon_大宝剑', 'jason_大宝剑', 'sean_大宝剑', 'tank_大宝剑']
2、函数递归
'''
函数递归:
函数递归指的是重复 “直接调用或间接调用” 函数自己,
这是一种函数嵌套调用的表现形式。
直接调用: 指的是在函数内置,直接调用函数自己。
间接调用: 两个函数之间相互调用间接形成递归。
了解:
面试可能会问:
python中有递归默认深度: 限制递归次数
998, 1000
PS: 可是在每一台操做系统中都会根据硬盘来设置默认递归深度。
获取递归深度: 了解
sys.getrecursionlimit()
设置递归深度: 了解
sys.setrecursionlimit(深度值)
注意: 单纯的递归调用时没有任何意义的。
'''
直接调用: 指的是在函数内置,直接调用函数自己。
def func():
print('from func')
func()
func()
间接调用: 两个函数之间相互调用间接形成递归。
def foo1():
print('from foo1')
foo2()
foo1()
def foo2():
print('from foo2')
foo1()
foo2()
python中有默认的递归深度1000(实际上只能到998)
但其实在每一台操做系统中都会根据硬盘来设置默认递归深度
#获取操做系统资源的模块
import sys
print(sys.getrecursionlimit())#获取递归深度
#设置递归深度
sys.setrecursionlimit(2000)#后面加你想要设置的递归深度
#获取你当前的递归深度
num = 1
def func():
global num
print('from func', num)
num += 1
func()
func()
'''
想要递归有意义,必须遵循两个条件:
- 回溯:(*****) 是向下的过程
指的是重复地执行, 每一次执行都要拿到一个更接近于结果的结果,
回溯必要有一个终止条件。
- 递推:(*****) 是向上的过程
当回溯找到一个终止条件后,开始一步一步往上递推。
age5 == age4 + 2
age4 == age3 + 2
age3 == age2 + 2
age2 == age1 + 2
age1 == 18 # 回溯终止的结果
# age(n) == age(n - 1) + 2(n>1)
'''

def age(n):
if n == 1:
return 18
#这里后面要写return才能实现递归
return age(n - 1) + 2
res = age(5)
print(res)
>>>26
3、模块
包指的是内部包含__init__.py的文件。
存放模块,包能够更好的管理模块
模块是一系列功能的结合体
模块的本质是一个个的.py文件
一、python内置的模块
如:sys\time\os\turtle
二、第三方的模块:
如:requests
三、自定义的模块:
如:本身定义的demo.py
一、使用python编写的py文件
二、编译后的共享库好比c或者是c++库
三、包下面带有__init__.py的一组py文件
四、python解释器下的py文件
模块能够帮咱们更好的管理功能代码,好比:函数
能够将项目拆分红一个个的功能,分别存放于不一样的py文件
鼠标右键建立py文件
-在py文件编写python代码
-在一个文件中,经过import关键字导入模块
-import 模块名
# 注意: import 模块时,模块不能加.py后缀
在使用模块阶段,需注意,谁是执行文件,谁是被导入文件(模块)
模块在首次导入时,就已经固定好了,当前文件查找的顺序是先从内存中查到的
一、会先执行当前执行文件,并产生执行文件中的名称空间
二、当执行到导入模块的代码时,被导入的模块会产生一个模块的名称空间
三、会将被导入模块的名称空间加载到内存中

as
import 模块 as 模块的别名
-import 模块
-from 包\模块 import 模块\(函数名,变量名,类名)
- conf:
- 用于存放配置文件的文件夹
- core:
- 核心业务代码 .py
- interface:
- 接口, 接口内写获取数据前的逻辑代码,经过后才能获取数据
- db:
- 用于存放文件数据
- lib:
- 存放公共功能文件
- log:
- 用于存放日志文件,日志用于记录用户的操做记录
- bin:
- 里面存放启动文件 / - 启动文件
- readme.txt:
- 项目说明书, 用户告诉使用者项目的操做