Python 关于是一个字符串还是字符串列表的If语句

Python 关于是一个字符串还是字符串列表的If语句,python,Python,我有以下功能。理想情况下,我希望将单个字符串或字符串列表作为输入传递。无论是哪种情况,我都需要使用。上面的。但是,当只传递单个字符串时,迭代器将遍历每个字符。如何使用if语句来测试字符串列表还是单个字符串?(我似乎无法避免字符串的易受攻击性) 使用isinstance检查类型 def runthis(stringinput): if isinstance(stringinput, list): for t in stringinput: t = t

我有以下功能。理想情况下,我希望将单个字符串或字符串列表作为输入传递。无论是哪种情况,我都需要使用。上面的。但是,当只传递单个字符串时,迭代器将遍历每个字符。如何使用if语句来测试字符串列表还是单个字符串?(我似乎无法避免字符串的易受攻击性)


使用
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