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

抑制字符串的迭代处理

高承望
2023-03-14
问题内容

更新:

在2006年python.org上提出了使内置字符串不可迭代的想法。我的问题有所不同,因为我试图偶尔仅抑制一次此功能。整个线程还是很相关的。

这是Guido的批判性评论,他们str在试用的基础上实施了不可重复的操作:

[…]我实现了这一点(这确实很简单),但是后来发现我不得不修复大量遍历字符串的地方。例如:

  • sre解析器和编译器使用set(“ 0123456789”)之类的东西,并且还对输入正则表达式的字符进行迭代以对其进行解析

* difflib具有为两个字符串列表(一个文件的典型逐行差异),两个字符串(一个典型的行内差异)或什至两个东西的列表(对于通用序列差异)定义的API 。

  • optparse.py,textwrap.py,string.py中的小变化。

而且我什至不在regrtest.py框架可以工作的地方(由于difflib问题)。

我正在放弃这个项目;该补丁是SF补丁1471291。我不再支持这个想法。这只是不切实际的,并且我在sre和difflib中都发现了用例,驳斥了没有充分理由遍历字符串的前提。

原始问题:

尽管字符串的可重复性是该语言的一项巧妙功能,但与鸭子输入结合使用时,可能会导致灾难:

# record has to support [] operation to set/retrieve values
# fields has to be an iterable that contains the fields to be set
def set_fields(record, fields, value):
  for f in fields:
    record[f] = value

set_fields(weapon1, ('Name', 'ShortName'), 'Dagger')
set_fields(weapon2, ('Name',), 'Katana')
set_fields(weapon3, 'Name', 'Wand') # I was tired and forgot to put parentheses

不会引发异常,除非通过isinstance(fields, str)在众多地方进行测试,否则没有简单的方法来捕获此异常。在某些情况下,此错误将需要很长时间才能找到。

我想在我的项目中完全禁止将字符串视为可迭代对象。这是个好主意吗?是否可以轻松,安全地完成?

也许我可以对内置对象进行子类化,str以便在get_iter()希望将其对象视为可迭代对象时需要显式调用。然后,每当我需要字符串文字时,我都将创建此类的对象。

以下是一些与切线相关的问题:

如何判断python变量是字符串还是列表?


问题答案:

不幸的是,没有任何方法可以自动执行此操作。您提出的解决方案(str不可迭代的子类)遭受与isinstance()…相同的问题,即,您必须记住在使用字符串的任何地方都使用它,因为无法使Python代替它来使用它。本机类。当然,您不能用猴子修补内置对象。

我可能建议,如果您发现自己编写的函数使用可迭代的容器 字符串,则可能是您的设计有问题。但是有时您无法避免。

在我看来,最不麻烦的事情是将检查放入函数中,并在进入循环时调用该函数。至少这会将行为更改放在您最有可能看到的位置:在for语句中,不要埋藏在班级的某个地方。

def iterate_no_strings(item):
    if issubclass(item, str):   # issubclass(item, basestring) for Py 2.x
        return iter([item])
    else:
        return iter(item)

for thing in iterate_no_strings(things):
    # do something...


 类似资料:
  • 问题内容: 我有一个字符串迭代器。 为了进行排序,我需要从中创建一个列表并使用对其进行排序。 有没有简单的方法可以对迭代器进行排序。 问题答案: 迭代器不是容器,它是遍历容器元素的实用程序。因此,如果您仅有权访问迭代器,则无法更改此迭代器的创建者定义的迭代顺序。 如果您不能更改原始容器,则必须将迭代器传递的元素收集到新的Collection中,并在其中进行排序。 (了解迭代器可能的一种好方法是查看

  • 我试图找到给定字符串的排列,但我想使用迭代。我在网上找到的递归解决方案,我确实理解它,但是将其转换为迭代解决方案真的行不通。下面我附上了我的代码。我真的很感激你的帮助:

  • 问题内容: 我已经阅读了有关该主题的几篇文章,但是所提供的代码(有时是片段)都没有帮助我解决转换这样的二进制字符串的简单问题: 插入文本字符串早安 我可能无法将我在stackoverflow中可用的链接中找到的代码片段放在一起。有人会这么友好地给我完整的代码吗?假设我有一个输入字符串(文本)来自我正在通过“ gettext()”访问的JTextarea,例如text = tTextarea.get

  • StringBuffer 是一个字符串拼接工具,和java中的StringBuilder类似。对于那些需要大量的字符串连接的时候,用 StringBuffer 更高效一些。它实现了以下API: class StringBuffer { public function __construct($str); public function isEmpty(); publi

  • 字符串在我们平常的Web开发中经常用到,包括用户的输入,数据库读取的数据等,我们经常需要对字符串进行分割、连接、转换等操作,本小节将通过Go标准库中的strings和strconv两个包中的函数来讲解如何进行有效快速的操作。 字符串操作 下面这些函数来自于strings包,这里介绍一些我平常经常用到的函数,更详细的请参考官方的文档。 func Contains(s, substr string)

  • 函数 说明 Series.str.capitalize() 将 Series / 索引中的字符串转换为大写。 Series.str.cat([others, sep, na_rep, join]) 使用给定的分隔符连接 Series / 索引中的字符串。 Series.str.center(width[, fillchar]) 用附加字符填充 Series / 索引中字符串的左侧和右侧。 Seri