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中的WSGI接口
May 11 Python
Python判断两个对象相等的原理
Dec 12 Python
Python简单实现的代理服务器端口映射功能示例
Apr 08 Python
python3 对list中每个元素进行处理的方法
Jun 29 Python
对numpy中向量式三目运算符详解
Oct 31 Python
利用anaconda保证64位和32位的python共存
Mar 09 Python
python动态视频下载器的实现方法
Sep 16 Python
python线程定时器Timer实现原理解析
Nov 30 Python
django 模型中的计算字段实例
May 19 Python
keras的backend 设置 tensorflow,theano操作
Jun 30 Python
Python-openCV开运算实例
Jul 05 Python
python 还原梯度下降算法实现一维线性回归
Oct 22 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
用PHP4访问Oracle815
2006/10/09 PHP
计算一段日期内的周末天数的php代码(星期六,星期日总和)
2009/11/12 PHP
PHPMYADMIN导入数据最大为2M的解决方法
2012/04/23 PHP
php中使用临时表查询数据的一个例子
2013/02/03 PHP
PHP魔术引号所带来的安全问题分析
2014/07/15 PHP
ThinkPHP单字母函数(快捷方法)使用总结
2014/07/23 PHP
php几个预定义变量$_SERVER用法小结
2014/11/07 PHP
php实现通用的从数据库表读取数据到数组的函数实例
2015/03/21 PHP
jQuery 遍历-nextUntil()方法以及prevUntil()方法的使用介绍
2013/04/26 Javascript
js 实现日期灵活格式化的小例子
2013/07/14 Javascript
分享一个自己动手写的jQuery分页插件
2014/08/28 Javascript
vue2.0+webpack环境的构造过程
2016/11/08 Javascript
js使用i18n实现页面国际化的方法
2017/05/09 Javascript
js操作二进制数据方法
2018/03/03 Javascript
Vue2.0点击切换类名改变样式的方法
2018/08/22 Javascript
基于element-ui对话框el-dialog初始化的校验问题解决
2020/09/11 Javascript
Python入门篇之编程习惯与特点
2014/10/17 Python
django连接mysql配置方法总结(推荐)
2018/08/18 Python
Django安装配置mysql的方法步骤
2018/10/15 Python
使用python对excle和json互相转换的示例
2018/10/23 Python
python读取txt文件,去掉空格计算每行长度的方法
2018/12/20 Python
python实现文本进度条 程序进度条 加载进度条 单行刷新功能
2019/07/03 Python
Python函数装饰器原理与用法详解
2019/08/16 Python
在python中计算ssim的方法(与Matlab结果一致)
2019/12/19 Python
Win10下安装并使用tensorflow-gpu1.8.0+python3.6全过程分析(显卡MX250+CUDA9.0+cudnn)
2020/02/17 Python
小程序瀑布流解决左右两边高度差距过大的问题
2019/02/20 HTML / CSS
法国发饰品牌:Alexandre De Paris
2018/12/04 全球购物
NULL是什么,它是怎么定义的
2015/05/09 面试题
初一科学教学反思
2014/01/27 职场文书
婚礼主持词开场白
2014/03/13 职场文书
《莫泊桑拜师》教学反思
2014/04/23 职场文书
购房委托书范本
2014/09/18 职场文书
事业单位工作人员年度考核个人总结
2015/02/12 职场文书
小学体育组工作总结2015
2015/07/21 职场文书
师德师风心得体会(2016精选篇)
2016/01/12 职场文书
python编写五子棋游戏
2021/05/25 Python