Python bir işlev bağımsız değişkeni olarak işlev görüyor mu?


116

Bir Python işlevi başka bir işlevin argümanı olabilir mi?

Söyle:

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

Yani bu temelde iki sorudur:

  1. Buna izin veriliyor mu?
  2. Ve eğer öyleyse, diğer işlevin içindeki işlevi nasıl kullanırım? Exec (), eval () veya bunun gibi bir şey kullanmam gerekir mi? Onlarla uğraşmak zorunda kalmadım.

BTW, extraArgs, başka bir işlevin argümanlarının bir listesi / demetidir.


Yanıtlar:


138

Bir Python işlevi başka bir işlevin argümanı olabilir mi?

Evet.

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

Daha spesifik olmak gerekirse ... çeşitli argümanlarla ...

>>> 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 da bir işlev olabilir mi? eğer öyleyse nasıl adlandırırsın?
Aysennoussi

@sekai Evet, extraArgs da bir işlev olabilir.
Manuel Salvadores

3
bu nerede belgeleniyor?
4dc0

32

İşte kullanmanın başka bir yolu *args(ve isteğe bağlı olarak) **kwargs:

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

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

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

Çıktı

hello dude
world

O Not function, *args, **kwargssahip oldukları sırada olması ve işlevini çağırarak işlevine son argümanlar olmak zorunda.


3
* Args & ** kwargs hakkında daha fazla bilgi burada bulunabilir pythontips.com/2013/08/04/args-and-kwargs-in-python-explained
Pipo

16

Python'daki işlevler birinci sınıf nesnelerdir. Ancak işlev tanımınız biraz yanlış .

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

4

Elbette, bu yüzden python, ilk parametrenin bir işlev olduğu aşağıdaki yöntemleri uygular:

  • map (işlev, yinelenebilir, ...) - Her yinelenebilir öğeye işlevi uygulayın ve sonuçların bir listesini döndürür.
  • filter (function, iterable) - İşlev için true döndüren yinelenebilir öğelerden bir liste oluşturun.
  • azalt (işlev, yinelenebilir [, başlatıcı]) - Yinelenebilirliği tek bir değere düşürmek için iki bağımsız değişkenin işlevini, yinelenebilir öğelere kümülatif olarak, soldan sağa uygulayın.
  • lambda'lar

2
  1. Evet, izin verilir.
  2. İşlevi başka herhangi bir şekilde kullanırsınız: anotherfunc(*extraArgs)

2
  1. Evet. İşlev çağrısını girdi argümanınıza / larınıza dahil ederek, aynı anda iki (veya daha fazla) işlevi çağırabilirsiniz.

Örneğin:

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

Myfunc'ı aradığınızda şunu yaparsınız:

myfunc(anotherfunc(inputarg1, inputarg2))

Bu başka bir işlevin dönüş değerini yazdıracaktır.

Bu yardımcı olur umarım!


2

Fonksiyon içindeki fonksiyon: Fonksiyonu parametre olarak da kullanabiliriz ..

Başka bir deyişle, bir fonksiyonun çıktısının aynı zamanda bir nesne için bir referans olduğunu söyleyebiliriz, aşağıya bakın, iç fonksiyonun çıktısının aşağıdaki gibi dış fonksiyona nasıl referans verdiğine bakın.

def out_func(a):

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

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

sonuç .. 14

Bu yardımcı olur umarım.


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

def y(a):
    return a

y(x(1))

2
Lütfen cevabınıza bir açıklama eklemeyi düşünün.
HMD

Fonksiyonu burada argüman olarak değil, dönüş değeri olarak iletmiyorsunuz.
Bob Bobster

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

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

y(x, 1)

Daha uygun bir örnek olacağını düşünüyorum. Şimdi merak ettiğim şey, başka bir işleve argüman gönderimi içinde kullanılacak işlevi kodlamanın bir yolu olup olmadığıdır. C ++ 'da olduğuna inanıyorum, ancak Python'da emin değilim.


1

Dekoratörler Python'da çok güçlüdür çünkü programcıların işlevi bağımsız değişken olarak geçirmesine izin verir ve işlevi başka bir işlev içinde tanımlayabilir.

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

Çıktı

  • Bu, yürütmeden önce içerideki işlevdir
  • Ben argüman işleviyim
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.