如何让你的代码更 Pythonic?

什么是 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)
    原文作者:谢烟客
    原文地址: https://www.jianshu.com/p/a100adfe85ab
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞