处理列表或单个整数作为参数

Ste*_*ing 37 python integer function list

函数应根据行名称选择表中的行(在本例中为第2列).它应该能够将单个名称或名称列表作为参数并正确处理它们.

这就是我现在所拥有的,但理想情况下不存在这种重复的代码,并且会像智能一样使用类似的方法来选择处理输入参数的正确方法:

def select_rows(to_select):
    # For a list
    for row in range(0, table.numRows()):
        if _table.item(row, 1).text() in to_select:
            table.selectRow(row)
    # For a single integer
    for row in range(0, table.numRows()):
        if _table.item(row, 1).text() == to_select:
            table.selectRow(row)
Run Code Online (Sandbox Code Playgroud)

Nic*_*oic 23

实际上我同意Andrew Hare的回答,只需传递一个包含单个元素的列表.

但是如果你真的必须接受一个非列表,那么在这种情况下如何将其变成列表呢?

def select_rows(to_select):
    if type(to_select) is not list: to_select = [ to_select ]

    for row in range(0, table.numRows()):
        if _table.item(row, 1).text() in to_select:
            table.selectRow(row)
Run Code Online (Sandbox Code Playgroud)

在单项列表上进行"输入"的性能损失可能不高:-)但是这确实指出了如果你的'to_select'列表可能很长,你可能要考虑做的另一件事:考虑转换它到一个集合,以便查找更有效.

def select_rows(to_select):
    if type(to_select) is list: to_select = set( to_select )
    elif type(to_select) is not set: to_select = set( [to_select] )

    for row in range(0, table.numRows()):
        if _table.item(row, 1).text() in to_select:
            table.selectRow(row)
Run Code Online (Sandbox Code Playgroud)

  • 目前认为使用`isinstance`而不是`type`会更好,请参阅/sf/ask/108486101/ (6认同)

Ste*_*eef 18

您可以重新定义函数以获取任意数量的参数,如下所示:

def select_rows(*arguments):
    for row in range(0, table.numRows()):
        if _table.item(row, 1).text() in arguments:
            table.selectRow(row)
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样传递一个参数:

select_rows('abc')
Run Code Online (Sandbox Code Playgroud)

像这样的多个参数:

select_rows('abc', 'def')
Run Code Online (Sandbox Code Playgroud)

如果你已经有一个清单:

items = ['abc', 'def']
select_rows(*items)
Run Code Online (Sandbox Code Playgroud)


And*_*are 12

我会这样做:

def select_rows(to_select):
    # For a list
    for row in range(0, table.numRows()):
        if _table.item(row, 1).text() in to_select:
            table.selectRow(row)
Run Code Online (Sandbox Code Playgroud)

并期望参数将始终是一个列表 - 即使它只是一个元素的列表.

记得:

要求宽恕比获得更容易.