Let’s get Pythonic

 

1. 警惕eval()带来的安全威胁

即使信任该字符串,最好还是应该使用ast.literal_eval()来代替。因为后者会检查字符串,是否是有效的python数据类型,从而避免一些风险。

2. 转换成浮点数来做除法

Python 2.7可以引入

from future import division

来避免除法运算的结果被截取,其实,这个模块就是为了把Python 2 不兼容的关键字和特性通过 __future__模块导入。在Python 2 中表现 Python 3.x 中的整除。

有兴趣的话,可以读一下PEP-0238

3. 异常处理

  • 保证异常处理中的代码量足够精简
  • 尽量避免直接像下面这样

Tip

在执行finally时,有个trap。
如果try模块中有异常,很不幸,finally模块中也存在一个异常的话,那try模块中的异常会被屏蔽。

4. 修饰器

先来看个最基本的例子:

给函数做一个缓存

5. repr()到底是什么

str()函数是用户在print时调用,用来显示给用户看的;repr()则是给解释器来看的,意思就是说,你repr()得到的结果,直接eval(repr(obj))就是obj本身。

6. 一个由reverse()引发的很有意思的问题

Interesting! m,n竟然还是相等的。Python Docs上写道

in place是个关键词。意思就是说它并没有做浅拷贝,而是直接修改内存上的数据(在reverse操作之前,m和n是共用同一个内存地址的,而reverse之后,m并没有做浅拷贝,所以m,n还是使用同一个内存)。

怎么样能让m,n做浅拷贝呢?使用[::-1]或者reversed()来替代即可。

7. 深浅拷贝

拓展一下6里所说的,我们来试下。

可以看到,里面的列表还是变化了。打印id一看,其实内嵌的列表还是共用同一个内存地址。

copy.deepcopy来解决就好。

说个题外话,a = b = []看着很酷,其实,很有可能在之后的使用中遇到不明bug。

8. +join的问题

问题起因,在我看requests源码时,看到的一段

很有意思的一点就是,作者在构造url时,他不是用+,而是特别喜欢用join。很有意思,一查才知道,the former is a very common and catastrophic mistake when building large strings. mark下,以后注意。

9. 简单的比较

直接链式比较。

再比如,

再比如,

10. else能有多酷

Python的else有点不太按常理出牌。
比如,

再比如,

11. 字典的默认值

12. zip~

通过zip把两个tuple结合一起,然后转成dict。

发表评论

电子邮件地址不会被公开。 必填项已用*标注