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
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、