【问题标题】:Pass either a list or a value to a function in Python [duplicate]将列表或值传递给Python中的函数[重复]
【发布时间】:2016-02-14 01:05:42
【问题描述】:

能够将列表或值传递给函数并将其返回为的最佳方法是什么

foo(x):foo(x)

foo([x, y, z]):[foo(x), foo(y), foo(z)]?

是否只是测试输入是否为列表?尝试访问列表元素的 try/except 块?还有什么?

【问题讨论】:

  • 您可以使用type(x) 来定义您的逻辑流程
  • isinstance(x, list)
  • “尝试访问列表元素的 try/except 块?” - 如果您想获取字符串,则不是,这也是序列。 “只是测试输入是否是一个列表?” - 如果你想进行正确的鸭子输入,则不是。你到底想达到什么目的?你能举一个更具体的例子吗?听起来您想要类似于map 的东西,它只需要第二个参数是可迭代的(例如map(int, 1) 将失败)。

标签: python function parameter-passing


【解决方案1】:

使用集合来确定它是否可迭代。如果可迭代,请执行您的列表逻辑。如果不做你的变量逻辑

import collections

if isinstance(e, collections.Iterable) and not isinstance(e, basestring) :

正如 cmets 中指出的那样。添加逻辑以不包含字符串

【讨论】:

  • 或者MutableSequence,如果函数应该改变它的参数。
  • 已更新。只是不包括字符串实例。应该适用于所有可迭代对象,然后在逻辑上划分任何边缘情况
【解决方案2】:

这是一个简单的函数foo,它接受一个元素并将其乘以2。如果是列表,它将返回foo 操作的元素列表。

def foo(x):
    if isinstance(x, list): ## Accepts list ONLY
        return [foo(i) for i in x]
    return x * 2

输出:

>>> foo(3)
6
>>> foo([1,2,3])
[2, 4, 6]

编辑:

根据 Jon 的评论,如果您希望 tuple 成为可接受的输入,您可以执行以下操作:

def foo(x):
    if isinstance(x, (list, tuple)): ## Accepts list OR tuple
        return [foo(i) for i in x]
    return x * 2

不过,对于 listtuple 输入,这仍将仅返回 list。如果你想要与输入相同类型的输出(即tuple 输出),那么你可以修改如下:

def foo(x):
    if isinstance(x, (list, tuple)): ## Accepts list OR tuple
        result = [foo(i) for i in x]
        return result if not isinstance(x, tuple) else tuple(result)
    return x * 2

新输出:

>>> foo(1)
2
>>> foo([1,2,3])
[2, 4, 6]
>>> foo((1,2,3))
(2, 4, 6)

还要注意,这将处理奇怪的嵌套结构:

>>> foo([[1,2,3],[4,5,6],(7,8,9)])
[[2, 4, 6], [8, 10, 12], (14, 16, 18)]

【讨论】:

  • 那么foo((1, 2, 3)) 呢?它不会失败,用户可能期望它失败,因为您不能改变元组,而是返回一些奇怪的东西 ((1, 2, 3, 1, 2, 3))。
  • 说句公道话,他特意要了名单……但我会编辑……
  • 没错,但你至少应该评论一下这种方法的局限性!
猜你喜欢
  • 2015-06-06
  • 1970-01-01
  • 1970-01-01
  • 2018-01-13
  • 2015-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多