《改善Python程序的91个建议》读书笔记(部分)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013128262/article/details/69076615

前言

有幸拜读了《改善Python程序的91个建议》,学到很多python代码的小技巧。书写的很全,分的很细,很多知识如果想深入了解的,是仍然要通过其他渠道来学习的。
电子版书籍下载:http://download.csdn.net/detail/u013128262/9631704

笔记

以下是从我的角度,记录下的部分笔记

理解 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的存在,线程会阻塞直到外部调用函数返回,线程安全不再是一个问题。

其他人的笔记

他山之石可以攻玉,可以看看别人是怎么总结的。
https://zhuanlan.zhihu.com/p/26155739

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页