Item 2: Follow the PEP 8 Style Guide

Naming

Naming
functions, variables, attributes lowercase_underscore
protected instance attributes _leading_underscore
private instance attributes __double_leading_underscore
classes, exceptions CapitalizedWord
module-level constants ALL_CAPS

Expressions and Statements

Always use absolute names for modules when importing them, not names relative to the current module's own path.

# not good
import foo
foo.bar() # good
from foo import bar
bar()

Item 3: Know the Differences Between str and unicode

In Python2, there are two types that represent sequences of characters: str and unicode. Instances of str contain raw 8-bit values. Instances of unicode contain Unicode characters.

The most common encoding to represent Unicode characters as binary data is UTF-8. Unicode instance in Python 2 do not have an associated binary encoding. To convert Unicode characters to binary data, you must use the encode method. To convert binary data to Unicode characters, you must use the decode method.

The core of your program should use Unicode character type (unicode in Python 2) and should not assume anything about character encodings. This approach allows you to be very accepting of alternative text encoding while being strict about your output text encoding.

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 # Instance of unicode 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 # Instance of str

In Python 2, file operations default to binary encoding. But still always open file using a binary mode (like 'rb' or 'wb').

Item 4: Write Helper Functions Instead of Complex Expressions

Python's syntax makes it all too easy to write single-line expressions that are overly complicated and difficult to read.

Move complex expressions into helper functions, especially if you need to use the same logic repeatedlly.

The if/else expression provides a more readable alternative to using Boolean operators like or and and in expressions.

from urllib.parse import parse_qs
my_values = parse_qs('red=5&blue=0&green=',
keep_blank_values=True)
print(repr(my_values)) >>>
{'red': [''], 'green': [''], 'blue': ['']} # just use get method
print('Red: ', my_values.get('red'))
print('Green: ', my_values.get('green'))
print('Opacity: ', my_values.get('opacity')) >>>
Red: ['']
Green: ['']
Opacity: None # what about set a default of 0, use or operator
red = int(my_values.get('red', [''])[0] or 0)
green = int(my_values.get('green', [''])[0] or 0)
opacity = int(my_values.get('opacity', [''])[0] or 0) # use if/else expression
red = my_values.get('red')
red = int(red[0]) if red[0] else 0 # ues if/else statement
green = my_values.get('green')
if green[0]:
green = int(green[0])
else:
green = 0 # helper function, make sense
def get_first_int(values, key, default=0):
found = values.get(key, [''])
if found[0]:
found = int(found[0])
else:
found = default
return found green = get_first_int(my_values, 'green')

Item 5: Know How to Slice Sequence

lst = [1, 2, 3]
first_twenty_items = lst[:20]
last_twenty_items = lst[-20:] lst[20] >>>
IndexError: list index out of range from copy import copy, deepcopy # lst[-0:] equal to copy(lst), same as lst[:] lst = [1, 2, 3, [4, 5]]
a = copy(lst)
b = deepcopy(lst) lst[-1].append(6)
lst.append(7) print lst
print a
print b >>>
[1, 2, 3, [4, 5, 6], 7]
[1, 2, 3, [4, 5, 6]]
[1, 2, 3, [4, 5]] lst = [1, 2, 3, 4]
lst[1:] = [3]
print lst >>>
[1, 3]

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

a = ['red', 'orange', 'yellow', 'green', 'blue', 'purple']
odds = a[::2]
evens = a[1::2]
print(odds)
print(evens) >>>
['red', 'yellow', 'blue']
['orange', 'green', 'purple'] # reverse a byte string, but break for unicode
x = b'mongoose'
y = x[::-1]
print(y) >>>
b'esoognom' a = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
a[::2] # ['a', 'c', 'e', 'g']
a[::-2] # ['h', 'f', 'd', 'b']
a[2::2] # ['c', 'e', 'g']
a[-2::-2] # ['g', 'e', 'c', 'a']
a[-2:2:-2] # ['g', 'e']
a[2:2:-2] # []

Specifying start, end, and stride in a slice can be extremely confusing. Avoid using them together in a single slice.

Item 7: Use List Comprehensions Instead of map and filter

a = [1,2,3,4,55,6,7,7,8,9]

# clear
even_squares = [x**2 for x in a if x % 2 == 0] # sucks
alt = map(lambda x: x**2, filter(lambda x: x % 2 == 0, a)) assert even_squares == list(alt)

Item 8: Avoid More Than Two Expressions in List Comprehensions

matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
flat = [x for row in matrix for x in row]
print flat >>>
[1, 2, 3, 4, 5, 6, 7, 8, 9] squared = [[x**2 for x in row] for row in matrix]
print squared >>>
[[1, 4, 9], [16, 25, 36], [49, 64, 81]] my_lists = [
[[1, 2, 3], [4, 5, 6]],
#...
] # not good
flat = [x for sublist1 in my_lists
for sublist2 in sublist1
for x in sublist2] # clear
flat = []
for sublist1 in my_lists:
for sublist2 in sublist1:
flat.extend(sublist2)

List comprehensions with more than two expressions are very difficult to read and should be avoided.

Item 9: Consider Generator Expressions for Large Comprehensions

Generator expressions avoid memory issues by producing outputs one at a time as an iterator.

Item 10: Prefer enumerate Over range

flavor_list = ['vanilla', 'chocolate', 'pecan', 'strawberry']

# usually
for i in range(len(flavor_list)):
flavor = flavor_list[i]
print('%d: %s' % (i + 1, flavor)) # enumerate
for i, flavor in enumerate(flavor_list):
print('%d: %s' % (i + 1, flavor)) # specify which enumerate should begin count
for i, flavor in enumerate(flavor_list, 1):
print('%d: %s' % (i, flavor))

Item 11: Use zip to Process Iterators in Parallel

names = ['Cecilia', 'Lise', 'Marie']
letters = [len(n) for n in names] # usually
longest_name = None
max_letters = 0 for i in range(len(names)):
count = letters[i]
if count > max_letters:
longest_name = names[i]
max_letters = count print(longest_name) # using enumerate
for i, name in enumerate(names):
count = letters[i]
if count > max_letters:
longest_name = names[i]
max_letters = count # using zip
for name, count in zip(names, letters):
if count > max_letters:
longest_name = name
max_letters = count

In Python 2, use izip from the itertools built-in module when zip very large iterators.

If the lengths tht lists you want to zip aren't equal, use izip_longest.

Item 12: Avoid else Blocks After for and while Loops

Just Avoid use it.

Item 13: Take Advantage of Each Block in try/except/else/finally

Else Blocks

When the try block doesn't raise an exception, the else block will run. The else block helps you minimize the amount of code in the try block and improves readability.

def load_json_key(data, key):
try:
result_dict = json.loads(data) # May raise ValueError
except ValueError as e:
raise KeyError from e:
else:
return result_dict[key] # May raise KeyError

The else clause ensure that what follows the try/except is visually distinguished from the except block. This makes the exception propagation behavior clear.

The try/finally compound statement lets you run cleanup code regardless of whether exceptions were raised in the try block.

The else block helps you minimize the amount of code in try blocks and visually distinguish the success case from the try/except blocks.

An else block can be used to perform additional actions after a successful try block but before common cleanup in a finally block.

Effective Python2 读书笔记1的更多相关文章

  1. Effective Python2 读书笔记3

    Item 22: Prefer Helper Classes Over Bookkeeping with Dictionaries and Tuples For example, say you wa ...

  2. Effective Python2 读书笔记2

    Item 14: Prefer Exceptions to Returning None Functions that returns None to indicate special meaning ...

  3. Effective STL 读书笔记

    Effective STL 读书笔记 标签(空格分隔): 未分类 慎重选择容器类型 标准STL序列容器: vector.string.deque和list(双向列表). 标准STL管理容器: set. ...

  4. Effective STL读书笔记

    Effective STL 读书笔记 本篇文字用于总结在阅读<Effective STL>时的笔记心得,只记录书上描写的,但自己尚未熟练掌握的知识点,不记录通用.常识类的知识点. STL按 ...

  5. effective c++读书笔记(一)

    很早之前就听过这本书,找工作之前读一读.看了几页,个人感觉实在是生涩难懂,非常不符合中国人的思维方式.之前也有博主做过笔记,我来补充一些自己的理解. 我看有人记了笔记,还不错:http://www.3 ...

  6. Effective Java读书笔记完结啦

    Effective Java是一本经典的书, 很实用的Java进阶读物, 提供了各个方面的best practices. 最近终于做完了Effective Java的读书笔记, 发布出来与大家共享. ...

  7. Effective java读书笔记

    2015年进步很小,看的书也不是很多,感觉自己都要废了,2016是沉淀的一年,在这一年中要不断学习.看书,努力提升自己 计在16年要看12本书,主要涉及java基础.Spring研究.java并发.J ...

  8. Effective Objective-C 读书笔记

    一本不错的书,给出了52条建议来优化程序的性能,对初学者有不错的指导作用,但是对高级阶段的程序员可能帮助不是很大.这里贴出部分笔记: 第2条: 使用#improt导入头文件会把头文件的内容全部暴露到目 ...

  9. 【Effective C++读书笔记】序

    C++ 是一个难学易用的语言! [C++为什么难学?] C++的难学,不仅在其广博的语法,以及语法背后的语义,以及语义背后的深层思维,以及深层思维背后的对象模型: C++的难学还在于它提供了四种不同而 ...

随机推荐

  1. 最新版CentOS6.5上安装部署ASP.NET MVC4和WebApi

    最新版CentOS6.5上安装部署ASP.NET MVC4和WebApi 使用Jexus5.8.1独立版 http://www.linuxdot.net/ ps:该“独立版”支持64位的CentOS ...

  2. 12款经典的白富美型—jquery图片轮播插件—前端开发必备

    图片轮播是网站中的常用功能,用于在有限的网页空间内展示一组产品图片或者照片,同时还有非常吸引人的动画效果.本文向大家推荐12款实用的 jQuery 图片轮播效果插件,帮助你在你的项目中加入一些效果精美 ...

  3. TCP/IP、Http、Socket、XMPP-从入门到深入

    TCP/IP.Http.Socket.XMPP-从入门到深入 终极iOS程序猿 2016-12-29 18:27 为了便于大家理解和记忆,我们先对这几个概念进行的介绍,然后分析他们的不同,再进行详细的 ...

  4. # 2015-2016-2 《Java程序设计》课程总结

    2015-2016-2 <Java程序设计>课程总结

  5. C++标准库:std_map作为一个关联数组

    摘要:std::map作为一个容器存在一个典型应用就是作为关联数组来作用.在诸如Java等等语言中,关联数组广泛存在.std::map是一个容器,在它的概念框架中存在两个词:键和值,std::map把 ...

  6. winform采集网站美女图片程序---多线程篇

    设定思路: 采集目标: http://www.8kmm.com,   已知网址列表(List保存),  应用多线程(Thread)读取该列表, 获取url时不能重复(加锁Lock). 允许无序采集! ...

  7. iOS地图 -- 定位中的CLLocation的介绍与小练习

    通过定位练习,熟悉CLLocation 在上篇笔记中提到了CLLocation类,这里通过练习来讲解一下这个类,类中包含了获取到的用户位置的信息 coordinate --> 坐标,经度和纬度 ...

  8. mysql-批量修改表字段中的某一部分内容

    MySQL批量替换指定字段字符串语句(1)updat 表名 set 字段名=replac(字段名,'原来的内容','替换后的内容') 举一个例子,就是我实际操作的时候的命令: update cpg14 ...

  9. 动手实验iptables的NAT功能实现流量穿透

    1.NAT和iptables理论见: http://lustlost.blog.51cto.com/2600869/943110 2.引子 近期,有同事抱怨说数据入库时,由于数据库所在的服务器只有内网 ...

  10. HTTP协议 -- 认清协议常用状态码

    HTTP协议作为web服务的基础,理所应当受到重视,但是周围的同事能够讲清楚HTTP协议的凤毛麟角.既然是基础,就应该早一点掌握,所以近半年(2016-2月——2016年6月),不准备学习新技术了.首 ...