# ### 闭包的特征 """
内函数使用了外函数的局部变量
那么该变量与闭包函数发生绑定,
延长该变量的生命周期
"""defouter(val):definner(num):return val + num
return inner
func = outer(10)# func = inner
res = func(15)# res = func(15) = inner(15)print(res)"""
10实参 -> val 形参
因为内函数inner是闭包函数,使用了外函数val
那么该变量val生命周期被延长,没有随着函数调用的结束而释放.
func(15) 把15这个参数赋值给num这个形参
res = inner(15) => return val + num =>10 + 15 => 25
"""# ### 闭包的意义# 模拟鼠标点击次数
num =0defclick_num():global num
num +=1print(num)
click_num()
click_num()
click_num()
num =100
click_num()
click_num()# 使用闭包函数改写点击次数"""
闭包的意义:闭包可以优先使用外函数中的变量,并对闭包中的值起到了封装保护的作用.外部无法访问.
"""defclick_num():
num =0deffunc():nonlocal num
num +=1print(num)return func
func = click_num()
func()
func()
num =1000
# ### 匿名函数 : 用一句话来表达只有返回值的函数"""语法:lambda 参数 : 返回值 """"""追求代码:简洁,高效"""# 1.无参的lambda 表达式deffunc():return"123"# 改写
func =lambda:"123"
res = func()print(res)# 2.有参的lambda 表达式deffunc(n):returntype(n)# 改写
func =lambda n :type(n)print( func([1,2,3]))# 3.带有判断条件的lambda 表达式deffunc(n):if n %2==0:return"偶数"else:return"奇数"
func =lambda n :"偶数"if n %2==0else"奇数"
res = func(17)print(res)# ### 三元(目)运算符"""
语法:
真值 if 条件表达式 else 假值 如果条件表达式为真,返回真值,否则返回假值
"""
n =16
res ="偶数"if n %2==0else"奇数"print(res)# 小练习 , 传递两个数, 返回较大的那一个deffunc(x,y):if x>y:return x
else:return y
func =lambda x,y : x if x>y else y
res = func(200,100)print(res)
"""
1.定义函数:打印用户传入的容器类型数据长度
2.定义函数:参数为容器类型数据,打印所有奇数位索引对应的元素
3.定义函数:,接收一个参数(可迭代性数据),用_让元素相连成字符串,打印出来
4.定义函数:接收任意个参数,打印其中的最小值
5.定义函数:传入一个参数n,返回n的阶乘(5! = 5*4*3*2*1)
6.写函数,传入函数中多个实参(均为可迭代对象如字符串,列表,元祖,集合等),
将容器中的每个元素依次添加到新的列表中返回
#例:传入函数两个参数[1,2,3] (22,33)最终args为(1,2,3,22,33)
7.写函数,用户传入要修改的文件名,与要修改的内容,执行函数,修改操作
8.写函数,计算传入字符串中【数字】、【字母】、【空格] 以及 【其他】的个数
9.写函数,检查字典的每一个value的长度,如果大于2,那么仅保留前两个长度的内容,返回处理后的结果.
#例:参数为:dic = {"k1": "v1v1", "k2": [11,22,33,44]}
10.传入多个一级容器类型数据,计算元素总个数
"""# 1.定义函数:打印用户传入的容器类型数据长度deffunc(container):len(container)
func =lambda contaner :len(contaner)
res = func([1,2,3,45])print(res)# 2.定义函数:参数为容器类型数据,打印所有奇数位索引对应的元素deffunc(container):
i =0while i<len(container):if i %2==1:print(container[i])
i+=1
func([1,2,3,43,5,5])# 方法二deffunc(container):return container[1::2]# 1,3,5,7, ...
res = func([1,2,3,43,5,5])print(res)# 3.定义函数:,接收一个参数(可迭代性数据),用_让元素相连成字符串,打印出来deffunc(container):return"_".join(container)
func(["1","2","3","45"])print(res)deffunc(container):
strvar =""for i in container:
strvar +=str(i)+"_"return strvar.rstrip("_")
res = func([1,2,5,7])print(res)# 4.定义函数:接收任意个参数,打印其中的最小值# 正常deffunc(*args):# print(args)
lst =list(args)
lst.sort()return lst[0]
res = func(1,5,9,-100)print(res)# 升级deffunc(*args):
lst_new =[]print(args)for i in args:ifisinstance(i,(int,float)):
lst_new.append(i)elifisinstance(i,(list,tuple,dict,set)):ifisinstance(i,dict):
i = i.values()# print(i.values())for j in i:ifisinstance(j,(int,float)):
lst_new.append(j)
lst_new.sort()return lst_new[0]
res = func(1,5,9.1,"你好",[1,19,100],(99,-7),{"a":1000,"b":3,"c":"abc"},{98,-10})print(res)# 5.定义函数:传入一个参数n,返回n的阶乘(5! = 5*4*3*2*1)deffunc(n):
total =1for i inrange(n,0,-1):
total *= i
return total
res = func(6)print(res)# 6.写函数,传入函数中多个实参(均为可迭代对象如字符串,列表,元祖,集合等),# 将容器中的每个元素依次添加到新的列表中返回#例:传入函数两个参数[1,2,3] (22,33)最终args为(1,2,3,22,33)# 方法一deffunc(*args):
lst =[]print(args)for i in args:for j in i:
lst.append(j)return lst
res = func([1,2,3],(22,33))print(res)# 方法二deffunc(*args):# print(args)returnlist(args)
func(*[1,2,3],*(22,33))# 7.写函数,用户传入要修改的文件名,与要修改的内容,执行函数,修改操作deffunc(file,str1,str2):# 打开文件读取所有内容withopen(file,mode="r+",encoding="utf-8")as fp:
strvar = fp.read()print(strvar)# 替换字符串
strvar = strvar.replace(str1,str2)# 重写写入withopen(file,mode="w+",encoding="utf-8")as fp:
fp.write(strvar)
func("ceshi.txt","好的","坏的")deffunc(file,str1,str2):withopen(file,mode="r+",encoding="utf-8")as fp:
strvar = fp.read()
strvar = strvar.replace(str1,str2)# 把光标移动到开头
fp.seek(0)# 没有参数等于没有截取,相当于清空
fp.truncate()
fp.write(strvar)
func("ceshi.txt","坏的","好的")# 8.写函数,计算传入字符串中【数字】、【字母】、【空格] 以及 【其他】的个数deffunc(strvar):# dic = {"num":0,"word":0,"space":0,"other":0}
dic ={}.fromkeys(["num","word","space","other"],0)print(dic)for i in strvar:if i in"0123456789":
dic["num"]+=1elif i.lower()in"abcdefghijklmnopqrstuvwxyz":
dic["word"]+=1elif i ==" ":
dic["space"]+=1else:
dic["other"]+=1return dic
strvar ="234JKJK^&* "
res = func(strvar)print(res)deffunc(strvar):# dic = {"num":0,"word":0,"space":0,"other":0}
dic ={}.fromkeys(["num","word","space","other"],0)for i in strvar:if i.isdecimal():
dic["num"]+=1# elif i.isalpha(): isalpha 可以在字节流模式下,分辨出中文(False)和字母(True)elif i.encode().isalpha():
dic["word"]+=1elif i.isspace():
dic["space"]+=1else:
dic["other"]+=1return dic
strvar ="234JKJK^&* 你好"
res = func(strvar)print(res)# 9.写函数,检查字典的每一个value的长度,如果大于2,那么仅保留前两个长度的内容,返回处理后的结果.#例:参数为:dic = {"k1": "v1v1", "k2": [11,22,33,44]}deffunc(dic):for k,v in dic.items():# print(k,v)ifisinstance(v,(str,list,tuple))andlen(v)>2:
dic[k]= v[:2]return dic
dic ={"k1":"v1v1","k2":[11,22,33,44],"k3":123}
res = func(dic)print(res)# 10.传入多个一级容器类型数据,计算元素总个数deffunc(*args):
total =0for i in args:
total +=len(i)return total
res = func([1,2,3],(3,4),{6,7,8},{"a":1,"b":2})print(res)