Thursday, June 24, 2010

Lambda expression буюу Зарлагаагүй хэрэглэгдэх функц

Lambda илэрхийлэл (Lambda Expression = LE гэж товчлоё)
Lambda илэрхийлэл буюу зарлагаагүй хэрэглэгдэх функц гэдэг ойлголт нь LISP болон бусад функционал програмчлалын хэлнүүдээс үүсэлтэй. LE нь нэрлэгдээгүй функц гэдэг тодорхойлолтондоо илүү дөхсөн гэж би боддог. Ер нь бол LE нь ямар нэгэн зарласан функцээр гүйцэтгэгдэх ажлыг тийм функц зарлахгүйгээр шууд ашиглахыг хүссэн газраа хэрэглэх боломж олгодгоороо давуу юм.




Үндсэн синтакс нь lambda args : expression. Гэхдээ заавал аргумент авах шаардлагагүй бөгөөд lambda: x+1 гэж бичиж болно. Жишээлбэл квадрат олдог 
LE нь lambda x : x*x гэж бичигдэх бөгөөд үүнийг ашиглахдаа 
(lambda s:s*s)(2)
эсвэл
kwad = lambda e : e*e
kwad(2) гэж бичнэ.


Энд нэг жижигхэн жишээ бичиж үзье:


Эхнийх нь яг үндсэн зарлагаар зарлагдсан функц


>>> def kwadrat(x):
...     return x*x
... 
>>> kwadrat(2)
4


Харин энд LE-г ашигласан жишээ байна.


>>> (lambda s:s*s)(2)
4


Одоо арай өөр нэг жишээ авч үзье.


def zeregt_dewshuulegch(n):return lambda x:x**n
... 


Энд функц болон LE-г хоёуланг нь зэрэг хэрэглэсэн байна.


>>> xoer = zeregt_dewshuulegch(2)
>>> xoer(5)
25
>>> gurawt = zeregt_dewshuulegch(3)
>>> gurawt(3)
27


Мөн дараах байдлаар ашиглаж болно.
>>> print zeregt_dewshuulegch(5)(2)
32


Эхний аргумент нь тухайн зэрэгт дэвшүүлэх функц буюу тухайн LE-д хэрэглэгдэх тогтмол утга (манай жишээнд n) юм.


Дээрх LE нь тухайн функцыг ашиглан хувьсагчид lambda илэрхийллийг олгох үйлдэл хийж байгаа бөгөөд үүнийг хэвлэж үзвэл :


>>> def zeregt_dewshuulegch(n):return lambda x:x**n
... 
>>> d=zeregt_dewshuulegch(8)
>>> d
at 0xb74e86f4>


Python дээр map, filter, reduce гэсэн 3 функц байдаг LE-г эдгээртэй хослуулан ашигласнаар нэлээд гоё хэрэглээ гарч ирдэг. Эдгээр функцуудыг товчхон тайлбарлаад LE-г ашигласан жишээг үзье :


>>> toonuud = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] гэсэн өгөгдөл байсан.


filter(функц, дараалал) синтакстай байх бөгөөд энэ нь эхний функцээс үнэн утга буцаасан дарааллыг буцаадаг.


>>> print filter(lambda d:d%2==0,toonuud)
[2, 4, 6, 8, 10]


map(функц, дараалал) синтакстай байх бөгөөд энэ нь өгөгдсөн дарааллыг өгөгдсөн функцээр мэплэх буюу буулгалт хийн гарсан дарааллыг буцаадаг.



>>> print map(lambda d:d**2,toonuud)
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

reduce(функц, дараалал) гэсэн синтакстай байх бөгөөд энэ нь өгөгдсөн дарааллын эхний 2 элементийг авч тухайн функцыг ашиглан үйлдлээ хийгээд гарсан үр дүнг дараагын элемэнттэй мөн дээрх үйлдлийг хийх замаар эцэст нь нэгхэн утга буцаадаг.

>>> reduce(lambda x,y:x+y,toonuud)
55
c

>>> too = range(1,11)
>>> too
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> reduce(lambda a,b : a*b,too)
3628800

энд Lambda илэрхийлэл ашиглах давуу тал болох товч бичиглэл, цэгцтэй байдал харагдаж байгаа бизээ.

2 comments:

  1. сайхан ойлгомжтой болж, баярлалаа.

    ReplyDelete
  2. Ламбаадаа бүжгийн тухай бичээд байна уу? Дууны тухай бичээд байна уу? Ойлгохгүй юм аа, багш аа

    ReplyDelete

Сэтгэгдэл үлдээж байгаад баярлалаа :]