【问题标题】:how do i pass argument into a function inside a function?如何将参数传递给函数内部的函数?
【发布时间】:2021-09-27 17:01:02
【问题描述】:

我目前的代码串是:

def makeTriangle(sign):
    
    def triangle(n):
        result = ''
    
        for i in range(1,n+1):
            result += sign * i + '\n'
        
        return result
    
    return 

我如何使用高阶函数将符号从 MakeTriangle(sign) 传递到 triangle(n)?

【问题讨论】:

  • sign 已经可以在 triangle 中访问,这要归功于范围界定的工作原理。
  • 你需要从 makeTriangle 返回三角形
  • return 更改为return triangle
  • 因此您不想“将参数sign 传递到trianglemakeTriangle”,您想使用makeTriangle(sign) 返回捕获/记住的triangle sign。传递一个参数具体意味着你正在尝试做triangle(sign),你想要的是一个闭包。

标签: python higher-order-functions


【解决方案1】:

你只需要返回 triangle 否则它会被扔掉。由于这种模式似乎会引起一些混乱:

def makeTriangle(sign):
    
    def triangle(n):
        result = ''
    
        for i in range(1,n+1):
            result += sign * i + '\n'
        
        return result
    
    return triangle # returns a function wrapped in an enclosing scope


triangle_maker = makeTriangle("+")
# triangle_maker is a `triangle()` function, locked in a scope where `sign=+`.
triange_maker(3)
# calls the `triangle()` function

此模式的另一个选项是使用functools.partial

from functools import partial

def triangle(sign, n):
    result = ""
    for i in range(1, n+1):
        result += sign * i + "\n"
    return result

# call without caching arg:
triangle("+",3)
# make partial function:
plus_triangle = partial(triangle, "+")
plus_triangle(3)

这省去了每次都写出容器函数的麻烦,但它当然比完全闭包要有限得多。

【讨论】:

  • +1 for namedropping partial 因为这是大多数实际闭包的意图,它可以节省您编写使用其范围之外的变量的嵌套函数的工作,这使得错误更容易,测试更难。
  • @BatWannaBe 我喜欢部分(和一般的 functools)。但我认为这个习惯来自于 JS。 Ofc,当您实际需要它们时,闭包真的很有用。尽管我写过的大多数闭包都在状态过多而无法管理时变成了类。
猜你喜欢
  • 2022-11-10
  • 1970-01-01
  • 2018-09-26
  • 2021-09-21
  • 2015-02-17
  • 1970-01-01
  • 1970-01-01
  • 2012-06-19
  • 2011-05-30
相关资源
最近更新 更多