1.继承

# 按照类的继承顺序,找下一个.
class Foo(object):
    def f1(self):
        super().f1()
        print('3个功能')

class Bar(object):
    def f1(self):
        print('6个功能')

class Info(Foo,Bar):
    pass

# obj = Foo()
# obj.f1()   #报错AttributeError: 'super' object has no attribute 'f1'

obj = Info()
obj.f1()   #6个功能
              #3个功能
View Code
2.class StarkConfig(object):
    list_display = [1,4]
s1 = StarkConfig()
s2 = StarkConfig()
s1.list_display.append(3)
print(s1.list_display) #[1, 4, 3]
s2.list_display.append(9)
print(s2.list_display) #[1, 4, 3, 9]

# class StarkConfig(object):
#     list_display = 'dd'
# s1 = StarkConfig()
# s2 = StarkConfig()
# s1.list_display = 'tt'
# print(s1.list_display) #'tt'
# print(s2.list_display) #'dd'
class StarkConfig(object):    list_display = 'dd's1 = StarkConfig()s2 = StarkConfig()StarkConfig.list_display = 'tt'print(s1.list_display) #'tt'print(s2.list_display) #'tt'
View Code

2.缩进

在缩进的时候,要么全部使用tab键,要么全部使用空格键。PEP8规范要求全部使用空格键,并且每层缩进使用2个空格,这个就要看每个公司的规范了。

3.异常处理(try...finally + return)

   try...finally是用来捕获异常,并且不管有没有异常发生,都会执行finally中的代码。这样看起来会比较好理解,但是如果加上return语句,可能就会发生意想不到的事情。

         

          以上代码输出结果是1,3,2

          如果try中包含了break、continue、return语句,在离开try块之前,会优先执行finally中的代码,然后才会执行return语句。这样就能理解,为什么结果是1,3,2了。

4.可变容器作为函数默认值

   当我们在函数中使用了列表、字典等可变容器类型作为参数默认值的时候,会很容易出现问题。

    

 

        我们可以看到,test()函数每执行一次,param这个列表中的值都会加1,这是因为默认参数会存储在函数的一个叫做__defaults__属性中,这个属性是函数属性,每次执行都是同一个对象,因此每次执行,param都会加一个新元素,并且还会保留之前添加的元素。正确的做法应该是把默认值设置成None,或者设置成不可变的数据类型,比如元组。

5.for...else...

      这个语法可以说是Python独有的,他的作用是在for循环中每一项都循环到了,就会执行else,否则就不会执行else。举个例子:

         

 

         因为0...9的所有数字都小于18,所以不执行到break,也就range中的每一项都执行到了。这时候就会执行else语句。但是如果我们把a改成8,就不会执行else中的语句了

6.Python闭包的变量

         

 

        我们期望的结果应该是0,1,4,但实际上是16,16,16。原因是Python中的惰性求值。惰性求值,也就是延迟求值,表达式不会在它被绑定到变量之后就立即求值,而是等用到时再求值。x 实际不在 lambda 的作用域中。只有当 lambda 被调用时,x 的值才会被传给它。也就是最后的一次循环中 x 为 4,后面的 ls[1],ls[1],ls[2],ls[3]实际都是 16。

7.相同值的不可变对象

         

 

        可以发现只有key为1,value为'b'的数据了。而原来的key为1,value为'a'的值凭空消失了。这是为什么呢?原因是Python字典是使用哈希表的思想实现的,Python 调用内部的散列函数,将键(Key)作为参数进行转换,得到一个唯一的地址,也就是哈希值。而Python 的哈希算法对相同的值计算得到的结果是一样的,这就很好地解释了上述情况出现的原因

8. is 和 ==

        Python中的is代表两个对象的id值是否相同,而==则判断两个值是否相同。

 

        

 

        a和b都是一个空的列表,他们是存放到不同的内存空间,因此他们的id是不一样的,所以a is b为False,但是a==b是True,原因是他们两个的值是相等的。

 

posted on 2019-10-16 20:31  始终不够啊  阅读(260)  评论(0编辑  收藏  举报