Day 13 匿名函数 :内置函数: 闭包
01 今日大纲内容
- 如何学习:
- 一定要把预习加上!
- 分配比例:
- 文字总结格式(1/3),晚上20点-21点之前 完成总结以及代码练习
- 20点-21点之后写作业
02 昨日内容回顾作业讲解
- 生成器:生成器就是迭代器,生成器是自己用python代表构建的
-
- 生成器函数
- 生成器表达式
- python内部提供的
- 如何判断函数与生成器函数
- yield
- yield (一个yield对一个next,返回值,不终止)与 return(终止函数,返回值)的区别
- 吃包子
- yield from 讲一个可迭代对象,变成一个生成器
- 列表推导式,生成器表达式
- 循环模式[变量(加工后的变量 for 变量 in iterable)]
- 筛选模式[变量(加工后的变量 for 变量 in iterable if 条件)]
- 内置函数(避免重复造轮子,提升开发效率,68个)
-
03 今日内容
-
匿名函数:一句话函数,比较简单的函数
-
此函数不是没有名字,他是有名字的,他的名字就是你给其设置的变量,比如func
-
lambda 是定义匿名函数的关键字,相当于函数的def
-
lambda 后面直接加形参,形参加多少都可以,只要用逗号隔开就行
-
返回值在冒号之后设置,返回值和正常函数一样,可以使任意数据类型
-
匿名函数不管多复杂,只能写一行,且逻辑结束后直接返回数据
课上练习:匿名函数 :一句话函数,比较简单的函数
def func(a,b):
return a + b构建匿名函数
func1 = lambda a,b:a+b
print(func1(1,2))
- 接收一个可切片的数据,返回索引为0与2的对应元素(元组形式)
func2 = lambda a:(a[0],a[2])
print(func2([22,33,44,55,66])) - 写匿名函数,接收两个int参数,将较大的数据返回
func3 = lambda a,b: a if a > b else b
print(func3(1,200))
-
-
内置函数
# python提供了68个内置函数
# 今天讲的这部分大部分了解即可
# eval 剥去字符串的运算外衣,运行里面的代码,有返回值**
s1 = '1 + 3'
print(s1)
print(eval(s1))
s = "{'name':'alex'}"
print(s,type(s))
# print(dict(s)) ##错误
print(eval(s),type(eval(s)))
# 网络传输的str input 输入的时候,sql注入等等,绝对不能够使用eval,携带病毒的字符串,eval后直接运行病毒exec 与 eval 几乎是一样,代码流
msg = '''
for i in range(10):
print(i)
'''
print(msg)
exec(msg)hash 哈希值
print(hash('ahsfgajhhalga'))
help 帮助
s1 = 'laksldka'
print(help(str))
print(help(str.upper))
s1 = 'dasd'
s1.upper() #对变量本身不更改
print(s1)# callable 判断一个对象是否可以被调用!!!
s1 = 'aksdajklf'
# s1() # TypeError: 'str' object is not callable
def fun():
pass
fun() #可执行
print(callable(fun))
print(callable(s1))int # 整形
print(int(4.6))
float # 浮点型
print(type(3.6))
complex 复数
print(complex(1,2)) #(1+2j)
bin:将十进制转换成2进制
print(bin(100)) # 0b1100100
oct:将十进制转化成八进制字符串并返回
print(oct(10)) #0o12
hex:将十进制转化成十六进制字符串并返回
print(hex(160)) #0xa0
print(hex(16)) #0x10
print(hex(13)) #0xddivmod !!取商取余
print(divmod(10,3)) #(3, 1) 商3余1
round:保留浮点数的小数位数!!
print(round(3.14156,2))
pow:求xy次幂 (三个参数时,对xy的结果对z取余)
print(pow(2,3)) #2的三次方,8
print(pow(2,3,3)) #8除以3 余2bytes 编码
s1 = '太白'
b = s1.encode('utf-8')
print(b)
b = bytes(s1,encoding='utf-8')
print(b)ord:输入字符找到该字符的编码位置
ascii Unicode
print(ord('a'))
print(ord('中')) #20013chr:输入位置,找出对应的字符
print(chr(98)) # b
print(chr(20014)) #Unicoderepr:返回一个对象的string形式(原形毕露)!!!
s1 = '存龙'
print(s1)
print(repr(s1))
msg = f'我叫{s1}'
print(msg)
print(repr(msg))all 可迭代对象中,全都是True 才是True
l1 = [1, 2, '太白3', True, [1,2,3], '']
print(all(l1)) #Falseany :可迭代对象中,有一个是True 就是True
l1 = [1, 2, '太白3', True, [1,2,3], '']
print(any(l1))print函数
print(self, *args, sep=' ', end='\n', file=None)
print(1,2,3,4)
print(1,2,3,4,sep='^')print(1,end=' ')
print(2)list函数
l1 = [1,2,3,4]
l2 = list() #[]
l2 = list('asdhjashf')
print(l2) #['a', 's', 'd', 'h', 'j', 'a', 's', 'h', 'f']dict 字典创建的几种方式
这季节创建
# 元组的解构
dic = dict([(1,'one'),(2,'two'),(3,'three')]) #列表中放元组
print(dic)
dic = dict(one=1,two = 2) #dict中放参数
print(dic)
# fromkeys
# 字典推导式abs() #绝对值!!!
print(abs(-6))
sum() #求和!!!
l1 = [i for i in range(10)]
s1 = '123456'
print(sum(l1)) #45
print(sum(l1,100)) #145
# print(sum(s1)) #错误 TypeError: unsupported operand type(s) for +: 'int' and 'str'reversed 翻转 返回的是一个翻转的迭代器!!!
l1 = [i for i in range(10)]
l1.reverse() #列表的方法,改变了原列表
print(l1)#[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
l1 = [i for i in range(10)]
obj = reversed(l1) #不对原列表进行操作
print(l1) #[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(list(l1)) #[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]zip 拉链方法
l1 = [1,2,3,4,5,6]
tu1 = ('太白','b哥','的干煤化工')
s1 = 'sadjakjda'obj = zip(l1,tu1,s1)
print(list(obj))以下方法最最最重要!!!!!!!!!!!
min max
l1 = [33,2,3,54,7,-1,-9]
print(min(l1))
# 以绝对值的方法去最小值
l2 = []
func = lambda a:abs(a)
for i in l1:
l2.append(func(i))
print(min(l2))def abss(a):
'''
第一次:a = 33 以绝对值 取最小值 33
第二次:a = 2 以绝对值 取最小值 2
第三次:a = 3 以绝对值 取最小值 2
........
第六次:a = -1 以绝对值 取最小值 1
'''
return abs(a)
print(min(l1,key = abss)) #abss不加(),使用变量名
# 凡是可以加key的:他会自动的将可迭代对象中的每个元素按照顺序传入key对应的函数中,
# 以返回值比较大小
dic = {'a':3,'b':2,'c':1}
求出最小的键
print(min(dic)) #min会按照字典的键去比较大小
def func(*args):
'''
第一次:
args:'a' 返回值:dic['a'] 记录:3
第二次:
args:'b' 返回值:dic['b'] 记录:2
第三次:
args :'c' 返回值:dic['c'] 记录:1
'''
return dic[args]
print(min(dic,key=lambda a:dic[a]))
func = lambda a:dic[a]
print(min(dic,key=func))
l2 = [('太白',18), ('alex', 73), ('wusir', 35), ('口天吴', 41)]
print(min(l2))
print(min(l2,key=lambda a:l2[1]))
# max passsorted 加key
l1 = [22, 33, 1, 2, 8, 7,6,5]
l2 = sorted(l1)
print(l1)
print(l2)
l2 = [('大壮', 76), ('雪飞', 70), ('纳钦', 94), ('张珵', 98), ('b哥',96)]
print(sorted(l2))
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]
print([i for i in l1 if i > 3]) #返回的是列表
ret = filter(lambda a:a>3,l1) #返回的是迭代器
print(ret)
print(list(ret))map 列表推导式的循环模式
l1 = [2, 3, 4, 1, 6, 7, 8]
print([i2 for i in l1]) #返回的是列表
ret = map(lambda a:a2,l1) #返回的是迭代器
print(list(ret))reduce #累加 第一次取2个值,后续一次取1个值,根据函数来计算
from functools import reduce
def func(x,y):
'''
第一次:x,y:11,2 x+y
'''
return x+y
l = reduce(func,[11,2,3,4,5])
print(l) -
闭包:整个历史中的某个商品的平均收盘价。什么叫平局收盘价呢?就是从这个商品一出现开始,每天记录当天价格,然后计算他的平均值:平均值要考虑直至目前为止所有的价格。
比如大众推出了一款新车:小白轿车。
第一天价格为:100000元,平均收盘价:100000元
第二天价格为:110000元,平均收盘价:(100000 + 110000)/2 元
第三天价格为:120000元,平均收盘价:(100000 + 110000 + 120000)/3 元
1.闭包只存在于嵌套函数中
2.内层函数对外层函数非全局变量(自由变量)的引用或使用,就会形成闭包
3.被引用的非全局变量也称作自由变量,这个自由变量会与内层函数产生一个绑定关系
4.自由变量不会再内存中消失
5.闭包的作用,保证数据的安全.函数外访问不到l1
# 闭包
# 封闭的东西:保证数据安全不断输入参数,求平均值 方案一:
l1 = [] # l1为全局变量,数据不安全
li = []
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(180000))
print(make_averager(140000))
print(make_averager(103000))
print(make_averager(93000))方案二:数据安全,l1不能是全局变量
每次执行的时候,l1列表都会重新赋值成[]
li = []
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(200000))方案三:闭包
def make_averager():
l1 = []
def averager(new_value):
l1.append(new_value)
print(l1)
total = sum(l1)
return total/len(l1)
return averageravg = make_averager() #averager
print(avg.code.co_freevars)
print(avg(100000))
print(avg(140000))
print(avg(167000))
print(avg(190000))
print(avg(173000))def func():
return 666
ret = func() #函数消失了,但是返回值给了ret
print(globals())闭包:多用于面试题:什么是闭包?闭包有什么用?
1.闭包只存在于嵌套函数中
2.内层函数对外层函数非全局变量的引用或使用,就会形成闭包 (自由变量)
被引用的费全局变量也称作自由变量,这个自由变量会与内层函数产生一个绑定关系
自由变量不会再内存中消失
闭包的作用,保证数据的安全.函数外访问不到l1如何判断一个嵌套函数是不是闭包?
例一:是闭包
def wrapper():
a = 1
def inner():
print(a)
return inner
ret = wrapper()
# 例二:不是闭包
a = 2
def wrapper():
def inner():
print(a)
return inner
ret = wrapper()例三:
也是闭包!
def wrapper(a,b):
def inner():
print(a)
print(b)
return inner
# 传值相当于:
a = 2
b = 3
ret = wrapper(a,b) #ret得到inner
# 如何利用代码判断闭包,对内层函数进行判断
print(ret.code.co_freevars)def make_averager():
l1 = []
def averager(new_value):
l1.append(new_value)
print(l1)
total = sum(l1)
return total/len(l1)
return averageravg = make_averager() # averager
04 今日总结
- 匿名函数
- 内置函数(三颗星一定记住,两颗星尽量记住)
- 闭包
05 预习内容
- 装饰器
浙公网安备 33010602011771号