pythonic_Pythonic定义

Pythonic定义

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

copycode.gif

优美胜于丑陋(Python 以编写优美的代码为目标)

明了胜于晦涩(优美的代码应当是明了的,命名规范,风格相似)

简洁胜于复杂(优美的代码应当是简洁的,不要有复杂的内部实现)

复杂胜于凌乱(如果复杂不可避免,那代码间也不能有难懂的关系,要保持接口简洁)

扁平胜于嵌套(优美的代码应当是扁平的,不能有太多的嵌套)

间隔胜于紧凑(优美的代码有适当的间隔,不要奢望一行代码解决问题)

可读性很重要(优美的代码是可读的)

copycode.gif

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

copycode.gif

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)

copycode.gif

Pythonic代码风格

交换两个变量

C语言代码如下:

copycode.gif

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 //这样的形式,可以不用引入第三个变量

copycode.gif

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...应使用字典来实现

copycode.gif

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")

copycode.gif

编写Pythonic代码

避免劣化代码

避免只用大小写来区分不同的对象;

避免使用容易引起混淆的名称,变量名应与所解决的问题域一致;

不要害怕过长的变量名;

代码中添加适当注释

行注释仅注释复杂的操作、算法,难理解的技巧,或不够一目了然的代码;

注释和代码要隔开一定的距离,无论是行注释还是块注释;

给外部可访问的函数和方法(无论是否简单)添加文档注释,注释要清楚地描述方法的功能,并对参数,返回值,以及可能发生的异常进行说明,使得外部调用的人仅看docstring就能正确使用;

推荐在文件头中包含copyright申明,模块描述等;

注释应该是用来解释代码的功能,原因,及想法的,不该对代码本身进行解释;

对不再需要的代码应该将其删除,而不是将其注释掉;

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

在一组代码表达完一个完整的思路之后,应该用空白行进行间隔,推荐在函数定义或者类定义之间空两行,在类定义与第一个方法之间,或需要进行语义分隔的地方空一行,空行是在不隔断代码之间的内在联系的基础上插入的;

尽量保证上下文语义的易理解性,一般是调用者在上,被调用者在下;

避免过长的代码行,每行最好不要超过80字符;

不要为了保持水平对齐而使用多余的空格;

编写函数的几个原则

函数设计要尽量短小,嵌套层次不宜过深;

函数申明应做到合理、简单、易于使用,函数名应能正确反映函数大体功能,参数设计应简洁明了,参数个数不宜过多;

函数参数设计应考虑向下兼容;

一个函数只做一件事,尽量保证函数语句粒度的一致性;

将常量集中到一个文件

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

通过命名风格来提醒使用者该变量代表的意义为常量,如常量名所有字母大写,用下划线连接各个单词,如MAX_NUMBER,TOTLE等;

通过自定义的类实现常量功能,常量要求符合两点,一是命名必须全部为大写字母,二是值一旦绑定便不可再修改;

copycode.gif

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()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值