Python编码时应该注意的几个情况


Posted in Python onMarch 04, 2013

在编程过程中,多了解语言周边的一些知识,以及一些技巧,可以让你加速成为一个优秀的程序员。
对于Python程序员,你需要注意一下本文所提到的这些事情。你也可以看看Zen of Python(Python之禅),这里面提到了一些注意事项,并配以示例,可以帮助你快速提高。

1. 漂亮胜于丑陋

实现一个功能:读取一列数据,只返回偶数并除以2。下面的代码,哪个更好一些呢?

#----------------------------------------
halve_evens_only = lambda nums: map(lambda i: i/2, filter(lambda i: not i%2, nums))  
#----------------------------------------
def halve_evens_only(nums):
   return [i/2 for i in nums if not i % 2]

2. 记住Python中非常简单的事情

# 交换两个变量
a, b = b, a
# 切片(slice)操作符中的step参数。(切片操作符在python中的原型是[start:stop:step],即:[开始索引:结束索引:步长值])
a = [1,2,3,4,5]
>>> a[::2] # 遍历列表中增量为2的数据
[1,3,5]
# 特殊情况下,`x[::-1]`是实现x逆序的实用的方式
>>> a[::-1]  
[5,4,3,2,1]
# 逆序并切片
>>> x[::-1]
[5, 4, 3, 2, 1]
>>> x[::-2]
[5, 3, 1]

3. 不要使用可变对象作为默认值

def function(x, l=[]): #不要这样def function(x, l=None): # 好的方式
   if l is None:
      l = []

这是因为当def声明被执行时,默认参数总是被评估。

4. 使用iteritems而不是items

iteritems 使用generators ,因此当通过非常大的列表进行迭代时,iteritems 更好一些。
d = {1: "1", 2: "2", 3: "3"}
for key, val in d.items() # 当调用时构建完整的列表
for key, val in d.iteritems() # 当请求时只调用值

5. 使用isinstance ,而不是type

# 不要这样做         
if type(s) == type(""): ...
if type(seq) == list or \
   type(seq) == tuple: ...# 应该这样
if isinstance(s, basestring): ...
if isinstance(seq, (list, tuple)): ...

原因可参阅:stackoverflow

注意我使用的是basestring 而不是str,因为如果一个unicode对象是字符串的话,可能会试图进行检查。例如:

>>> a=u'aaaa'
>>> print isinstance(a, basestring)
    True
>>> print isinstance(a, str)
    False

这是因为在Python 3.0以下版本中,有两个字符串类型str 和unicode。

6. 了解各种容器

Python有各种容器数据类型,在特定的情况下,相比内置容器(如list 和dict ),这是更好的选择。

我敢肯定,大部分人不使用它。我身边一些粗心大意的人,一些可能会用下面的方式来写代码。

freqs = {}
for c in "abracadabra":
    try:
        freqs[c] += 1
    except:
        freqs[c] = 1

也有人会说下面是一个更好的解决方案:

freqs = {}
  for c in "abracadabra":
      freqs[c] = freqs.get(c, 0) + 1

更确切来说,应该使用collection 类型defaultdict。

from collections import defaultdict
freqs = defaultdict(int)
for c in "abracadabra":
    freqs[c] += 1

其他容器:
namedtuple()    # 工厂函数,用于创建带命名字段的元组子类 
deque           # 类似列表的容器,允许任意端快速附加和取出 
Counter   # dict子类,用于哈希对象计数 
OrderedDict   # dict子类,用于存储添加的命令记录 
defaultdict   # dict子类,用于调用工厂函数,以补充缺失的值

7. Python中创建类的魔术方法(magic methods)

    __eq__(self, other)      # 定义 == 运算符的行为 
    __ne__(self, other)      # 定义 != 运算符的行为 
    __lt__(self, other)      # 定义 < 运算符的行为 
    __gt__(self, other)      # 定义 > 运算符的行为 
    __le__(self, other)      # 定义 <= 运算符的行为 
    __ge__(self, other)      # 定义 >= 运算符的行为

8. 必要时使用Ellipsis(省略号“...”)

Ellipsis 是用来对高维数据结构进行切片的。作为切片(:)插入,来扩展多维切片到所有的维度。例如:

>>> from numpy import arange
    >>> a = arange(16).reshape(2,2,2,2)    # 现在,有了一个4维矩阵2x2x2x2,如果选择4维矩阵中所有的首元素,你可以使用ellipsis符号。
    >>> a[..., 0].flatten()
    array([ 0, 2, 4, 6, 8, 10, 12, 14])
    # 这相当于
    >>> a[:,:,:,0].flatten()
    array([ 0, 2, 4, 6, 8, 10, 12, 14])
Python 相关文章推荐
python压缩文件夹内所有文件为zip文件的方法
Jun 20 Python
Python引用类型和值类型的区别与使用解析
Oct 17 Python
numpy数组拼接简单示例
Dec 15 Python
基于python代码实现简易滤除数字的方法
Jul 17 Python
对Python中的条件判断、循环以及循环的终止方法详解
Feb 08 Python
使用Python的SymPy库解决数学运算问题的方法
Mar 27 Python
Python进程间通信Queue消息队列用法分析
May 22 Python
PyCharm-错误-找不到指定文件python.exe的解决方法
Jul 01 Python
Python使用正则实现计算字符串算式
Dec 29 Python
Python+unittest+requests 接口自动化测试框架搭建教程
Oct 09 Python
python实现扫雷游戏的示例
Oct 20 Python
基于Python-turtle库绘制路飞的草帽骷髅旗、美国队长的盾牌、高达的源码
Feb 18 Python
python中定义结构体的方法
Mar 04 #Python
Python语言技巧之三元运算符使用介绍
Mar 04 #Python
python解决字典中的值是列表问题的方法
Mar 04 #Python
python实现的各种排序算法代码
Mar 04 #Python
python 获取本机ip地址的两个方法
Feb 25 #Python
把大数据数字口语化(python与js)两种实现
Feb 21 #Python
python正则表达式修复网站文章字体不统一的解决方法
Feb 21 #Python
You might like
用PHP连接Oracle for NT 远程数据库
2006/10/09 PHP
PHP has encountered an Access Violation at 7C94BD02解决方法
2009/08/24 PHP
PHP使用CURL实现对带有验证码的网站进行模拟登录的方法
2014/07/23 PHP
PHP中魔术变量__METHOD__与__FUNCTION__的区别
2014/09/29 PHP
总结PHP如何获取当前主机、域名、网址、路径、端口和参数等
2016/09/09 PHP
浅谈PHP的$_SERVER[SERVER_NAME]
2017/02/04 PHP
jquery如何改变html标签的样式(两种实现方法)
2013/01/16 Javascript
JS+ACTIVEX实现网页选择本地目录路径对话框
2013/03/18 Javascript
jQuery实现时尚漂亮的弹出式对话框实例
2015/08/07 Javascript
jquery制作属于自己的select自定义样式
2015/11/23 Javascript
jquery实现表格中点击相应行变色功能效果【实例代码】
2016/05/09 Javascript
AngularJs学习第五篇从Controller控制器谈谈$scope作用域
2016/06/08 Javascript
Angular2开发环境搭建教程之VS Code
2017/12/15 Javascript
angular2中Http请求原理与用法详解
2018/01/11 Javascript
浅谈AngularJS中$http服务的简单用法
2018/05/15 Javascript
Vue press 支持图片放大功能的实例代码
2018/11/09 Javascript
JS使用正则表达式判断输入框失去焦点事件
2019/10/16 Javascript
JS数组方法concat()用法实例分析
2020/01/18 Javascript
[45:17]DOTA2-DPC中国联赛定级赛 Phoenix vs DLG BO3第三场 1月9日
2021/03/11 DOTA
Python 的 with 语句详解
2014/06/13 Python
Python Web框架Flask下网站开发入门实例
2015/02/08 Python
Python中的高级数据结构详解
2015/03/27 Python
最基础的Python的socket编程入门教程
2015/04/23 Python
面向初学者的Python编辑器Mu
2018/10/08 Python
pyqt弹出新对话框,以及关闭对话框获取数据的实例
2019/06/18 Python
python第三方库学习笔记
2020/02/07 Python
Python3监控疫情的完整代码
2020/02/20 Python
PyCharm 光标变成黑块的解决方式
2021/02/06 Python
对pytorch中x = x.view(x.size(0), -1) 的理解说明
2021/03/03 Python
工会主席岗位责任制
2014/02/11 职场文书
就业协议书的作用
2014/04/11 职场文书
交通事故协议书
2014/04/15 职场文书
2014年销售内勤工作总结
2014/12/01 职场文书
CSS3实现的侧滑菜单
2021/04/27 HTML / CSS
详细聊聊关于Mysql联合查询的那些事儿
2021/10/24 MySQL
Java+swing实现抖音上的表白程序详解
2022/06/25 Java/Android