匿名函数:无需定义名字的一类函数。
定义匿名函数使用关键字lambda
lambda结构体要比def简单的多,它只有一条语句。
语法:
lambda 参数列表:表达式
表达式的结果就是匿名函数的返回值。
参数列表:参数与参数之间使用逗号隔开。
优点:无需定义函数名,不会发生函数名冲突
匿名函数的调用:
将定义的匿名函数赋值给一个变量,通过调用这个变量来调用的匿名函数。
参数列表中有几个参数,那么我们就传递几个参数。
mysum = lambda a,b:a+b
print(mysum(10,20))
使用匿名函数完成返回两个数之间最小值。
mymin = lambda a,b: a if a<b else b
print(mymin(12,34))
print(mymin(12,12))
装饰器:在代码运行的期间动态增加功能的方式我们称之为装饰器。
最简单的装饰器的语法:
def outer(func):
def inner():
#添加要添加功能
return func()
return inner
外函数:
功能:
1.将被装饰的函数传递进去
2.将装饰好的替代版的函数返回
内函数:
功能:
1.添加要装饰的功能
2.执行被装饰的函数
def nowouter(func): #func = now
def inner():
print("**********")
return func()
return inner
def nowouter2(func): #func = now
def inner():
print(“")
res = func()
print(res)
print("”)
return res
return inner
@nowouter2
def now():
return “2019-4-29”
res = now()
print(res)
2019-4-29
@装饰器名字
当我们将@装饰器添加到某个函数的头上的时候,@符号它的作用:
它会将这个函数的函数名作为参数传递给装饰器,然后返回一个替代版的函数。
当我们调用被装饰的函数的时候,其实相当于调用的是替换版的函数。
在替代版的函数中执行的内容,其实就是相当于调用被装饰函数执行的。
注意:当被装饰的函数【原函数】中出现返回值【被装饰的函数中有return的时候】
这时候我们在内函数中就必须使用return,将原函数计算的结果返回。
复杂点的装饰器:
def outer(func):
def inner(参数列表):
#增加的功能
return func(参数列表)
return inner
外函数:
1.将被装饰的函数作为参数传进来
2.将装饰好的函数作为替代版的函数返回
内函数:
1.接收被装饰函数的参数列表
2.添加装饰的功能
3.执行被装饰的函数
对年龄进行过滤,要求不能更改我之前的函数,
你要完成过滤的功能.[0,160]
def ageouter(func):
def inner(age):
if age>=0 and age<=160:
func(age)
else:
print(“年龄非法”)
return inner
将setAge —》 func
age —》 inner(age)
setAge相当于调用inner
@ageouter
def setAge(age):
print(“我今年%d岁”%age)
setAge(-10)
setAge(18)
setAge(180)
需求:对user,psd进行过滤
要求user由数字字母下划线组成,不能以数字开头,5~8位
psd 必须6位的数字。
‘’’
def userleal(user):
# 由数字字母下划线组成
for x in user:
if x >= ‘0’ and x <= ‘9’ or x == “_” or x >= ‘a’ and x <= ‘z’ or x >= ‘A’ and x <= ‘Z’:
pass
else:
# print(“用户名只能由数字字母下划线组成!!”)
return False #非法
else:
return True #合法
def isstartnum(user):
if user[0] >= “0” and user[0] <= ‘9’:
# print(“用户名不能以数字开头”)
return True
else:
return False
def loginouter2(func):
def inner(user,psd):
if not isstartnum(user) and len(user)>=5 and len(user)<=8 and userleal(user) :
if len(psd)==6 and psd.isdigit():
return func(user,psd)
else:
else:
print(“用户名非法。。”)
return inner
def loginouter(func):
def inner(user,psd):
if len(user)>=5 and len(user)<=8:
if user[0]>=“0” and user[0]<=‘9’:
print(“用户名不能以数字开头”)
else:
for x in user:
if x>=‘0’ and x<=‘9’ or x=="_" or x>=‘a’ and x<=‘z’ or x>=‘A’ and x<=‘Z’:
pass
else:
print(“用户名只能由数字字母下划线组成!!”)
return
else:
#用户名合法
if len(psd) == 6 and psd.isdigit():
return func(user,psd)
else:
print(“密码错误”)
print(“用户名长度不合法”)
return inner
@loginouter2
def login(user,psd):
if user == “admin” and psd == “123456”:
return True #登录成功
else:
return False #登录失败
print(login(“a22111”,“123456”))
print(login(“a22111”,“12345”))
print(login(“admin”,“123456”))
偏函数:
功能:将函数中的某些参数固定住,返回一个新的函数,这个函数使用起来会更简单,
类似于我们的默认参数实现的功能。
functools.partial(func,要固定的参数)
import functools
print(int(“10010”,2))
def int2(numstr,base=2):
return int(numstr,base)
int3 = functools.partial(int,base=2)
print(int2(“11110”))
print(int2(“11010”))
print(int2(“11010”))
print(int3(“10010”))
print(int3(“10”,base=8))
使用偏函数求任意数与100之和。
import operator
print(operator.add(100,10))
add2 = functools.partial(operator.add,100)
print(add2(100))
def func(a,b):
return a+b
func2 = functools.partial(func,b=100)
print(func2(100))