加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

有人可以通过这个Python代码并向我解释

发布时间:2020-12-20 11:29:37 所属栏目:Python 来源:网络整理
导读:months = ['January','February','March','April','May','June','July','August','September','October','November','December']def valid_month(month): if month: cap_month = month.capitalize() if cap_month in months: return cap_month 所以上面是创
months = ['January','February','March','April','May','June','July','August','September','October','November','December']

def valid_month(month):
    if month:
        cap_month = month.capitalize()
        if cap_month in months:
            return cap_month

所以上面是创建月份列表的python代码,基本上打印用户输入的内容,如果它是有效的月份.上面的代码很好.

下面是另一个类似于上面的版本,但我想更好或更用户友好.但我不确定这是如何工作的我没有看到这种方式的python词典可以有人通过这个代码并解释给我,非常感谢我.

months_abbvs = dict((m[:3].lower(),m) for m in months)

def valid_month(month):
    if month:
        short_month = month[:3].lower()
        return month_abbvs.get(short_month)

解决方法

打印出从额外步骤中获得的内容可能会有所帮助:

>>> months_abbvs
{'apr': 'April','aug': 'August','dec': 'December','feb': 'February','jan': 'January','jul': 'July','jun': 'June','mar': 'March','may': 'May','nov': 'November','oct': 'October','sep': 'September'}

因此,您可以将小写缩写映射到完整月份名称.

这是如何运作的?好吧,首先,让我们看看表达式的作用:

>>> m = 'December'
>>> m[:3].lower()
'dec'
>>> m[:3].lower(),m
('dec','December')

所以,每个月的理解就是这样:

>>> [(m[:3].lower(),m) for m in months]
[('jan','January'),('feb','February'),('mar','March'),('apr','April'),('may','May'),('jun','June'),('jul','July'),('aug','August'),('sep','September'),('oct','October'),('nov','November'),('dec','December')]

正如在the tutorial中更详细地解释的那样,理解基本上是循环的简写.特别是,这个:

>>> m2 = [<expression with m> for m in months]

……相当于:

>>> m2 = []
>>> for m in months:
...     m2.append(<expression with m>)

使用生成器表达式而不是列表推导仅意味着将序列构建为惰性迭代器而不是列表.

然后将结果(以任一方式)传递给dict构建一个字典,将每个元组的第一个值映射到第二个元组.

作为词典理解,你可以更可读地写这个:

months_abbvs = {m[:3].lower(): m for m in months}

更好的是,不要反复写m [:3] .lower(),给它一个好名字并使用它:

def abbreviate(m):
    return m[:3].lower()
months_abbvs = {abbreviate(m): m for m in months}

然后:

def valid_month(month):
    if month:
        short_month = abbreviate(month)
        return month_abbvs.get(short_month)

现在,您在新版本中对输入所做的是:

short_month = month[:3].lower()
return month_abbvs.get(short_month)

由于month_abbvs是一个dict(你可以通过打印出来,或者只是通过调用dict来创建它),get方法是dict.get.所以,如链接文档中所述,month_abbvs.get( short_month)与months_abbvs [short_month]相同,只是如果找不到密钥short_month,则会得到None,而不是引发异常.

所以,如果给出’October’,你将short_month设置为’oct’.然后你在缩写词典中查找,它返回’October’.如果给出’OCT’或’october’或’octal digit string’,你也会返回同样的东西.因为任何非空字符串都是真实的,如果你做过if_month(‘October’)这样的事情,那就是真的.

但是,如果给出,比如说’穆罕默德’,你就会把短期定为’muh’.然后你看起来,它不存在.如上所述,get方法为未知键返回None,因此您将返回None.因为“无”是假的,如果你做过像if_month(‘穆罕默德’)这样的事情,那就不是真的了.

换句话说,它使功能更加宽松 – 这可能是一种改进,或者可能是一件坏事(或者可能是两者兼而有之 – 可能你想要’OCT’工作,但不是’八进制数字串’).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读