内置函数
map
映射:(函数地址,可迭代对象)—>map对象
map对象会将可迭代对象中的每一个值进行修改,然后映射到一个map对象中,可以再将map对象转换成列表/元组.
演示
name_list = ['egon','sean','tank']
map_obj = map(lambda name:name + 'dsb' if name == 'tank' else name + 'xsb',name_list)
print(list(map_obj))
print(tuple(map_obj))
不能同时打印两个,因为map对象只能被引用一次
reduce
合并:
(函数地址,可迭代对象,初始值(默认为0))
reduce(lambda x,y:x+y,range(1,101),0)
每次从可迭代对象中获取两个值进行合并
初始值:执行reduce函数时,都是从初始值开始合并
from functools import reduce
num = reduce(lambda x,y:x+y,range(1,101),0)
print(num)
filter
过滤: (函数地址,可迭代对象)–>filter对象
name_list = ['sean_dsb','nick_dsb','wm_dsb','lipeng']
filter_obj = filter(lambda name:name.endswith('_dsb'),name_list)
print(list(filter_obj))
print(tuple(filter_obj))
函数递归
定理
直接上代码(在python解释器里被限制了递归次数为1000,但在现实生活中,这是永无止尽的,你懂的)
def gilr():
print('girl:我想要')
boy()
def boy():
print('boy:我给你')
gilr()
gilr()
正经理论
函数递归指的是重复’直接或间接调用’函数本身,这是一种嵌套调用的表现形式
直接调用:指的是在函数内置,直接调用函数本身(自交行为)
间接调用:两个函数之间相互调用间接造成递归(69式行为)
获取它的(递归)深度:‘sys.getrexursionlimit()’
设置递归深度:‘sys.setrecursionlimit(深度值)’
ps:单纯的递归没有任何意义
有意义的递归
递推:一层一层的递归调用下去,进入下一层递归的问题规模都将减小.
回溯:回溯需要一个明确的结束条件,在满足该条件开始一层一层的回溯.
模块
包
包指的是内部包含有–init–.py文件的文件夹
包的作用:存放模块,包能更好的管理模块;
模块
模块是一系列功能的结合体,里面包着一堆函数和代码.
模块本身是一个.py文件
模块来源
内置模块:sys,os,time,datetime,loging,json等都是内置模块
第三方模块:requestes
自定义模块:自定义一个py文件存放功能,通过import导入使用.
优点
将一个个功能分别管理,存放在不同的py文件中,比如函数;为了更方便的管理功能代码
使用
在导入时,需要注意谁是执行文件,谁是被导入文件
模块在导入时就已经固定好了,当前文件查找的顺序是先从内存中查找
导入:
from 包/模块 import 模块/(函数名、变量名、类名)
在执行文件中直接import导入
模块导入发生的三件事:
- 会先执行当前执行文件,并产生执行文件中的名称空间
- 当执行到被导入模块的代码时,被导入的模块会产生一个模块的名称空间
- 会将被导入模块的名称空间加载到内存中
给模块取别名:
import 模块名 as 模块别名
循环导入
model1.py
from model2 import name
name = 'json'
model2.py
from model1 import name
name = 'tank'
解决循环导入问题:
- 需要查找的名字放在导入模块上方
- 在函数内部导入,将模块变成函数名称空间中的名字
补充
软件开发目录规范
注意:每次写项目时,都要新建一个文件夹与项目工程,必须让文件夹作为项目的根目录.
conf:用于存放配置文件
core:核心业务代码
interface:接口,接口内写获取数据前的逻辑代码,通过后才能获取数据
db:用于存放文件数据
lib:存放公共文件
log:用于存放日志文件,日志用于记录用户的操作
bin:里面存放启动文件
readme.txt:项目说明书,用户告诉使用者项目的操作