Python 工匠:使用数字与字符串的技巧学习笔记

#Python 工匠:使用数字与字符串的技巧学习笔记
#https://github.com/piglei/one-python-craftsman/blob/master/zh_CN/3-tips-on-numbers-and-strings.md

 

:使用 enum 枚举类型改善代码

#避免如下代码
def mark_trip_as_featured(trip):
    """将某个旅程添加到推荐栏目
    """
    if trip.source == 11:
        do_some_thing(trip)
    elif trip.source == 12:
        do_some_other_thing(trip)
    ... ...
    return


#提倡如下代码
from enum import IntEnum

class TripSource(IntEnum):
    FROM_WEBSITE = 11
    FROM_IOS_CLIENT = 12


def mark_trip_as_featured(trip):
    if trip.source == TripSource.FROM_WEBSITE:
        do_some_thing(trip)
    elif trip.source == TripSource.FROM_IOS_CLIENT:
        do_some_other_thing(trip)
    ... ...
    return

 

:不必预计算字面量表达式

 

#避免如下代码
def f1(delta_seconds):
    # 如果时间已经过去了超过 11 天,不做任何事
    if delta_seconds > 950400:
        return 
    ...
#提倡如下代码
def f1(delta_seconds):
    if delta_seconds > 11 * 24 * 3600:
        return

 

实用技巧

 

1.布尔值其实也是“数字”
["Python", "Javascript"][2 > 1]
'Javascript'


[2>1]为True,True即1
["Python", "Javascript"][1]

 

2.改善超长字符串的可读性

使用括号将长字符串包起来,然后就可以随意折行了:

def main():
    logger.info(("There is something really bad happened during the process. "
                 "Please contact your administrator."))

 


可以用标准库 textwrap 来解决整段代码的缩进视觉效果

 

 

from textwrap import dedent

def main():
    if user.is_active:
        # dedent 将会缩进掉整段文字最左边的空字符串
        message = dedent("""\
            Welcome, today's movie list:
            - Jaw (1975)
            - The Shining (1980)
            - Saw (2004)""")

 

3.float("inf") 和 float("-inf") 它们俩分别对应着数学世界里的正负无穷大。当它们和任意数值进行比较时,满足这样的规律:float("-inf") < 任意数值 < float("inf")。

因为它们有着这样的特点,我们可以在某些场景用上它们:

# A. 根据年龄升序排序,没有提供年龄放在最后边
>>> users = {"tom": 19, "jenny": 13, "jack": None, "andrew": 43}
>>> sorted(users.keys(), key=lambda user: users.get(user) or float('inf'))
['jenny', 'tom', 'andrew', 'jack']

# B. 作为循环初始值,简化第一次判断逻辑
>>> max_num = float('-inf')
>>> # 找到列表中最大的数字
>>> for i in [23, 71, 3, 21, 8]:
...:    if i > max_num:
...:         max_num = i
...:
>>> max_num
71

 

上一篇:Java //PP2.6 编写一个应用程序,将英里转换为千米(1英里等于1.60935千米)。以浮点数类型读取用户输入的英里数


下一篇:Python 编程语言要掌握的技能之一:善用变量来改善代码质量