Câu hỏi Hàm Python làm đối số hàm?


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

Nói:

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

Đây là hai câu hỏi cơ bản:

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

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


76
2018-06-09 07:47


gốc


Liên quan: stackoverflow.com/questions/47502068/… - alseether


Các câu trả lời:


Hàm Python có thể là một đối số không   của một chức năng khác?

Vâng.

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

Để cụ thể hơn ... với các đối số 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
>>>

89
2018-06-09 07:48



extraArgs có thể là một hàm không? nếu vậy bạn gọi nó như thế nào? - Sekai
@sekai Có, extraArgs có thể là một chức năng quá. - Manuel Salvadores
Không có nó, sabujp. Điều đó sẽ không hiệu quả chút nào. Không có điểm nào trong lịch sử chỉnh sửa của nhận xét này là chính xác. Đối số thứ hai của y đang được chuyển thành một bộ dữ liệu đơn lẻ, không phải là một danh sách đối số. Nếu bạn muốn chữ ký của y là y (z, * t), bạn cũng sẽ phải thay đổi cách bạn gọi điện y là y (x, "xin chào", "manuel") - codetaku
Ahh yea phải có một cái gì đó mistyped khi tôi đã được thử nghiệm nó, nó hoạt động như trên - sabujp


Đây là một cách khác bằng cách sử dụng *args (và 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, **kwargs phải theo thứ tự đó và phải là đối số cuối cùng của hàm gọi hàm.


25
2017-09-16 21:01



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


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 một chút.

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

15
2018-06-09 07:50





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

  • map (function, iterable, ...) - Áp dụng hàm cho mọi mục có thể lặp lại và trả về một danh sách các kết quả.
  • filter (function, iterable) - Xây dựng một danh sách từ các phần tử đó của iterable cho hàm trả về true.
  • reduce (function, iterable [, initializer]) - Áp dụng hàm hai đối số tích lũy cho các mục có thể lặp lại, từ trái sang đúng, để giảm giá trị lặp lại thành một giá trị duy nhất.
  • lambdas

3
2018-06-09 08:09





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

2
2018-06-09 07:49





  1. Vâng. Bằng cách bao gồm các cuộc gọi chức năng trong đối số đầu vào của bạn / s, bạn có thể gọi hai (hoặc nhiều) chức năng 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 làm điều này:

myfunc(anotherfunc(inputarg1, inputarg2))

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

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


2
2018-05-17 07:02





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

def y(a):
    return a

y(x(1))

0
2018-04-29 11:34



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. - Hamed


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 phù hợp hơn. Bây giờ những gì tôi tự hỏi là nếu có một cách để mã chức năng để sử dụng trong việc gửi đối số cho một chức năng khác. Tôi tin rằng có trong C + +, nhưng trong Python tôi không chắc chắn.


0
2017-07-26 14:33