Python 关于是一个字符串还是字符串列表的If语句
我有以下功能。理想情况下,我希望将单个字符串或字符串列表作为输入传递。无论是哪种情况,我都需要使用。上面的。但是,当只传递单个字符串时,迭代器将遍历每个字符。如何使用if语句来测试字符串列表还是单个字符串?(我似乎无法避免字符串的易受攻击性)Python 关于是一个字符串还是字符串列表的If语句,python,Python,我有以下功能。理想情况下,我希望将单个字符串或字符串列表作为输入传递。无论是哪种情况,我都需要使用。上面的。但是,当只传递单个字符串时,迭代器将遍历每个字符。如何使用if语句来测试字符串列表还是单个字符串?(我似乎无法避免字符串的易受攻击性) 使用isinstance检查类型 def runthis(stringinput): if isinstance(stringinput, list): for t in stringinput: t = t
使用
isinstance
检查类型
def runthis(stringinput):
if isinstance(stringinput, list):
for t in stringinput:
t = t.upper()
# Some other code should probably be here.
elif isinstance(stringinput, basestring):
t = t.upper()
# Some other code perhaps as well.
else:
raise Exception("Unknown type.")
对于Python 3,使用
str
而不是basestring
。您可以使用type()
函数:
if type(stringinput) is list:
#Your list code
elif type(stringinput) is str:
#Your string code
else:
#stringinput isn't a list or a string, throw an error
您可以使用
isinstance()
检查函数arg是否属于list
类型:
def to_upper(arg):
if isinstance(arg, list):
return [item.upper() for item in arg] # This is called list comprehension
else:
return arg.upper()
一种方法是显式检查参数是列表还是字符串,并在条件子句中对其进行不同的处理 我认为更好的替代方案(如果适合您的用例)可能是:
def runthis(*stringinput):
for t in stringinput:
t = t.upper()
print(t)
print()
runthis("test") # TEST
runthis("another", "test") # ANOTHER TEST
runthis(*["one", "final", "test"]) # ONE FINAL TEST
然而,如果调用代码可以提供列表而不浪费列表,那么这种方法是不合适的
这种方法依赖于
*
操作符的使用,这里有两种不同的使用方式
在函数定义上下文中(*stringinput
),此运算符实质上使stringinput
成为可变参数;也就是说,一个参数“将”传递给函数的所有参数“收集”到一个元组中,为了runthis
的目的,元组的作用类似于一个列表(可以对其进行迭代)。如果我调用运行此(“foo”、“bar”、“baz”)
,stringinput
的值将为(“foo”、“bar”、“baz”)
您可以阅读有关可变参数的更多信息
在函数调用上下文中(runthis(*[“one”、“final”、“test”])
),此运算符将“splat”或解压缩列表中的每个元素。本质上,runthis(*[“一”、“最终”、“测试])
相当于runthis(“一”、“最终”、“测试”)
您可以阅读有关splatting的更多信息。因此,即使
stringinput
是一个字符串列表,您的代码也不会修改它。始终接受一个字符串列表似乎更好,因为它可能只包含一个字符串。让调用者传递一个未列出的字符串有什么价值?嗨,谢谢。“*”做什么?“*”是splat运算符。我将编辑我的帖子,以包含更多关于它的信息。@凯恩斯。我现在已经编辑了这些细节。谢谢!这很有效
def runthis(*stringinput):
for t in stringinput:
t = t.upper()
print(t)
print()
runthis("test") # TEST
runthis("another", "test") # ANOTHER TEST
runthis(*["one", "final", "test"]) # ONE FINAL TEST