📜  Python –调用带括号或不带括号的函数

📅  最后修改于: 2021-05-20 07:59:05             🧑  作者: Mango

Python中的函数是执行特定任务的已定义代码块。在本节中,我们将讨论带括号和不带括号的调用函数的区别。

  • 当我们使用括号调用函数时,该函数将被执行并将结果返回给可调用对象。
  • 在另一种情况下,当我们调用没有括号函数函数的引用被发送到调用,而不是执行函数本身。

让我们讨论3个重要概念:

  • 调用功能
  • 返回功能
  • 传递功能

调用功能–

下面的函数执行一个简单的任务,字符串连接。在这里,我们将调用带括号和不带括号的函数“ concatenate_string”,并观察它们之间的区别。

def concatenate_string(*args):
    string1 = args[0]
    string2 = args[1]
  
    return string1 + string2
  
obj = concatenate_string('Hello, ', 'George')
print('Function call with Parentheses: ')
print(obj)
  
obj = concatenate_string
print('Function call without Parentheses: ')
print(obj)

输出

Function call with Parentheses: 
Hello, George
Function call without Parentheses:

对于第一种情况,当我们调用concatenate_string('Hello, ', 'George') ,函数执行并返回串联的字符串。
并且,对于第二种情况,当我们调用concatenate_string即没有括号时,会将引用传递给可调用对象,而不是执行函数本身。在这里,可调用对象可以决定如何处理引用。

返回函数–

从上面的讨论中,您可以理解,当用括号调用该函数时,代码将被执行并返回结果。并且,如果在不带括号的情况下调用该函数,则将函数引用返回给可调用对象。
因此,将函数与带有括号和不带括号的return语句一起编码时会发生什么。让我们来看一个例子。

带括号

def concatenate_string(*args):
  
    string1 = args[0]
    string2 = args[1]
      
    def merge_string(string1, string2):
        return string1 + string2
      
    return merge_string(string1, string2)
  
def func():
    conc_obj = concatenate_string('Hello, ', 'George')
    print(conc_obj)
  
func()

输出

Hello, George

从上面的示例中可以明显看出, merge_string是函数concatenate_string一个函数,主函数( concatenate_string )将子函数( merge_string )返回给调用者。

return merge_string(string1, string2) 

在这里, merge_string用括号调用,因此它执行并把结果提供给concatenate_string从那里将结果传递给func

没有括号

def concatenate_string():
      
    def merge_string(string1, string2):
        return string1 + string2
      
    return merge_string
  
def func():
      
    # return the reference of merge_string func
    conc_obj = concatenate_string()
    print(conc_obj)  # prints the reference 
  
    # executes the reference 
    print(conc_obj('Hello, ', 'George'))  
  
func()

输出:


Hello, George

由于使用merge_string没有括号,因此concatenate_string将函数引用传递给可调用的func而不是执行merge_string

return merge_string

因此,我们可以得出结论,当在return语句中用括号对子函数进行编码时,主函数执行该子函数并将结果传递给可调用函数。
而且,当我们在return语句中编写不带括号的子函数时,主函数会将子函数引用传递给可调用对象,而不是执行它。在这里,可调用对象决定如何处理引用。

传递函数–

您可以通过创建引用,在不带括号的情况下调用该函数并将其作为参数来传递函数作为参数。让我们看一下代码。

def concatenate_string(*args):
    string1 = args[0]
    string2 = args[1]
  
    def merge_string(string1, string2):
        return string1 + string2  # string merge
     
    # executes merge_string and return the result
    return merge_string(string1, string2)
  
def function_call(function):
    string1 = 'Hello, '
    string2 = 'George'
    return function(string1, string2)
  
# passing function as argument
print(function_call(concatenate_string))  

输出:

Hello, George

在这种情况下, concatenate_string的引用将作为参数传递给function_call

function_call(concatenate_string)

在function_call内部,它使用引用执行concatenate_string并将结果返回给可调用对象。