内置函数补充,函数递归,模块

内置函数的补充,递归,以及模块

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)
'''

![](https://img2018.cnblogs.com/blog/1843751/201911/1843751-20191115154935595-70744750.jpg)




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:
        - 项目说明书, 用户告诉使用者项目的操做
相关文章
相关标签/搜索