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 装饰器功能以及函数参数使用介绍
Jan 27 Python
Python中字典(dict)和列表(list)的排序方法实例
Jun 16 Python
Python使用Flask框架获取当前查询参数的方法
Mar 21 Python
python在不同层级目录import模块的方法
Jan 31 Python
Python爬虫中urllib库的进阶学习
Jan 05 Python
浅谈flask中的before_request与after_request
Jan 20 Python
Python中作用域的深入讲解
Dec 10 Python
DataFrame:通过SparkSql将scala类转为DataFrame的方法
Jan 29 Python
selenium python 实现基本自动化测试的示例代码
Feb 25 Python
Python安装与基本数据类型教程详解
May 29 Python
python实现五子棋程序
Apr 24 Python
Pytorch使用shuffle打乱数据的操作
May 20 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
使用session判断用户登录用户权限(超简单)
2013/06/08 PHP
WordPress开发中自定义菜单的相关PHP函数使用简介
2016/01/05 PHP
Gird组件 Part-3:范例RSSFeed Viewer
2007/03/10 Javascript
editable.js 基于jquery的表格的编辑插件
2011/10/24 Javascript
jquery自动切换tabs选项卡的具体实现
2013/12/24 Javascript
Extjs表单常见验证小结
2014/03/07 Javascript
scrollWidth,clientWidth,offsetWidth的区别
2015/01/13 Javascript
setinterval()与clearInterval()JS函数的调用方法
2015/01/21 Javascript
浅谈setTimeout 与 setInterval
2015/06/23 Javascript
jQuery实现的经典滑动门效果
2015/09/22 Javascript
Bootstrap导航条可点击和鼠标悬停显示下拉菜单
2016/11/25 Javascript
webpack+vue+express(hot)热启动调试简单配置方法
2018/09/19 Javascript
Vue编程式跳转的实例代码详解
2019/07/10 Javascript
layui多iframe页面控制定时器运行的方法
2019/09/05 Javascript
Python使用dis模块把Python反编译为字节码的用法详解
2016/06/14 Python
Python爬取附近餐馆信息代码示例
2017/12/09 Python
Python中的CSV文件使用&quot;with&quot;语句的方式详解
2018/10/16 Python
Python字符串通过'+'和join函数拼接新字符串的性能测试比较
2019/03/05 Python
PyTorch中反卷积的用法详解
2019/12/30 Python
在flask中使用python-dotenv+flask-cli自定义命令(推荐)
2020/01/05 Python
Python参数传递实现过程及原理详解
2020/05/14 Python
python实现无边框进度条的实例代码
2020/12/30 Python
五分钟学会怎么用python做一个简单的贪吃蛇
2021/01/12 Python
HTML5 和小程序实现拍照图片旋转、压缩和上传功能
2018/10/08 HTML / CSS
英国巧克力贸易公司:Chocolate Trading Company
2017/03/21 全球购物
租租车:国际租车、美国租车、欧洲租车、特价预订国外租车(中文服务)
2018/03/28 全球购物
英国曼彻斯特宠物用品品牌:Bunty Pet Products
2019/07/27 全球购物
在c#中using和new这两个关键字有什么意义
2013/05/19 面试题
党员自我评价分享
2013/12/13 职场文书
服装厂厂长职责
2013/12/16 职场文书
党委班子对照检查材料
2014/08/19 职场文书
中国梦演讲稿开场白
2014/08/28 职场文书
2014年领班工作总结
2014/11/25 职场文书
python绘制箱型图
2021/04/27 Python
Golang 空map和未初始化map的注意事项说明
2021/04/29 Golang
postgresql 删除重复数据案例详解
2021/08/02 PostgreSQL