美文网首页
Python 随笔

Python 随笔

作者: codingXue | 来源:发表于2016-12-29 11:50 被阅读12次

1 函数默认参数的陷阱

代码示例:

def defaultPara(item, l=[]):
    l.append(item)
    print l
    
defaultPara('1')
# ['1']

defaultPara('2', ['4', '5'])
# ['4', '5', '2']

defaultPara('3')
# ['1', '3']

上面的第三次调用,函数不是使用一个空数组作为参数,而是使用了与第一次调用时相同的数组。简言之,在Python里函数的默认参数是在函数定义时就定义了,而不是在每次调用函数时新生成,因此当默认参数为可变参数时,其行为可能与我们想象得有出入,需要注意。
更加详细的讨论:Python函数参数默认值的陷阱和原理深究](http://cenalulu.github.io/python/default-mutable-arguments/)。

2. GIL

GIL(Global Interpreter Lock),是在实现Python解析器(CPython)时所引入的一个概念。(也就是说它不是python语言的特性,而是实现解析器(CPython)时引入的一个坑)
GIL的存在让Python看起来只是一个伪多线程,因为它“prevents multiple native threads from executing Python bytecodes at once”。
Python的多线程在多核CPU上,只对于IO密集型计算产生正面效果;而当有至少有一个CPU密集型线程存在,那么多线程效率会由于GIL而大幅下降。
更加详细的讨论:Python的GIL是什么鬼,多线程性能究竟如何

3. 变长参数

当函数的参数不确定时,可以使用*args 和**kwargs,如:def myfun1(username, *keys)或def myfun2(username, **keys)等。
* 用来传递任意个无名字参数,这些参数会一个Tuple的形式访问;
**用来处理传递任意个有名字的参数,这些参数用dict来访问。

4. 类的继承

MRO:Method Resolution Order
目前采用的是C3算法,它保证了两点:

  • 单调性
    C继承B,B继承A,则MRO链应符合C->B->A的顺序
  • 重写问题
# 新式类
class A(object):
    def foo(self):
        print 'A'

class B(A):
    pass
    
class C(A):
    def foo(self):
        print 'C'

class D(B, C):
    pass
    
d = D()
d.foo()
# C

可见C3算法保持了DFS和BFS的优点。
C3算法:

  • L[object] = [object]
  • L[C(B1…BN)] = [C] + merge(L[B1]…L[BN], [B1]…[BN])

merge过程:

  • 检查第一个列表的头元素(如 L[B1] 的头),记作 H。
  • 若 H 未出现在其它列表的尾部,则将其输出,并将其从所有列表中删除,然后回到步骤1;否则,取出下一个列表的头部记作 H,继续该步骤。
  • 重复上述步骤,直至列表为空或者不能再找出可以输出的元素。如果是前一种情况,则算法结束;如果是后一种情况,说明无法构建继承关系,Python 会抛出异常。

super()
Python的多继承类是通过MRO的方式来保证各个父类的函数被逐一调用,而且保证每个父类函数只调用一次(如果每个类都使用super)

相关文章

  • python 总结

    python 随笔 关键字 基础 内建函数 技巧 模块 进阶

  • python学习札记

    随笔记 python中,注释语句用【alt+3】,反注释用【alt+4】 python中的几个词汇ClassIns...

  • Python自学分享第一天

    注:本python文集 是笔者自学python的笔记及心得分享,持续更新中......欢迎广大读者跟随笔者自学py...

  • python多线程的初步探索(从Queue探索)

    前言 自学了快4天的python。有些东西还是需要自己记录一下,故此写下该随笔。 在学习python的时候,编写多...

  • Qtreewidget

    样例源码PyQt(Python+Qt)学习随笔:树型部件的QTreeWidget的itemAbove、itemBe...

  • python随笔

    python中字符串不转义 r' ',类似于xml中的。 取字符的整数o...

  • python随笔

    print (‘ ’) 输出,最后面没有分号 name = input(’name‘)输入,()里面可以写输提示内...

  • Python随笔

    根据控制台输入数字的参数判断数值大小

  • Python随笔

    最近在学习Python,说来惭愧,工作几年后才发现对编程也挺感兴趣,上学时候也有一些零星的编程基础,现在学起来也不...

  • Python 随笔

    1 函数默认参数的陷阱 代码示例: 上面的第三次调用,函数不是使用一个空数组作为参数,而是使用了与第一次调用时相同...

网友评论

      本文标题:Python 随笔

      本文链接:https://www.haomeiwen.com/subject/ctnuvttx.html