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 MySQLdb Windows下安装教程及问题解决方法
May 09 Python
python 实现一个贴吧图片爬虫的示例
Oct 12 Python
Python中的TCP socket写法示例
May 11 Python
Python进阶:生成器 懒人版本的迭代器详解
Jun 29 Python
django表单的Widgets使用详解
Jul 22 Python
python 监测内存和cpu的使用率实例
Nov 28 Python
Python使用pyyaml模块处理yaml数据
Apr 14 Python
python爬虫基础知识点整理
Jun 02 Python
如何基于Python代码实现高精度免费OCR工具
Jun 18 Python
python软件测试Jmeter性能测试JDBC Request(结合数据库)的使用详解
Jan 26 Python
解决Pytorch半精度浮点型网络训练的问题
May 24 Python
python之django路由和视图案例教程
Jul 26 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
WINXP下apache+php4+mysql
2006/11/25 PHP
Windows下IIS6/Apache2.2.4+MySQL5.2+PHP5.2.1安装配置方法
2007/05/03 PHP
php制作中间带自己定义图片二维码的方法
2014/01/27 PHP
php实现复制移动文件的方法
2015/07/29 PHP
php使用yield对性能提升的测试实例分析
2019/09/19 PHP
表单的一些基本用法与技巧
2006/07/15 Javascript
jQuery实现的类flash菜单效果代码
2010/05/17 Javascript
理解Javascript_08_函数对象
2010/10/15 Javascript
jQuery 幻灯片插件(带缩略图功能)
2011/01/24 Javascript
纯js实现瀑布流展现照片(自动适应窗口大小)
2013/04/08 Javascript
文本框只能选择数据到文本框禁止手动输入
2013/11/22 Javascript
javascript弹出层输入框(示例代码)
2013/12/11 Javascript
鼠标移到图片上变大显示而不是放大镜效果
2014/06/15 Javascript
使用AngularJS创建单页应用的编程指引
2015/06/19 Javascript
jquery实现的点击翻书效果代码
2015/11/04 Javascript
javascript实现获取浏览器版本、浏览器类型
2015/12/02 Javascript
JavaScript实现设置默认日期范围为最近40天的方法分析
2017/07/12 Javascript
React进阶学习之组件的解耦之道
2017/08/07 Javascript
Javascript 编码约定(编码规范)
2018/03/11 Javascript
微信小程序实现同一页面取值的方法分析
2019/04/30 Javascript
async/await让异步操作同步执行的方法详解
2019/11/01 Javascript
jQuery加PHP实现图片上传并提交的示例代码
2020/07/16 jQuery
深入理解Python 代码优化详解
2014/10/27 Python
selenium+python实现1688网站验证码图片的截取功能
2018/08/14 Python
Python 实现训练集、测试集随机划分
2020/01/08 Python
python中setuptools的作用是什么
2020/06/19 Python
Python grpc超时机制代码示例
2020/09/14 Python
编辑个人求职信范文
2013/09/21 职场文书
服装厂厂长职责
2013/12/16 职场文书
生日邀请函范文
2014/01/13 职场文书
ktv筹备计划书
2014/05/03 职场文书
家长必看:义务教育,不得以面试 评测等名义选拔学生
2019/07/09 职场文书
PHP 对接美团大众点评团购券(门票)的开发步骤
2021/04/03 PHP
解决Pytorch半精度浮点型网络训练的问题
2021/05/24 Python
OpenCV中resize函数插值算法的实现过程(五种)
2021/06/05 Python
JavaScript与JQuery框架基础入门教程
2021/07/15 Javascript