elif seconds_delta < 3600 * 24:return "{} hours ago".format(seconds_delta // 3600)else:return "{} days ago".format(seconds_delta // (3600 * 24))now = time.timeprint(from_now(now))print(from_now(now - 24))print(from_now(now - 600))print(from_now(now - 7500))print(from_now(now - 87500))# OUTPUT:# less than 1 second ago# 24 seconds ago# 10 minutes ago# 2 hours ago# 1 days ago60 。而判断是否应该用分钟时,用到了3600 。从边界提炼规律是优化这段代码的关键 。如果我们将所有的这些边界放在一个有序元组中,然后配合二分查找模块 bisect 。整个函数的控制流就能被大大简化:
-
import bisect
-
# BREAKPOINTS 必须是已经排好序的,不然无法进行二分查找
-
BREAKPOINTS = (1, 60, 3600, 3600 * 24)
-
TMPLS = (
-
# unit, template
-
(1, "less than 1 second ago"),
-
(1, "{units} seconds ago"),
-
(60, "{units} minutes ago"),
-
(3600, "{units} hours ago"),
-
(3600 * 24, "{units} days ago"),
-
)
-
def from_now(ts):
-
"""接收一个过去的时间戳,返回距离当前时间的相对时间文字描述
-
"""
-
seconds_delta = int(time.time - ts)
-
unit, tmpl = TMPLS[bisect.bisect(BREAKPOINTS, seconds_delta)]
-
return tmpl.format(units=seconds_delta // unit)
if/else分支外,有些情况下字典也能被用来做同样的事情 。关键在于从现有代码找到重复的逻辑与规律,并多多尝试 。2. 在更多地方使用动态解包动态解包操作是指使用
*或**运算符将可迭代对象“解开”的行为,在 Python 2 时代,这个操作只能被用在函数参数部分,并且对出现顺序和数量都有非常严格的要求,使用场景非常单一 。-
def calc(a, b, multiplier=1):
-
return (a + b) * multiplier
-
# Python2 中只支持在函数参数部分进行动态解包
-
print calc(*[1, 2], **{"multiplier": 10})
-
# OUTPUT: 30
*和**的使用场景被大大扩充了 。举个例子,在 Python 2 中,如果我们需要合并两个字典,需要这么做:-
def merge_dict(d1, d2):
-
# 因为字典是可被修改的对象,为了避免修改原对象,此处需要复制一个 d1 的浅拷贝
-
result = d1.copy
-
result.update(d2)
-
return result
-
user = merge_dict({"name": "piglei"}, {"movies": ["Fight Club"]})
**运算符来快速完成字典的合并操作:-
user = {**{"name": "piglei"}, **{"movies": ["Fight Club"]}}
*运算符来动态的解包可迭代对象 。如果你想详细了解相关内容,可以阅读下面推荐的 PEP 。Hint:推进动态解包场景扩充的两个 PEP:
- PEP 3132 -- Extended Iterable Unpacking | Python.org
- PEP 448 -- Additional Unpacking Generalizations | Python.org
推荐阅读
- MySQL的查询性能分析神器:explain命令的使用详解
- Python爬虫:scrapy之Cookie和Session
- Python中的高阶函数
- 国内顶尖大佬整理的Python入门教程完整版!懂中文就能学会
- 一文看懂Python变量和赋值语句
- 在Python中定义Main函数
- 红衣天使怎么养 小红衣怎么养
- 怎样正确使用阿司匹林
- 买房为什么要交公共维修基金?什么情况下使用公共维修基金……
- 医保卡使用有技巧,做对这几件事报销的更多
