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 12 Python
Python中实现常量(Const)功能
Jan 28 Python
详解Python中的各种函数的使用
May 24 Python
Python实现多进程共享数据的方法分析
Dec 04 Python
TensorFlow的权值更新方法
Jun 14 Python
运用Python的webbrowser实现定时打开特定网页
Feb 21 Python
解决python gdal投影坐标系转换的问题
Jan 17 Python
Python3.7实现验证码登录方式代码实例
Feb 14 Python
matlab、python中矩阵的互相导入导出方式
Jun 01 Python
python使用列表的最佳方案
Aug 12 Python
Python lambda表达式原理及用法解析
Aug 18 Python
爬虫代理的cookie如何生成运行
Sep 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
php split汉字
2009/06/05 PHP
PHP下使用CURL方式POST数据至API接口的代码
2013/02/14 PHP
PHP函数addslashes和mysql_real_escape_string的区别
2014/04/22 PHP
PHP JSON出错:Cannot use object of type stdClass as array解决方法
2014/08/16 PHP
php实现的常见排序算法汇总
2014/09/08 PHP
鼠标图片振动代码
2006/07/06 Javascript
jQuery学习4 浏览器的事件模型
2010/02/07 Javascript
快速解决jQuery与其他库冲突的方法介绍
2014/01/02 Javascript
仿百度联盟对联广告实现代码
2014/08/30 Javascript
JavaScript设计模式之原型模式(Object.create与prototype)介绍
2014/12/28 Javascript
vue使用stompjs实现mqtt消息推送通知
2017/06/22 Javascript
vue2 前端搜索实现示例
2018/02/26 Javascript
angular ng-model 无法获取值的处理方法
2018/10/02 Javascript
vue 基于element-ui 分页组件封装的实例代码
2018/12/10 Javascript
TypeScript的安装、使用、自动编译的实现
2020/04/10 Javascript
vue实现拖拽进度条
2021/03/01 Vue.js
python获取远程图片大小和尺寸的方法
2015/03/26 Python
Python 列表(List) 的三种遍历方法实例 详解
2017/04/15 Python
Python实现的绘制三维双螺旋线图形功能示例
2018/06/23 Python
python使用xlsxwriter实现有向无环图到Excel的转换
2018/12/12 Python
对python for 文件指定行读写操作详解
2018/12/29 Python
Python Django给admin添加Action的方法实例详解
2019/04/29 Python
使用Python快乐学数学Github万星神器Manim简介
2019/08/07 Python
python数组循环处理方法
2019/08/26 Python
python实现飞机大战小游戏
2019/11/08 Python
python argparse模块通过后台传递参数实例
2020/04/20 Python
Python模块常用四种安装方式
2020/10/20 Python
世界上最大的二手相机店:KEN
2017/05/17 全球购物
Internet体系结构
2014/12/21 面试题
Shell如何接收变量输入
2016/08/06 面试题
光信息科学与技术专业职业生涯规划
2014/03/13 职场文书
党员干部一句话承诺
2014/05/30 职场文书
工作业绩不及格检讨书
2014/10/28 职场文书
淮海战役观后感
2015/06/11 职场文书
Vue2.0搭建脚手架
2022/03/13 Vue.js
图神经网络GNN算法
2022/05/11 Python