【问题标题】:Question about if statement if not thing is specified after it?关于 if 语句 if not 后面指定的问题?
【发布时间】:2021-01-09 22:50:24
【问题描述】:

我想问三件事。首先,对于第 10 行,这是一个“其他”语句吗?似乎并非如此——如果不是,它的作用是什么?

其次,对于第 8 行,我们是说如果 'val' 在列表 char_set 中,则返回 False?一般来说,我们会这样写吗?

最后,对于第 5 行,[False for _ in range(128)] 有什么作用?谢谢!

 def unique(string):
    if len(string) > 128:
        return False

    char_set = [False for _ in range(128)]
    for char in string:
        val = ord(char)                 
        if char_set[val]:          
            return False
        char_set[val] = True      

    return True

【问题讨论】:

    标签: python if-statement scope


    【解决方案1】:

    让我们按时间顺序(代码执行)回答这个问题:

    • 第 5 行,[False for _ in range(128)] 创建一个包含 128 个 False 值的列表。这是列表推导式,可以改写如下:
    char_set = []
    for _ in range(128):
        char_set.append(False)
    

    _ 表示从迭代器(range 对象)中读取值,并丢弃它。

    • 第 8 行:val 是字符的ord,表示数字。 char_set[val] 为我们提供了索引val 处的元素,它被初始化为False。在您的代码期间(特别是第 10 行),这可能会被覆盖为True。此处的if 语句检查该索引中的值是否为True
    • 第 10 行:这不是 else 语句,尽管在这种情况下它的工作原理相同。在这段代码中,如果第 8 行中的条件不满足,那么代码执行流程会像第 9 行一样跳过并“落空”到第 10 行,然后生活继续。如果第 8 行中的条件满足(即char_set[val]True),则第 9 行被执行,return 语句突然结束函数调用,同时返回False 作为结果。

    【讨论】:

    • 也可以将[False for _ in range(128)]简化为[false] * 128
    • @Hadrian 在这种情况下是的,因为bool 是不可变的,否则会发生别名。
    猜你喜欢
    • 2021-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-23
    • 1970-01-01
    • 2012-11-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多