Python学习笔记

用pythonic方式来思考(1)

2018-04-20  本文已影响0人  小懒额

先 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 风格指南
第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
上一篇下一篇

猜你喜欢

热点阅读