防止 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" 标签
不会再让我改变我的投票了。最好使用six
或pies
。
代码中还有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 遍历单个字符串的主要内容,如果未能解决你的问题,请参考以下文章