为什么我们在python中将函数作为参数传递

时间:2019-08-25 07:54:33

标签: python-3.x

我了解将函数作为参数传递给其他函数的过程,但是,从c#的背景出发,我不了解它的需要。

有人可以让我知道某些首选这种情况吗?

2 个答案:

答案 0 :(得分:4)

将函数作为参数传递有用的原因之一是concept of lambda functions in python

method2(lambda: method1('world'))
>>> hello world

lambda 函数的优点在与python函数map()filter()reduce()结合使用时很容易看出。 / p>

Lambda函数具有map()

>map(lambda x: x*2, my_list)
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38]

带有reduce()的Lambda

>reduce(lambda x, y: x+y, my_list)
190

带有filter()的Lambda

filter(lambda x: x >10, my_list)
[11, 12, 13, 14, 15, 16, 17, 18, 19]

c#基本上不同,您的代码减少了行数,并且变得更有效率 因为您的函数调用和执行发生在同一行

答案 1 :(得分:2)

将函数传递给函数可以参数化行为。这与将值传递到允许参数化 data 的函数一样。

sed '/priority/{s//&/2;t;d}' file

一些常见的用例包括:

  • def is_greater(what: int, base: int): if what > base: # fixed behaviour, parameterised data print(f'{what} is greater') def is_valid(what: int, condition: 'Callable'): if condition(what): # parameterised behaviour print(f'{what} is valid') map和其他将某些行为应用于可迭代对象的对象。这些函数本身仅实现了“应用于每个元素”部分,但是该行为可以换出:

    filter

    在这种情况下,人们经常使用>>> print(*map(float, ['1', '2', '3.0']) 1.0 2.0 3.0 来实时定义行为。

    lambda
  • 函数装饰器,用于包装具有其他行为的函数。

    >>> print(sorted(
    ...     ['Bobby Tables', 'Brian Wayne', 'Charles Chapeau'],
    ...     key=lambda name: name.split()[1]),  # sort by last name
    ... )
    ['Charles Chapeau', 'Bobby Tables', 'Brian Wayne']
    

    每次看到装饰器应用def print_call(func): """Decorator that prints the arguments its target is called with""" def wrapped_func(*args, **kwargs): print(f'call {func} with {args} and {kwargs}') return func(*args, **kwargs) return wrapped_func @print_call def rolling_sum(*numbers, initial=0): totals = [initial] for number in numbers: totals.append(totals[-1] + number) return totals rolling_sum(1, 10, 27, 42, 5, initial=100) # call <function rolling_sum at 0x10ed6fd08> with ([1, 10, 27, 42, 5],) and {'initial': 100} 时,它都是一个高阶函数。

  • 在其他时间,上下文,条件,线程甚至进程执行的回调和有效负载。

    @
  • 通过传递函数代替值可以模拟lazy evaluation

    def call_after(delay: float, func: 'Callable', *args, **kwargs):
        """Call ``func(*args, **kwargs)`` after ``delay`` seconds"""
        time.sleep(delay)
        func(*args, **kwargs)
    
    thread = threading.Thread(
        target=call_after,  # payload for the thread is a function
        args=(1, print, 'Hello World'))
    thread.start()
    print("Let's see what happens...")
    # Let's see what happens...
    # 
    # Hello World