阅读更多

12顶
0踩

编程语言

翻译新闻 Python 编码时应该注意的几件事情

2012-05-21 17:38 by 副主编 wangguo 评论(5) 有12531人浏览
在编程过程中,多了解语言周边的一些知识,以及一些技巧,可以让你加速成为一个优秀的程序员。

对于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])


原文:A FEW THINGS TO REMEMBER WHILE CODING IN PYTHON
12
0
评论 共 5 条 请登录后发表评论
5 楼 JavaCrazyer 2012-05-23 22:56
>>> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!
4 楼 木头lbj 2012-05-22 18:32
python cookbook中有相同的描述恩  学习了
3 楼 mathgl 2012-05-22 15:51
里面有些container是2.7才有的
2 楼 walkintojava 2012-05-22 09:43
刚刚学习Python,这些都是现在我的代码中存在的问题。看到这个真是豁然开朗。
1 楼 dieslrae 2012-05-21 23:44
我记得曾经那谁说过:白痴也能写出电脑能读懂的代码,而只有高手才能写出人能读懂的

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • Python编码时应该注意的几个情况

    对于Python程序员,你需要注意一下本文所提到的这些事情。你也可以看看Zen of Python(Python之禅),这里面提到了一些注意事项,并配以示例,可以帮助你快速提高。 1. 漂亮胜于丑陋 实现一个功能:读取一列数据,只...

  • 【python技能树】python编码规范

    本节技能树主要分享相应的python编码规范,学习python的小伙伴们请仔细阅读,对你的python代码的编写肯定有质的提高!!! 1 代码编码格式 一般来说,声明编码格式在脚本中是必需的。 国际惯例,文件编码和 ...

  • python连接数据库设置编码格式_python 数据库 编码

    UTF-8乱码问题在测试“Bluemix云端数据库服务ClearDB MySQL使用示例———Python开发投票程序”的程序时,从MySQL中读取的中文输出到网页显示都是问号,如下图:解决方法:产生乱码问题,通常都是由于几方面的编码不...

  • python查看汉字的编码_python汉字编码

    在处理一段文本的时候,首先了解文本的汉字编码。在windows下默认的文件编码是GBK,而linux的一般是utf-8....在Python中一定要注意区分“Unicode字符串”和“unicode对象”的区别。后面所有的“unicod...

  • python显示编码错误_Python编码解码问题——常见错误

    转自:http://www.crifan.com/summary_python_2_x_common_string_encode_decode_error_reason_and_solution/Python 2.x中的字符编码,设计的的确不好,导致初学者,甚至是即使用Python很长时间的人,都会经常遇到...

  • python 写入文件编码_使用Python写入文本文件时的编码问题

    我正在编写一个程序,用一个简短的python脚本"手动"安排一个csv文件,使其成为正确的json语法。从输入文件中,我使用readlines()将文件格式化为一个行列表,然后将其操作并集中到一个字符串中,然后将该字符串输出到...

  • Python3编码问题全总结

    平常主要是写C++,但有时候也需要用到python、shell等脚本来做一些事情,其中最常见的一种应用就是文本处理,而要处理文本不可避免地就要和编码打交道,python3和python2相比在编码方面已经有了很大的进步,但有时候...

  • 学习时Python时需要注意的几个知识点

    1、第一次写代码 不要害怕这件事情,写代码,其实和写作文一样,首先需要有一个题目,然后对题目进行拆解。...转变Python编码思路的唯一一个方法就是实战。只有在实战中你才能发现:代码因为少或者多了一个字母,...

  • Python PEP8 编码规范中文版

    Python PEP8 编码规范 中文

  • python预备知识-编码规范:

    python预备知识-编码规范:

  • PEP8 - Python编码规范完整中文版

    Python 中不存在私有变量一说,若是遇到需要保护的变量,使用小写和一个前导下划线。但这只是程序员之间的一个约定,用于警告说明这是一个私有变量,外部类不要去访问它。但实际上,外部类还是可以访问到这个变量。 ...

  • Python常见编码转化

    前言最近在做题遇到一些很捉鸡的事情,在编码转化上卡了很久,因此特就常见的编码做一个总结。 python中比较常见的两个编码转化模块binascii和libnum一、16进制转化为字符串import binascii from libnum import n2s...

  • python(25): 字符串编码操作utf-8,gbk

    说到python的编码,一句话总结,说多了都是泪啊,这个在以后的python的开发中绝对是一件令人头疼的事情。所以有必要要讲讲清楚 一、编码介绍 1、须知: 在python 2中默认编码是 ASCII,而在python 3中默认编码是 ...

  • 12.Python文件操作与字符编码

    Python文件操作与字符编码

  • python字符串编码及乱码解决方案

    字符编码详解 [字符编码ASCII,Unicode和UTF-8] 主要非英文字符集的编码范围 范围 编码 说明 2E80~33FFh 中日韩符号区 收容康熙字典部首、中日韩辅助部首、注音符号、日本假名、韩文音符, ...

  • python requests 编码格式_Python requests中的编码问题

    errors='replace')来解码Pythonreqeusts抓取返回页面时,碰到页面乱码requests的返回结果对象里有个apparent_encoding函数, apparent_encoding通过调用chardet.detect()来识别文本编码. 但是需要注意的是,这有些...

  • 【整理】Python编码规范指导

    代码更多是用来读而不是写。本指南旨在改善Python代码的可读性。风格指南强调一致性。项目、模块或函数保持一致都很重要。

  • python:数据类型、编码方式(base64、utf--8)、python中的进制、\u,\x,0x区别 力荐力荐力荐

    python:数据类型、编码方式(base64、utf--8)、python中的进制、\u,\x,0x区别? 数据类型 与 编码方式?为什么会有不同数据类型?python基础数据类型有哪些?计算机如何通过二进制的0、1表示不同的数据类型?字节...

  • 一篇文章彻底搞懂Python字符编码方式(中文编码,UTF-8,unicode,gb,gbk,中文乱码,爬虫中文乱码)

    (中文编码,UTF-8,unicode,gb,gbk,中文乱码,爬虫中文乱码,文件读取乱码)

  • 使用Python进行Base64编码和解码

    Base64 是一种将 8 位二进制数据编码为可以用 6 位表示的格式的方法。仅使用字符A-Za-z0-9用来表示数据,其中用于填充数据。例如,使用此编码,三个 8 位字节将转换为四个 6 位组。术语 Base64 取自多用途互联网邮件...

Global site tag (gtag.js) - Google Analytics