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语言代码如下:

 int a = , b = ;
int tmp = a;
a = b;
b = tmp; //如果两个变量都为整数类型,当然也可使用: int a = , b = ;
a = a^b;
b = a^b;
a = a^b; //这样的形式,可以不用引入第三个变量

Pythonic代码如下:

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

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

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

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

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

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

 name = 'Tom'
age = ''
print 'Hello %s, your age is %s !' % (name, age)

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

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

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

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

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

  • 包和模块

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

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

  • 过多的if...elif...elif......else...应使用字典来实现
 if n == 0:
print "You typed zero..."
elif n == 1:
print "You are in top..."
elif n == 2:
print "n is even number..."
else:
print "Default value" # 使用字典来实现更好一些 def f(x):
return {
0: "You typed zero...",
1: "You are in top...",
2: "n is even number...",
}.get(x, "Default value")

编写Pythonic代码

避免劣化代码

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

代码中添加适当注释

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

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

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

编写函数的几个原则

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

将常量集中到一个文件

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

  • 通过命名风格来提醒使用者该变量代表的意义为常量,如常量名所有字母大写,用下划线连接各个单词,如MAX_NUMBER,TOTLE等;
  • 通过自定义的类实现常量功能,常量要求符合两点,一是命名必须全部为大写字母,二是值一旦绑定便不可再修改;
 class _const:

     class ConstError(TypeError): pass
class ConstCaseError(ConstError): pass def __setattr__(self, name, value):
if name in self.__dict__:
rasie self.ConstError, "Can't change const.%s" % name
if not name.isupper():
raise self.ConstCaseError, "const name '%s' is not all uppercase" % name self.__dict__[name] = value import sys
sys.modules[__name__] = _const()

无论是用哪种方式,都应该将常量集中到一个文件中,便于维护管理;

——《编写高质量代码》读后总结

Python常见编程规范总结的更多相关文章

  1. python代码编程规范

    一.内容格式 1.注释部分:模块名及简介(一般用一行写完),模块描述(包含各类方法),其它描述(注意点,功能,示例等,可以分多段) 2.导入模块:Import XXX 3.全局变量定义:wantobj ...

  2. Python PE8 编程规范

    1.使用四个空格而不是tab进行缩进 2.默认使用utf-8编码 3.尽量不要使用魔术方法 4.类中使用self作为默认参数 5.命名时,尽量使用驼峰式或单词+下划线,要保证见名知意 6.操作符和逗号 ...

  3. Python PE8编程规范

    参考博客:https://blog.csdn.net/weixin_39723544/article/details/82144280 1.使用四个空格而不是tab进行缩进 2.默认使用utf-8编码 ...

  4. Python 编程规范-----转载

    Python编程规范及性能优化 Ptyhon编程规范 编码 所有的 Python 脚本文件都应在文件头标上 # -*- coding:utf-8 -*- .设置编辑器,默认保存为 utf-8 格式. ...

  5. Python编程规范(PEP8)

    Python编程规范(PEP8) 代码布局 缩进 对于每一次缩进使用4个空格.使用括号.中括号.大括号进行垂直对齐,或者缩进对齐. 制表符还是空格? 永远不要将制表符与空格混合使用.Python最常用 ...

  6. Python编程规范及性能优化(转载)

    转载地址:http://codeweblog.com/python编程规范及性能优化/

  7. Python 浅谈编程规范和软件开发目录规范的重要性

    最近参加了一个比赛,然后看到队友编程的代码,我觉得真的是觉得注释和命名规范的重要性了,因为几乎每个字符都要咨询他,用老师的话来说,这就是命名不规范的后续反应.所以此时的我意识到写一篇关于注释程序的重要 ...

  8. python函数式编程,性能,测试,编码规范

    这篇文章主要是对我收集的一些文章的摘要.因为已经有很多比我有才华的人写出了大量关于如何成为优秀Python程序员的好文章. 我的总结主要集中在四个基本题目上:函数式编程,性能,测试,编码规范.如果一个 ...

  9. Python爬虫编程常见问题解决方法

    Python爬虫编程常见问题解决方法: 1.通用的解决方案: [按住Ctrl键不送松],同时用鼠标点击[方法名],查看文档 2.TypeError: POST data should be bytes ...

随机推荐

  1. neutron负载均衡高可用测试

    对工作中,实验环境的一个小总结 1.创建高可用负载均衡器------创建高可用的时候,添加上ha-mode参数即可 neutron lb-pool-create --lb-method ROUND_R ...

  2. iOS 面试全方位剖析 -- Block篇

    1.Block的本意 block本质上也是一个OC对象,它内部也有个isa指针, block是封装了函数调用以及函数调用环境的OC对象, block是封装函数及其上下文的OC对象 2.block截获变 ...

  3. Unity 2018中的图形渲染

    https://mp.weixin.qq.com/s?__biz=MzU5MjQ1NTEwOA==&mid=2247490249&idx=1&sn=d86083e33d9884 ...

  4. 上传文件到linux乱码问题

    由于linux系统编码一般设置为utf-8,而中文windows下通常默认编码是gbk,因此经常需要将文件名或文件内容编码进行转换,文件名编码转换软件:convmv yum install convm ...

  5. uva 1153 顾客是上帝(贪心)

    uva 1153 顾客是上帝(贪心) 有n个工作,已知每个工作需要的时间q[i]和截止时间d[i](必须在此前完成),最多能完成多少个工作?工作只能串行完成,第一项任务开始的时间不早于时刻0. 这道题 ...

  6. HDU1425 A Chess Game

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1524 思路:题目就是给你一个拓扑图,然后指定点的位置放棋子,然后两人轮流移动棋子(题目中的边的关系),直到 ...

  7. POJ3274-Gold Balanced Lineup

    题目链接:点击打开链接 Gold Balanced Lineup Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 16978 ...

  8. Maven项目聚合 jar包锁定 依赖传递 私服

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  9. vue中点击空白处隐藏弹框(用指令优雅地实现)

    在写vue的项目的时候,弹框经常性出现,并要求点击弹框外面,关闭弹框,那么如何实现呢?且听我一一...不了,能实现效果就好 <template> <div> <div c ...

  10. Codeforces Round #506 (Div. 3) - D. Concatenated Multiples(思维拼接求是否为k的倍数)

    题意 给你N个数字和一个K,问一共有几种拼接数字的方式使得到的数字是K的倍数,拼接:“234”和“123”拼接得到“234123” 分析: N <= 2e5,简单的暴力O(N^2)枚举肯定超时 ...