python杂记 20200207 离线安装 正则

正则匹配小括号:

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目录的区别

  1. sudo apt-get install 安装的package存放在 /usr/lib/python2.7/dist-packages目录中
  2. pip 或者 easy_install安装的package存放在/usr/local/lib/python2.7/dist-packages目录中
  3. 手动从源代码安装的package存放在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循环

class Squares(object):
    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
4
array = [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】

原文地址:https://www.cnblogs.com/testzcy/p/12273688.html