什么是 Pythonic?
个人理解:Pythonic 就是在符合 Python 之禅的基础上,充分利用 Python 语言特色的同时而又不过分的炫技来实现具体的功能。
字符串格式化
有其他语言经验的人对格式化字符串应该不是特别的陌生,像 C 的 printf、Golang 的 fmt.Printf,而 Python 的字符串格式化则很有自己的特色。
例如:
#! /usr/bin/env python
# -*- coding: utf-8 -*-
__author__ = 'xieyanke'
def ordinary_format():
'''这种方式的缺点是:因为占位符是通过value 元组中的索引位置匹配的,当占位符出现多个后,添加、更新、删除等操作会变得非常的不便利'''
value = ("xieyanke", )
tpl = "Hello: %s" % value
print(tpl)
def pythonic_format():
''' 这种方式解决了因为占位符数量上升带来的负担,但是在可读性上还有待提升'''
value = {'name': 'xieyanke'}
tpl = "Hello: %(name)s" % value
print(tpl)
def pythonicest_format():
'''基本完美解决了以上两种缺点,推荐使用 string.format '''
value = 'xieyanke'
tpl = "Hello: {name}".format(name=value)
print(tpl)
if __name__ == '__main__':
ordinary_format()
pythonic_format()
pythonicest_format()
变量交换
在 C 语言或者 Java 中如果要交换两个变量的值,往往我们需要定义一个中间变量 tmp,在 Python 中虽然我们也可以沿用这样的方式,但是这样的代码起码让人看起来一点也不 Pythonic
#! /usr/bin/env python
# -*- coding: utf-8 -*-
def ordinary():
''' 缺点代码不够简洁'''
b = 'I am b'
a = "I am a"
tmp = a
a = b
b = tmp
print('a: ' + a, 'b: ' + b)
def pythonic():
'''推荐这种方式,很 pythonic '''
b = 'I am b'
a = "I am a"
a, b = b, a
print('a: ' + a, 'b: ' + b)
if __name__ == '__main__':
pythonic()
ordinary()
迭代序列并获取 index 与 value
迭代一个 序列的数据结构是一个很普通的需求,同时获取 index 与对应的 value 也相信每个人都有自己的实现方式,那么哪种方式最 Pythonic 呢?
#! /usr/bin/env python
# -*- coding: utf-8 -*-
__auther__ = 'xieyanke'
list_a = ['a', 'b', 'c', 'd']
def ordinary_for_loop(arg_list):
'''传统的 for 循环方式获取 index 与 value,缺点引入了 i 变量自增的过程, 代码不够简洁'''
i = 0
for item in arg_list:
print(i, item)
i += 1
def ordinary_while_loop(arg_list):
''' 传统的 while 循环方式获取 index 与 value,缺点与 for 循环相同,代码不够简洁'''
i = 0
while i < len(arg_list):
print(i, arg_list[i])
i += 1
def ordinary_range(arg_list):
'''通过 range 与 len 组合实现获取 index 与 value,虽然代码简洁了一些,但是可读性下降了'''
for i in range(len(arg_list)):
print(i, arg_list[i])
def pythonic_iteration(arg_list):
'''通过 enumerate 函数实现 index 与 value的迭代,基本满足代码足够简洁而且可读性良好'''
for i, v in enumerate(arg_list):
print(i, v)
if __name__ == '__main__':
ordinary_for_loop(list_a)
ordinary_while_loop(list_a)
ordinary_range(list_a)
pythonic_iteration(list_a)