学至今日,回想这两个月的python学习成果,初感貌似东西不多,但转而细细回想,一些知识点的脉络出现头绪进而逐渐清晰,下面我就大致浅谈一下最近一段时间学习的总结吧,当然考虑到篇幅及时间的原因,这里只能做一下有节选的小结。 引用中分为不可变类型与可变类型,不可变类型是修改里面的数据内容,内存起始地址必定发生改变,包括数字类型,布尔值,字符串还有元组;而可变类型则是修改内容,内存起始地址不变,包括列表和字典。 函数名其实就是指向一个函数对象的引用,完全可以把函数名赋给一个变量,相当于给这个函数起了一个“别名”。 函数中实例属性和类属性的区别: 类属性对于每个类实例对象都有,可以通过类对象创建,而实例属性则是类属性中独具个性的属性,它们是相互独立互不干扰的,可通过类对象或实例对象创建。 模块导入时,每一个包目录下面都会有一个init.py的文件,这个文件是必须存在的,否则,Python就把这个目录当成普通目录,而不是一个包。init.py可以是空文件,也可以有Python代码,因为init.py本身就是一个模块,而它的模块名就是包的名字。 装饰器decorator: 可以将原函数对象的指定属性复制给包装函数对象, 或者通过参数选择。以下的万能选择器在不修改源代码的情况下,给源代码添加新的功能,如下: def set_fun(func): def call_fun(*args, **kwargs): print("添加额外的功能") return func(*args, **kwargs) return call_fun @set_fun def test(*args, **kwargs): print(args) print(kwargs) return 100 value = test(31, 63, a=312263) print(value) 文件操作: read: 一次性读取整个文件。 readline: 读取一行,readlines: 读取整个文件到迭代器。用with打开文件的方式比较好,会自动关闭文件。读取非UTF-8编码的文本文件,需要给open()函数传入encoding参数。如果文本文件中可能混杂了一些非法的编码的字符,open()还可以接受一个errors参数,处理最简单的方法是忽略(ignore),即errors=’ignore’。
多进程: (multiprocessing)
Process: from multiprocessing import Process,proc = Process(target,args),proc.start(),proc.join() 1,分布式进程: multiprocessing.managers 2,注意: 在多进程中,同一个变量,各自有一份拷贝存在于每个进程中,互不影响;而多线程中,所有变量都由所有线程共享
进程池(Pool)
from multiprocessing import Pool
proc = Pool(4) ,proc.apply_async(target,args),proc.close(), proc.join(), close之后就不能添加新的process了。
多线程(threading) Threading thread = threading.Tread(target,args,name),thread.start(),thread.join()
1,锁: lock = threading.Lock() ,eg:lock.acquire() ,try: something… finally: lock.release() 一定要释放锁。
2,获取现在线程的名字: threading.current_thread().name 3,在Tread和Process中,应该优先选Process。 协程:单线程的异步编程模型。 协程: 利用进程+协程可以很大的程度上利用多核的cpu。
python对协程的支持是通过generator实现的。
如果一个函数包含yield关键字,那这个函数就不是普通的函数了,而是一个generator。
注意: yield不但可以返回一个值,还可以接收调用者发出的参数。 先返回后接收调用者发出的参数。
|