枚举
from enum import Enum
class VIP(Enum):
YELLOW = 1
YELLOW_ALIAS = 1 #是YELLOW的别名
BLACK = 2
RED = 4
for vip in VIP:
print(vip.name)
for vip in VIP.__members__:#打印包括别名的所有内容
print(vip)
print(VIP(1)) #VIP.YELLOW 通过值来获取枚举类型
控制枚举不能定义别名,即不能定义值相同的枚举类型
from enum import IntEnum,unique
@unique
class VIP(IntEnum):
YELLOW = 1
YELLOW_ALIAS = 1 #是YELLOW的别名
BLACK = 2
RED = 4
print(VIP(1))
#提示报错
函数式变成
闭包 =函数+环境变量(函数定义时候)
如下代码,把curve_pre的结果返回给f,即,返回了curve方法,但是不仅仅是返回了curve方法,而是连同它所在的环境(a=10)一起返回了。这就是闭包。
如果再curve方法中改变a的值,那么就不能再称之为闭包了
def curve_pre():
a = 10
def curve(x):
return a*x
return curve
a = 2
f = curve_pre()
print(f.__closure__) #打印闭包
print(f(2));
用闭包实现走路
x = 0
def wark_pre(x):
def wark(step):
nonlocal x
new_x = x + step
x = new_x
return new_x
return wark
f = wark_pre(x)
print(f(2))
print(f(3))
print(f(2))
匿名函数
用lambda来定义匿名函数
def add(x,y):
return x+y
add(1,2)
f = lambda x,y:x+y
f(1,2)
map
第一个参数是方法,第二个参数是传的参数
list_x = [1,2,3,5,6,7,87]
def getData(x):
return x*x
r = map(getData,list_x)
print(list(r))
# [1, 4, 9, 25, 36, 49, 7569]
使用匿名函数来简化如上功能
list_x = [1,2,3,5,6,7,87]
r = map(lambda x:x*x,list_x)
print(list(r))
也可以传递多个参数,但是最终的结果只会取交集
list_x = [1,2,3,5,6,7,87]
list_y = [1,2,4,5]
r = map(lambda x,y:x*x+y,list_x,list_y)
print(list(r))
reduce
计算顺序如下:(((1+2)+3)+4)+5
from functools import reduce
# 连续计算,连续调用lambda
list_x = [1,2,3,4,5,6,67]
r = reduce(lambda x,y:x+y,list_x)
print(r)
filter
过滤函数,过滤掉不满足条件的数据,返回一条新的数据
list_x = [1,0,1,1,1,0,2,3]
r = filter(lambda x:True if x == 1 else False,list_x)
print(list(r))
#[1, 1, 1, 1]
装饰器
下面的
*args
指的是定义一个可变参数,这样,这个装饰器就可以用于不同参数列表的方法了
下面的**kw
是用来满足关键字参数的传参情况的,这样就可以满足所有的情况了
import time
def showTime(func):
def showNowTime(*args,**kw):
print(time.time())
func(*args,**kw)
return showNowTime
@showTime
def showData():
print('王梦同牛逼!')
@showTime
def showData2(func_name1):
print('王梦同牛逼!')
@showTime
def showData3(func_name1,func_name2,**kw):
print('王梦同牛逼!')
showData()
#1543508028.8441682
#王梦同牛逼!