当前位置: 首页 > 面试题库 >

str.startswith如何真正起作用?

傅安宁
2023-03-14
问题内容

我玩了一段时间,startswith()发现了一些有趣的东西:

>>> tup = ('1', '2', '3')
>>> lis = ['1', '2', '3', '4']
>>> '1'.startswith(tup)
True
>>> '1'.startswith(lis)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: startswith first arg must be str or a tuple of str, not list

现在,错误显而易见了,将列表转换为元组就可以像开始时一样正常工作:

>>> '1'.startswith(tuple(lis))
True

现在,我的问题是:为什么第 一个参数必须是str或str前缀的元组,而不是 str前缀 的列表

AFAIK,其Python代码startswith()可能如下所示:

def startswith(src, prefix):
    return src[:len(prefix)] == prefix

但这让我更加困惑,因为即使记住了它,列表还是元组也应该没有任何区别。我想念什么?


问题答案:

从技术上讲,没有理由不接受其他序列类型。该源代码大致做到这一点:

if isinstance(prefix, tuple):
    for substring in prefix:
        if not isinstance(substring, str):
            raise TypeError(...)
        return tailmatch(...)
elif not isinstance(prefix, str):
    raise TypeError(...)
return tailmatch(...)

tailmatch(...)实际匹配在哪里工作)。

因此,是的,任何可html" target="_blank">迭代的操作都会对该for循环起作用。但是,所有其他使用多个值的字符串测试API(以及isinstance()issubclass())也只接受元组,这告诉您作为API的用户可以安全地假定该值
不会被突变 。您不能变异元组,但理论上该方法可以变异列表。

另请注意, 通常 测试固定数目的前缀或后缀或类(对于isinstance()issubclass());该实现不适用于 大量
元素。元组表示您的元素数量有限,而列表可以任意大。

接下来,如果可以接受任何可迭代或序列类型,则将包括字符串;单个字符串 也是 一个序列。那么,应该将单个字符串参数视为单独的字符还是作为单个前缀?

因此,换句话说,序列不会被更改,与其他API一致,限制了要测试的项目数量以及消除了关于单个字符串的歧义性,这是对自我文档的限制论据应予处理。

注意,这是在“ Python
Ideas”列表中提到的。看到这个线程; Guido van
Rossum的主要论点是,您要么是单个字符串的特殊情况,要么是仅接受一个元组。他选择了后者,因此不需要更改它。



 类似资料:
  • 问题内容: 我真的不明白是什么和有。 根据文档- 会将选择器和事件绑定到某种包装容器,该包装容器可在以后的时间再次用于当前和将来的项目。 如果所有新加载的内容都匹配,则会将其重新映射到第一次受限制的时间。也许我不太了解这种允诺方法。 如果包装器仍然存在,但是包装器容器中的内容已更改和/或通过加载,该怎么办?为什么事件没有像第一次绑定那样触发或起作用? 是的,我去过文档页面,只是我不完全理解他们的解

  • 问题内容: 阅读各种文章后,我决定不使用REGEX检查电子邮件是否有效,而仅使用PHP的内置filter_var函数。似乎正常,直到它开始告诉我一封电子邮件无效,因为我有一个号码。 即name@domain.com有效,而name2@domain.com无效。 我是否缺少某些东西或真的无效? 问题答案: PHP 5.3.3过滤器代码中使用的正则表达式基于Michael Rushton的博客中有关E

  • 问题内容: 这是一个简单的错误开始的:我使用的不是对象的格式字符串。但是我对使用格式错误的字符串的测试结果完全感到困惑。 这段代码: 产生以下输出: 我在这里阅读了有关’Y’参数的文档:https : //docs.oracle.com/javase/7/docs/api/java/util/GregorianCalendar.html,但是我仍然看不到在这里工作。特别是最后一种情况:我可以有点理

  • 问题内容: 这来自django的文档: 领域独特 如果为True,则此字段在整个表中必须是唯一的。 这是在数据库级别并通过模型验证强制执行的。如果尝试在唯一字段中保存具有重复值的模型,则模型的save()方法将引发django .db.IntegrityError。 这是我的models.py 这是我的manage.py sqlall(我运行了syncdb) 但是,在manage.py shell

  • 这可能是一个反复出现的问题,但我发现了相互矛盾的答案,现在我不知道哪一个是正确的。我以为我理解了这个概念,然后我开始阅读所有这些答案,我完全困惑了,所以我在寻找一个明确而简单的答案来回答我的问题,我很容易理解。 根据这个答案和这篇文章,应该中断代码执行,实际上等待未来完成,然后继续按顺序执行其余代码。它还表明这可能会阻塞主线程,这在这种情况下是合乎逻辑的。 另一方面,来自flutter团队的这个、

  • 好的,所以我做了一些关于常量以及它们应该如何设计和使用的研究。对于我的应用程序来说,有许多枚举可以将彼此相关的术语分组是有意义的。 其想法是,当我开发具有数百个参数(其中许多参数被多次使用)和方法的web服务时,我可以使用枚举的值进行注释。在此之前,有一个巨大、令人厌恶的常量文件,其中包含冗余和未维护的值。 所以,这里有一个枚举我想使用: 这里有一个地方我想用它: 因此,如果我尝试上面的方法,就会