不可及不可及物的处理

2024-10-02 18:17:44 发布

您现在位置:Python中文网/ 问答频道 /正文

如何使此函数独立于参数X和的可写性而正确工作,而无需任何if/else条件?你知道吗

我想这个问题以前有人问过/回答过,但我什么也没找到。你知道吗

def do_something(X):
  return map(lambda x: x ,X)

# Possible input:

do_something([1,2,3]) #-> [1,2,3]
do_something(1) # -> [1]

编辑:

我希望标量参数被视为一维单元素数组,例如1->;[1],因此返回值应该始终是一个列表。你知道吗

Numpy解决方案:

刚刚意识到numpy提供了以下功能:

import numpy

def do_something(X):
  return map(lambda x: x ,numpy.atleast_1d(X))

所以现在的问题是:“有没有一种方法可以实现同样的不进口numpy”?你知道吗


Tags: lambda函数numpymapinput参数returnif
3条回答

您可以检查传递的项是否可iterable,根据您可以处理它:

>>> from collections import Iterable
def do_something(X):
    f = lambda x: x**2
    if isinstance(X, Iterable):
        return map(f, X)
    return f(X)
>>> do_something([1, 2, 3, 4])
[1, 4, 9, 16]
>>> do_something(2)
4
>>> do_something(iter(range(3, 7)))
[9, 16, 25, 36]

如果要在第二种情况下返回[4],则需要将其修改为:

def do_something(X):
    return map(lambda x: x**2, X if isinstance(X, Iterable) else [X])

我建议在助手函数中隐藏不希望看到的内容:

from collections import Iterable

def make_sure_iterable(X):
    return X if isinstance(X, Iterable) and not isinstance(X, basestring) else [X]

然后在使用参数时,将其包装为对helper函数的调用:

def do_something(X):
    return map(lambda x: x, make_sure_iterable(X))

EAFP。你知道吗

def do_something(X):
    try:
       return map(lambda x: x, X)
    except TypeError:
       return map(lambda x: x, [X])

基本上,您可以使用给定的X尝试map,如果失败,您可以使用包含X的单个元素列表重试。你知道吗

请注意,如果您的函数可以引发TypeError,那么您需要以某种方式检查错误是由map还是由它调用的函数引发的。这是可能的。。。用if语句。你知道吗

相关问题 更多 >