Pythonic定义

Python最常用的编码风格还是PEP8,详见:http://jython.cn/dev/peps/pep-0008/

Pythonic确实很难定义,先简单引用下《Python之禅》中的几句经典阐释:

优美胜于丑陋(Python 以编写优美的代码为目标)
明了胜于晦涩(优美的代码应当是明了的,命名规范,风格相似)
简洁胜于复杂(优美的代码应当是简洁的,不要有复杂的内部实现)
复杂胜于凌乱(如果复杂不可避免,那代码间也不能有难懂的关系,要保持接口简洁)
扁平胜于嵌套(优美的代码应当是扁平的,不能有太多的嵌套)
间隔胜于紧凑(优美的代码有适当的间隔,不要奢望一行代码解决问题)
可读性很重要(优美的代码是可读的)

举个简单的例子,使用Pythonic风格编码的快速排序算法代码如下所示:

def quicksort(array):
less = [];
greater = []; if len(array) <= 1:
return array
pivot = array.pop()
for x in array:
if x <= pivot:
less.append(x)
else:
greater.append(x) return quicksort(less) + [pivot] + quicksort(greater)

Pythonic代码风格

  • 交换两个变量

C语言代码如下:

 1 int a = 1, b = 2;
2 int tmp = a;
3 a = b;
4 b = tmp;
5
6 //如果两个变量都为整数类型,当然也可使用:
7
8 int a = 1, b = 2;
9 a = a^b;
10 b = a^b;
11 a = a^b;
12
13 //这样的形式,可以不用引入第三个变量

Pythonic代码如下:

1 a, b = b, a
  • Python可以灵活的使用迭代器,安全的关闭文件描述符,如下:
1 for i in alist:
2 do_sth_with(i)
3
4 with open(path, 'r') as f:
5 do_sth_with(f)

Pythonic追求的是对Python语法的充分发挥,写出的代码带Python味儿,而不是看着向C或JAVA代码;

  • 不应过分使用技巧
1 a = [1, 2, 3, 4]
2 b = 'abcdef'
3 print a[::-1]
4 print b[::-1]

使用Python比较多的人可以比较容易看出其作用,就是输出逆序的a和b,但还是比较晦涩,Pythonic追求的是充分利用Python语法,上面代码可写为:

1 a = [1, 2, 3, 4]
2 b = 'abcdef'
3 print list(reversed(a))
4 print list(reversed(b))
  • 字符串格式化

我们很多人一般这样写,比较简洁:

1 name = 'Tom'
2 age = '20'
3 print 'Hello %s, your age is %s !' % (name, age)

其实,%s是比较影响可读性的,尤其是数量多了之后,很难清楚哪个占位符对应哪个实参,比较Pythonic的代码如下:

1 value = {'name': 'Tom', 'age': '20'}
2 print 'Hello %(name)s, your age is %(age)s !' % value

使用%占位符的形式,依旧不是Python最推荐的,最具Pythonic风格的代码如下:

1 print 'Hello {name}, your age is {age} !'.format(name = 'Tom', age = '20')

str.format()是Python最为推荐的字符串格式化方法;

  • 包和模块

包和模块的命名采用小写、单数形式,而且短小;

包通常仅作为命名空间,可以只包含空的__init__.py文件;

  • 过多的if...elif...elif......else...应使用字典来实现
 1 if n == 0:
2 print "You typed zero..."
3 elif n == 1:
4 print "You are in top..."
5 elif n == 2:
6 print "n is even number..."
7 else:
8 print "Default value"
9
10 # 使用字典来实现更好一些
11
12 def f(x):
13 return {
14 0: "You typed zero...",
15 1: "You are in top...",
16 2: "n is even number...",
17 }.get(x, "Default value")

编写Pythonic代码

避免劣化代码

  • 避免只用大小写来区分不同的对象;
  • 避免使用容易引起混淆的名称,变量名应与所解决的问题域一致;
  • 不要害怕过长的变量名;

代码中添加适当注释

  • 行注释仅注释复杂的操作、算法,难理解的技巧,或不够一目了然的代码;
  • 注释和代码要隔开一定的距离,无论是行注释还是块注释;
  • 给外部可访问的函数和方法(无论是否简单)添加文档注释,注释要清楚地描述方法的功能,并对参数,返回值,以及可能发生的异常进行说明,使得外部调用的人仅看docstring就能正确使用;
  • 推荐在文件头中包含copyright申明,模块描述等;
  • 注释应该是用来解释代码的功能,原因,及想法的,不该对代码本身进行解释;
  • 对不再需要的代码应该将其删除,而不是将其注释掉;

适当添加空行使代码布局更为优雅、合理

  • 在一组代码表达完一个完整的思路之后,应该用空白行进行间隔,推荐在函数定义或者类定义之间空两行,在类定义与第一个方法之间,或需要进行语义分隔的地方空一行,空行是在不隔断代码之间的内在联系的基础上插入的;
  • 尽量保证上下文语义的易理解性,一般是调用者在上,被调用者在下;
  • 避免过长的代码行,每行最好不要超过80字符;
  • 不要为了保持水平对齐而使用多余的空格;

编写函数的几个原则

  • 函数设计要尽量短小,嵌套层次不宜过深;
  • 函数申明应做到合理、简单、易于使用,函数名应能正确反映函数大体功能,参数设计应简洁明了,参数个数不宜过多;
  • 函数参数设计应考虑向下兼容;
  • 一个函数只做一件事,尽量保证函数语句粒度的一致性;

将常量集中到一个文件

Python没有提供定义常量的直接方式,一般有两种方法来使用常量;

  • 通过命名风格来提醒使用者该变量代表的意义为常量,如常量名所有字母大写,用下划线连接各个单词,如MAX_NUMBER,TOTLE等;
  • 通过自定义的类实现常量功能,常量要求符合两点,一是命名必须全部为大写字母,二是值一旦绑定便不可再修改;
 1 class _const:
2
3 class ConstError(TypeError): pass
4 class ConstCaseError(ConstError): pass
5
6 def __setattr__(self, name, value):
7 if name in self.__dict__:
8 rasie self.ConstError, "Can't change const.%s" % name
9 if not name.isupper():
10 raise self.ConstCaseError, "const name '%s' is not all uppercase" % name
11
12 self.__dict__[name] = value
13
14 import sys
15 sys.modules[__name__] = _const()

Pythonic定义的更多相关文章

  1. Python常见编程规范总结

    Pythonic定义 Python最常用的编码风格还是PEP8,详见:http://jython.cn/dev/peps/pep-0008/ Pythonic确实很难定义,先简单引用下<Pyth ...

  2. 超文本传输协议-HTTP/1.1

    超文本传输协议-HTTP/1.1(修订版) ---译者:孙超进本协议不限流传发布.版权声明Copyright (C) The Internet Society (1999). All Rights R ...

  3. python gui之tkinter界面设计pythonic设计

    ui的设计,控件id的记录是一件比较繁琐的事情. 此外,赋值和读取数据也比较繁琐,非常不pythonic. 有没有神马办法优雅一点呢?life is short. 鉴于控件有name属性,通过dir( ...

  4. Be Pythonic ,Google Python Style Guide

    为了更规范的写代码,变得更专业 分号 1 不在句末添加分号,不用分号在一行写两句代码 行长度 2 每行不超过80字符,python会隐式行连接圆括号,中括号,花括号中的字符,如多参数方法调用可以写为多 ...

  5. [Python]更加Pythonic的多个List合并和Python的安利

    原题: https://segmentfault.com/q/1010000005904259 问题: 倘若存在 L=[ [1,2,3],[4,5,6],[7,8,9]] 这样的列表,如何把合并成[1 ...

  6. Pythonic到底是什么玩意儿?

    http://blog.csdn.net/gzlaiyonghao/article/details/2762251 作者:Martijn Faassen 译者:赖勇浩(http://blog.csdn ...

  7. python pythonic是什么?

    原文地址:http://faassen.n--tree.net/blog/view/weblog/2005/08/06/0 注:Martijn 是 Zope 领域的专家,他为 Zope 系列产品做了许 ...

  8. 为Pythonic论坛添加一个“专题”功能(续)

    上篇博文<为Pythonic论坛添加一个“专题”功能>,在模板的层次上对发帖进行了限制.也就是根据用户是否拥有权限来决定是否显示发帖框. 但是自从这么“投机取巧”的写完模板后,整夜辗转反侧 ...

  9. Pythonic论坛怪怪的’居民’显示[已解决]

    之前使用Pythonic搭建的论坛people界面显示有点问题 第一个用户不显示,问了下作者,作者回复说这个Link只有~/people/而没有用户名 就点到为止了. 按说我使用syncdb同步时注册 ...

随机推荐

  1. JAVA RMI分布式原理和应用

    RMI(Remote Method Invocation)是JAVA早期版本(JDK 1.1)提供的分布式应用解决方案,它作为重要的API被广泛的应用在EJB中.随着互联网应用的发展,分布式处理任务也 ...

  2. Xib设置label自动换行和Label的顶部对齐

    真的是不想说自己了,一个Xib纠结了一天,简直了,整整被虐了一上午啊...... 不知道这是Xcode8的问题呢....还是我的Xib约束什么的问题..... 只想说的是,以前也是这么设置的,明明可以 ...

  3. 7. grep

    grep命令 grep grep是通用正则表达式分析程序(General Regular Expression Parser)的缩写. grep命令可以在它的输入中搜索指定的字符串模式(Pattern ...

  4. iptable和tcpdump的先后顺序

    tcpdump是一个用来抓取linux网络数据包的工具,而iptables是linux上的防火墙工具,两者之间的顺序是: Wire -> NIC -> tcpdump -> netf ...

  5. js-dialog

    依赖 jquery.js dialog.js dialog-plus.js ui-dialog.css 实例 <!DOCTYPE html> <html> <head&g ...

  6. 日常小节----unity小坑记(静态后不可移动和旋转)

    当物体被置为静态时,模型网格是无法移动和旋转的,只有碰撞器可以. 也就是会出现当父物体不为静态,子物体为静态时,运行后旋转移动父物体,子物体模型网格不会跟随旋转移动,但子物体碰撞器会跟随旋转移动. 或 ...

  7. 一些常见的MySQL配置

    目录 配置 参考 配置 [mysqld] port = 3306 socket = /mysql/log/mysql_3306.sock # mysql的目录(即mysql的文件所在目录) # bas ...

  8. [Agc036D]Do Not Duplicate_链表_贪心_数论

    Do Not Duplicate 题目链接:https://atcoder.jp/contests/agc036/tasks/agc036_b 题解: 首先最后肯定至多只有$n$个数. 我们想处理出来 ...

  9. 7.编写mapreduce案例

    在写一个mapreduce类之前先添加依赖包 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=&qu ...

  10. linux内核开源代码地址下载

    https://www.kernel.org/pub/linux/kernel/v2.6/