用pythonic方式来思考(1)

先 print 一下 Zen of Python,让我们学会如何离 pythonic 更近:

import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!
第1条: 确认自己所用的 Python 版本

如果电脑里面同时安装了 python2 和 python3 的话,通常我们用 python 来运行 python2 的版本, 用 python3 来运行 python3 的版本。
查看电脑已安装的 python 版本时,可以使用 python --version 或者 python3 --version 来获取当前的版本号。
也可以通过内置的 sys 模块来查询。

>>> import sys
>>> print(sys.version_info)
sys.version_info(major=3, minor=6, micro=4, releaselevel='final', serial=0)
>>> print(sys.version)
3.6.4 (v3.6.4:d48eceb, Dec 19 2017, 06:04:45) [MSC v.1900 32 bit (Intel)]

由于 Python 核心团队计划在 2020 年停止支持 Python 2,最好还是学习 python3。
第一条建议应该就是让我们学会查看自己当前使用的 python 版本并推荐使用 python3。

第2条:遵循 PEP 8 风格指南
  • 使用 space 来缩进,而不是直接用 tab。
  • 语法相关的每个缩进都用 4 个空格来表示。
  • 每行的字符数不超过 79。(现在 pycharm 编辑器中字符数推荐是不超过121)
  • 表达式过长,分行时首行之外的其余行需要缩进4个空格。
  • 同一文件中函数与函数之间,函数与类之间,类与类之间,隔开两个空行。
  • 下标获取元素,调用函数和给关键字参数赋值时,“=”号两边加不需要加空格。
  • 变量赋值需要在两侧各加一个空格。
  • 函数、变量以及属性使用小写字母拼写,各单词之间加下划线。如 do_something()。
  • 类与异常使用首字母大写拼写。如 ClassExcept()。
  • 受保护的实例属性,单个下划线开头。如 _protected_instance。
  • 私有实例属性,双下划线开头。如 __private_value。
  • 模块级别常量,全部使用大写字母表示。如MAX_LEN。
  • 类中实例方法,首个参数为 self, 表示对象自身。
  • 类方法,首个参数为cls。
  • 采用内联方式的否定,不要把否定否定整个表达式的前面。
  • 不要通过检测长度的方法来判断 somelist 如字符串、列表、字典等是否为空,应该采用 if not 。
  • 检测 somelist 非空时,同理,使用 if somelist。
  • 不要编写单行的 if语句、for循环、while循环以及except复合语句。
  • import 语句总应该放在文件开头。
  • 引入模块时,总是应该使用绝对名称,而不是根据当前模块路径来使用相对名称。
  • 如果一定要使用相对名称来编写 import 语句,采用明确的写法:from.import foo
  • 文件中 import 语句应该按顺序划分为三个部分,分别表示为标准库模块,第三方模块以及自用模块。在每一部分之中,按模块的字母顺序来排列。
第3条:了解 bytes、str 与 unicode的区别

python3 有两种表示字符序列的类型:bytes 和 str。bytes实例是原始的8位值,str实例包含Unicode字符。
python2 也有两种字符序列的类型:str 和 unicode。str实例包含原始的8位值,unicode实例包含unicode字符。
在python2 和 python3 中,我们可以编写函数来实现输入是 str 或者 unicode 总是返回 str 或者 unicode 的一种的方法。
在 python3 中,
总是返回 str:

def to_str(chara_seq):
    if isinstance(chara_seq, bytes):
        value = chara_seq.decode('utf8')
    else:
        value = chara_seq

总是返回 bytes:

def to_bytes(chara_seq):
    if isinstance(chara_seq, str):
        value = chara_seq.encode('utf-8')
    else:
        value = chara_seq

在 python2 中,
总是返回unicode:

def to_unicode(chara_seq):
    if isinstance(chara_seq, str):
        value = chara_seq.decode('utf-8')
    else:
        value = chara_seq

总是返回 str:

def to_str(chara_seq):
    if isinstance(chara_seq, unicode):
        value = chara_seq.encode('utf-8')
    else:
        value = chara_seq

注意: python3使用打开文件的open()函数时,默认使用utf8,以'rb'或'wb'来进行文件的读操作和写操作。

第4条:用辅助函数来取代复杂的表达式

表达式如果变得比较复杂,应该考虑将其拆解成小块,并把逻辑移入辅助函数中。
比如从一个字典中获取一个值的判断,有可能写成:
foo_dict.get(key)
当字典中无法获取到给定的 key 时,即返回 None,希望返回一个默认值,可以写成:
value = foo_dict.get(key) or default_value
这样就可以实现在字典中获取不到指定 key 时,得到自己设置的默认值。
如果需要字典中取出的值时 int 型,则改为:
value = int(foo_dict.get(key)) or default_value
如果使用简洁易懂的 if/else 表达式,可以写成:
value = foo_dict.get(key)
value = int(value) if value else default_value
但是如果频繁使用这种逻辑,更好的方式是做成辅助函数的方式,

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

推荐阅读更多精彩内容

  • Python 面向对象Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对...
    顺毛阅读 4,207评论 4 16
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,590评论 18 139
  • 01 “早更!一定是早更!” 从楼下星巴克回来的我,电脑一开就蹦出露西极其愤怒的投诉,害的我差点用咖啡星子溅电脑一...
    琼华Vivian阅读 4,693评论 17 22
  • 行侠仗义、惩恶扬善、嫉恶如仇、劫富济贫,哪怕你是“朗生”,那你也与格萨尔无异。by张承宇 永远永远永远,这片土地永...
    张承宇Tomato阅读 231评论 0 1
  • 1:栈 (1.6) : 主要是用于实现堆栈数据结构的存储方式。先进后出 2:队列(双端队列1.5): 主要是为了...
    小小机器人阅读 1,538评论 0 0