如果说优雅也有缺点的话,那就是你需要艰巨的工作才能得到它,需要良好的教育才能欣赏它。

—— Edsger Wybe Dijkstra

什么是所谓的Pythonic呢?

我发现这是一个很常见的名词,但是又很难去用纯粹理性的描述去表达。生活里有很多这样的词汇,譬如生命,我们与之日常相伴,却并不能准确拿捏定义。

Pythonic是一个很模糊的定义,甚至更接近于口语。很多年前我们说过很黄很暴力,后来演进一步,更多地使用名词形容词化,譬如“这很知乎”、“这很百度”,以及“这很中国”之类。因此Pythonic,可以换一种表达,“这很Python”。

演绎出“Pythonic”这个名词是Python语言的骄傲,表征着其不止是依赖于丰富的社区而使开发者愉悦,Python Style也作为某种标准向计算机科学界输出价值观。

在此以前,我们听说过C风格,C++风格,Java风格。与Python类似广泛流行而并未形成优雅编码风格的一门语言,叫做PHP。

这篇文章前前后后写了三个多月,为此我积累了很多可以认为是Pythonic的案例,这篇文章谨作为一个总结。

遍历:

## Bad 列举

for i in [0, 1, 2, 3, 4, 5]:

print i**2

## Better 使用range

for i in range(6):

print i**2

colors = ['red', 'green', 'blue', 'yellow']

## Bad 通过key遍历

for i in range(len(colors)):

print colors[i]

## Better 使用in直接获取value

for color in colors:

print color

colors = ['red', 'green', 'blue', 'yellow']

## Bad 通过key遍历

for i in range(len(colors)-1, -1, -1):

print colors[I]

## Better 使用in直接获取value

for color in reversed(colors):

print color

colors = ['red', 'green', 'blue', 'yellow']

## Bad 通过key遍历

for i in range(len(colors)):

print i, '--->', colors[i]

## Better 使用enumerate获取 key-value 对

for i, color in enumerate(colors):

print i, '--->', color

names = ['raymond', 'rachel', 'matthew']

colors = ['red', 'green', 'blue', 'yellow']

## Bad 通过key遍历

n = min(len(names), len(colors))

for i in range(n):

print names[i], '--->', colors[i]

## Better 使用 zip 函数

for name, color in zip(names, colors):

print name, '--->', color

排序

colors = ['red', 'green', 'blue', 'yellow']

# 正序

for color in sorted(colors):

print(color)

# 逆序

for color in sorted(colors, reverse=True):

print(color)

# 自定义排序

colors = ['red', 'green', 'blue', 'yellow']

def compare_length(c1, c2):

if len(c1) < len(c2): return -1

if len(c1) > len(c2): return 1

return 0

print sorted(colors, cmp=compare_length)

print sorted(colors, key=len)

终止循环

# Bad 循环内判断

blocks = []

while True:

block = f.read(32)

if block == '':

break

blocks.append(block)

# Better for语句中判断

blocks = []

for block in iter(partial(f.read, 32), ''):

blocks.append(block)

循环结束调用else

# Bad 在循环中创建标记

def find(seq, target):

found = False

for i, value in enumerate(seq):

if value == target:

found = True

break

if not found:

return -1

return i

# Better 通过for-else语句实现

def find(seq, target):

for i, value in enumerate(seq):

if value == target:

break

else:

return -1

return i

字典标记自增

colors = ['red', 'green', 'red', 'blue', 'green', 'red']

# Bad 判断字典是否存在key

d = {}

for color in colors:

if color not in d:

d[color] = 0

d[color] += 1

# Better 使用缺省值

d = {}

for color in colors:

d[color] = d.get(color, 0) + 1

# Best 使用 collections 包

d = collections.defaultdict(int)

for color in colors:

d[color] += 1

赋值

p = 'Raymond', 'Hettinger', 0x30, 'python@example.com'

# Bad 逐个赋值

fname = p[0]

lname = p[1]

age = p[2]

email = p[3]

# Better 统一赋值

fname, lname, age, email = p

# Bad 逐个赋值

def fibonacci(n):

x = 0

y = 1

for i in range(n):

print x

t = y

y = x + y

x = t

# Better 统一赋值

def fibonacci(n):

x, y = 0, 1

for i in range(n):

print x

x, y = y, x + y

字符串拼接

names = ['raymond', 'rachel', 'matthew', 'roger',

'betty', 'melissa', 'judith', 'charlie']

# Bad 使用“+”

s = names[0]

for name in names[1:]:

s += ', ' + name

print s

# Better 使用“join”

print ', '.join(names)

文件操作句柄处理

# Bad 使用try-finally

f = open('data.txt')

try:

data = f.read()

finally:

f.close()

# Better 使用 with

with open('data.txt') as f:

data = f.read()

lock = threading.Lock()

# Bad 使用try-finally

lock.acquire()

try:

print 'Critical section 1'

print 'Critical section 2'

finally:

lock.release()

# Better 使用 with

with lock:

print 'Critical section 1'

print 'Critical section 2'

忽略某个异常

# Bad 使用pass

try:

os.remove('somefile.tmp')

except OSError:

pass

# Better 使用ignored

with ignored(OSError):

os.remove('somefile.tmp’)

水平for条件

# Bad

result = []

for i in range(10):

s = i ** 2

result.append(s)

print sum(result)

# Better 语法糖

print sum(i**2 for i in xrange(10))

使用 % format 字符串

name = 'David'

messages = 3

text = ('Hello %s, you have %i messages'

% (name, messages))

以上,本文不定期更新~

pythonic 代码_如何编写Pythonic的代码?相关推荐

  1. lombok 简化代码_如何编写更少,更好的代码,或Project Lombok

    lombok 简化代码 我长期以来一直打算写有关Lombok的文章 ,以至于每当一个自重的Java开发人员都已经听说过它时,我可能会写它. 尽管如此,值得一提的是,如果只是提醒自己,不要犹豫,尝试性能 ...

  2. javascript 代码_如何使您JavaScript代码保持简单并提高其可读性

    javascript 代码 by Leonardo Lima 莱昂纳多·利马(Leonardo Lima) 如何使您JavaScript代码保持简单并提高其可读性 (How to keep your ...

  3. python测验5 函数和代码_测验5: 函数和代码复用 (第5周)-单选题

    1.以下选项不是函数作用的是:‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬ A. 提 ...

  4. java测试性能代码_关于性能:Java代码内部的基准测试

    我最近一直在研究基准测试,我一直对记录程序数据等感兴趣.我想知道我们是否可以在程序中有效地实现自己的内存使用代码和实现自己的时间消耗代码.我知道如何检查代码运行所需的时间: public static ...

  5. 代码不朽笔记: 编写简单的代码单元

    文章目录 原则 名词 代码示例 保留问题 原则 限制每个代码单元分支点的数量不超过4个. 应该将复杂的单元拆分成多个更简单的单元,避免多个复杂的单元在一起. 该原则能提高可维护性的原因在于,分支点越少 ...

  6. 史上最烂代码_历史上最大的代码库

    史上最烂代码 Here's a diagram of the biggest codebases in history, as measured by lines of code: 这是历史上最大的代 ...

  7. idea看更改过的代码_就是你把所有代码全写在一个类里的?

    来源 | https://urlify.cn/6jQRN3 最近,在对已有项目进行扩展的时候,发现要改动的一个类它长900行,开放了近40个public接口,我流着泪把它给改完了. 为了防止这样的惨剧 ...

  8. vscode中怎样格式化js代码_如何在Visual Studio代码(VSCode)中格式化代码

    回答(30) 2 years ago 对于那些想要自定义要格式化的JavaScript文件的人,可以使用 JSfiles 属性上的任何扩展名同样适用于HTML . { "beautify.o ...

  9. 一段堆栈溢出的代码_为什么堆栈溢出的代码片段会破坏您的项目

    一段堆栈溢出的代码 Stack Overflow has been the saviour of many programmers, including me. Some of us have nev ...

最新文章

  1. 看完这篇Exception 和 Error,和面试官扯皮就没问题了
  2. linux小白-基础命令-useradd
  3. Java黑皮书课后题第8章:*8.25(马尔可夫矩阵)一个n*n的矩阵,如果每个元素都是正数,并且每列的元素的和为1,则成为正马尔可夫矩阵。编写下面的方法来检测矩阵是否是马尔可夫矩阵
  4. 数据结构和算法-链表
  5. CSDN2018博客之星评选——期待各位大佬的投票
  6. AES加密算法256位密钥与128位密钥的不同之处
  7. C语言删掉无关变量无输出,C语言变量类型与输出控制用法实例教程
  8. tensor数据类型转换_PyTorch的tensor数据类型及其相关转换
  9. 遍历Map要选择好的遍历方式(洛谷P1097题题解,Java语言描述)
  10. html获取子节点数量,css判断子元素个数
  11. GDAL被java调用 Cannot find proj.db
  12. 拓端tecdat|Python风险价值计算投资组合VaR(Value at Risk )、期望损失ES(Expected Shortfall)
  13. layui 复选框checked获取值和赋值
  14. 香农辅助定理、KL散度和Jensen不等式
  15. eclipse中追加html模板,Eclipse创建自定义HTML5,JSP模板
  16. HTML教程笔记(菜鸟教程)
  17. 【北亚数据恢复】MSSQL 2000 出现“823”报错信息的数据恢复案例
  18. LeetCode-Hot100-最长回文子串
  19. [ Azure - Cloud Shell ] 微软 Azure Cloud Shell 介绍
  20. mysql集群 MySQL Cluster

热门文章

  1. css3伪类做三角型,css伪元素写三角形
  2. Jeeplus-vue 实现文件的上传
  3. FFMPEG:利用ffmpeg转换3gp文件
  4. wsl使用可视化界面_启用Windows10的Linux子系统并安装图形界面
  5. 【高德地图API】从零开始学高德JS API(二)地图控件与插件——测距、圆形编辑器、鼠标工具、地图类型切换、鹰眼鱼骨
  6. 系列文章(十一)丨边缘计算的安全思考
  7. 零数科技向海南省委书记汇报数字金融创新
  8. python echarts 热力图_pyecharts Map 热力图绘制
  9. Redis作用,适用场景,数据类型
  10. “黑色星期五”是怎样成为美国传统的?