ฟังก์ชัน Python เป็นอาร์กิวเมนต์ของฟังก์ชัน?


116

ฟังก์ชัน Python สามารถเป็นอาร์กิวเมนต์ของฟังก์ชันอื่นได้หรือไม่?

พูด:

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

นี่คือสองคำถามโดยทั่วไป:

  1. ได้รับอนุญาตหรือไม่?
  2. และถ้าเป็นเช่นนั้นฉันจะใช้ฟังก์ชันภายในฟังก์ชันอื่นได้อย่างไร? ฉันจะต้องใช้ exec (), eval () หรืออะไรทำนองนั้น? ไม่จำเป็นต้องยุ่งกับพวกเขา

BTW, extraArgs คือรายการ / ทูเพิลของอาร์กิวเมนต์ของ anotherfunc


ที่เกี่ยวข้อง: stackoverflow.com/questions/47502068/…
พร้อมกัน

คำตอบ:


138

ฟังก์ชัน Python สามารถเป็นอาร์กิวเมนต์ของฟังก์ชันอื่นได้หรือไม่?

ใช่.

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

ให้เจาะจงมากขึ้น ... กับข้อโต้แย้งต่างๆ ...

>>> 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 สามารถเป็นฟังก์ชันได้หรือไม่ ถ้าเป็นอย่างนั้นคุณจะเรียกมันว่าอย่างไร?
Aysennoussi

@sekai ใช่ extraArgs ก็เป็นฟังก์ชันได้เช่นกัน
Manuel Salvadores

3
เอกสารนี้อยู่ที่ไหน
4dc0

32

นี่เป็นอีกวิธีหนึ่งในการใช้*args(และเป็นทางเลือก) **kwargs:

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

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

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

เอาท์พุต

hello dude
world

โปรดทราบว่าfunction, *args, **kwargsต้องอยู่ในลำดับที่และจะต้องมีการขัดแย้งที่ผ่านมาเพื่อฟังก์ชั่นการเรียกฟังก์ชั่น


3
สามารถดูข้อมูลเพิ่มเติมเกี่ยวกับ * args & ** kwargs ได้ที่นี่pythontips.com/2013/08/04/args-and-kwargs-in-python-explained
Pipo


4

แน่นอนว่านั่นคือเหตุผลที่ python ใช้วิธีการต่อไปนี้โดยที่พารามิเตอร์แรกเป็นฟังก์ชัน:

  • map (function, iterable, ... ) - ใช้ฟังก์ชันกับทุกรายการที่ทำซ้ำได้และส่งคืนรายการผลลัพธ์
  • ตัวกรอง (ฟังก์ชันสามารถทำซ้ำได้) - สร้างรายการจากองค์ประกอบเหล่านั้นที่สามารถทำซ้ำได้ซึ่งฟังก์ชันจะส่งคืนจริง
  • ลด (ฟังก์ชัน, ทำซ้ำได้ [, ตัวเริ่มต้น]) - ใช้ฟังก์ชันของสองอาร์กิวเมนต์สะสมกับรายการที่ทำซ้ำได้จากซ้ายไปขวาเพื่อลดค่าที่สามารถทำซ้ำได้เป็นค่าเดียว
  • lambdas

2
  1. ใช่ได้รับอนุญาต
  2. คุณใช้ฟังก์ชันเช่นเดียวกับที่คุณทำอื่น ๆ : anotherfunc(*extraArgs)

2
  1. ใช่. เมื่อรวมการเรียกใช้ฟังก์ชันไว้ในอาร์กิวเมนต์อินพุตของคุณคุณสามารถเรียกใช้ฟังก์ชันสองฟังก์ชัน (หรือมากกว่า) พร้อมกันได้

ตัวอย่างเช่น:

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

เมื่อคุณโทรหา myfunc คุณจะทำสิ่งนี้:

myfunc(anotherfunc(inputarg1, inputarg2))

สิ่งนี้จะพิมพ์ค่าส่งคืนของ anotherfunc

หวังว่านี่จะช่วยได้!


2

ฟังก์ชันภายในฟังก์ชัน: เราสามารถใช้ฟังก์ชันเป็นพารามิเตอร์ได้เช่นกัน ..

กล่าวอีกนัยหนึ่งเราสามารถพูดได้ว่าเอาต์พุตของฟังก์ชันเป็นการอ้างอิงสำหรับอ็อบเจกต์ด้วยเช่นกันดูด้านล่างว่าเอาต์พุตของฟังก์ชันภายในอ้างอิงกับฟังก์ชันภายนอกอย่างไรดังต่อไปนี้ ..

def out_func(a):

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

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

ผลลัพธ์จะเป็น .. 14

หวังว่านี่จะช่วยได้


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

def y(a):
    return a

y(x(1))

2
โปรดพิจารณาเพิ่มคำอธิบายในคำตอบของคุณ
HMD

คุณไม่ได้ส่งผ่านฟังก์ชันเป็นอาร์กิวเมนต์ที่นี่แทนที่จะส่งคืนค่า
Bob Bobster

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

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

y(x, 1)

ฉันคิดว่าน่าจะเป็นตัวอย่างที่เหมาะสมกว่า ตอนนี้สิ่งที่ฉันสงสัยคือมีวิธีโค้ดฟังก์ชันเพื่อใช้ในการส่งอาร์กิวเมนต์ไปยังฟังก์ชันอื่นหรือไม่ ฉันเชื่อว่ามีใน C ++ แต่ใน Python ฉันไม่แน่ใจ


1

Decoratorsมีประสิทธิภาพมากใน Python เนื่องจากช่วยให้โปรแกรมเมอร์สามารถส่งผ่านฟังก์ชันเป็นอาร์กิวเมนต์และยังสามารถกำหนดฟังก์ชันภายในฟังก์ชันอื่นได้

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()

เอาท์พุต

  • นี่คือฟังก์ชันภายในก่อนดำเนินการ
  • ฉันคือฟังก์ชันอาร์กิวเมนต์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.