Python拾遗1

1、变量名是给编译器和程序员看的,操作时转换成地址,符号表起连接作用。符号表包括常数表、变量名表、数组表、过程名表、标号表等。

2、python为什么比C/C++慢?

a、支持动态类型,执行时需要先判断类型;

b、执行时需要先翻译再执行,效率低;

c、虚拟机带来间接开销;

d、GIL带来的伪多线程问题。

3、Psyco是PVM增强工具,将部分程序字节码转换成真正的二进制机器码,加快执行速度

4、注册表机制和#!同理。

5、python模块导入本质上讲就是载入另一个文件,导入必须找到文件将其编译成字节码并运行代码,导入者得到了模块文件中在顶层所定义的所有变量名。

6、查看模块内部可用变量名列表。os.platform,sys.path,程序由模块构成,模块包含语句,语句包含表达式,表达式建立并处理对象。

7、help(class.method)

8、in表达式

9、0o、0x、0b

10、floor、ceil、round

11、oct、hex、bin,将整数转换成其它进制的字符串,int将数字字符串转换为整数。

12、整数、浮点数、复数、小数、decimal(Decimal)、Fraction

13、数字、集合、元组、字符串不可变,类型属于对象,变量只是引用了不同的对象。

14、传址:列表、字典和class

15、python缓存并复用了小的整数和字符串,切片是复制,不是共享引用。列表整体赋值是共享引用。

16、raw字符串不能以单个反斜杠结尾。切片的正偏移 + 负偏移 = 长度

17、ord转ascii,chr转字符串,join、split

18、格式字符串 %(对象...)                            str.format

19、values keys items

20、序列化对象到文件,比手动字符串转化要方便, with open() as myfile

21、列表通过切片进行拷贝,字典通过.copy进行拷贝,只做顶层复制,不能够复制嵌套的数据结构,如果需要深度复制,需使用copy.deepcopy

22、==测试值的相等性,is测试对象的一致性(同一个对象)

23、sorted内置函数

24、序列赋值,带*号扩展赋值

25、以单一下划线开头的变量名不会被 from module import *导入;前后有下划线的变量名是系统定义的;有两下划线开头但结尾没有下划线的变量名是类的本地变量;以双下划线开头并结尾的变量名是用来表示python实现细节的命名模式。

26、print([object,...][sep=''][end='\n'][,file=sys.stdout.])      print(xxx)等价于sys.stdout.write

27、python没有switch-case

28、顶层代码必须于第一栏开始写,嵌套代码可于任意栏开始写,只要一致即可,不管缩进多少。

29、任意表达式都可放在括号内,括号可以跨行

30、布尔运算符是字,不是像C语言中的符号,and和or会返回真或假的对象而不是True False

31、A = Y if X else Z

32、while  else break continue  pass   for ..range...

33、并行遍历:zip和map,zip创建元组对的列表,map使用函数作用于序列中的每个元素。

34、enumerate返回生成器对象

35、有__next__方法的对象会前进到下一个结果,在结果的末尾会引发StopIteration,这类对象就是可迭代的,任何这类对象也能以for循环或其它迭代工具遍历。迭代器在python中以C语言的速度运行,内置函数iter.next。python3.x提供了内置函数next,next(X)相当于X.__next__。文件本身就是自己的迭代器,而列表等不是自身的迭代器,必须用iter获得迭代器,才能针对迭代器调用next或__next__。

36、python迭代环境包括for循环、列表解析、map内置函数、in成员关系测试表达式、sorted、sum、any、all、join、序列赋值等,都使用了迭代协议

37、变量名解析的LE/NGB法则(本地、函数、全局、内置),最小化全局变量。global,nonlocal嵌套的def(记住状态信息),nonlocal声明的变量必须在上一层def中定义过。

def tester(start):
    state = start
    def nested(label):
        nonlocal state
        print(label,state)
        state += 1
    return nested

38、不可变参数通过值传递,可变对象通过指针传递。

39、常规参数,关键字参数(通过变量名匹配),默认参数是定义时写好,关键字参数是调用时写。任一参数*(主要是收集不匹配的位置参数)和**(主要是字典)。keyword-only参数必须出现在一个**args形式之前。

40、lambda arg1 arg2...:expression using args 也能使用默认参数,是表达式,可以出现在任何地方,起到函数速写的作用,用到跳转表、map中。函数式编程。

41、map比for循环快两倍,列表解析比map快。

42、生成器yield一个值,保留状态等待下次执行,生成器的__next__方法继续函数并且运行到下一个yield结果返回或引发StopIteration。生成器表达式写在圆括号中(与列表解析对比)。生成器是单迭代器对象。

43、import导入文件不加路径和后缀名,模块搜索路径:程序主目录、PYTHONPATH目录(可扩展)、标准链接库目录,任何.pth文件(可扩展)。sys.path.append(dirname)

44、模块导入只发生一次,后面的导入只会取出已加载的模块对象。from也会把整个模块导入内存。导入操作不会赋予被导入文件中的代码对上层代码的可见度,被导入文件无法看见进行导入的文件内的变量名。

45、reload,导入一个模块,再修改其代码,然后用reload重载,重载不会影响所有使用import读取了模块的客户端,只会对以后使用from的客户端造成影响。

46、python代码的目录就称为包,包导入就是把计算机上的目录编程一个python命名空间,包导入语句路径的每个目录内都必须由__init__.py,__all__

47、from。。。import name  ,同层次目录导入。3.x默认绝对搜索路径sys.path,而不是相对路径。import name进行相对导入。相对导入解决包名冲突,适用于包内导入。

48、把变量名赋值给__all__,from *只会把这些变量复制出来。

49、启用以后的语言特性:from __future__ import futurename

50、__name__     __main__

51、import ... as ..简化名字,避免命名冲突。

52、reload不重载通过import导入的模块。from导入复制变量名而不是原变量的一个引用。

53、属性属于实例,方法属于类。

54、运算符重载:以双下划线命名的方法是特殊钩子(拦截作用),当实例出现在内置运算时这类方法会自动调用,方法的返回值会变成相应表达式的结果。

常见的运算符重载方法:

 

55、重载函数:__init__,__str__

56、instance.__class__提供从实例到创建它的类的连接,类有__name__和__bases__序列。

57、pickle,shelve

58、超类构造函数需要显示调用,不会默认调用,实例属性是由对方法内self属性进行复制运算生成的,类属性是通过class语句内的语句生成的。

59、属性是python的字典键,__dict__,dir

60、重载__iter__,__next__,实现自己的迭代器

61、继承、多态、封装。继承、组合、委托、复合、多继承、绑定方法、工厂

62、绑定方法会自动让实例和类方法函数配对。

63、python3.x都是新式类,都继承自object,内置类型和用户类型没有差别,类和类型同义,钻石继承宽度优先(多重继承),__slots__(实例变量)

64、函数装饰器是它后面的函数的运行时的声明,在def上一行写,由@符号跟着元函数,用来给现成的函数增加函数每次被调用时都会运行的一层逻辑。

65、Exception,try,except,finally,else,raise,assert,with..as...。字符串异常和类异常。3.x中的异常必须由类定义。

66、坏境管理器实现需要有__enter__何__exit__方法,sys.exe_info

67、编码是把一个字符串翻译为原始字节形式,3.x有str、bytes、bytearray,BOM

68、装饰器提供了一种方法在函数和类定义末尾插入自动运行代码,函数装饰器可以用来管理函数调用和函数对象,装饰器自身时候一个返回可调用对象的自调用对象。

69、元类继承自type,重新定义__init__和__new__,metaclass=M声明继承,类装饰器。

70、装饰器、特性、描述符、元类。

71、不建议使用thread,最明显的原因是主线程退出后所有其他线程会不清理直接退出,threading则会处理。

72、_做占位符用。

73、装饰器是可调用对象,其参数是另一个函数(被装饰的函数),装饰器可能会处理被装饰的对象然后把它返回,或者将其替换成另一个函数或可调用对象。装饰器的一个关键特性是他们在被装饰的函数定义之后立即运行。多数函数装饰器会修改被装饰的函数,而不是原封不动的返回,一般要用到闭包。

自由变量是未在本地作用域中绑定的变量,闭包是一种函数,会保留定义在函数时存在的自由变量的绑定,这种函数调用时虽然作用域不可用了,但是仍能使用那些绑定。

nonlocal把变量标记为自由变量。函数加了@装饰器符号就可以等价为经装饰器调用后返回的函数。

74、time.pert_counter计时

75、python内置了3个装饰器:property、classmethod、staticmethod。另一个常见装饰器是functools.wraps,functools.lru_cache做备忘录优化性能。

76、叠放装饰器,放在前面的最后作用。参数化装饰器创建装饰器工厂函数,把参数传给他再返回一个装饰器。

77、除了开发框架,不要写元类。

78、subprocess管理子线程,

79、collections.deque

80、os.fork在windows版本python中没有定义,multiprocessing来处理多进程,进程池Pool。

81、冻结二进制文件:将程序的字节码、PVM以及任何程序所需要的python支持文件打包成一个单独的可执行二进制程序。客户端系统不需要安装python来运行这些冻结的二进制文件。

82、python内置对象

83、列表、集合、字典都可以用解析来创建

[i for i in "spam"]          {i for i in "spam"}   {i:ord(i) for i in "spam"}

84、对字典进行排序:通过字典的keys方法收集一个键的列表,然后使用列表的sort方法进行排序,最后使用for循环逐个显示结果。使用内置sorted可以一步完成。

85、元组有两个专有的可调用方法:Index和count。元组一旦创建就不能改变。

86、整除法:  //     ,自动类型转换仅仅在数字类型运算时才有

87、repr,代码规范显示          str,用户友好显示

可以使用连比,X < Y <Z

88、集合只能包含不可变对象类型。sys.getrefcount查询对象的引用次数。

89、常见字符串操作:

单双引号是一样的。

常见的列表操作:

常用的字典操作:

元组的常用操作:

常见文件运算:

90、python中所有一切都是某种类型的对象:

91、python语句集:

92、列表解析看上去像是一个反向的for循环。函数属性、函数注解。python类没有访问控制权限,通过伪私有属性__xx来实现访问控制。

93、编写函数装饰器    

装饰器使用场景:不想改变源代码,又想增加功能。

类装饰器实现__call__方法

无参装饰器:

def decorator(fn):
    @wraps(fn)
    def wrapper(*arg,**kwargs):
        print('foo')
        fn(*args,**kwargs)
        print('bar')
    return wrapper

有参装饰器多了一层函数的嵌套:

def decorator(times):
    # 外部装饰器
    def out_wrapper(fn):
        # 内部装饰器
        @wraps(fn)
        def wrapper(*args, **kwargs):
            print('foo')  # 目标函数之前执行
            for _ in range(times):  # 执行次数
                fn(*args, **kwargs)  # 执行目标函数
            print('bar')  # 目标函数之后执行

        return wrapper  # 返回内部装饰器

    return out_wrapper  # 返回外部装饰器

通过类实现带参装饰器减少嵌套:

from functools import wraps


# 装饰器类
class Decorator(object):
    def __init__(self, times):  # 初始化方法,传递参数
        self._times = times  # 参数赋值

    def __call__(self, fn):  # 魔法方法,当类被调用时执行
        @wraps(fn)  # 保留原方法函数名
        def wrapper(*args, **kwargs):  # 装饰器方法
            print('foo')  # 在目标函数之前运行
            for _ in range(self._times):  # 执行多少次
                fn(*args, **kwargs)  # 执行目标函数
            print('bar')  # 在目标函数之后运行
        return wrapper  # 返回装饰猴年的方法

94、python调试

在cmd窗口中启动python脚本调试:python -m pdb xxx.py,启用pdb对python脚本进行调试。

95、python容器

Python附带一个模块,它包含许多容器数据类型,名字叫作collections。我们将讨论它的作用和用法。

有:

  • defaultdict
  • counter
  • deque
  • namedtuple
  • enum.Enum (包含在Python 3.4以上)

96、PEP Python Enhancement Proposal

97、比较重要的语法元素:

python内置2种集合:

98、

super(子类名, self) . 父类方法()

使用super的缺陷:混用super和传统调用CABB问题、每个基类__init__的参数个数不同问题

  • 应该避免多重继承, 使用一些设计模式替代
  • super的使用必须一致, 在类层次结构中, 应该在所有地方使用super或者彻底不使用它。混用super和传统调用是一种混乱的方法, 人们倾向于避免使用super, 这样使代码更清晰。
  • 不要混用老式和新式的类, 两者都具备的代码库将导致不同的MRO表现。
  • 调用父类时必须检查类层次, 避免出现任何代码问题, 每次调用父类时, 必须查看一下所涉及的MRO(使用mro

99、
 

猜你喜欢

转载自blog.csdn.net/chenkaifang/article/details/81138487