七天学会Python基础-第七天1/3-匿名函数-闭包-内置函数Ⅱ
-
匿名函数(也叫一句话函数,比较简单)
-
格式:
函数名=lambda 形参:返回值- 所有类型的形参都可以加,但是一般使用匿名函数只是加位置参数,其他的用不到
# 常规函数 def func(a,b): return a+b # 构建匿名函数 func1=lambda a,b:a+b print(func1(1,2)) ------------------------------------------ # 写一个匿名函数:接受两个int参数,将较大的数据返回 lambda a,b:a if a>b else b-
1)此函数不是没有名字,他是有名字的,他的名字就是你给其设置的变量,比如func.
2)lambda 是定义匿名函数的关键字,相当于函数的def.
3)lambda 后面直接加形参,形参加多少都可以,只要用逗号隔开就行。
func = lambda a,b,*args,sex= 'alex',c,**kwargs: kwargs print(func(3, 4,c=666,name='alex')) # {'name': 'alex'} # 所有类型的形参都可以加,但是一般使用匿名函数只是加位置参数,其他的用不到。4)返回值在冒号之后设置,返回值和正常的函数一样,可以是任意数据类型。
5)匿名函数不管多复杂.只能写一行.且逻辑结束后直接返回数据
-
-
内置函数Ⅰ
-
int(),用于将一个字符串或数字转换成整数,还可以将二进制转换成十进制
int('1010',base=2) # 将二进制转换成10进制 -
float(),用于将整数和字符串转换成浮点数。
-
complex(),用于创建一个值为real+imag*j的复数或者转化一个字符串或数位复数。如果第一个参数为字符串,则不需要指定第二个参数。
print(complex(1,2)) # (1+2j) -
bin() 返回一个数字的二进制。
bin(10) -
oct() 返回一个数字的八进制
oct(10) -
hex()返回一个数字的十六进制
hex(10) -
divmod(),返回除数与被除数的结果
print(divmod(10,3)) # (3,1) -
round(),保留浮点数小数的位数
print(round(3.1415926,2)) # 3.14 -
pow(),求x**y次幂。(第三个参数为x**y的结果对z取余)
print(pow(2,3,3)) # 2**3%2 2 -
bytes(),转换编码
s1="太白" # 转化成utf-8 b=s1.encode('utf-8') b=bytes(s1,encoding="utf-8") -
ord(),输入字符,找该字符的编码的位置,现在ASCII码中进行查找,找不到再去Unicode中进行查找
print(ord('a')) # 97 print(ord('中')) # 20013 在Unicode中的位置 -
chr(),输入位置数字,找出其对应的字符
print(chr(97)) # a print(chr(20013)) # 中 在Unicode中的位置 -
repr(),返回一个对象的string形式(原形毕露)
s1="太白" print(s1) # 太白 print(repr(s1)) # "太白" msg="我叫%r"%(s1) print(msg) # 我叫"太白" -
all(),可迭代对象中全部是True才是True
-
any(),可迭代对象中有一个True就是True
-
print(),打印
# print(*args,sep=" ",end='\n',file=None) print(1,2,3,4,sep='|') # 1|2|3|4 设置每个元素之间的分隔符 ------------------------------------------------------ print(1,end='') # 打印结尾去掉换行 print(2) -
int(),pass
-
str(),pass
-
bool(),pass
-
set(),pass
-
list(),将一个可迭代对象转化为列表
l2=list("abc") print(l2) # ['a','b','c'] -
tuple(),将一个可迭代对象转化为元组
-
dict(),通过相应的方式创建字典
# 字典的几种创建方式 # 1.直接创建 # 2.元组的结构 dic=dict([(1,"one"),(2,"two")]) # 3.键值对的形式 dic=dict(one=1,two=2) # 4.fromkeys # 5.update # 6.字典推导式 -
abs(),绝对值
print(abs(-6)) # 6 -
sum(),求和
l1=[i for i in range(10)] print(sum(l1)) # 45 print(sum(l1,100)) # 145 -
reversed()
l1=[i for i in range(10)] l1.reverse() # 列表的方法,对源列表进行翻转 print(l1) # [9,8,7,6,5,4,3,2,1,0] ------------------------------------------------------- obj=l1.reversed() # 列表的方法,不会对源列表进行改变,返回的是一个迭代器 print(list(obj)) # [9,8,7,6,5,4,3,2,1,0] -
zip(),拉链方法
l1=[1,2,3,4,5] tul=("太白","b哥","德刚") s1='abcd' obj=zip(l1,tul,s1) for i in obj: print(i) print(list(obj)) ---------------------- (1,'太白','a') (2,'b哥','b') (3,'德刚','c') [(1,'太白','a'),(2,'b哥','b'),(3,'德刚','c')] -
以下方法最最最重要,可以加key(自定义方法)
-
min(),返回最小值
- 过程:凡是可以能加key的:他会自动将可迭代对象中的每个元素按照顺序传入key对应的函数中,以返回值比较大小。
l1=[33,2,1,54,7,-1,-9] print(min(l1)) # -9 --------------------- # 以绝对值的方式求最小值 func = lambda a : abs(a) for i in l1: l2=append(func(i)) print(min(l2)) --------------------- def abss(a): return abs(a) print(min(l1,key=abss))- 练习:求出值最小的键
dic={'a':3,'b':2,'c'1:} print(min(dic)) # min默认会按照字典的键去比较大小 def func(a): return dic[a] print(min(dic,key=func)) ------------------------------------------ print(min(dic),key=lambda a:dic[a])-
过程详解
def func(args): ''' 第一次: args:'a' 返回值:dic['a'] 记录:3 第二次: args:'b' 返回值:dic['b'],将dic['b']与dic['a']进行比较 2比3小,记录2 第三次: args:'c' 返回值:dic['c'],将dic['c']与dic['b']进行比较 1比2小,记录1 ''' return dic[args] print(min(dic,key=func)) # 这里的方法没括号 -
练习
l2=[('太白',18),('alex',73),('wusir',35),('口天吴',41)] print(min(l2,key=lambda a:a[1])) # min函数返回的永远是列表中的第一层元素 ('太白',18) print(min(l2,key=lambda a:a[1])[0]) # 返回元素 太白
-
max(),同上,求最大值 pass
-
sorted(),对列表进行排序,但不对源列表进行操作,返回的是一个列表
l1=[22,33,1,2,3,8,7,6,5] l2=sorted(l1) print(l2) # [1,2,3,5,6,7,8,22,33] print(l1) # [22,33,1,2,3,8,7,6,5] --------------------------------------- l2=[('太白',18),('alex',73),('wusir',35),('口天吴',41)] print(sorted(l2,key=lambda a:a[1])) # 默认从低到高排 print(sorted(l2,key=lambda a:a[1],reverse=True)) # 进行翻转(从高到低排) -
filter(),列表推导式的筛选模式,返回一个迭代器
l1[2,3,4,,1,6,7,8] # 输出大于3的 print([i for i in l1 if i>3]) # 返回的是一个列表 ------------------------------ ret=filter(lambda x:x>3,l1) # 此时ret是一个迭代器 print(list(ret)) -
map(),列表推导式的循环模式
# 生成l1=[1,4,9,16,25] print([i**2 for i in range(6)]) ret=map(lambda x:x**2,range(1,6)) # 返回的是迭代器 print(list(ret)) -
reduce
from functools import reduce def func(x,y): """ 第一次:x,y:11,2 x+y= 记录13 第二次:x=13,y=3 x+y= 记录16 第三次:x=16,y=4 x+y= 记录20 ...... """ return x+y l=reduce(funt,[11,2,3,4]) print(l)
-
-
闭包:保证了数据的安全
-
闭包的定义:
- 闭包只能存在嵌套函数中
- 内层函数对外层函数非全局变量的引用(使用),就会形成闭包。
-
闭包的现象
- 被引用的非全局变量也称作为自由变量,这个自由变量会与内层函数产生一个绑定关系,自由变量不会再内存中消失
-
闭包的作用
- 保证数据的安全
-
如何判断一个嵌套函数是否是闭包
# 例一: def wrapper(): a = 1 def inner(): print(a) return inner ret = wrapper() # 是一个闭包 # 例二: a = 2 def wrapper(): def inner(): print(a) return inner ret = wrapper() # 不是闭包,a是全局变量 # 例三: def wrapper(a,b): def inner(): print(a) print(b) return inner a = 2 b = 3 ret = wrapper(a,b) # 也是闭包!-
使用代码判断是否为闭包
# 如果他是闭包那么他肯定有一个自由变量 # 例三: def wrapper(a,b): def inner(): print(a) print(b) return inner a = 2 b = 3 ret = wrapper(a,b) print(ret.__code__.co__freevars) # 返回的是元组 ('a','b')
-
-
字面意思:封闭的东西,私密的,私用的
-
例子:
''' 第一天价格为:100000元,平均收盘价:100000元 第二天价格为:110000元,平均收盘价:(100000 + 110000)/2 元 第三天价格为:120000元,平均收盘价:(100000 + 110000 + 120000)/3 元 ........ ''' # 代码实现 # 方案1 l1=[] # 全局变量 数据不安全 def make_averager(new_value): l1.append(new_value) total=sum(l1) averager=total/len(l1) return averager print(make_averager(100000)) print(make_averager(110000)) print(make_averager(120000)) ---------------------------------------------------------改进:
# 此时有个缺点,即操作l2或者其他列表时,可能会误操作到l1列表,这样计算结果就会受到影响 # 方案2:为了数据安全,l1不能放到全局变量,放到make_averager函数体中 def make_averager(new_value): l1=[] l1.append(new_value) total=sum(l1) averager=total/len(l1) return averager print(make_averager(100000)) print(make_averager(110000)) print(make_averager(120000)) # 此时,调用一次make_averager方法,l1列表便会重置,所以方案2不可采用 # 方案3 闭包方案 def make_averager(): l1=[] def averager(new_value): l1.append(new_value) total=sum(l1) return total/len(l1) return averager avg=make_averager() # 得到函数名averager print(avg(100000)) print(avg(120000)) print(avg(120000))

-
# 看代码求结果
def add(n,1):
return n+1
def test():
for i in range(4):
yield i
g=test()
for i in [1,10]:
g=(add(n,1) for i in g)
print(list(g))


浙公网安备 33010602011771号