Hàm Python như một đối số hàm?


116

Một hàm Python có thể là đối số của một hàm khác không?

Nói:

def myfunc(anotherfunc, extraArgs):
    # run anotherfunc and also pass the values from extraArgs to it
    pass

Vì vậy, về cơ bản đây là hai câu hỏi:

  1. Nó có được phép không?
  2. Và nếu có thì làm cách nào để sử dụng hàm bên trong hàm kia? Tôi có cần sử dụng thi hành (), eval () hoặc một cái gì đó tương tự không? Không bao giờ cần phải gây rối với họ.

BTW, extraArgs là một danh sách / nhiều đối số của anotherfunc.


Câu trả lời:


138

Một hàm Python có thể là đối số của một hàm khác không?

Đúng.

def myfunc(anotherfunc, extraArgs):
    anotherfunc(*extraArgs)

Cụ thể hơn ... với nhiều lập luận khác nhau ...

>>> def x(a,b):
...     print "param 1 %s param 2 %s"%(a,b)
...
>>> def y(z,t):
...     z(*t)
...
>>> y(x,("hello","manuel"))
param 1 hello param 2 manuel
>>>

extraArgs có thể là một hàm không? nếu vậy bạn gọi nó như thế nào?
Aysennoussi

@sekai Có, extraArgs cũng có thể là một hàm.
Manuel Salvadores

3
tài liệu này ở đâu?
4dc0

32

Dưới đây là một cách khác để sử dụng *args(và cũng có thể tùy chọn), **kwargs:

def a(x, y):
  print x, y

def b(other, function, *args, **kwargs):
  function(*args, **kwargs)
  print other

b('world', a, 'hello', 'dude')

Đầu ra

hello dude
world

Lưu ý rằng function, *args, **kwargsphải được theo thứ tự đó và phải được các đối số cuối cùng để các chức năng gọi hàm.


3
Bạn có thể tìm thấy thêm thông tin về * args & ** kwargs tại đây pythontips.com/2013/08/04/args-and-kwargs-in-python-explained
Pipo

16

Các hàm trong Python là các đối tượng hạng nhất. Nhưng định nghĩa hàm của bạn hơi lệch .

def myfunc(anotherfunc, extraArgs, extraKwArgs):
  return anotherfunc(*extraArgs, **extraKwArgs)

4

Chắc chắn, đó là lý do tại sao python triển khai các phương thức sau trong đó tham số đầu tiên là một hàm:

  • map (chức năng, có thể lặp, ...) - Áp dụng chức năng cho mọi mục có thể lặp và trả về danh sách kết quả.
  • filter (chức năng, có thể lặp lại) - Tạo danh sách từ các phần tử có thể lặp lại mà hàm trả về true.
  • giảm (hàm, có thể lặp [, bộ khởi tạo]) - Áp dụng hàm tích lũy hai đối số cho các mục có thể lặp, từ trái sang phải, để giảm có thể lặp lại thành một giá trị duy nhất.
  • lambdas

2
  1. Có, nó được phép.
  2. Bạn sử dụng chức năng như bất kỳ chức năng nào khác: anotherfunc(*extraArgs)

2
  1. Đúng. Bằng cách bao gồm lệnh gọi hàm trong / s đối số đầu vào của bạn, bạn có thể gọi hai (hoặc nhiều) hàm cùng một lúc.

Ví dụ:

def anotherfunc(inputarg1, inputarg2):
    pass
def myfunc(func = anotherfunc):
    print func

Khi bạn gọi myfunc, bạn thực hiện điều này:

myfunc(anotherfunc(inputarg1, inputarg2))

Điều này sẽ in ra giá trị trả về của anotherfunc.

Hi vọng điêu nay co ich!


2

Hàm bên trong hàm: chúng ta cũng có thể sử dụng hàm làm tham số ..

Nói cách khác, chúng ta có thể nói đầu ra của một hàm cũng là một tham chiếu cho một đối tượng, hãy xem bên dưới cách đầu ra của hàm bên trong tham chiếu đến hàm bên ngoài như dưới đây ..

def out_func(a):

  def in_func(b):
       print(a + b + b + 3)
  return in_func

obj = out_func(1)
print(obj(5))

kết quả sẽ là .. 14

Hi vọng điêu nay co ich.


1
def x(a):
    print(a)
    return a

def y(a):
    return a

y(x(1))

2
Vui lòng xem xét thêm một số giải thích cho câu trả lời của bạn.
HMD

Bạn không chuyển hàm làm đối số ở đây, thay vào đó là giá trị trả về.
Bob Bobster

1
def x(a):
    print(a)
    return a

def y(func_to_run, a):
    return func_to_run(a)

y(x, 1)

Đó tôi nghĩ sẽ là một mẫu thích hợp hơn. Bây giờ điều tôi tự hỏi là liệu có cách nào để viết mã hàm để sử dụng trong việc gửi đối số cho một hàm khác không. Tôi tin rằng có trong C ++, nhưng trong Python thì tôi không chắc.


1

Decorator rất mạnh trong Python vì nó cho phép người lập trình truyền hàm dưới dạng đối số và cũng có thể định nghĩa hàm bên trong một hàm khác.

def decorator(func):
      def insideFunction():
        print("This is inside function before execution")
        func()
      return insideFunction

def func():
    print("I am argument function")

func_obj = decorator(func) 
func_obj()

Đầu ra

  • Đây là chức năng bên trong trước khi thực thi
  • Tôi là hàm đối số
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.