python杂记 20200207 离线安装 正则
时间与字符串相互转换
import dateutil.parser from datetime import datetime execution_date = datetime.now().isoformat() print(execution_date, type(execution_date)) execution_date = dateutil.parser.parse(execution_date) #dateutil模块parser从字符串中解析出时间对象 print(execution_date, type(execution_date))
输出:
('2022-06-25T19:06:02.556000', <type 'str'>)
(datetime.datetime(2022, 6, 25, 19, 6, 2, 556000), <type 'datetime.datetime'>)
正则匹配小括号:
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包的离线安装,如下:
![](https://img2020.cnblogs.com/blog/1161222/202007/1161222-20200707205017962-121161594.png)
压缩包安装的话,包以及安装包的依赖包都存在了,所以可以直接在服务器不联网安装成功,whl文件安装包的时候,所需要的依赖包还需要联网下载,
所以没网的时候有时候有依赖包的话就安装不成功
py转成pyc:python -m compileall hh.py
os.getcwd() 方法用于返回当前工作目录。
使用 pyinstaller
可以将python程序打包成 exe 程序
python的dist-packages目录和site-packages目录的区别
- sudo apt-get install 安装的package存放在 /usr/lib/python2.7/dist-packages目录中
- pip 或者 easy_install安装的package存放在/usr/local/lib/python2.7/dist-packages目录中
- 手动从源代码安装的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】
如果只想要一个队列容器,用deque;如果想线程间同步,生产者消费者什么的,用Queue。