匿名函数,内置函数,函数递归,模块

时间:2019-11-15
本文章向大家介绍匿名函数,内置函数,函数递归,模块,主要包括匿名函数,内置函数,函数递归,模块使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

匿名函数

1.什么是匿名函数(lambda)

无名字的函数

:冒号左边是参数, 右边是返回值

关键字:lambda :

PS: 原因,因为没有名字,函数的调用 函数名 + () 即lambda :

匿名函数需要一次性使用。 注意: 匿名函数单独使用毫无意义,它必须配合 “内置函数” 一起使用的才有意义。

func = lambda : 1
print(func())   # 匿名函数单独使用毫无意义,因为没有函数名,所以需要赋值给其他变量名

内置函数

1.什么是内置函数

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

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)

输出结果:
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(函数地址,可迭代对象,初始值),一般初始值默认为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, 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.会将被导入模块的名称空间加载到内存中。

- 给模块起别名 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:
       - 项目说明书, 用户告诉使用者项目的操作

 

原文地址:https://www.cnblogs.com/jiangxianseng/p/11869287.html