首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >“思考Python3”一书中day_num问题的解决方案

“思考Python3”一书中day_num问题的解决方案
EN

Stack Overflow用户
提问于 2019-02-11 20:09:25
回答 4查看 769关注 0票数 2

第三版“如何像计算机科学家那样思考:用Python 3学习”一书的第4.17节中有练习

编写一个将整数0到6转换为日期名称的函数day_name。假定第0天是“星期日”。如果该函数的参数无效,请再次返回None。

我已经写了下面的代码,它解决了大部分问题,除了我不能理解如何为无效参数返回"None“。请协助...

代码语言:javascript
运行
复制
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“

EN

回答 4

Stack Overflow用户

发布于 2019-02-11 20:18:28

向您的函数添加验证。您可以显式执行此操作:

代码语言:javascript
运行
复制
if x in range(7):
    return days[x]
else:
    return None

这就是所谓的三思而后行:在尝试选择days[x]之前,您需要检查它是否存在。

或者,您可以让选择失败并捕获错误:

代码语言:javascript
运行
复制
try:
    return days[x]
except IndexError:
    return None
票数 3
EN

Stack Overflow用户

发布于 2019-02-11 20:14:54

您正在使用列表数据结构。它是基于索引工作的。

代码语言:javascript
运行
复制
["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]
    0         1          2          3            4          5           6

当我们访问print(day_name(7))时,我们试图访问不可用的索引7。所以,它抛出了错误。

更好的方法是

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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)

输出

代码语言:javascript
运行
复制
None
3.09944152832e-05
None
1.09672546387e-05

有关更多脱轨信息,请查看https://learnbatta.com/course/python/python-working-with-lists/

票数 1
EN

Stack Overflow用户

发布于 2019-02-11 20:16:25

代码语言:javascript
运行
复制
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所说,这也是一个很好的实践,只捕获特定的异常,而不是全面的异常,除非语句如下:

代码语言:javascript
运行
复制
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库进行时间测试的例子:

代码语言:javascript
运行
复制
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

这意味着速度可以与之媲美。所以,当然,你应该使用一种更具蟒蛇风格的方式。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54630330

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档