我了解将函数作为参数传递给其他函数的过程,但是,从c#的背景出发,我不了解它的需要。
有人可以让我知道某些首选这种情况吗?
答案 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