【问题标题】:Higher Order of Function (Map)高阶函数(映射)
【发布时间】:2018-09-25 03:54:33
【问题描述】:

我对 python 中的map 有点困惑。 map的函数接受2个参数:`map(function, variables)。

为什么下面的代码可以将multiplyadd 作为变量,而第二个代码不能?通常情况下,multiply 应该作为函数传入,检查范围。

def multiply(x):
    return x * x

def add(x):
    return x + x

funcs = [multiply, add]

for i in range (1, 5):
    value = list(map(lambda x: x(i), funcs))
    print(value)

这是第二个代码:

def multiply(x):
    return x * x

def add(x):
    return x + x

funcs = (add, multiply)
multi_func = (multiply)

for i in range (1, 5):
    value = list(map(lambda x: x(i), multi_func))
    print(value)

是否可以使用 1 个函数并仍然在范围内使用?

使用范围:

map(multiply, range(1, 5))

【问题讨论】:

  • 试试multi_func = (multiply,)
  • 有效!但是为什么它不在地图参数的左侧,因为它是一个函数?
  • 我认为是因为它作为一个元组接受?但我仍然对它如何能够交换位置感到震惊。 (当我查看使用范围方法时)
  • map 接受一个可调用和可迭代的参数。你给它的可调用对象lambda x: x(i) 只是调用它的参数,而你试图给它的可迭代对象是可调用对象的可迭代对象(即函数)

标签: python python-3.x higher-order-functions map-function


【解决方案1】:

map 将其第一个参数(一个函数)应用于作为第二个参数的可迭代对象的每个元素。该功能是惰性应用的。这意味着它仅在您迭代地图对象时完成,例如,当您创建它的列表时。

让我们看一下您的第一个代码。 funcs = [multiply, add] 创建一个包含两个元素的可迭代列表。这两个元素都是函数。这在 Python 中很正常,因为函数只是普通对象,可以传递、赋值、拥有属性等。循环

for i in range (1, 5):
    value = list(map(lambda x: x(i), funcs))
    print(value)

重复从 1 到 4。在每次迭代中,它会将 lambda x: x(i) 映射到 funcs 中的函数。当i = 1 时,地图最终会执行multiply(1), add(1)i = 2 时为multiply(2), add(2),以此类推。

由于拼写错误,第二个代码不起作用。 (x) 只是 x,但 (x,) 是一个单元素元组,其第一个元素是 xmap 要求第二个参数是可迭代的,所以传入一个函数是不行的。如果要映射到单个函数,则需要提供一个带有一个元素的可迭代对象:multi_func = (multiply,)

一旦更正,第二个版本将在i = 1时打印multiply(1),在i = 2时打印multiply(2)

list(map(multiply, range(1, 5))) 这样的东西实际上是编写第二个版本的更简单的方法。您也可以使用zip 对第一个代码执行类似的操作:

zip(map(func, range(1, 5)) for func in funcs)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-19
    相关资源
    最近更新 更多