知识点回顾

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

  

  

  

  

 

posted @ 2018-12-08 14:10  小小猎魔人  阅读(114)  评论(0)    收藏  举报