防止 Python For 循环通过 char 遍历单个字符串

Posted

技术标签:

【中文标题】防止 Python For 循环通过 char 遍历单个字符串【英文标题】:Preventing a Python For-loop from iterating over a single string by char 【发布时间】:2017-04-13 21:15:56 【问题描述】:

我有一个变量,它可以是单个字符串或字符串列表。当变量为单个字符串时,循环按字符对其进行迭代。

text = function() # the function method can return a single string or list of string
for word in text:
    print word+"/n"
# When it is a single string , it prints char by char.

当它是一个字符串时,我希望循环只迭代一次。我实际上不想使用其他循环类型。我怎样才能为每个结构做到这一点?

【问题讨论】:

***.com/questions/2225038/… 喜欢这样吗? 检查text的类型怎么样? 在单个字符串的情况下,您可以将 [yourstring] 作为由单个元素组成的列表返回。 【参考方案1】:

如果你的函数总是返回一个列表,即使是只有一个元素的列表也会更简洁。如果您可以在那里更改代码,我强烈推荐这个。

否则在循环之前添加这一行:

text = text if isinstance(text, list) else [text]

此外,您的变量名称令人困惑,您应该调用“text”“word_list”或其他名称,以便更好地指示所需的类型。

需要类型检查通常表示样式有问题。

【讨论】:

谢谢,很明显,这里的列表让我很困惑:)【参考方案2】:

应该这样做:

text = function() 
if isinstance(text, list):
    for word in text:
        print word + "/n"
else:
    print text + "/n"

【讨论】:

这不是pythonic的做事方式,因为如果function()返回一个字符串元组,那么你的代码会尝试将整个元组打印为一个单词。 从问题来看,很明显函数返回字符串或字符串列表...不是元组。【参考方案3】:

尽管鸭式打字是常态,但有时您只需检查某物的类型。在这种情况下,您期望实例为 basestring

text = function()
if isinstance(text, basestring):
    print text
else:
    for word in text:
        print word

【讨论】:

basestring 仅适用于 python2 @tacaswell "python-2.7" 标签 不会再让我改变我的投票了。最好使用sixpies 代码中还有print 语句,因此您需要print_function 导入。我们一定读过不同的问题。【参考方案4】:

仍然可以通过duck typing,您只需要使用不在字符串中的列表上的方法,反之亦然,并捕获异常,例如copy()是列表方法而不是str。

text = function()
try:
    temp_text = text.copy()
    for word in text:
        print word
except AttributeError:
    print text

在上面的代码中,如果function() 返回了一个字符串text.copy() 将引发一个AttributeError 异常,并且不会通过for 循环而是转到异常块并按原样打印文本,另一方面如果@987654325 @ 成功表示它是一个列表,它会继续 for 循环打印列表中的每个单词。

【讨论】:

您可以只检查属性而不是实际执行方法:assert(hasattr(text, 'copy'))。如果这是错误的,你会得到一个 AssertionError 。尽管有人说引发异常比类型检查更好,但有趣的是哪一种表现更好。【参考方案5】:

您需要isinstance() 方法来检查您的变量所持有的值的类型,根据文档:

如果 object 参数是 classinfo 参数或其(直接、间接或虚拟)子类的实例,则返回 true。

使用它,您可以创建自定义函数:

import collections

def my_print(my_val):
    if isinstance(my_val, str):
        print my_val
    elif isinstance(my_val, collections.Iterable):  # OR, use `list` if you just want check for list object
        # To check object is iterable ^
        for val in my_val:
            print val
    else:
       raise TypeError('Unknown value')

示例运行:

>>> my_print('Hello')
Hello
>>> my_print(['Hello', 'World'])
Hello
World

instance() 检查传递的对象是否是传递的类的实例。

>>> isinstance('hello', str)
True
>>> isinstance('hello', list)
False

或者,您可以使用type() 来检查变量的类型:

>>> type('hello') == str
True

【讨论】:

这将失败,tuples @tacaswell:感谢您的评论。更新了 您只需要特殊情况str 并让鸭子打字处理其余的事情。 我正在明确处理 int 或任何其他值传递给函数的情况【参考方案6】:

我决定这样做是因为它强调循环的准备而不是基本的循环(重新)设计:

if type(thing) is str:
    x = [thing]
elif type(thing) is list:
    x = thing[:]

for i in x:
   ... do stuff ....

【讨论】:

以上是关于防止 Python For 循环通过 char 遍历单个字符串的主要内容,如果未能解决你的问题,请参考以下文章

C语言如何循环输出1到0这10位数字8遍,即1234567890…?

如何将 For 循环与 char 一起使用?

python用for循环实现ABCD循环成菱形阵列

python中怎么输出一个字符串25遍?

控制流程-for循环

将 C++ 转换为 Python(For 循环多重赋值)