Python基础语法07 匿名函数 装饰器 偏函数

匿名函数:无需定义名字的一类函数。
定义匿名函数使用关键字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))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值