更新:
在2006年python.org上提出了使内置字符串不可迭代的想法。我的问题有所不同,因为我试图偶尔仅抑制一次此功能。整个线程还是很相关的。
这是Guido的批判性评论,他们str
在试用的基础上实施了不可重复的操作:
[…]我实现了这一点(这确实很简单),但是后来发现我不得不修复大量遍历字符串的地方。例如:
* 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