Python进阶(五)----内置函数Ⅱ 和 闭包

Python进阶(五)----内置函数Ⅱ 和 闭包

一丶内置函数Ⅱ

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

###print()  打印输入
#sep   设定分隔符
# end 默认是换行可以打印到一行
print(1,2,3,4,sep='|',end=' ')
print(1,2,3,4,sep='|')
# print() 还可以写字符串到文件, file= 文件句柄
f=open('log','a',encoding='utf-8')
print('这是要写入的文件',file=f)
print([1,2,3,4],file=f)       #可以写任意类型的哦!!!  写入就成字符串了
print((1,2,34),file=f)       #可以写任意类型的哦!!!   写入就成字符串了
print({'a':1},file=f)       #可以写任意类型的哦!!!   写入就成字符串了
print(1,file=f)            #可以写任意类型的哦!!!    写入就成字符串了




###list()
#创建列表的集中方式
#1. 直接创建
li=[]
#2. list() 方法
li1=list()
#3. 列表推导表达式
a=[i for i in range(10)]
print(a)  #[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]




###dict()
#字典的创建方式 4 中
#1.直接创建
dic={}
#2. dict()
dic2=dict()
#3. 字典推导式
b={i:1 for i in range(10)}
#4. fromkeys
dic3=dict.fromkeys([1,2,3,4],1)




###获取绝对值 abs()
print(abs(-100))




###sum(iterable,) 求和  必须是数字
print(sum([1,2,3,4]))
print(sum([1,2,3,4],100))
print(sum('1234'))     # 字符串不能求和
print(sum({1:1,2:2,3:3}))  # 字典的键是数字  so 可以相加求和
print(sum((1,2,3,4,5,6)))





####min(*args ,key=)  取最小的值    和 max()用法相同
#1. 普通使用
print(min([1,2,3,4]))                 # 1
print(min((23,10,1,2,3,4)))           # 1
print(min('413'),type(min('413')))    #<class 'str'> 字符串 会被迭代  还是字符串


#2 特殊功能 key=func    ===> key=匿名函数
    #默认情况
        def func(x):   # 此处x得到是迭代对象的每个元素, so 分别是: wuad ,  aler   ,  field
            return x[1]  # 返回是以字符串索引为1的字母,比较这个位置的字母的大小.返回最小的
        print(min(['wuad','aler','field'],key=func))  # field
    
    #特殊使用  key=lambda
		print(min(['dalao','aordi','xiaocang'],key=lambda x:x[0])) #aordi
    
   
	### 👇 min(*args ,key=lambda) 测试
        li = [('艾利克斯', 33, '170cm'), ('杨白', 18, '185cm'), ('武大', 35, '159cm'),]
        #需求: 找年龄最小的元组
            # 分析: 1 找到每个元素 元组,2 把年龄作为返回值 3,打印
        print(min(li,key=lambda x:x[1]))
        #需求: 找年龄最小的元组的身高 
        	#分析: 1.min(li,key=lambda x:x[1]) 返回一个最小的元组, 2. [2]得到元组后面是取索引位2的值
        print(min(li,key=lambda x:x[1])[2])

####总结:    
	#1. 返回值是什么就按照什么比较最小的。
	#2.	min()会自动的将可迭代对象的每一个元素作为实参传给形参,

# so 继续来测试

##测试1
        dic = {'a':3,'b':2,'c':1}
        #需求: 将dic值最小的键返回。
            #分析: 最小的键是  a
        print(min(dic,key=lambda x:dic[x]))
        #需求: 将dic值最小的值返回。
            #分析: 最小的值的键是 c   ,so  拿键取值
        print(dic[min(dic,key=lambda x:dic[x])])
##测试2
        dic = {'A':['李业', 67],'b': ['怼哥', 95],'c': ['冯垚', 85]}
        #*需求: 将成绩最低的从属于的那个列表返回。
            #分析: 成绩最低 :  .需要的是成绩元素为排序的标准,
            # 1  通过键拿到对应的值,值为列表,列表中成绩索引为1 ,根据成绩找到最小so,返回一个键
        print(dic[min(dic,key=lambda x:dic[x][1])])
        
        #*需求: 将成绩最低的分数返回。
            #分析:得到成绩最低的分数  .需要的是成绩元素为排序的标准, 并拿到这个成绩
            # 1.通过键拿到对应的值,值为列表,列表中成绩索引为1根据成绩找到最小 so,返回一个列表,根据列表索引取成绩值
        print(dic[min(dic,key=lambda x:dic[x][1])][1])
       
  ###👆👆👆  如果还是不理解,请指出不理解的点. i can help you to solve



    
    
    
    
    
###reversed() 将一个可迭代的对象进行翻转 ,并返回成一个迭代器(生成器)
s1='不打广告'
print(reversed(s1),type(reversed(s1))) #<reversed object at 0x00000185BD268048> <class 'reversed'>
# 迭代循环取值
s2=reversed(s1)         #可以直接迭代
print(s2.__next__())    #这样可以取值
print(next(s2))         #这样可以取值
for i in s2:            #这样也可以取值
    print(i)



    
    
    
    
###bytes() 将(字符串,或者是数字,但数字就不需要加编码)数据转换成 字节类型
s1='不打广告'
s2='budaguanggao'
s3=1
print(bytes(s1,encoding='utf-8'))
print(bytes(s2,encoding='utf-8'))
print(bytes(1))

#编码
s1 = '不打广告'
# 方法一:
print(s1.encode('utf-8'))
# 方法二:
print(bytes(s1,encoding='utf-8'))

# 解码:
b1 =b'\xe4\xb8\x8d\xe6\x89\x93\xe5\xb9\xbf\xe5\x91\x8a'
# 方法一:
print(b1.decode('utf-8'))
# 方法二:
print(str(b1, encoding='utf-8'))






####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,li )  # 使用 lambda 匿名函数
print(num)


二丶闭包

什么是闭包:

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

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

​ 3.闭包函数必须返回内部嵌套的函数地址.

闭包的作用:

​ 保存局部信息不被销毁,保证数据的安全性。
​ 在编写代码时,非常节省.
​ 在面相对象的思想中,闭包可以理解为封装,简化代码量

闭包的应用

​ 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 @ 2019-06-21 14:47  染指未来  阅读(159)  评论(0编辑  收藏  举报