Little boy questioned his mother, he asked what he can be in the future..with a sad smile, she tells him he can be anything he wants to be.... Boy said he’d become (an) astronaut and fly out into space crews around the universe he wanted to see the stars and also see other planets in outer space------------- "Why don’t we just keep dreaming, let’s keep our mind with dream and faith, as long as we wish we can make it come true, how old you are never forget your dream and keep dreaming "

Sunday 23 December 2018

Python : *args dan **kwargs

Ketika anda memperlajari kode pada bahasa pemrograman python pasti menemukan variable *args atau **kwargs ini menjadi parameter dari suatu fuction (fungsi) dalam suatu program. dan terheran sebenarnya variable apa ini?!
*args dan **kwargs
Kedua parameter ajaib ini adalah sebuah fungsonal parameter, *args adalah arguments dan **kwargs adalah keyword arguments. dengan kedua parameter tsb kita dapat membuat function yang kita buat dapat menerima sejumlah parameter argumen dan parameter keyword secara arbitrary (sewenang wenang) tanpa menentukan predefined parameter sebelumnya.

Perlu diketahui pada *args dan **kwargs yang paling penting adalah tanda *(asterik) dan ** (asterik ganda). anda bisa saja mengganti nama variablenya, semisal menjadi *var atau **vars.

Contoh :

Function pada python
def komisi (a,b):
    return sum((a,b))*0.05

komisi(40,60)
In [5]: komisi(40,60)
Out[5]: 5.0
function untuk mengembalikan nilai sejumlah 5% dari penjumlahan dua buah nilai. terdapat dua buah parameter a dan b, didalam function tsb terdapat operasi menjulahkan nilai dari dua paramter tsb kemudian dikalikan dengan 0.05, sehingga jika input nilai parameter a = 40 dan b = 60 maka nilai yang dikembalikan fuction adalah 5.0
So far ga ada masalah ya...hehe

Selanjutnya bagaimana jika kita memiliki tidak hanya dua tapi lebih banyak nomor atau keyword yang akan dilewatkan kedalam fungsi tsb.
Mungkin hanya tinggal menambahkan lebih banyak variable parameter pada function tsb (a,b,c,d dan seterusnya) seperti ini :
def komisi (a,b,c,d):
    return sum((a,b,c,d))*0.05

komisi(40,60,80,90)
In [11]: komisi(40,60,80,90)
Out[11]: 13.5

Muncul masalah baru, bagaimana jika kita tidak tahu berapa jumlah parameter yang akan dilewatkan oleh user sebelumnya? 
Maka digunakanlah *args untuk melewatkan parameter dalam type tuple non-keyword menjadi argumen suatu fuction. contoh :
def komisi (*args):
    return sum((args))*0.05

komisi(40,60,80,90,100,60,10,40)
In [15]: komisi(40,60,80,90,100,60,10,40)
Out[15]: 24.0
Dengan *args kita bisa melewatkan berapapun jumlah dari parameter yang kita mau tanpa kita tentukan jumlah dari parameter sebelumnya.


Lalu bagaimana dengan **kwargs
Contoh penggunaan functional parameter **kwargs :
def makan(**kwargs):
    for orang, makan in kwargs.items():
        print(f"{orang} suka makan {makan}")
    
makan(Saya='bubur',Budi="Nasi padang", Tono="Bakso", Mawar="Gudeg")
[Out] Saya suka makan bubur
      Budi suka makan Nasi padang
      Tono suka makan Bakso
      Mawar suka makan Gudeg
Jika *args menyimpan kedalam type tuple, maka kalau **kwargs meyimpan parameter keyword kedalam bentuk dictionary. Artinya ada pasangan antara 'key' : 'value' . Pada contoh diatas saya membuat fungsimakan() yang akan mencetak nama dan makanan yang dia sukai dengan beberapa parameter atau sebanyak parameter keyword yang kita mau.

contoh penggunaan **kwargs dalam bentuk class :
class Car:
    def __init__(self,**kwargs):
        self._Data=kwargs

    def GetType(self):
        return self._Data["Type"]
    def GetModel(self):
        return self._Data["Model"]
    def GetPrice(self):
        return self._Data["Price"]
    def GetMilesDrive(self):
        return self._Data["MilesDrive"]
    def GetOwner(self):
        return self._Data["Owner"]

    def GetCurrentPrice(self):
        return self.GetPrice()- ( self.GetMilesDrive()*10)


def main():
    myCar= Car(Type="BMW",Model=2015,Price=26000,MilesDrive=15,Owner="Hussein")
    CurrentPrice=myCar.GetCurrentPrice()
    print("{}'s Car, New price {}".format(myCar.GetOwner(),CurrentPrice))


    AlexCar= Car(Type="GMC",Model=2017,Price=28000,MilesDrive=5,Owner="Alex")
    CurrentPrice=AlexCar.GetCurrentPrice()
    print("{} 's Car, New price {}".format(AlexCar.GetOwner(),CurrentPrice))


if __name__ == '__main__':main()

[Out] Hussein's Car, New price 25850
      Alex 's Car, New price 27950
Sekian, terima kasih ^^

No comments:

Post a Comment