(一)匿名函数
不想显式定义函数的时候,可以使用匿名函数。
1 def f(x): 2 return x*x 3 4 #将匿名函数赋值给一个变量 5 result = lambda x:x*x 6 7 print(result(5)) 8 print(f(5))
通过输出可以看出, lambda x:x*x 实际上就是:
1 def f(x): 2 return x*x
lambda关键字表示一个匿名函数,通过上面的对比可以看出冒号前面的x就是函数的参数,后面的表达式就是该匿名函数的返回值。
匿名函数只有一个表达式,不需要写return,因为表达式的结果就是该匿名函数的返回值。
例1:
1 def divisible(n): 2 3 return n % 2 == 0 4 #这里解释下filter(function, iterable)函数,第一个参数为函数,第二个为序列 5 #序列的每个元素作为参数传递给函数进行判断,然后返回 True 或 False,最后将返回 True 的元素放到新列表中。 6 the_list =list( filter(divisible,range(20)))
使用匿名函数重写上面的代码:下面这个和上面的是一样的
1 the_list = list(filter(lambda n: n % 2 == 0,range(20)))
例2:
匿名函数也可以定义多个参数
1 def f(x,y): 2 3 return x+y 4 5 l = lambda x,y: x + y 6 7 print(f(1,3)) 8 print(l(1,3))
(二)@property
例如:现在有一个可以存储人类年龄的类
1 class people(): 2 3 def __init__(self,age=1): 4 self.age = age 5 6 #通过下面p = people() p.age = 100,我们可以设置人的年龄 7 8 p = people() 9 p.age = 100 10 print(p.age)
现在有一个新需求,要求年龄只能输入大于0的整数。有一个解决方式就是隐藏属性,我们可以定义getter和setter接口来操作属性
1 class people(): 2 3 def __init__(self,age=1): 4 self.set_age(age) 5 6 #返回年龄 7 def get_age(self): 8 return self._age 9 #设置年龄 10 def set_age(self,value): 11 if value <= 0 or not isinstance(value,int) : 12 raise ValueError('请输入大于0的整数') 13 self._age = value 14 15 p = people(20) 16 print(p.get_age()) 17 p.set_age(25) 18 print(p.get_age())
上面的代码可以实现需求,但是有一种更简单的方式就是使用@property,使用@property的实现代码
1 class people(): 2 3 def __init__(self,age=1): 4 self._age = age 5 #在返回属性的方法上,使用@property修饰符 6 @property 7 def age(self): 8 return self._age 9 10 #在设置属性的方法中使用 属性.setter 修饰符 11 @age.setter 12 def age(self,value): 13 if value <= 0 or not isinstance(value,int) : 14 raise ValueError('请输入大于0的整数') 15 self._age = value 16 17 p = people() 18 19 p.age = 20 #和之前的 p.set_age(20) 是一样的 20 print(p.age) #获取属性的值,和之前 p.get_age()的效果是一样的