正则匹配小括号:
ss = u'陈奕迅(十年)sdf'
ss = '晨光(M&G)素描纸'
s = re.sub(r'\((.*?)\)',' ',ss)
s = re.sub(r'\((.*?)\)',' ',ss)
======
python cookbook:https://python3-cookbook.readthedocs.io/zh_CN/latest/index.html
离线安装
通过下载zip或tar.gz包可以实现python包的离线安装,如下:压缩包安装的话,包以及安装包的依赖包都存在了,所以可以直接在服务器不联网安装成功,whl文件安装包的时候,所需要的依赖包还需要联网下载,所以没网的时候有时候有依赖包的话就安装不成功
py转成pyc:python -m compileall hh.py
os.getcwd() 方法用于返回当前工作目录。
使用 pyinstaller 可以将python程序打包成 exe 程序
python的dist-packages目录和site-packages目录的区别
Python 列表的实际实现基于数组的概念
============
python 魔术方法指南: https://pycoders-weekly-chinese.readthedocs.io/en/latest/issue6/a-guide-to-pythons-magic-methods.html#id1
=========并发通信
Queue.Queue是进程内非阻塞队列,用于进程内的各函数模块或线程间通信。
multiprocess.Queue是跨进程通信队列。但是不能用于multiprocessing.Pool多进程的通信。
进程池multiprocessing.Pool()的多进程之间的通信要用multiprocessing.Manager().Queue()
==============
《Think Python》https://codingpy.com/books/thinkpython2/index.html
=============
def __len__(self): 只要正确实现了__len__()方法,就可以用len()函数“长度”:
class TST(object):def __init__(self,names):
self.names=names
def __len__(self):
return len(self.names)
aa=TST('sdf')
print(len(aa))
def __iter__(self):
只要实现了__iter__的对象就是可迭代对象(Iterable)
同时实现了__iter__和__next__的是迭代器(Iterator),当然也是一个可迭代对象了
__next__应该在迭代完成后,抛出一个StopIteration异常
for语句会自动处理这个StopIteration异常以便结束for循环
def __init__(self, start, stop):
self.value=start-1
self.stop=stop
def __iter__(self):
return self #因为自己实现了__next__方法,所以可以返回self
def __next__(self):
if self.value==self.stop:
raise StopIteration
self.value+=1
return self.value**2
x=Squares(1,5)
print([n for n in x]) # #[1, 4, 9, 16, 25]
print([n for n in x]) #同一个对象只能迭代一次[]
#要达到多个迭代器的效果,__iter__只需返回实现了__next__的对象,而不是返回self
class mynext(object):def __init__(self,start,stop):
self.value=start-1
self.stop=stop
def __next__(self):
if self.value==self.stop:
raise StopIteration
self.value+=1
return self.value**2
class Squares2(object):
def __init__(self, start, stop):
self.value=start-1
self.stop=stop
def __iter__(self):
return mynext(self.value,self.stop)
x=Squares2(1,5)
print([n for n in x]) # [1, 4, 9, 16, 25]
print([n for n in x]) #同一个对象可以被迭代多次 [1, 4, 9, 16, 25]
=================
def __setitem__(self,k,v) #将对象当作字典操作,设置键值对时会触发该方法
def __getitem__(self,k)#将对象当作字典操作,根据键获取值时会触发该方法
def __delitem__(self,k)#将对象当作字典操作,删除指定的键值对时自动触发
=========
n [1]: a = 'something'...: b = 'some'+'thing'
...: id(a)==id(b)
Out[1]: True #这与Cpython 编译优化相关,行为称为字符串驻留In [5]: d = {}
...: d[1] = 'java'
...: d[1.0] = 'python'
In [6]: d
Out[6]: {1: 'python'} #相同值的不可变对象在Python中始终具有相同的哈希值class SE(object):
def __init__(self):
print('init')
def __del__(self):
print('del')
In [63]: SE() is SE()
init
init
del
del
Out[63]: False
In [64]: id(SE()) == id(SE())
init
del
init
del
Out[64]: True
调用id函数, Python 创建一个 SE 类的实例,并使用id函数获得内存地址后,销毁内存丢弃这个对象。当连续两次进行此操作, Python会将相同的内存地址分配给第二个对象,所以两个对象的id值是相同的.In [65]: for i in range(5):
...: print(i)
...: i = 10
0
1
2
3
4array = [1, 3, 5]
g = (x for x in array if array.count(x) > 0)
list(g)后返回[1,3,5]
array = [1, 3, 5]
g = (x for x in array if array.count(x) > 0)
array = [5, 7, 9]
In [74]: list(g)
Out[74]: [5]
生成器表达式中, in 子句在声明时执行, 而条件子句则是在运行时执行。
上述代码等价于:
g = (x for x in [1,3,5] if [5,7,9].count(x) > 0)python的列表内部实现是数组(长度可变的数组,具体实现要看解析器CPython的实现 )
字典是通过hash函数和哈希桶实现的,(所以只有可哈希的对象才能作为字典的键)
集合内部实现是dict的logging 是线程安全的,在一个进程内的多个线程同时往同一个文件写日志是安全的。
但是多个进程往同一个文件写日志不是安全的对于不支持使用"with"语句的类似文件的对象,使用 contextlib.closing():
import contextlib
with contextlib.closing(urllib.urlopen("http://www.python.org/")) as front_page:
for line in front_page:
print line
优先使用Queue模块的 Queue 数据类型作为线程间的数据通信方式。
不要在函数或方法定义中使用可变对象作为默认值.
=========代码更快的三个技巧
编译成pyc本质上和py没有太大区别,只是对于这个模块的加载速度提高了,并没有提高代码的执行速度
将python源码打包成exe的工具,从而脱离python环境单独运行【可以通过Pyinstaller得到exe】
如果只想要一个队列容器,用deque;如果想线程间同步,生产者消费者什么的,用Queue。