第三版“如何像计算机科学家那样思考:用Python 3学习”一书的第4.17节中有练习
编写一个将整数0到6转换为日期名称的函数day_name。假定第0天是“星期日”。如果该函数的参数无效,请再次返回None。
我已经写了下面的代码,它解决了大部分问题,除了我不能理解如何为无效参数返回"None“。请协助...
def day_name(x):
days=["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]
return days[x]
print(day_name(5))
如果I为print(day_name(7))
,则返回python错误而不是"None“
发布于 2019-02-11 20:18:28
向您的函数添加验证。您可以显式执行此操作:
if x in range(7):
return days[x]
else:
return None
这就是所谓的三思而后行:在尝试选择days[x]
之前,您需要检查它是否存在。
或者,您可以让选择失败并捕获错误:
try:
return days[x]
except IndexError:
return None
发布于 2019-02-11 20:14:54
您正在使用列表数据结构。它是基于索引工作的。
["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]
0 1 2 3 4 5 6
当我们访问print(day_name(7))
时,我们试图访问不可用的索引7
。所以,它抛出了错误。
更好的方法是
def day_name(x):
days = {
0: 'Sunday',
1: 'Monday',
2: 'Tuesday',
3: 'Wednesday',
4: 'Thursday',
5: 'Friday',
6: 'Saturday'
}
return dic.get(x)
print(day_name(7))
字典的速度更快,因为它使用了散列技术。
速度测试列表索引vs. dict key
from time import time
t = time()
lst = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]
try:
print(lst[7])
except IndexError:
pass
print(time() - t)
t = time()
days = {
0: 'Sunday',
1: 'Monday',
2: 'Tuesday',
3: 'Wednesday',
4: 'Thursday',
5: 'Friday',
6: 'Saturday'
}
print(days.get(7))
print(time() - t)
输出
None
3.09944152832e-05
None
1.09672546387e-05
有关更多脱轨信息,请查看https://learnbatta.com/course/python/python-working-with-lists/
发布于 2019-02-11 20:16:25
def day_name(x):
days=["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]
try:
return days[x]
except:
return None
您可以使用for循环,但这是更好的方法。https://docs.python.org/3/tutorial/errors.html#handling-exceptions。
正如@Derte所说,这也是一个很好的实践,只捕获特定的异常,而不是全面的异常,除非语句如下:
def day_name(x):
days=["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]
try:
return days[x]
except IndexError as e:
print(e)
return None
下面是一个使用timeit库进行时间测试的例子:
import timeit
def day_name_eafp(x):
days=["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]
try:
return days[x]
except IndexError as e:
return None
def day_name_dict(x):
days = {
0: 'Sunday',
1: 'Monday',
2: 'Tuesday',
3: 'Wednesday',
4: 'Thursday',
5: 'Friday',
6: 'Saturday'
}
return days.get(x)
def wrapper(func, *args, **kwargs):
def wrapped():
return func(*args, **kwargs)
return wrapped
x=7
wrapped_eafp = wrapper(day_name_eafp, x)
wrapped_dict = wrapper(day_name_dict, x)
timeit.timeit(wrapped_eafp, number=100000)
>>0.05935070099803852
timeit.timeit(wrapped_dict, number=100000)
>>0.06682577800165745
这意味着速度可以与之媲美。所以,当然,你应该使用一种更具蟒蛇风格的方式。
https://stackoverflow.com/questions/54630330
复制相似问题