内置函数 闭包引入 使用

day13

一丶内置函数Ⅱ

####内置函数####  特别重要,反复练习

####zip() 拉链函数 用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组
li=[1,2,3,4]
tu=('a','b','c')
s='python'
z=zip(li,tu,s)     #把生成的迭代器赋给变量z
print(z,dir(z))   #返回一个迭代器 '__next__', '__iter__'

for i in z:       # 元素个数与最短的列表一致
   print(i)
   
   
   
   
   
##### sorted() 排序 ,形成新列表
li=[6,3,1,5,9,2,4]
print(sorted(li))

#sorted(iterable , key= , reverse=)
li= [('张一东', 80), ('张耳洞', 75), ('怼怼哥', 7), ('李业', 59)]
print(sorted(li,key=lambda x :x[1]),)                  #按照分数排序 升序
print(sorted(li,key=lambda x :x[1],reverse=True))      # 降序
print(sorted(li,key=lambda x :x,reverse=True))         # 默认按照,循环元素的第一个位置排序







####filter(函数,可迭代对象
) 列表推导式的筛选模式   # 返回成一个迭代器
lst = [{'id':1,'name':'tom','age':30},
      {'id':1,'name':'jam','age':12},
      {'id':1,'name':'aim','age':16},
      ]
ls=filter(lambda x :x['age']<30,lst)    # 把age大于30的过滤
print(ls)           # 返回成一个迭代器<filter object at 0x000001CDF1500E48>
print(list(ls),type(ls) ,dir(ls))        # <class 'filter'> '__iter__', '__next__',







####map(函数,可迭代对象) 返回一个迭代器 ,生成器表达式:循环模式
# 使用 lambda 匿名函数,计算平方数
ls=[1, 2, 3, 4, 5]
map(lambda x: x ** 2, ls)  

# 提供了两个列表,对相同位置的列表数据进行相加
li1=[1, 3, 5, 7, 9]
li2=[2, 4, 6, 8, 10]
map(lambda x, y: x + y,li1,li2 )






####reduce 函数会对参数序列中元素进行累积。
from functools import  reduce
li=[1,2,3,4,5]
num=reduce(lambda x, y: x+y, )  # 使用 lambda 匿名函数
print(num)

 

二丶闭包

什么是闭包:

1.闭包是嵌套在函数中的函数

2.闭包必须是内层函数对外层函数的变量(非全局变量)进行引用

闭包的作用:

保存局部信息不被销毁,保证数据的安全性。

闭包的应用

1.装饰器

2.可以保存一些非全局变量但是不易被销毁、改变的数据。

###闭包为了保证数据的安全
def make_average():
   li=[]  #自由变量         # |   这个区间就是闭包 👇
   def average(price):      # |
       li.append(price)  # |
       total=sum(li)  # |
       print(locals())  
       return  total/len(li)   # |
print(locals())
   
   return average           # | 这个区间就是闭包 👆

avg=make_average()

avg(10)
avg(12)
avg(11)

#查看 avg 也就是average函数中的自由变量是有哪些.
print(avg.__code__.co_freevars) # 查看自由变量 ,元组类型 ('li',) li是一个字符串,


###总结: li 作为自由变量, 当外层函数(make_average)执行完毕之后,li变量会被保留.
#个人理解: li 为什么会被保留,程序编译完成,li和内部函数(make_average)已经建立一个引用关系,当程序执行外层函数(make_average)时,li变量和内部函数(average)的引用关系就激活.li还在被引用,即使外层函数(make_average)执行完毕了. li还会存在. li存在哪里呢? li还在make_average局部作用域中. ...概念比较抽象

 

posted on 2020-01-11 15:22  向往1  阅读(212)  评论(0)    收藏  举报

导航

……