To be pythonic

原创 2016年05月31日 07:29:50

第一章 引言

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



相关文章推荐

how to be pythonic

Short Ways to Manipulate Lists List comprehensions provide a powerful, concise way to work with lis...

com.sun.proxy.$Proxy25 cannot be cast to SessionImplementor

今天在用传统框架ssh时出现了如题的错误,版本是hibernate4.x和struts2.x和spring4.x。之前用hibernate3.x和spring3.x还好好的,代码如下 @Overri...

message to be delived

  • 2015年09月29日 17:07
  • 248KB
  • 下载

Dbviusalizer报错Java.lang.ClassCastException: javax.swing.KeyStroke cannot be cast to java.lang.Compar

Dbviusalizer报错Java.lang.ClassCastException: javax.swing.KeyStroke cannot be cast to java.lang.Compar...

calzature hogan rarely home. Parents will be open until the time only to find his son's ranking dr

Wang Hongshan tone filled with tenderness.And his mother, Wang Kunliang have never played the younge...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:To be pythonic
举报原因:
原因补充:

(最多只允许输入30个字)