注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Code@Pig Home

喜欢背着一袋Code傻笑的Pig .. 忧美.欢笑.记忆.忘却 .之. 角落

 
 
 

日志

 
 

[轻书快读] Effective Python - 59 Specific Ways to Write Better Python (1)  

2016-01-17 17:27:18|  分类: lang_python |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
1. Pythonic Thinking

Item 1: Know Which Version of Python You're Using

目前(2015-2016年),主流的 python 版本是 2.7,而未来的方向必然是 python 3。
因为 python 3 相对 python 2 的改动还是很大的,所以搞清楚当前用的哪个版本的 python。

D:\>python --version
Python 2.7.8

D:\>c:\python35\python --version
Python 3.5.1

除了 --version,也可以通过 sys.version 来查看。
import sys
print sys.version_info
print sys.version

>>>
sys.version_info(major=2, minor=7, micro=8, releaselevel='final', serial=0)
2.7.8 (default, Jun 30 2014, 16:03:49) [MSC v.1500 32 bit (Intel)]


Item 2: Follow the PEP 8 Style Guide

PEP8(Python Enhancement Proposal #8, http://www.python.org/dev/peps/pep-0008/) 是 python 官方推荐的代码风格。
pylint tool (http://www.pylint.org),用它检查下你的代码是否符合 PEP8 吧。


2. Functions

Item 3: Know the Differences Between bytes, str, and unicode

Python 3,bytes 是 raw 8-bit values,str 是 unicode characters。
Python 2,str 是 raw 8-bit values, unicode 是 unicode characters。

# python 3
def to_str(bytes_or_str):
  if isinstance(bytes_or_str, bytes):
    value = bytes_or_str.decode('utf-8')
  else:
    value = byte_or_str
  return value

def to_bytes(bytes_or_str):
  if isinstance(bytes_or_str, str):
    value = bytes_or_str.encode('utf-8')
  else:
    value = bytes_or_str
  return value

# python 2
def to_unicode(unicode_or_str):
  if isinstance(unicode_or_str, str):
    value = unicode_or_str.decode('utf-8')
  else:
    value = unicode_or_str
  return value

def to_str(unicode_or_str):
  if isinstance(unicode_or_str, unicode):
    value = unicode_or_str.encode('utf-8')
  else:
    value = unicode_or_str
  return value

python 3 中,open() 默认使用 utf-8 encoding,而 python 2 中,默认用 binary encoding。
所以要 open('tmp/random.bin', 'wb') 才能保证在 2/3 中行为一致。


Item 4: Write Helper Functions Instead of Complex Expressions

# 有点长
red = int(my_values.get('red', [''])[0] or 0)

# 还是略复杂
red = my_values.get('red', [''])
red = int(red[0]) if red[0] else 0

# helper func,可读性好多了
def get_first_int(values, key, default=0):
  found = values.get(key, [''])
  if found[0]:
    found = int(found[0])
  else:
    found = default
  return found


Item 5: Know How to Slice Sequences

都是说 slice 的例子,没啥特别的。

直接修改 list 本身
a[2:7] = [99, 22, 14]


Item 6: Avoid Using start, end, and stride in a Single Slice

slice 还有个 start:end:stride 的用法,如下:
>>> a = [1, 2, 3, 4, 5, 6, 7]
>>> a[::2]
[1, 3, 5, 7]
>>> a[1::2]
[2, 4, 6]

... (各种 stride 奇葩问题的举例,略过~)

stride 会带来各种奇奇怪怪的问题,还是不要用 stride 吧。


Item 7: Use List Comprehensions Instead of map and filter

# list comprehension 和 map 可以达到同样效果
# list comprehension 可读性更佳
a = [1,2,3,4,5,6,7]

[x**2 for x in a]
map(lambda x: x**2, a)

[x**2 for x in a if x % 2 == 0]
map(lambda x: x**2, filter(lambda x: x % 2 == 0, a))


Item 8: Avoid More Than Two Expressions in List Comprehensions

list comprehension 虽好,但不要用过头了。
my_lists = [
  [[1,2,3], [4,5,6]],
  # ...
]

flat = [x for sublist1 in my_lists
          for sublist2 in sublist1
          for x in sublist2]

flat = []
for sublist1 in my_lists:
  for sublist2 in sublist1:
    flat.extend(sublist2)


Item 9: Consider Generator Expressions for Large Comprehensions

# 如过文件巨大,可能搞爆内存
value = [len(x) for x in open('/tmp/my_file.txt')]
[100, 57, 15, 1, 12, 75, 5, 86, 89, 11]

# 换成 generator,需要时才读取一行,就没问题啦
value = (len(x) for x in open('/tmp/my_file.txt')]
print next(value)   # 100
print next(value)   # 57

关于 generator,好文推荐:
http://www.dabeaz.com/generators-uk/


Item 10: Prefer enumerate Over range

# 一看就懂,不解释~
for i in range(len(flavor_list)):
  flavor = flavor_list[i]
  print('%d: %s' % (i+1, flavor))

for i, flavor in enumerate(flavor_lsit):
  print('%d: %s' % (i+1, flavor))

----
ps. 网易blog居然开始限制文章的字数。。。=_=!

  评论这张
 
阅读(535)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017