第一章 引言
- C ? X: Y ===> X if C else Y
- 将常量集中到一个文件中
- 函数
(1)调用者在上,被调用者在下
(2)尽量短小,嵌套层次不宜过深
(3)一个函数只做一件事,保证函数语句力度的一致性
- 代码过长
超过的部分用圆括号、方括号和花括号进行连接,并保持行链接的元素垂直对齐
- 关于注释
(1) 注释是用来解释代码功能、原因及想法的而不是代码本身
(2) 给外部可访问的函数和方法添加文档注释,说明功能,参数,返回值及可能发生的异常值。外部调用人员查看docstring
(3) 删除而不是注释掉无用的代码,利用git找回被删除的代码
- 空格的使用
(1)函数定义或类定义之间空两行,类定义与第一个方法之间、或者需要进行语意分割的地方空一行
(2)需要空格:赋值、比较、布尔运算 (=,==,>,<,!=,in,not in,is,is not,and, or, not)、强调前面的操作符
(3)不需要空格:逗号和分号前、函数名与左括号间、序列操作时序列名和[]之间、函数的默认参数两侧
第二章 编程惯用法
- 枚举的几种替代方式
(1)类属性(支持无意义的操作)
(2)函数
(3) collections.namedtuple(允许枚举值重复)
(4)可以使用第三方模块flufl.enum
- 浮点数
(1)涉及除法操作时先尽量将操作数转换为浮点类型再做运算
(2)浮点数只能接近不能精确表示,避免i==1.35这种表达式,或者 指定精度
- 索引和值
(1)使用enumerate(seq)获取序列迭代的索引和值,seq可以时list、set、可迭代对象
(2)对于字典还是使用iteritems
- 判断两个对象相等应该使用==而不是is
- 考虑兼容性尽可能使用Unicode
(1)有中文的程序则在头文件制定编码方式
# coding=utf8
# !/usr/bin/python
# -*-coding: utf8 -*-
(2)对于中文字符,为了做到不同系统之间的兼容,建议直接使用Unicode表示方式
(3)利用unicode_literals自动将定义的普通字符识别为Unicode字符串
from __future__ import <span style="font-family: Arial, Helvetica, sans-serif;">unicode_literals</span>
In [5]: s = "中文字符"
In [6]: s
Out[6]: u'\u4e2d\u6587\u5b57\u7b26'
s += "Chinese character"
In [8]: s
Out[8]: u'\u4e2d\u6587\u5b57\u7b26Chinese character'
- 构建合理的包层次来管理module
1. 包(就是目录)的构成:python文件(就是模块)+__init__.py,通过包名.模块名进行访问
2. __init__.py的作用:
(1)区分包和普通目录;
(2)在该文件中申明模块级别的import语句从而使其变成包级别可见.
比如有如下关系的包结构:
Package/ __init__.py
Module1.py
Module2.py
Subpackage/ __init__.py
Module1.py
#Module1.py
class Apple:
def __init__(self, id):
self.id = id
如果要使用Apple类,当__init__.py文件为空时,要使用完整路径申明import语句:
from Package.Module1 import Apple
但是可以通过在__init__.py文件中添加语句,则可以直接通过Package导入类Apple:
#<span style="font-family: Arial, Helvetica, sans-serif;">__init__.py</span>
from Module1 import Apple
#直接通过Package导入类Apple
from Package import Apple
(3)通过在__init__.py中定义__all__变量,控制需要导入的子包或者模块
#__init__.py
__all__ = ['Module1', 'Module2', 'Subpackage']
再运行 from Package import *, 可以看到__all__变量中定义的模块和包被导入到当前名字空间。
3.使用包带来的便利:
(1)将关系密切的模块组成一个包,完善项目结构,增强代码可维护性和实用性;
(2)在嵌套的包结构中,每一个模块都以其所在的完整路径作为其前缀,因此即使名称一样,不同包下的模块也不会冲突
import Package.Module2
import Package.Subpackage.Module2
第四章 库
4.1 按需选择sort()或者sorted()
1. sort()作用于列表,直接修改原有列表,消耗内存少,效率高
2. sorted作用于可迭代对象,返回一个新的对象
3.利用sorted对不同数据结构进行排序
- 对字典进行排序
from operator import itemgetter
phonebook = {'Emma': '9786', 'Sharon': '1871', 'Atina': '1094'}
sorted_pb = sorted(phonebook.iteritems(), key=itemgetter(1))
print sorted_pb
[('Atina', '1094'), ('Sharon', '1871'), ('Emma', '9786')]
- 多维list排序
In [6]: result = [['Bob', 95.0, 'A'], ['Amy', 96.0, 'A'], ['Tom', 86.0, 'C'], ['Nann', 86.0, 'E']]
In [7]: sorted(result, key=itemgetter(1,2))
Out[7]:
[['Tom', 86.0, 'C'],
['Nann', 86.0, 'E'],
['Bob', 95.0, 'A'],
['Amy', 96.0, 'A']]
In [8]: sorted(result, key=itemgetter(1,2), reverse=True)
Out[8]:
[['Amy', 96.0, 'A'],
['Bob', 95.0, 'A'],
['Nann', 86.0, 'E'],
['Tom', 86.0, 'C']]
- 字典的value是list排序
In [9]: mydict = {'Li':['M',7],'Zhang':['E',2],'Wang':['P',2],'Ma':['C',9],'Du':['C',2]}
In [10]: sorted(mydict.iteritems(), key=lambda (k,v): itemgetter(1)(v))
Out[10]:
[('Du', ['C', 2]),
('Zhang', ['E', 2]),
('Wang', ['P', 2]),
('Li', ['M', 7]),
('Ma', ['C', 9])]