Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有办法在Python中传递块参数而不首先将其定义为函数?_Python_Callback_Arguments - Fatal编程技术网

有没有办法在Python中传递块参数而不首先将其定义为函数?

有没有办法在Python中传递块参数而不首先将其定义为函数?,python,callback,arguments,Python,Callback,Arguments,在Ruby中,块参数的工作方式如下: def foo_bar (&block) block.(4) end foo_bar do |x| puts x puts x * 2 end =begin 4 8 =end 我已经在Python中看到了以下等价物,但我发现它非常不令人满意,因为它需要定义函数,然后才将其作为参数传递: def foo_bar(block): block(4) def callback(x): print(x) p

在Ruby中,块参数的工作方式如下:

def foo_bar (&block)
    block.(4)
end

foo_bar do |x|
    puts x
    puts x * 2
end
=begin
4
8
=end
我已经在Python中看到了以下等价物,但我发现它非常不令人满意,因为它需要定义函数,然后才将其作为参数传递:

def foo_bar(block):
    block(4)

def callback(x):
    print(x)
    print(x * 2)

foo_bar(callback) 
'''
4
8
'''

Python中是否有其他替代方法,不需要先定义函数?

不,Python不允许这种语法糖。它没有匿名函数;它提供的最接近的是lambdas,但它们有许多限制,即它们只能有一个表达式,即一行代码


使用
def
定义函数是创建可重用代码块的pythonic方法

我发现最接近于没有预先定义的回调函数的是decorator语法:

def loop_thru(block):
    arr = [3, 76, 2, 8, 24]
    for item in arr:
        block(item)

@loop_thru
def puts(item):
    print(item, end=" ") # 3 76 2 8 24
…尽管这样做仍然需要一个命名函数。
当然还有
lambda
s:

loop_thru(lambda num: print(num, end=" "))
但是,它们有局限性:

  • 它们仅限于一行代码
  • 他们不允许
    =
    分配:
尽管在lambda中,
:=
是合法的,
:=
仅适用于变量,而不适用于属性或下标

foo = {}
bar = lambda: (foo['baz'] := 23)
'''
  File "script.py", line 2
    bar = lambda: (foo['baz'] := 23)
                   ^
SyntaxError: cannot use named assignment with subscript
'''

不过,这太糟糕了。每种语言都会做出权衡。Python试图将可读性和惯用风格置于方便的速记之上。Ruby更注重表现力,不管下一个维护人员能想出什么。如果您喜欢ruby,请使用它。如果您出于某种原因不得不使用python,请尝试接受它试图做的事情,而不是违背规则。我知道,我只是不知道没有块参数对可读性如此重要。我的意思是“…块参数[是]如此…”
foo = {}
bar = lambda: (foo['baz'] := 23)
'''
  File "script.py", line 2
    bar = lambda: (foo['baz'] := 23)
                   ^
SyntaxError: cannot use named assignment with subscript
'''