前言
有幸拜读了《改善Python程序的91个建议》,学到很多python代码的小技巧。书写的很全,分的很细,很多知识如果想深入了解的,是仍然要通过其他渠道来学习的。
电子版书籍下载:
笔记
以下是从我的角度,记录下的部分笔记
理解 Pythonic 概念
- 美胜丑,显胜隐,简胜杂,杂胜乱,平胜陡,疏胜密。
- 找到简单问题的一个方法,最好是唯一的方法(正确的解决之道)。
- 难以解释的实现,源自不好的主意;如有非常棒的主意,它的实现肯定易于解释。
eval
警惕eval()的安全漏洞
enumerate
# python 迭代中字典获取k,v的方法
for k,v in personinfo.iteritems():
print k,":",v
使用enumerate()获取序列迭代的索引和值
# 获取索引
li = ['1','2','3']
for i, e in enumerate(li):
print i, e
is 与 ==
is 与 ==
is 用来比较两个对象在内存中是否拥有同一块内存空间,并不适用于字段串的比较
x is y 只有x,y是同一个对象时才返回true
a == b 类似 a.__equal__(b)
'a' is 'a'
print True
这个是因为python的string interning机制造成的,对于较小的字符串,系统只是保留其值的一个副本
i+=1 ++i
++i与–i
i+=1 不等同于 ++i
with的妙用
对文件操作,操作完就应该立即关闭之。
使用with自动关闭资源
无论程序以何种方式跳出with块,总能保证文件被正确关闭
with open('test.txt', 'w') as f:
f.write('test')
深入理解None
深入理解None,正确判断对象是否为空
python中的空对象
常量None
常量False
任何形式的0数值:0 、0L、0.0、0j
空的结构:[],{},”,()
join、+连接字符串
连接字符串优先 join,而不是+
join效率高
join会计算总的内存空间,时间复杂度是n(n)
+的时间复杂度是n(n^2)
ConfigParser用法
解析配置文件
# encoding: utf-8
import ConfigParser
conf = ConfigParser.ConfigParser()
conf.read('test.conf')
print conf.sections()
print conf.options('sec_a')
# ['sec_a', 'sec_b'] 展示section下所有的option,可以理解为key
print conf.items('sec_a')
# [('a_key1', '20'), ('a_key2', '10')]将这个section下的值以kv形式展现
print conf.get('sec_a', 'a_key1')
# 20 获取指定section,option下的值,类似于value,结果是string
print conf.getint('sec_a', 'a_key1')
# 20 结果是int型
conf.set('sec_a', 'c_key1', '100')
print conf.options('sec_a')
conf.write(open("test.conf", 'w'))
# section 必须存在,如果option存在,则是修改value,否则就是新增一个option,最终只有conf.write后才算真正写入
conf.add_section('sec_c')
conf.write(open("test.conf", 'w'))
# 新增一个section
理解GIL
- GIL被称为为全局解释器锁(Global Interpreter Lock),是Python虚拟机上用作互斥线程的一种机制,它的作用是保证任何情况下虚拟机中只会有一个线程被运行,而其他线程都处于等待GIL锁被释放的状态。对于有I/O操作的多线程。不管是在单核系统还是多核系统中,始终只有一个获得了GIL锁的线程在运行,每次遇到I/O操作便会进行GIL锁的释放。
- 如果是纯计算的程序,没有I/O操作,解释器则会根据sys.setcheckinterval的设置来自动进行线程间的切换,默认情况下每隔100个时钟(注:这里的时钟指的是Python的内部时钟,对应于解释器执行的指令)就会释放GIL锁从而轮换到其他线程的执行
GIL的引入确实使得多线程不能在多核系统中发挥优势,但它也带来了一些好处:大大简化了Python线程中共享资源的管理,在单核CPU上,由于其本质是顺序执行的,一般情况下多线程能够获得较好的性能。此外,对于扩展的C程序的外部调用,即使其不是线程安全的,但由于GIL的存在,线程会阻塞直到外部调用函数返回,线程安全不再是一个问题。