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

mac2022-06-30  59

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, ) # 使用 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局部作用域中. ...概念比较抽象

转载于:https://www.cnblogs.com/dengl/p/11064479.html

最新回复(0)