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 HTMLParser模块解析html获取url实例
Apr 08 Python
python返回昨天日期的方法
May 13 Python
python检查指定文件是否存在的方法
Jul 06 Python
Python 爬虫多线程详解及实例代码
Oct 08 Python
Python快速从注释生成文档的方法
Dec 26 Python
Python编程之string相关操作实例详解
Jul 22 Python
Python创建二维数组实例(关于list的一个小坑)
Nov 07 Python
Python中断多重循环的几种方式详解
Feb 10 Python
OpenCV Python实现拼图小游戏
Mar 23 Python
python实现一次性封装多条sql语句(begin end)
Jun 06 Python
在tensorflow以及keras安装目录查询操作(windows下)
Jun 19 Python
Python读取多列数据以及用matplotlib制作图表方法实例
Sep 23 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
转生史莱姆:萌王第一次撸串开心到飞起,哥布塔撸串却神似界王神
2018/11/30 日漫
SONY ICF-SW07收音机电路分析
2021/03/02 无线电
利用php获取服务器时间的实现代码
2013/06/07 PHP
Firefox window.close()的使用注意事项
2009/04/11 Javascript
js获取图片长和宽度的代码
2009/11/24 Javascript
JQuery学习笔记 nt-child的使用
2011/01/17 Javascript
关于onScroll事件在IE6下每次滚动触发三次bug说明
2011/09/21 Javascript
关于jquery ajax 调用带参数的webservice返回XML数据一个小细节
2012/07/31 Javascript
javascript 数组排序函数sort和reverse使用介绍
2013/11/21 Javascript
Bootstrap与KnockoutJs相结合实现分页效果实例详解
2016/05/03 Javascript
jQuery实现的导航下拉菜单效果
2016/07/04 Javascript
jQuery插件DataTable使用方法详解(.Net平台)
2016/12/22 Javascript
jQuery实现可拖动进度条实例代码
2017/06/21 jQuery
Angular2生命周期钩子函数的详细介绍
2017/07/10 Javascript
webpack学习教程之前端性能优化总结
2017/12/05 Javascript
vue微信分享的实现(在当前页面分享其他页面)
2019/04/16 Javascript
Vue.js 实现地址管理页面思路详解(地址添加、编辑、删除和设置默认地址)
2019/12/11 Javascript
JavaScript实现滑动门效果
2020/01/18 Javascript
vue实现购物车加减
2020/05/30 Javascript
解决vue无法侦听数组及对象属性的变化问题
2020/07/17 Javascript
关于你不想知道的所有Python3 unicode特性
2014/11/28 Python
基于进程内通讯的python聊天室实现方法
2015/06/28 Python
Python实现模拟登录及表单提交的方法
2015/07/25 Python
Django使用httpresponse返回用户头像实例代码
2018/01/26 Python
详解python中list的使用
2019/03/15 Python
基于Python绘制美观动态圆环图、饼图
2020/06/03 Python
Python3+Appium安装及Appium模拟微信登录方法详解
2021/02/16 Python
html5 Canvas画图教程(3)—canvas出现1像素线条模糊不清的原因
2013/01/09 HTML / CSS
乐高西班牙官方商店:LEGO Shop ES
2019/12/01 全球购物
是否有自动比较结构的方法
2015/06/03 面试题
学校万圣节活动方案
2014/02/13 职场文书
材料物理专业求职信
2014/09/01 职场文书
美容院合作经营协议书
2014/10/10 职场文书
合作意向协议书
2015/01/29 职场文书
2015大学自主招生自荐信范文
2015/03/04 职场文书
MySQL 逻辑备份 into outfile
2022/05/15 MySQL