如何让你的代码更 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)
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容