- python赋值a,b = b,a 函数unpack
def foo()
return 3, 5,5
a, b = foo()
- Mixin利用多继承机制,为新类添加新的功能
- 局部作用域的坑
def fun(v):
v2 = 'a local'
def local_fun():
v3 = v2 + v
v2 = 'try to def'
return v3
局部变量v2将报错,因为后续有对v2的赋值,python的名字查找被限定在了改区域,所有前面的v2将出现未定义错误。还有其他类似赋值的操作比如import, for等
参考《python命名空间》
4. 并发和并行 《efficiently Exploiting Multiple Cores with Python》
《understandding the Python GIL》,python线程,GIL和ctypes,《理解python coroutine》《python协程:从yield/send到async/await》
5.
- 通过分片可以实现列表的插入和删除操作
- 列表sort函数会改变原序列,sorted不会改变原序列返回修改后的值
- 对字符串进行in操作可以实现字符串匹配操作
- String模块提供了模板字符串的方法,可以用来格式化字符串(Template)
- dict可以用作字符串格式化用在%后面
- ''和[]的布尔值都为False
- enumerate可以迭代出序列的索引
- exec执行python语句,eval求表达式的值,
- python性能调试
- 《gtrace的使用方法》
- 《Faster CPython》
- 《pytracemalloc的安装和使用》
- 《pytracemalloc内部实现和扩展
- hasattr可以判断函数是否可以调用hasattr(func, call)
- 在函数或者类的前面写上字符串表示文档化字符串
- 函数参数名前加表示收集参数,函数内参数作为元组使用。参数名前加**表示关键字参数函数内部作为字典使用
- globals()获取全局变量,locals()获取局部变量,函数内部为全局变量重新赋值,变量会变成局部变量,需要声明global表示该变量为全局变量
- _xxx 不能用于’from module import *’ 以单下划线开头的表示的是protected类型的变量。即保护类型只能允许其本身与子类进行访问。__xxx 双下划线的表示的是私有类型的变量。只能是允许这个类本身进行访问了。连子类也不可以
- 多重继承下,先继承的父类同名方法会重写后继承父类的同名方法
- hasattr和getattr 判断类是否有方法和获取方法
- 子类初始化时要显示调用父类的构造函数,否则子类不能被正确的初始化。
- 可以通过调用类的未绑定方法,为类方法传递self参数
- python类方法通过写入@classmethod实现,可以通过对象或者访问类方法,并且可以通过cls参数访问对象的成员(staticmethod不能方法对象的成员)
@classmethod
def classmethod(cls, arg):
- yield实现生成器 实现惰性求值,提高生成序列的效率。生成器由两部分组成:生成器的函数和生成器的迭代器
- 模块:dir可以查看模块中的内容(方法属性等),__all__含有模块中定义的共有接口,编写模块设定__all__可以避免导入无用信息。__file__可以查看模块的路径
- python weakref对象的非永久引用:引用一个昂贵的对象,如果对象不存在存在其他非弱引用,可以直接销毁对象,避免正常引用造成引用计数增加的弊端,通过代理weak.proxy可以像使用原对象一样使用类。
8.一个下划线和两个下划线定义的变量不能被from module import * 导入,两个下划线类中定义的变量不能被访问
- id(var1) == id(var2) 用来比较两个变量是否引用同一个对象 python会缓存简单整型(-1, 100)
- repr和··得到的对象字符串可以通过eval操作重新得到对象,str得到的对象可读性较好不能重新得到对象
- 整型和字符串类型是不可变类型
- python热更新
- 删除原来对象中的模块名,替换成新的模块名
def hotfix(o):
cls_name = o.__class__.__name__
mod_name = o.__module__
del sys.modules[mod_name]
mod = __import__(mod_name)
new = getattr(mod, cls_name, None)
if new != None:
print '**reload:', mod, new
o.__class__ = new
- 装饰器的特性:能把被装饰的函数转换为另一个函数,在加载模块时自动执行,且只执行一次。装饰器用途是将一些非业务的代码抽象出来,比如打印日志,函数路由,前函数运行时间等的非业务代码。装饰器给一个函数添加缓存, 其中@wraps作用是保证fib的函数名不被wrapppermemoizer取代
from functools import wraps
def memoize(fn):
known = dict()
@wraps(fn)
def memoizer(*args):
if args not in known:
known[args] = fn(*args)
return known[args]
return memoizer
同时也支持用类的方式声明装饰器
# -*- coding:utf-8 -*-
from functools import wraps
from datetime import datetime
#类的装饰器写法,日志
class log(object):
def __init__(self, logfile='c:\out.log'):
self.logfile = logfile
def __call__(self, func):
@wraps(func)
def wrapped_func(*args, **kwargs):
self.writeLog(*args, **kwargs) # 先调用 写入日志
return func(*args, **kwargs) # 正式调用主要处理函数
return wrapped_func
#写入日志
def writeLog(self, *args, **kwargs):
time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
log_str = time+' 操作人:{0[0]} 进行了【{0[1]}】操作'.format(args)
with open(self.logfile, 'a',encoding='utf8') as file:
file.write(log_str + '\n')
@log()
def myfunc(name,age):
print('姓名:{0},年龄:{1}'.format(name,age))
if __name__ == '__main__':
myfunc('小白', '查询')
myfunc('root', '添加人员')
myfunc('小小', '修改数据')