python学习笔记

这篇博客涵盖了Python的赋值技巧、Mixins、局部作用域的陷阱、并发并行概念、列表操作、字符串与字典使用、异常处理、模块与弱引用、装饰器应用等内容,深入探讨了Python语言的高效使用方法和底层机制。
摘要由CSDN通过智能技术生成
  1. python赋值a,b = b,a 函数unpack
def foo()
    return 3, 5,5
a, b = foo()
  1. Mixin利用多继承机制,为新类添加新的功能
  2. 局部作用域的坑
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求表达式的值,
  1. 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得到的对象可读性较好不能重新得到对象
  • 整型和字符串类型是不可变类型
  1. 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
		
  1. 装饰器的特性:能把被装饰的函数转换为另一个函数,在加载模块时自动执行,且只执行一次。装饰器用途是将一些非业务的代码抽象出来,比如打印日志,函数路由,前函数运行时间等的非业务代码。装饰器给一个函数添加缓存, 其中@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('小小', '修改数据')
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值