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中for循环控制语句用法实例
Jun 02 Python
python魔法方法-属性访问控制详解
Jul 25 Python
Python实现字符串格式化输出的方法详解
Sep 20 Python
matplotlib简介,安装和简单实例代码
Dec 26 Python
Python配置虚拟环境图文步骤
May 20 Python
django多对多表的创建,级联删除及手动创建第三张表
Jul 25 Python
python3.7将代码打包成exe程序并添加图标的方法
Oct 11 Python
python的等深分箱实例
Nov 22 Python
Python 解决OPEN读文件报错 ,路径以及r的问题
Dec 19 Python
django序列化时使用外键的真实值操作
Jul 15 Python
如何基于Python Matplotlib实现网格动画
Jul 20 Python
基于Python爬取搜狐证券股票过程解析
Nov 18 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
phpmyadmin 3.4 空密码登录的实现方法
2010/05/29 PHP
PHP常用技巧总结(附函数代码)
2012/02/04 PHP
php导入excel文件到mysql数据库的方法
2015/01/14 PHP
discuz图片顺序混乱解决方案
2015/07/29 PHP
HTML中嵌入PHP的简单方法
2016/02/16 PHP
thinkPHP5.0框架独立配置与动态配置方法
2017/03/17 PHP
PHP 传输会话curl函数的实例详解
2017/09/12 PHP
js Date自定义函数 延迟脚本执行
2010/03/10 Javascript
在标题栏显示新消息提示,很多公司项目中用到这个方法
2011/11/04 Javascript
jQuery插件原来如此简单 jQuery插件的机制及实战
2012/02/07 Javascript
JavaScript实现数字数组按照倒序排列的方法
2015/04/06 Javascript
浅谈jquery高级方法描述与应用
2016/10/04 Javascript
详解Python中logging日志模块在多进程环境下的使用
2016/12/26 Javascript
angular.js实现购物车功能
2017/10/23 Javascript
一个Vue视频媒体多段裁剪组件的实现示例
2018/08/09 Javascript
解决element ui select下拉框不回显数据问题的解决
2019/02/20 Javascript
Vue scrollBehavior 滚动行为实现后退页面显示在上次浏览的位置
2019/05/27 Javascript
Vue实现简易购物车页面
2020/12/30 Vue.js
使用Python实现一个简单的项目监控
2015/03/31 Python
Django 中间键和上下文处理器的使用
2019/03/17 Python
Python登录系统界面实现详解
2019/06/25 Python
如何在Django项目中引入静态文件
2019/07/26 Python
python Elasticsearch索引建立和数据的上传详解
2019/08/04 Python
python 并发下载器实现方法示例
2019/11/22 Python
Python实现Appium端口检测与释放的实现
2020/12/31 Python
美国创意之家:BulbHead
2017/07/12 全球购物
Bowflex美国官方网站:高级家庭健身器材
2017/12/22 全球购物
土耳其国际性时尚购物网站:Modanisa
2018/01/19 全球购物
为什么会有内存对齐
2016/10/10 面试题
十佳班主任事迹材料
2014/01/18 职场文书
小学生竞选班长演讲稿
2014/04/24 职场文书
领导干部“四风”问题批评与自我批评材料
2014/09/24 职场文书
街道党工委党的群众路线教育实践活动对照检查材料思想汇报
2014/10/05 职场文书
教师政风行风自查自纠报告
2014/10/21 职场文书
2015年监理工作总结范文
2015/04/07 职场文书