如何讓你的代碼更 Pythonic?

什么是 Pythonic?

個人理解:Pythonic 就是在符合 Python 之禪的基礎(chǔ)上,充分利用 Python 語言特色的同時而又不過分的炫技來實現(xiàn)具體的功能。

字符串格式化

有其他語言經(jīng)驗的人對格式化字符串應(yīng)該不是特別的陌生,像 C 的 printf、Golang 的 fmt.Printf,而 Python 的字符串格式化則很有自己的特色。

例如:

#! /usr/bin/env python
# -*- coding: utf-8 -*-

__author__ = 'xieyanke'


def ordinary_format():
    '''這種方式的缺點是:因為占位符是通過value 元組中的索引位置匹配的,當占位符出現(xiàn)多個后,添加、更新、刪除等操作會變得非常的不便利'''
    value = ("xieyanke", )
    tpl = "Hello: %s" % value

    print(tpl)


def pythonic_format():
    ''' 這種方式解決了因為占位符數(shù)量上升帶來的負擔(dān),但是在可讀性上還有待提升'''
    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

迭代一個 序列的數(shù)據(jù)結(jié)構(gòu)是一個很普通的需求,同時獲取 index 與對應(yīng)的 value 也相信每個人都有自己的實現(xiàn)方式,那么哪種方式最 Pythonic 呢?

#! /usr/bin/env python
# -*- coding: utf-8 -*-

__auther__ = 'xieyanke'

list_a = ['a', 'b', 'c', 'd']


def ordinary_for_loop(arg_list):
    '''傳統(tǒng)的 for 循環(huán)方式獲取 index 與 value,缺點引入了 i 變量自增的過程, 代碼不夠簡潔'''
    i = 0
    for item in arg_list:
        print(i, item)
        i += 1


def ordinary_while_loop(arg_list):
    ''' 傳統(tǒng)的 while 循環(huán)方式獲取 index 與 value,缺點與 for 循環(huán)相同,代碼不夠簡潔'''
    i = 0
    while i < len(arg_list):
        print(i, arg_list[i])
        i += 1


def ordinary_range(arg_list):
    '''通過 range 與 len 組合實現(xiàn)獲取 index 與 value,雖然代碼簡潔了一些,但是可讀性下降了'''
    for i in range(len(arg_list)):
        print(i, arg_list[i])


def pythonic_iteration(arg_list):
    '''通過 enumerate 函數(shù)實現(xiàn) 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)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容