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 selenium如何设置等待时间
Sep 15 Python
浅谈function(函数)中的动态参数
Apr 30 Python
解决python写入mysql中datetime类型遇到的问题
Jun 21 Python
python numpy 显示图像阵列的实例
Jul 02 Python
Python实现的服务器示例小结【单进程、多进程、多线程、非阻塞式】
May 23 Python
在Python中使用turtle绘制多个同心圆示例
Nov 23 Python
python错误调试及单元文档测试过程解析
Dec 19 Python
python图形开发GUI库wxpython使用方法详解
Feb 14 Python
Python类的绑定方法和非绑定方法实例解析
Mar 04 Python
获取python运行输出的数据并解析存为dataFrame实例
Jul 07 Python
如何在scrapy中集成selenium爬取网页的方法
Nov 18 Python
使用Python的开发框架Brownie部署以太坊智能合约
May 28 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
索尼SONY ICF-7600A(W)电路分析
2021/03/01 无线电
PHP中路径问题的解决方案
2006/10/09 PHP
用PHP实现Ftp用户的在线管理的代码
2007/03/06 PHP
使用PHP实现蜘蛛访问日志统计
2013/07/05 PHP
PHP获得数组交集与差集的方法
2015/06/10 PHP
PHPStorm+XDebug进行调试图文教程
2016/06/13 PHP
php使用ftp实现文件上传与下载功能
2017/07/21 PHP
PHP实现搜索时记住状态的方法示例
2018/05/11 PHP
关于jQuery object and DOM element
2013/04/15 Javascript
Jquery显示和隐藏元素或设为只读(含Ligerui的控件禁用,实例说明介绍)
2013/07/09 Javascript
js如何实现淡入淡出效果
2020/11/18 Javascript
使用jQuery处理AJAX请求的基础学习教程
2016/05/10 Javascript
Javascript 闭包详解及实例代码
2016/11/30 Javascript
详解JavaScript的闭包、IIFE、apply、函数与对象
2016/12/21 Javascript
利用JS实现简单的日期选择插件
2017/01/23 Javascript
微信小程序多列选择器range-key使用详解
2020/03/30 Javascript
HTML5+JS+JQuery+ECharts实现异步加载问题
2017/12/16 jQuery
React Native 图片查看组件的方法
2018/03/01 Javascript
react router4+redux实现路由权限控制的方法
2018/05/03 Javascript
解决layui table表单提示数据接口请求异常的问题
2019/09/24 Javascript
JS实现transform实现扇子效果
2020/01/17 Javascript
[02:32]DOTA2英雄基础教程 祸乱之源
2013/12/23 DOTA
浅谈python数据类型及类型转换
2017/12/18 Python
Python利用Django如何写restful api接口详解
2018/06/08 Python
django框架cookie和session用法实例详解
2019/12/10 Python
Python实现EM算法实例代码
2020/10/04 Python
美国NBA官方商店:NBA Store
2019/04/12 全球购物
销售人员获奖感言
2014/02/05 职场文书
机关党员2014全国两会学习心得体会
2014/03/10 职场文书
2014年五四青年节活动方案
2014/03/29 职场文书
医学求职自荐信
2014/06/21 职场文书
领导班子三严三实对照检查材料
2014/09/25 职场文书
工人先锋号事迹材料(2016精选版)
2016/03/01 职场文书
Python 如何将integer转化为罗马数(3999以内)
2021/06/05 Python
vue里使用create, mounted调用方法
2022/04/26 Vue.js
Java 数组的使用
2022/05/11 Java/Android