知识点回顾
1、三元运算
# 定义两个变量 a = 1 b = 2 # 判断a的真假值,如果为True,则将判断表达式的前面的值赋给c,否则将判断表达式后面的值赋给c c = a if a else b print(c) # 1 # 因为a的真假值判断为True,所以c为1 # 定义两个变量 a = 0 b = 2 # 判断a的真假值,如果为True,则将判断表达式的前面的值赋给c,否则将判断表达式后面的值赋给c c = a if a else b print(c) # 2 # 因为a的真假值判断为False,所以c为2
2、列表推导式
列表推导式的返回结果仍然是一个列表,假设有列表li = [1, 2, 3, 4],,如果将li列表里面的每一个元素乘以2得到一个新的列表,请看下面的代码:
li = [1, 2, 3, 4]
# 方式一:使用普通for循环
new_list = list()
for item in li:
new_list.append(item * 2)
# 方式二:使用列表推导式
li = [ x * 2 for x in li]
3、getattr
在学习面向对象时,我们知道可以通过对象加点号获取该对象的属性,也可以通过对象的dict访问属性,请看下面的代码:
class Father(object):
country = "china"
class Person(Father):
def __init__(self, name, age):
self.name = name
self.age = age
p = Person("pizza", 18)
print(p.__dict__) # {'name': 'pizza', 'age': 18}
print(Person.__dict__) # {'__module__': '__main__', '__init__': <function Person.__init__ at 0x103f132f0>, '__doc__': None}
print(p.name) # pizza
print(p.age) # 18
print(p.country) # china 如果对象不存在这个属性,则会到其父类中查找这个属性
print(p.hobby) # 如果在父类中也找不到这个属性,则会报错:AttributeError: 'Person' object has no attribute 'hobby'
对象的属性查找首先会在该对象的一个名为dict的字典中查找这个属性,如果找不到,则会到其父类中查找这个属性,如果在父类中都也找不到对应的属性,这会抛出异常AttributeError,我们可以通过在类中定义一个getattr来重定向未查找到属性后的行为,请看下面的代码:
class Father(object):
country = "china"
class Person(Father):
def __init__(self, name, age):
self.name = name
self.age = age
def __getattr__(self, value):
raise ValueError("属性%s不存在" % value)
p = Person("pizza", 18)
print(p.hobby) # ValueError: 属性hobby不存在
可以看到,我们能够重新定义异常,也可以做其他任何事情,这就是getattr,一句话总结,通过对象查找属性,如果找不到属性,且该对象有getattr方法,那么getattr方法会被执行,至于执行什么逻辑,我们可以自定义
4、函数的参数
def func(a, b, c=1, *args, **kwargs):
print(a, b, c, args, kwargs)
func(1, 2, 3, 4, 5) # 1, 2, 3, (4, 5) 所有未被匹配到的非key=value型的参数都会被*args接收
func(b=1, a=1, c=2, 4, 5) # 报错,位置参数不能在关键字参数之后
func(4, 5, c=3, {"name": "pizza"}) # 报错,位置参数不能在关键字参数之后,字典不是关键字参数
func({"name": "pizza"}, 1, 2) # {'name': 'pizza'} 1 2 () {}
func(1, 2, 3, 4, 5, d=1, e=2) # 1 2 3 (4, 5) {'d': 1, 'e': 2} 未被匹配到的关键字参数被传递给kwargs

浙公网安备 33010602011771号