To be pythonic

第一章 引言

  •  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])]



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值