පයිතන් ලැම්බඩාස් ප්‍රයෝජනවත් වන්නේ ඇයි? [වසා ඇත]


931

මම උත්සාහ කරන්නේ පයිතන් ලැම්බඩස්. ලැම්බඩා සැබෑ ජීවිතයේ අමතක කළ යුතු “රසවත්” භාෂා අයිතම වලින් එකක් ද?

එය අවශ්‍ය විය හැකි අවස්ථා කිහිපයක් ඇති බව මට විශ්වාසයි, නමුත් එහි අපැහැදිලි බව සැලකිල්ලට ගෙන, අනාගත නිකුතුවලදී එය නැවත අර්ථ දැක්වීමේ විභවය (එහි විවිධ අර්ථකථන මත පදනම් වූ මගේ උපකල්පනය) සහ අඩු කළ කේතීකරණ පැහැදිලිකම - එසේ නම් වළක්වා ගත යුතුද?

මෙය මට මතක් කර දෙන්නේ සී වර්ගවල පිටාර ගැලීම (ස්වාරක්ෂක පිටාර ගැලීම) - ඉහළ විචල්‍යයට යොමු කිරීම සහ අනෙක් ක්ෂේත්‍ර අගයන් සැකසීම සඳහා අධික ලෙස පැටවීම. එය තාක්‍ෂණික සංදර්ශනයක් ලෙස පෙනේ, නමුත් නඩත්තු කෝඩර් බියකරු සිහිනයකි.


262
+1 හොඳ ප්‍රශ්නය - නරක උපකල්පන (ලැම්බඩා හි අපැහැදිලි බව) =) ක්‍රමලේඛන ශිල්පීය ක්‍රම විනිශ්චය නොකිරීමට උත්සාහ කරන්න. ඒවා තක්සේරු කර ඔබේ මානසික මෙවලම් කට්ටලයට එක් කරන්න. ඔබ ඔවුන්ට අකමැති නම්, ඒවා භාවිතා නොකරන්න, ආගමික නොවී තර්කානුකූලව සාකච්ඡා කිරීමට සූදානම්ව සිටින්න.
කියෙව්ලි

41
හස්කල් නීති! ලැම්බඩා කාර්යයන් ඔබට ප්‍රකාශන හැකියාව සහ වියුක්ත බලය ලබා දෙයි.
ජොනතන් බාබෙරෝ

11
@JAL LISP ගැන සඳහන් නොකල යුතුය ...
ළඟා වෙමින්

8
AppApproachingDarknessFish "ආහ්, ඒ ඔබේ පියාගේ වරහනයි. වඩා ශිෂ් age සම්පන්න යුගයක සිට වඩාත් ශිෂ්ට ආයුධයකි." - ඔබි ලිස්ප් කෙනෝබි
ක්ෂේත්‍ර

Answers:


1014

ඔබ කතා කරන්නේ ලැම්බඩා කාර්යයන් ගැනද? මෙන්

lambda x: x**2 + 2*x - 5

එම දේවල් ඇත්තෙන්ම බෙහෙවින් ප්‍රයෝජනවත් ය. පයිතන් ක්‍රියාකාරී ක්‍රමලේඛනය නමින් ක්‍රමලේඛන ශෛලියක් සඳහා සහාය වන අතර එහිදී ඔබට වෙනත් කාර්යයන් වෙත කාර්යයන් යැවිය හැකිය. උදාහරණයක්:

mult3 = filter(lambda x: x % 3 == 0, [1, 2, 3, 4, 5, 6, 7, 8, 9])

කට්ටල mult3කිරීමට [3, 6, 9], 3. මෙම ගුණාකාර බව මුල් ලැයිස්තුව හස්බන්ඩ් කෙටි (සහ, කෙනෙකුට තර්ක කළ හැකිය පැහැදිලි) වඩා

def filterfunc(x):
    return x % 3 == 0
mult3 = filter(filterfunc, [1, 2, 3, 4, 5, 6, 7, 8, 9])

ඇත්ත වශයෙන්ම, මෙම විශේෂිත අවස්ථාවෙහිදී, ඔබට ලැයිස්තු අවබෝධයක් ලෙස එකම දේ කළ හැකිය:

mult3 = [x for x in [1, 2, 3, 4, 5, 6, 7, 8, 9] if x % 3 == 0]

(හෝ එසේ වුවද range(3,10,3)), නමුත් ඔබට ලැයිස්තු අවබෝධය භාවිතා කළ නොහැකි තවත් බොහෝ නවීන භාවිත අවස්ථා ඇති අතර ලැම්බඩා ශ්‍රිතය යමක් ලිවීමට ඇති කෙටිම ක්‍රමය විය හැකිය.

  • වෙනත් ශ්‍රිතයකින් ශ්‍රිතයක් නැවත ලබා දීම

    >>> def transform(n):
    ...     return lambda x: x + n
    ...
    >>> f = transform(3)
    >>> f(4)
    7

    මෙය බොහෝ විට භාවිතා කරනුයේ පයිතන්ගේ සැරසිලි කරුවන් වැනි ක්‍රියාකාරී ආවරණ නිර්මාණය කිරීමට ය.

  • සමඟ අනුක්‍රමික අනුක්‍රමයක මූලද්‍රව්‍ය ඒකාබද්ධ කිරීම reduce()

    >>> reduce(lambda a, b: '{}, {}'.format(a, b), [1, 2, 3, 4, 5, 6, 7, 8, 9])
    '1, 2, 3, 4, 5, 6, 7, 8, 9'
  • විකල්ප යතුරකින් වර්ග කිරීම

    >>> sorted([1, 2, 3, 4, 5, 6, 7, 8, 9], key=lambda x: abs(5-x))
    [5, 4, 6, 3, 7, 2, 8, 1, 9]

මම නිතිපතා ලැම්බඩා කාර්යයන් භාවිතා කරමි. ඔවුන් සමඟ හුරු වීමට මට යම් කාලයක් ගත වූ නමුත් අවසානයේදී ඔවුන් භාෂාවේ ඉතා වටිනා කොටසක් බව මට වැටහුණි.


26
තේරුම් ගැනීමට ඉතා පහසු, උදාහරණ වලට ආදරය කරන්න. නමුත් අඩු කරන කොටස සඳහා. මට මෙම අංගය ක්‍රියාත්මක කිරීමට සිදුවුවහොත්. මම කරන්නම්','.join(str(x) for x in [1,2,3,4,5,6,7,8,9])
etlds

3
BTW ඔබ මෙය පයිතන් 3 මත ධාවනය කරන්නේ නම් සත්‍ය අගයන් බැලීමට ඔබට පෙරහන් ප්‍රති results ල ලැයිස්තුවක් ඇමතිය යුතුය, එසේම ඔබ ෆන්ක්ටූල් වලින් අඩු කිරීම ආනයනය කළ යුතුය
ජෙරාඩ්

ඉහත “ක්‍රියාකාරී ක්‍රමලේඛනය” අර්ථ දැක්වීම ගැන අපට විශ්වාසද? එය මට ටිකක් අවුල් සහගත විය.
stdout

3
මම හිතන්නේ ප්‍රධාන කරුණ නම් lambdaකාර්යයන් නිර්නාමික විය හැකි බවයි (ඒවා ඔබගේ සියලු උදාහරණවල ඇති පරිදි). ඔබ කිසියම් lambdaදෙයකට ශ්‍රිතයක් def
පවරන්නේ

1
gzgulser එය අර්ථ දැක්වීමක් නොවේ, එය ක්‍රියාකාරී ක්‍රමලේඛනය මඟින් ඔබට කිරීමට ඉඩ දෙන දෙයක් පිළිබඳ ප්‍රකාශයක් පමණි.
ඩේවිඩ් ඉසෙඩ්

378

lambdaකියන්න විකාර ක්‍රමයක් function. එහි නම හැරුණු විට ඒ පිළිබඳව අපැහැදිලි, බිය ගැන්වීම් හෝ ගුප්ත කිසිවක් නොමැත. ඔබ පහත දැක්වෙන රේඛාව කියවන විට, වෙනුවට lambdaවිසින් functionඔබේ මනස තුළ:

>>> f = lambda x: x + 1
>>> f(3)
4

එය හුදෙක් ශ්‍රිතයක් අර්ථ දක්වයි x. තවත් සමහර භාෂා Rඑය පැහැදිලිව කියනවා:

> f = function(x) { x + 1 }
> f(3)
4

ඔයා බලන්න? එය ක්‍රමලේඛනයේදී කළ යුතු ස්වාභාවික දේවලින් එකකි.


36
ක්‍රමලේඛන නොවන පසුබිම් වලින් පැමිණෙන අයට මෙය හොඳ විස්තරයකි (එනම්: නිශ්චිත විද්‍යාවන්) එමඟින් lambda ඉතා සරල අර්ථය තේරුම් ගැනීමට හැකි වේ. ස්තූතියි!
ගේබ්‍රියෙල්

10
රේමන්ඩ් හෙටින්ගර් සිය එක් කතාවක නම සඳහන් කරමින් කියා සිටියේ 'ලැම්බඩා' වෙනුවට 'ක්‍රියාකාරී වන්න' ලෙස නම් කිරීමෙන් සියලු ව්‍යාකූලතා මඟහරවා ගත හැකි බවයි. :-)
ankush981

10
ඔබේ මනසෙහි ප්‍රතිස්ථාපනය lambdaකර අවසන් ප්‍රකාශනයට පෙර එකතු කරන්නfunctionreturn
සිප්රියන් ටොමොයෙගා

4
AAaronMcMillin උත්සාහ කරන්න type(lambda x: 3). lambdaප්‍රකාශන සහ defප්‍රකාශ යන දෙකම functionවස්තු ජනනය කරයි; එය නිපදවිය හැකි අවස්ථා lambdaසීමා කරන ප්‍රකාශනයක වාක්‍ය ඛණ්ඩය පමණි .
චෙප්නර්

6
@AaronMcMillin ඔබට මගේ අදහස මග හැරී ඇත. ඔබට ප්‍රකාශනයක් සමඟ සෑම ශ්‍රිතයක්ම අර්ථ දැක්විය නොහැකි නිසා lambdaප්‍රකාශනයේ ප්‍රති result lambdaලය ශ්‍රිතයක් නොවේ .
චෙප්නර්

106

පේළි දෙකේ සාරාංශය:

  1. වසා දැමීම් : ඉතා ප්‍රයෝජනවත්. ඒවා ඉගෙන ගන්න, ඒවා භාවිතා කරන්න, ඔවුන්ට ආදරය කරන්න.
  2. පයිතන්ගේ ප්‍රධාන lambdaපදය: අනවශ්‍ය, ඉඳහිට ප්‍රයෝජනවත්. ඔබ එය දුරස්ථව සංකීර්ණ දෙයක් කරන බව පෙනේ නම්, එය පසෙකට දමා සැබෑ ශ්‍රිතයක් අර්ථ දක්වන්න.

72

ලැම්බඩා යනු ඉහළ ඇණවුම් කාර්යයන් සමඟ කටයුතු කරන ඉතා වැදගත් වියුක්ත යාන්ත්‍රණයක කොටසකි. එහි වටිනාකම පිළිබඳ නිසි අවබෝධයක් ලබා ගැනීමට කරුණාකර ඇබෙල්සන් සහ සුස්මාන්ගෙන් උසස් තත්ත්වයේ පාඩම් බලන්න , සහ පොතක් කියවන්න SICP

මේවා නවීන මෘදුකාංග ව්‍යාපාරයේ අදාළ ගැටළු වන අතර වඩ වඩාත් ජනප්‍රිය වෙමින් පවතී.


2
ලැම්බඩා ප්‍රකාශන වෙනත් භාෂාවලින්ද ජනප්‍රිය වෙමින් පවතී (C # වැනි). ඔවුන් කොහේවත් යන්නේ නැහැ. වසා දැමීම් පිළිබඳ කියවීම ලැම්බඩාස් තේරුම් ගැනීමට ප්‍රයෝජනවත් ව්‍යායාමයක් වනු ඇත. වසා දැමීම් jQuery වැනි රාමු තුළ කේතීකරණ මැජික් විශාල ප්‍රමාණයක් කළ හැකිය.
ඩෑන් එස්පර්සා

3
lambdaS සහ පළමු පන්තියේ කාර්යයන් පටලවා නොගන්න . පයිතන්ට අතිශය සීමිත lambdaප්‍රකාශයක් ඇත, නමුත් සම්පූර්ණයෙන්ම පළමු පන්තියේ කාර්යයන්. එහි ඇති එකම වෙනස නම් ඔබට ගමන් කිරීමට අවශ්‍ය කාර්යයන් නම් කිරීමයි.
ගරෙත් ලැටි

59

මට සැකයි ලැම්බඩා නැති වෙයි කියලා. එය ඉවත් කිරීමට උත්සාහ කිරීම අත්හැරීම ගැන ගයිඩෝගේ ලිපිය බලන්න . ගැටුමේ දළ සටහනක් ද බලන්න .

පයිතන්ගේ ක්‍රියාකාරී අංග පිටුපස ඇති ගනුදෙනුව පිළිබඳ වැඩි විස්තර සඳහා ඔබට මෙම ලිපිය බලන්න: http://python-history.blogspot.com/2009/04/origins-of-pythons-functional-features.html

කුතුහලය දනවන කරුණ නම්, ලැම්බඩා සහ අනෙකුත් ක්‍රියාකාරී අංග හඳුන්වාදීමට මුලින් පෙළඹවූ සිතියම, පෙරණය සහ අඩු කිරීමේ කාර්යයන් බොහෝ දුරට ලැයිස්තු අවබෝධය සහ උත්පාදක ප්‍රකාශන මගින් අභිබවා ගොස් ඇත. ඇත්ත වශයෙන්ම, අඩු කිරීමේ කාර්යය පයිතන් 3.0 හි ඇති බිල්ඩින් ශ්‍රිත ලැයිස්තුවෙන් ඉවත් කරන ලදි. (කෙසේ වෙතත්, ලැම්බඩා, සිතියම හෝ පෙරණය ඉවත් කිරීම පිළිබඳ පැමිණිලි යැවීම අවශ්‍ය නොවේ: ඒවා රැඳී තිබේ. :-)

මගේම ශත දෙක: පැහැදිලිකම යන තාක් දුරට ලැම්බඩා වටිනවා. සාමාන්‍යයෙන් ලැම්බඩා ඇතුළත් නොවන වඩාත් පැහැදිලි විසඳුමක් තිබේ.


2
අඩු කිරීම තවමත් පයිතන් 3.0 හි ආනයනය කළ හැකි බව සලකන්න. ඔබට එය සැබවින්ම අවශ්‍ය නම්, ඔබට එය තවමත් තිබිය හැකිය.
Paweł Polewicz

59

GUI වැඩසටහන්කරණයේදී ලැම්බඩාස් අතිශයින් ප්‍රයෝජනවත් වේ. නිදසුනක් ලෙස, ඔබ බොත්තම් සමූහයක් නිර්මාණය කරන බවත්, බොත්තමකට අද්විතීය ඇමතුමක් ලබා ගැනීමට වඩා තනි පරාමිතිගත ඇමතුමක් භාවිතා කිරීමට ඔබට අවශ්‍ය බවත් කියමු. එය පහසුවෙන් ඉටු කර ගැනීමට ලැම්බඩා ඔබට ඉඩ දෙයි:

for value in ["one","two","three"]:
    b = tk.Button(label=value, command=lambda arg=value: my_callback(arg))
    b.pack()

(සටහන: මෙම ප්‍රශ්නය විශේෂයෙන් විමසනු ලැබුවද lambda, ඔබට එකම ආකාරයේ ප්‍රති result ල ලබා ගැනීම සඳහා functools.partial භාවිතා කළ හැකිය )

විකල්පය වන්නේ අනුපිටපත් කේත වලට තුඩු දිය හැකි එක් එක් බොත්තම සඳහා වෙනම ඇමතුමක් ලබා දීමයි.


1
ලැම්බඩා යනු කුමක්දැයි මම සොයා බැලුවේ මේ නිසාය, නමුත් මෙය ක්‍රියාත්මක වන්නේ ඇයි, මට එය හරියටම ශ්‍රිතය කෙළින්ම ඇමතීම හා සමානයි ( stackoverflow.com/questions/3704568/… ). සමහර විට එය ප්‍රමාදයි, එය ක්‍රියා කරයි, නමුත් එය ක්‍රියාත්මක වන්නේ ඇයි?
Rqomey

5
QRqomey: වෙනස වන්නේ මෙම උදාහරණයේ ලූපයකින් අර්ථ දැක්වීමයි value; අනෙක් උදාහරණයේ පරාමිතියට සෑම විටම තිබුණේ එක් අගයක් පමණි. ඔබ වැනි දෙයක් එකතු කළ විට arg=value, ඔබ වත්මන් අගය නැවත ඇමතුමට අනුයුක්ත කරයි. එය නොමැතිව, ඔබ ඇමතුමෙහි විචල්‍යයට යොමු කිරීමක් බැඳ තබයි. යොමු කිරීම සැමවිටම විචල්‍යයේ අවසාන අගය අඩංගු වේ, මන්දයත් ඇමතුම නැවත සිදුවන්නේ ලූපය දැනටමත් ක්‍රියාත්මක වීමෙන් පසුවය.
බ්‍රයන් ඕක්ලි

1
මට ඊයේ මෙම කාර්යය ලැබුණා, එය කොතරම් ප්‍රයෝජනවත්දැයි මට අවංකවම විශ්වාස කළ නොහැකිය ... මට ලූප සඳහා එකකින් මෙනුවක් සහ වින්‍යාසය සඳහා සීඑස්වී ගොනුවක් සෑදිය හැකිය. ඇත්තෙන්ම ප්‍රයෝජනවත් දේවල්.
Rqomey

1
functools.partial()අඩු කබොල්ලකින් (සහ රහිතව lambda) මෙය කිරීමට ඔබට ඉඩ සලසන පැවැත්ම සැලකිල්ලට ගන්න .
ගරෙත් ලැටි

2
partial(my_callback, value)එදිරිව lambda arg=value: my_callback(arg)- ලැම්බඩාට වඩා වැඩි කබොලක් ඇත (තර්ක කිරීමට හා පසුව භාවිතයට පැවරීම) සහ එහි අභිප්‍රාය කුමක්ද යන්න පැහැදිලි නැත (ඔබ ලැම්බඩාවේ සියුම් ලෙස වෙනස් දෙයක් කළ හැකිය). ආනයන සැබවින්ම ගැටළුවක් නොවේ (ඔබට කෙසේ හෝ ගොඩවල් ඇති අතර එය එක් ගොනුවකට වරක්). කේතය වඩාත් හොඳින් විනිශ්චය කරනු ලබන්නේ එය කොතරම් හොඳින් partial()කියවනවාද යන්න මත වන අතර එය ලැම්බඩා වලට වඩා කියවීමට පහසුය.
ගරෙත් ලැටි

38

පයිතන් හි, lambdaපේළිගත කිරීමේ කාර්යයන් නිර්වචනය කිරීමේ ක්‍රමයක් පමණි,

a = lambda x: x + 1
print a(1)

සහ..

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

මෙම ..are නිශ්චිත එකම.

නිත්‍ය ශ්‍රිතයක් සමඟ ඔබට කළ නොහැකි ලැම්බඩා සමඟ ඔබට කළ හැකි කිසිවක් නැත - පයිතන් ශ්‍රිත යනු අන් සියල්ලටම සමාන වස්තුවක් වන අතර ලැම්බඩාස් හුදෙක් ශ්‍රිතයක් අර්ථ දක්වයි:

>>> a = lambda x: x + 1
>>> type(a)
<type 'function'>

මම අවංකවම හිතනවා lambda පයිතන්හි මූලික පදය අතිරික්තයක් ඇති බවය them මට ඒවා භාවිතා කිරීමේ අවශ්‍යතාවය කිසි විටෙකත් නොතිබුණි (හෝ නිත්‍ය ශ්‍රිතයක්, ලැයිස්තු අවබෝධයක් හෝ බොහෝ බිල්ඩින් ශ්‍රිතයන්ගෙන් එකක් වෙනුවට වඩා හොඳින් භාවිතා කළ හැකි තැනක් භාවිතා කර ඇති බව දැක ඇත)

සම්පූර්ණයෙන්ම අහඹු උදාහරණයක් සඳහා, "පයිතන්ගේ ලැම්බඩා කැඩී ඇත!" :

ලැම්බඩා කැඩී ඇති ආකාරය බැලීමට, fs=[f0,...,f9]කොතැනක ශ්‍රිත ලැයිස්තුවක් ජනනය කිරීමට උත්සාහ කරන්න fi(n)=i+n. පළමු උත්සාහය:

>>> fs = [(lambda n: i + n) for i in range(10)]
>>> fs[3](4)
13

මම තර්ක කරමි, එය ක්‍රියාත්මක වුවද, එය බිහිසුණු හා “අවිධිමත්” ය, එකම ක්‍රියාකාරීත්වය වෙනත් ආකාරවලින් ලිවිය හැකිය, උදාහරණයක් ලෙස:

>>> n = 4
>>> [i + n for i in range(10)]
[4, 5, 6, 7, 8, 9, 10, 11, 12, 13]

ඔව්, එය එසේ නොවේ, නමුත් ලැයිස්තුවක් තුළ ලැම්බඩා ශ්‍රිත සමූහයක් උත්පාදනය කිරීම අවශ්‍ය වන හේතුවක් මා දැක නැත . එය වෙනත් භාෂාවලින් අර්ථවත් විය හැකි නමුත් පයිතන් හස්කල් නොවේ (හෝ ලිස්ප්, හෝ ...)

අපට ලැම්බඩා භාවිතා කළ හැකි අතර අපේක්ෂිත ප්‍රති results ල මේ ආකාරයෙන් ලබා ගත හැකි බව කරුණාවෙන් සලකන්න:

>>> fs = [(lambda n,i=i: i + n) for i in range(10)]
>>> fs[3](4)
7

සංස්කරණය කරන්න:

ලැම්බඩා ප්‍රයෝජනවත් වන අවස්ථා කිහිපයක් තිබේ, උදාහරණයක් ලෙස PyQt යෙදුම්වල සං als ා සම්බන්ධ කිරීමේදී බොහෝ විට එය පහසු ය:

w = PyQt4.QtGui.QLineEdit()
w.textChanged.connect(lambda event: dothing())

යන්තම් කරන්නේ w.textChanged.connect(dothing)ද ගැටලුවක් වනු ඇත dothingඅතිරේක සමඟ ක්රමය eventතර්කය හා දෝෂයක් ඇති විය. ලැම්බඩා භාවිතා කිරීම යනු එතීමේ ශ්‍රිතයක් නිර්වචනය නොකර අපට තර්කය පිළිවෙලින් අතහැර දැමිය හැකිය.


2
ඔබේ "ලැම්බඩා කැඩී ඇත" තර්කය බිඳී ඇත, මන්ද පයිතන් විචල්‍ය විෂය පථ නීති රීති ඒ ආකාරයට ක්‍රියාත්මක වන බැවිනි. ඔබ for-loop සඳහා වසා දැමීමක් නිර්මාණය කළහොත් ඔබට ඒ ආකාරයෙන්ම දෂ්ට කරනු ලැබේ.
ඇන්ටි හාපාල

1
ලැම්බඩා යනු වෙනත් බොහෝ භාෂාවන් මෙන් (උදා: ජාවාස්ක්‍රිප්ට්) පරිශීලකයාට "නිර්නාමික" ශ්‍රිතයක් ලබා දීම සඳහා පයිතන් ක්‍රමය පමණි.
ස්ටෙෆාන් ග ru න්වාල්ඩ්

1
aඔබ නිර්වචනය කළ ලැම්බඩා සහ ශ්‍රිතය හරියටම සමාන නොවේ . :) ඒවා __name__අවම වශයෙන් ක්ෂේත්‍රයෙන් වෙනස් වේ ...
nperson325681

1
එය හුදෙක් පේළිගත ශ්‍රිතයකට වඩා වැඩ කරයි.
kta

“වෙනත් භාෂාවකින් අර්ථවත් විය හැකිය” පිළිබඳ ඔබේ තර්කය අමුතුයි. එක්කෝ ලැම්බාස්හි සහජ ගුණාංග ඇත, නැතහොත් ඒවා එසේ නොවේ.
ටයිටෝ

32

එකම, නමුත් විවිධ තත්වයන් සඳහා කරන කාර්යයන් ලැයිස්තුවක් සඳහා ලැම්බඩා ප්‍රයෝජනවත් බව මට පෙනේ.

මොසිල්ලා බහුවිධ නීති මෙන් :

plural_rules = [
    lambda n: 'all',
    lambda n: 'singular' if n == 1 else 'plural',
    lambda n: 'singular' if 0 <= n <= 1 else 'plural',
    ...
]
# Call plural rule #1 with argument 4 to find out which sentence form to use.
plural_rule[1](4) # returns 'plural'

ඔබට ඒ සියල්ල සඳහා ශ්‍රිතයක් නිර්වචනය කිරීමට සිදුවුවහොත් එය අවසන් වන විට ඔබට පිස්සු වැටෙනු ඇත.
එසේම, ඒ වගේ කාර්යය නම් සමග ලස්සන වන්නේ නැහැ plural_rule_1, plural_rule_2ආදිය, සහ ඔබට අවශ්ය කියලා eval()ඔබ විචල්ය කාර්යය id මත පදනම්ව කරන විට එය.


1
රටා ගැළපුම සහ විකල්ප සමඟ F # හි මා මෙතෙක් කර ඇති කෙටි හමුවීම් වලට මෙය සමාන ය. මෙම වාක්‍ය ඛණ්ඩය භාවිතා කරන්නේ කෙසේද යන්න පිළිබඳ වැඩි විස්තර ඔබට තිබේද?
කෙන්

26

ඔබට කළ හැකි ඕනෑම දෙයක් lambda නම් කරන ලද කාර්යයන් හෝ ලැයිස්තුව සහ උත්පාදක ප්‍රකාශන සමඟ වඩා හොඳින් කළ හැකිය.

එහි ප්‍රති, ලයක් වශයෙන්, බොහෝ දුරට ඔබ මූලික වශයෙන් ඕනෑම තත්වයක සිටින අයගෙන් එක් අයෙකු පමණක් විය යුතුය (අන්තර්ක්‍රියාකාරී පරිවර්තකයේ ලියා ඇති සීරීම් කේතය හැර).


3
“බොහෝ දුරට ඔබ මූලික වශයෙන් ඕනෑම තත්වයක සිටින අයගෙන් එක් අයෙකු පමණක් විය යුතුය” කාල සීමාව. පරිවර්තකයා තුළ ලැම්බඩා ටයිප් කිරීම එතරම් ප්‍රයෝජනවත් නොවේ.
එස්.ලොට්

11
Av ජේවියර් ඔබ "ලැම්බඩා" සංකල්පය ගැන කතා කරන්නේ නම් මම ඔබ සමඟ එකඟ වෙමි; කෙසේ වෙතත්, අපි "ලැම්බඩා" ගැන කතා කරන්නේ නම්: 1) නම් කරන ලද කාර්යයන් වේගවත් වන අතර ඔබට ලැම්බඩාස් (සිතියම් + පෙරණය) භාවිතා කරන ඕනෑම තැනක (ප්‍රකාශ + ප්‍රකාශන) කළ හැකිය. ඔබට උත්පාදක ප්‍රකාශන හෝ ලැයිස්තු අවබෝධය කළ හැකිය. ඒවා වඩාත් ක්‍රියාකාරී හා සංක්ෂිප්ත ය. පළමු පන්තියේ කාර්යයන් සිසිල් නොවන බව මම නොකියමි, පයිතන්හි ඇති “ලැම්බඩා” මූල පදය නම් කරන ලද ශ්‍රිතයක් භාවිතා කිරීම තරම් හොඳ නැත, එපමණයි.
ආරොන් මේන්පා

3
යතුර = වර්ග කිරීම සඳහා තර්කය () සහ වර්ග කිරීම () වැනි ඇමතුම් ආපසු ලබා ගැනීමේ ශ්‍රිත භාවිතා කිරීම සඳහා ලැම්බඩා මට අත්‍යවශ්‍ය වේ
රික් කෝප්ලන්ඩ්

19
Ick රික් මට ඒ ගැන සැක නැත, නමුත් යථාර්ථය නම් ඔබ "ලැම්බඩා" දුටු විට සහ "සොහ්මිගොඩ් ලැම්බඩා" යැයි සිතමින් පයිතන්හි යෝජනා ක්‍රම ලිවීම ආරම්භ කළහොත් පයිතන්ගේ ලැම්බඩා ප්‍රකාශනයේ සීමාවන් නිසා ඔබ බලාපොරොත්තු සුන් වනු ඇත. අනෙක් අතට, ඔබ ඔබ ගැනම සිතීමට පටන් ගන්නේ නම් "ලැයිස්තුවක් අවබෝධ කර ගැනීමක් ක්‍රියාත්මක වේද? නැත. නම් කරන ලද ශ්‍රිතයක් වීම සඳහා මට අවශ්‍ය වන්නේ කුමක්ද? නැත. හරි: වර්ග කිරීම (xs, key = lambda x: x.name, x.height) ", ඔබ බොහෝ විට ලැම්බඩා නිවැරදි වාර ගණනක් භාවිතා කරනු ඇත.
ආරොන් මේන්පා

4
+1: මම තරම් එකක් ලැම්ඩා එක් වූ භාවිතා භාවිතා කරන විට ඒ මානසික ආතතිය බැහැ නමක් නැති උත්සවය. නම් වලට වටිනා බුද්ධිමය එකතු කළ අගයක් ඇත.
ස්ටෙෆාන් රෝලන්ඩ්

19

මම අවුරුදු කීපයක් තිස්සේ පයිතන් භාවිතා කර ඇති අතර, මම කිසි විටෙකත් ලැම්බඩා අවශ්‍ය අවස්ථාවකට නොගියෙමි. ඇත්ත වශයෙන්ම, නිබන්ධනයේ සඳහන් වන පරිදි, එය සින්ටැක්ටික් සීනි සඳහා පමණි.


8
පයිතන් භාවිතයෙන් GUI එකක් සංවර්ධනය කිරීමේදී ඒවා ඉතා ප්‍රයෝජනවත් වේ. බොහෝ විට, විජට් වලට ශ්‍රිතයක් සඳහා යොමු කිරීමක් අවශ්‍ය වේ. ශ්‍රිතයක් ඇමතීමට සහ තර්ක ඉදිරිපත් කිරීමට ඔබට විජට් එකක් අවශ්‍ය නම්, එය කිරීමට ලැම්බඩා ඉතා පහසු ක්‍රමයකි.
බ්‍රයන් ඕක්ලි

1
ශ්‍රිතයට බහුවිධ තර්ක ඉදිරිපත් කිරීමෙන් ලැබෙන වාසිය කුමක්ද? func_name (a, b): ලැම්බඩා භාවිතා කරනවාට වඩා a + b ආපසු
එවන්න

2
එය අවශ්‍ය නොවන නමුත් එය කෙටි කේත ලිවීමට සහ බොහෝ අවස්ථාවල කියවිය හැකි පරිදි ලිවීමට උපකාරී වේ. ජාවා හෝ සී ++ වැනි
වාචික භාෂාවලින්

17

පයිතන් විසින් විශේෂයෙන් ලැම්බඩා ක්‍රියාත්මක කිරීම ගැන මට කතා කළ නොහැක, නමුත් සාමාන්‍යයෙන් ලැම්බඩා කාර්යයන් සැබවින්ම පහසුය. ඒවා ක්‍රියාකාරී ක්‍රමලේඛනයේ මූලික තාක්‍ෂණයකි (සමහර විට තාක්‍ෂණය පවා), ඒවා වස්තු-නැඹුරු වැඩසටහන් වලද ඉතා ප්‍රයෝජනවත් වේ. සමහර ආකාරයේ ගැටළු සඳහා, ඒවා හොඳම විසඳුම වන බැවින් නිසැකවම අමතක නොකළ යුතුය!

වසා දැමීම් සහ සිතියම් ක්‍රියාකාරිත්වය (පයිතන් ලියකියවිලි සමඟ සම්බන්ධ වන නමුත් එය ක්‍රියාකාරී ඉදිකිරීම් සඳහා සහය දක්වන සෑම භාෂාවකම පාහේ පවතී) එය ප්‍රයෝජනවත් වන්නේ මන්දැයි බැලීමට මම ඔබට යෝජනා කරමි .


3
ලැම්බඩාස් නොමැතිව එම දේවල් කළ හැකිය. ඒක ලොකු කරදරයක් විතරයි.
බ්‍රයන්

17

ලැම්බඩා ශ්‍රිතය එය ශ්‍රිතයක් නිර්මාණය කිරීම සඳහා නිලධාරිවාදී නොවන ක්‍රමයකි.

ඒක තමයි. නිදසුනක් ලෙස, ඔබේ ප්‍රධාන කාර්යය සහ වර්ග අගයන් අවශ්‍ය යැයි අපි සිතමු. මෙය කිරීමට සාම්ප්‍රදායික ක්‍රමය සහ ලැම්බඩා ක්‍රමය බලමු:

සාම්ප්‍රදායික ක්‍රමය:

def main():
...
...
y = square(some_number)
...
return something

def square(x):
    return x**2

ලැම්බඩා මාර්ගය:

def main():
...
square = lambda x: x**2
y = square(some_number)
return something

වෙනස බලන්න?

ලැයිස්තු අවබෝධය හෝ සිතියම වැනි ලැයිස්තු සමඟ ලැම්බඩා කාර්යයන් ඉතා හොඳින් ගමන් කරයි. ඇත්ත වශයෙන්ම, ලැයිස්තු අවබෝධය එය ලැම්බඩා භාවිතා කරමින් ප්‍රකාශ කිරීමට “පයිතොනික්” ක්‍රමයකි. උදා:

>>>a = [1,2,3,4]
>>>[x**2 for x in a]
[1,4,9,16]

සින්ටැක්ස් හි එක් එක් අංගවල තේරුම කුමක්දැයි බලමු:

[]: "මට ලැයිස්තුවක් දෙන්න"

x ** 2: "මෙම අලුත උපන් ශ්‍රිතය භාවිතා කිරීම"

a හි x සඳහා: "a හි එක් එක් මූලද්‍රව්‍යයට"

ඒක පහසුද? මේ වගේ කාර්යයන් නිර්මාණය කිරීම. ලැම්බඩා භාවිතයෙන් එය නැවත ලියමු:

>>> square = lambda x: x**2
>>> [square(s) for x in a]
[1,4,9,16]

දැන් අපි සිතියම භාවිතා කරමු, එය එකම දෙයයි, නමුත් වඩා භාෂා-මධ්‍යස්ථයි. සිතියම් තර්ක 2 ක් ගනී:

(i) එක් ශ්‍රිතයක්

(ii) නැවත කළ හැකි

තවද, එක් එක් මූලද්‍රව්‍යයේ ක්‍රියාකාරීත්වයේ එක් එක් මූලද්‍රව්‍යයට අදාළ වන ශ්‍රිත ලැයිස්තුවක් ඔබට ලබා දෙයි.

එබැවින්, සිතියම භාවිතා කිරීමෙන් අපට ඇත්තේ:

>>> a = [1,2,3,4]
>>> squared_list = map(lambda x: x**2, a)

ඔබ ලැම්බඩාස් සහ සිතියම්කරණය ප්‍රගුණ කළහොත්, දත්ත හැසිරවීමට සහ සංක්ෂිප්ත ආකාරයකින් ඔබට විශාල බලයක් ලැබෙනු ඇත. ලැම්බඩා කාර්යයන් අපැහැදිලි හෝ කේත පැහැදිලිකම ඉවත් නොකරයි. අමාරු දෙයක් අලුත් දෙයක් සමඟ පටලවා නොගන්න. ඔබ ඒවා භාවිතා කිරීමට පටන් ගත් පසු, ඔබට එය ඉතා පැහැදිලිව පෙනෙනු ඇත.


13

ලස්සන දේවල් වලින් එකක් lambdaමගේ මතය අනුව අවතක්සේරු කර ඇති නම්, වටිනාකම අවශ්‍ය වන තෙක් සරල ආකෘති සඳහා ඇගයීමක් කල් දැමීමයි. මට පැහැදිලි කරන්න දෙන්න.

බොහෝ පුස්තකාල චර්යාවන් ක්‍රියාත්මක කරනු ලබන අතර එමඟින් ඇතැම් පරාමිතීන් ඇමතීමට ඉඩ සලසයි (ඔවුන්ගෙන් ලැම්බඩා එකකි). අදහස නම් සත්‍ය වටිනාකම ගණනය කරනු ලබන්නේ එය භාවිතා කිරීමට යන වේලාවේදී පමණි (ඒ වෙනුවට එය හැඳින්වූ විට). කාරණය නිදර්ශනය කිරීමට (උපක්‍රමශීලී) උදාහරණයක් උපකාරී වේ. දී ඇති කාලරාමුව ලොග් කිරීමට ඔබ පුරුද්දක් කර ඇතැයි සිතමු. වර්තමාන කාලය us ණ මිනිත්තු 30 භාවිතා කිරීමට ඔබට අවශ්‍යය. ඔබ එය එසේ කියනු ඇත

log_timestamp(datetime.datetime.now() - datetime.timedelta(minutes = 30))

දැන් සත්‍ය ශ්‍රිතය කැඳවනු ලබන්නේ කිසියම් සිදුවීමක් සිදු වූ විට පමණක් යැයි සිතමු. ඔබට අවශ්‍ය වන්නේ කාලරාමුව ගණනය කිරීම එම අවස්ථාවේ දී පමණි. ඔබට මෙය එසේ කළ හැකිය

log_timestamp(lambda : datetime.datetime.now() - datetime.timedelta(minutes = 30))

log_timestampමෙවැනි ඇමතුම් හැසිරවිය හැකි යැයි උපකල්පනය කිරීමෙන් , එය අවශ්‍ය වූ විට මෙය ඇගයීමට ලක් කරනු ඇති අතර ඔබට එම අවස්ථාවේ කාලරාමුව ලැබෙනු ඇත.

ඇත්ත වශයෙන්ම මෙය කිරීමට විකල්ප ක්‍රම තිබේ ( operatorඋදාහරණයක් ලෙස මොඩියුලය භාවිතා කරමින් ) නමුත් මම කාරණය ප්‍රකාශ කළෙමි.

යාවත්කාලීන කිරීම : මෙන්න තරමක් සංයුක්ත සැබෑ ලෝක උදාහරණයකි.

යාවත්කාලීන 2 : මම හිතන්නේ මෙය මාපටැඟිල්ලක් ලෙස හැඳින්වෙන දෙයට උදාහරණයක් .


11

ලැම්බඩස් ඇත්ත වශයෙන්ම ක්‍රියාකාරී ක්‍රමලේඛනයේ අදහස් වලින් පැන නගින ඉතා ප්‍රබල ඉදිකිරීම් වන අතර එය නුදුරු අනාගතයේ දී පයිතන්හි පහසුවෙන් සංශෝධනය කිරීම, නැවත අර්ථ දැක්වීම හෝ ඉවත් කිරීම සිදු නොවේ. කාර්යයන් ඔබට පරාමිතීන් ලෙස සම්මත කිරීමට ඉඩ සලසන බැවින් වඩා බලවත් කේත ලිවීමට ඒවා ඔබට උදව් කරයි, එබැවින් පළමු පන්තියේ පුරවැසියන් ලෙස කාර්යයන් පිළිබඳ අදහස.

ලැම්බඩාස් ව්‍යාකූල වීමට නැඹුරු වන නමුත් ස්ථිර අවබෝධයක් ලබා ගත් පසු ඔබට මේ ආකාරයට පිරිසිදු අලංකාර කේතයක් ලිවිය හැකිය:

squared = map(lambda x: x*x, [1, 2, 3, 4, 5])

ඉහත කේත රේඛාව මඟින් ලැයිස්තුවේ ඇති සංඛ්‍යා වල වර්ග ලැයිස්තුවක් ලබා දේ. ඇත්ත වශයෙන්ම, ඔබට එයද එසේ කළ හැකිය:

def square(x):
    return x*x

squared = map(square, [1, 2, 3, 4, 5])

කලින් කේතය කෙටි බව පැහැදිලිය, ඔබ සිතියම් ශ්‍රිතය (හෝ පරාමිතියක් ලෙස ශ්‍රිතයක් ගන්නා ඕනෑම සමාන ශ්‍රිතයක්) එකම ස්ථානයක භාවිතා කිරීමට අදහස් කරන්නේ නම් මෙය විශේෂයෙන් සත්‍ය වේ. මෙය කේතය වඩාත් බුද්ධිමත් හා අලංකාර කරයි.

ඩේවිඩ් සාස්ලාව්ස්කි සිය පිළිතුරෙහි සඳහන් කළ පරිදි, ලැයිස්තු අවබෝධය සැමවිටම යා යුතු මාර්ගය නොවේ, විශේෂයෙන් ඔබේ ලැයිස්තුවට කිසියම් අපැහැදිලි ගණිතමය ආකාරයකින් අගයන් ලබා ගත යුතු නම්.

වඩාත් ප්‍රායෝගික දෘෂ්ටි කෝණයකින් බලන කල, ලැම්බඩාස්හි විශාලතම වාසියක් වූයේ මෑතකදී GUI සහ සිදුවීම් මත පදනම් වූ වැඩසටහන්කරණයයි. ඔබ ටින්කර්හි ඇමතුම් ආපසු බැලීමක් කළහොත්, ඔවුන් තර්ක ලෙස සලකන්නේ ඒවා අවුලුවන සිදුවීම පමණි. උදා

def define_bindings(widget):
    widget.bind("<Button-1>", do-something-cool)

def do-something-cool(event):
    #Your code to execute on the event trigger

දැන් ඔබට සම්මත කිරීමට තර්ක කිහිපයක් තිබේ නම් කුමක් කළ යුතුද? මූසික ක්ලික් කිරීමක ඛණ්ඩාංක ගබඩා කිරීම සඳහා තර්ක 2 ක් සම්මත කිරීම තරම් සරල දෙයක්. ඔබට පහසුවෙන් මේ ආකාරයට කළ හැකිය:

def main():
    # define widgets and other imp stuff
    x, y = None, None
    widget.bind("<Button-1>", lambda event: do-something-cool(x, y))

def do-something-cool(event, x, y):
    x = event.x
    y = event.y
    #Do other cool stuff

ගෝලීය විචල්‍යයන් භාවිතයෙන් මෙය කළ හැකි යැයි දැන් ඔබට තර්ක කළ හැකිය, නමුත් මතක කළමනාකරණය සහ කාන්දු වීම ගැන කරදර වෙමින් ඔබේ හිස ගසා දැමීමට ඔබට අවශ්‍යද? විශේෂයෙන් ගෝලීය විචල්‍යය එක්තරා ස්ථානයක භාවිතා කරනු ඇත. එය දුර්වල වැඩසටහන් ශෛලියක් වනු ඇත.

කෙටියෙන් කිවහොත්, ලැම්බඩාස් නියමයි, කිසි විටෙකත් අවතක්සේරු නොකළ යුතුය. පයිතන් ලැම්බඩාස් LISP ලැම්බඩා වලට සමාන නොවේ (ඒවා වඩා බලවත්), නමුත් ඔබට ඔවුන් සමඟ ඉන්ද්‍රජාලික දේවල් රාශියක් කළ හැකිය.


ස්තූතියි. ඔබේ අවසාන උදාහරණය මට සම්පූර්ණයෙන්ම තේරුණේ නැත. X කෙසේ පැමිණ y දෙකේම අර්ථ නිරූපනය කර ඇත mainහා do_something_cool? මොකක්ද වෙන්නේ xහා yමෙම උත්සවයට? සම්මත කළ අගයන් වහාම නැවත ලියන බවක් පෙනේ ද? ශ්‍රිතය ගැන දන්නේ eventකෙසේද? ඔබට අදහස් / පැහැදිලි කිරීම් කිහිපයක් එකතු කළ හැකිද? ස්තූතියි
සංජේ මනෝහර්

@SanjayManohar මම පසුකර මා xහා yතර්කයන් ලෙස do-something-coolහා ඒවායේ අගයන් ඔබ කිසිවක් අපේක්ෂා කරනු ලබන තර්ක සම්මත කිරීමට lambdas භාවිතා කළ හැකි ආකාරය පැහැදිලි කිරීමට මෙම උත්සවයට කට්ටලයක් වීම වේ. මෙම widget.bindකාර්යය අපේක්ෂා eventඑම සුවිශේෂී විජට් මත චිත්රක අවස්ථාවට හඳුනාගතහැකි පරාමිතිය. වැඩි පැහැදිලි කිරීමක් සඳහා ටින්කර්ගේ ක්‍රමලේඛන ආකෘතිය කියවීමට මම නිර්දේශ කරමි.
varagrawal

හ්ම්ම් මම හිතන්නේ මට ටින්කර් ආකෘතිය තේරෙනවා. නමුත් තවමත් එතරම් අවබෝධයක් නැත - ඔබ සමත් වී x,yඑසේ කරන්න x=event.x. එය ඔබ සම්මත කළ අගය නැවත ලියන්නේ නැද්ද? ශ්‍රිතය eventයනු කුමක්දැයි දන්නේ කෙසේද? ඔබ එය ශ්‍රිතයට යොමු කරන්නේ කොතැනදැයි මට නොපෙනේ. නැත්නම් එය ක්‍රමවේදයක්ද? ශ්‍රිත නාමයකින් us ණ සං signs ා සඳහා ඔබට අවසර තිබේද?
සංජේ මනෝහර්

An සංජේ මනොහාර් යාළුවා ඔබ ටින්කර් සහ පයිතන් ගැන කියවිය යුතුයි. Tkinter විසින් සිදුවීම් වස්තුව පෙරනිමි ක්‍රියාවක් ලෙස සම්මත කරයි. නම් x, y, එය නිදර්ශන අරමුණු සඳහා උදාහරණයක් පමණි. මම උත්සාහ කරන්නේ ලැම්බඩාස්ගේ බලය පෙන්වීමට මිස ටින්කර්ට නොවේ. :)
වරග්‍රවාල්

1
හරි දැන් මට තේරෙනවා ඔබ අදහස් කළ දේ - ඔබට ශ්‍රිතය ලැබීමට eventඅවශ්‍යද? එවැනි අවස්ථාවක, ඔබේ ලැම්බඩා කියවිය යුතු lambda event: do_something_cool(event,x,y)නොවේද?
සංජේ මනෝහර්

10

ඉහත සඳහන් කළ පරිදි, පයිතන්හි ලැම්බඩා ක්‍රියාකරු නිර්නාමික ශ්‍රිතයක් නිර්වචනය කරන අතර පයිතන් ශ්‍රිතවල වසා දැමීම් වේ. වසා දැමීමේ සංකල්පය ක්‍රියාකරු ලැම්බඩා සමඟ පටලවා නොගැනීම වැදගත් වන අතර එය හුදෙක් සින්ටැක්ටික් මෙතඩෝනයකි.

මම මීට වසර කිහිපයකට පෙර පයිතන්හි ආරම්භ කරන විට, ලැයිස්තු අවබෝධය සමඟ මම සිසිල් යැයි සිතමින් ලැම්බඩාස් ගොඩක් භාවිතා කළෙමි. කෙසේ වෙතත්, මම ක්‍රියාකාරී ස්ථාන දහස් ගණනක අනුපිළිවෙල මත පයිතන් හි ලියා ඇති විශාල වෙබ් අඩවියක් ලිවීමට හා නඩත්තු කිරීමට සිදුවේ. අත්දැකීම් වලින් මම ඉගෙන ගෙන ඇත්තේ ලැම්බඩස් සමඟ මූලාකෘතිකරණය කිරීම සුදුසු විය හැකි නමුත් යතුරු පුවරු කිහිපයක් ඉතිරි කිරීම හෝ සමහර විට එසේ කිරීම හැරෙන්නට පේළිගත කිරීමේ කාර්යයන් (වසා දැමීම් ලෙස නම් කර ඇති) කිසිවක් ඉදිරිපත් නොකරයි.

මූලික වශයෙන් මෙය කරුණු කිහිපයක් දක්වා උනු වේ:

  • අර්ථවත් නම් භාවිතයෙන් පැහැදිලිව ලියා ඇති මෘදුකාංග කියවීම පහසුය. නිර්වචනය අනුව නිර්නාමික වසා දැමීම් වලට නමක් නොමැති බැවින් අර්ථවත් නමක් තිබිය නොහැක. මෙම සංක්ෂිප්තය යම් හේතුවක් නිසා ලැම්බඩා පරාමිතීන් ආසාදනය වන බව පෙනේ, එබැවින් අපි බොහෝ විට ලැම්බඩා x: x + 1 වැනි උදාහරණ දකිමු
  • නමක් ඇති විට ඒවා කිහිප වතාවක්ම හැඳින්විය හැකි බැවින් නම් කරන ලද වසා දැමීම් නැවත භාවිතා කිරීම පහසුය.
  • ලැම්බඩාස් වෙනුවට නම් කරන ලද වසා දැමීම් භාවිතා කරන කේතය නිදොස්කරණය කිරීම පහසුය, මන්දයත් නම ලුහු ce ු සටහන් වල සහ දෝෂය වටා දිස්වන බැවිනි.

ඒවා වට කර නම් කරන ලද වසා දැමීම් බවට පරිවර්තනය කිරීමට එය ප්‍රමාණවත් හේතුවකි. කෙසේ වෙතත්, මම නිර්නාමික වසා දැමීම් වලට එරෙහිව තවත් අමනාප දෙකක් දරමි.

පළමු අමනාපය වන්නේ ඒවා භාෂාව අවුල් කරන තවත් අනවශ්‍ය මූල පදයක් වීමයි.

දෙවන අමනාපය ගැඹුරු වන අතර පරමාදර්ශී මට්ටමින්, එනම් ඔවුන් ක්‍රියාකාරී-ක්‍රමලේඛන ශෛලියක් ප්‍රවර්ධනය කිරීමට මා කැමති නැත, මන්ද එම ශෛලිය පණිවුඩය යැවීම, වස්තු දිශානත හෝ ක්‍රියා පටිපාටි රටාවන්ට වඩා නම්‍යශීලී වන නිසා ලැම්බඩා කැල්කියුලස් ටියුරින් නොවන බැවිනි. සම්පුර්ණයි (වාසනාවකට මෙන් පයිතන්හි, අපට තවමත් ලැම්බඩා ඇතුළත පවා එම සීමාවෙන් ඉවත් විය හැකිය). ලැම්බඩාස් මෙම විලාසිතාව ප්‍රවර්ධනය කිරීමට මට හැඟෙන හේතු:

  • ව්‍යංග ප්‍රතිලාභයක් ඇත, එනම් ඒවා ක්‍රියාකාරී විය යුතු යැයි පෙනේ.

  • ඒවා වෙනත්, වඩාත් පැහැදිලි, වඩා කියවිය හැකි, නැවත භාවිතා කළ හැකි සහ වඩාත් පොදු යාන්ත්‍රණයකට විකල්ප රාජ්‍ය සැඟවීමේ යාන්ත්‍රණයකි: ක්‍රම.

ලැම්බඩා රහිත පයිතන් ලිවීමට මම දැඩි උත්සාහයක් දරමි. මම හිතන්නේ පයිතන් ලැම්බඩාස් නොමැතිව තරමක් හොඳ භාෂාවක් වනු ඇත, නමුත් එය මගේ මතය පමණි.


1
"... පයිතන් කාර්යයන් වසා දැමීම් වේ". මම තේරුම් ගත් පරිදි එය එතරම් නිවැරදි නැත. වසා දැමීම් කාර්යයන් වේ, නමුත් කාර්යයන් සැමවිටම වසා දැමීම් නොවේ. ශ්‍රිතය-> ලැම්බඩා x, y: x + y. වසා දැමීම-> lambda x: lambda y: x + y
0atman

6
"ලැම්බඩා කැල්කියුලස් ටියුරින්-සම්පුර්ණ නොවන නිසා" සරල වැරදියි, ටයිප් නොකළ ලැම්බඩා කැල්කියුලස් අයිඑස් ටියුරින් සම්පූර්ණයි, එය එතරම් වැදගත් වීමට හේතුව එයයි. Y- සංයෝජක භාවිතයෙන් ඔබට පුනරාවර්තනය ලබා ගත හැකිය,Y = lambda f: (lambda x: x(x))(lambda y: f(lambda *args: y(y)(*args)))
Antii Haapala

තවද, යමෙකු ටියුරින්ගේ සම්පූර්ණත්වය කියවීම සඳහා විකිපීඩියාවට ගියහොත්, එය පවසන්නේ "ලැම්බඩා කැල්කියුලස් ඊට හොඳම උදාහරණයයි."
ඇන්ටි හාපාල

බැරෑරුම් ලෙස - ටියුරින් කිරීම සම්පූර්ණ නොවේ - මෙම පිළිතුරට බැරෑරුම් සංස්කරණයක් හෝ ආපසු ගැනීමක් අවශ්‍ය වේ.
ටෝනි සෆොල්ක් 66

@ මාර්සිනෝ කිස් වෙත අනුගත වන නිසා ඉහළ ඡන්දය ප්‍රකාශ කළේය. සංසන්දනයක් ලෙස, කේ ඇන්ඩ් ආර් පොතේ සඳහන් වන්නේ පැවරුම කොටසක් හෝ විශාල ප්‍රකාශනයක් ලෙස භාවිතා කිරීම වඩා සංයුක්ත වන නමුත් එය බොහෝ විට කියවිය නොහැකි බවයි. ක්‍රියාකාරී ක්‍රමලේඛන රටා භාවිතා කිරීමේ ප්‍රවණතාව-වැගන් යනු ට්‍රයිට් සහ ක්ලච් ය. ඒවා භාවිතා කළ හැකි ආකාරය සඳහන් කිරීම ප්‍රමාණවත් ය, නමුත් ඔවුන් දක්ෂ සංවර්ධකයෙකු වීමට අතිශයින්ම වැදගත් බව ප්‍රකාශ කිරීම ඕනෑවට වඩා ය; සම්පූර්ණයෙන්ම ආත්මීය. පංති w / o පන්ති ප්‍රාථමික, පහත් හා ප්‍රමාණවත් නොවන බවට තර්ක කරන C ++ සංවර්ධකයින්ට මෙම තර්කය සමාන වේ. "ටියුරින්-සම්පූර්ණත්වය", තර්ක විතර්ක වේ.
typedeaf

8

ලැම්බඩාස් සාමාන්‍යයෙන් ක්‍රියාකාරී ක්‍රමලේඛන ශෛලියට ගැඹුරින් බැඳී ඇත. සමහර දත්ත වලට ශ්‍රිතයක් යෙදීමෙන් සහ ප්‍රති results ල ඒකාබද්ධ කිරීමෙන් ඔබට ගැටලු විසඳා ගත හැකිය යන අදහස ගූගල් එහි ඇල්ගොරිතම බොහොමයක් ක්‍රියාත්මක කිරීමට භාවිතා කරයි.

ක්‍රියාකාරී ක්‍රමලේඛන ශෛලියේ ලියා ඇති වැඩසටහන් පහසුවෙන් සමාන්තරගත වන අතර එබැවින් නවීන බහු-මූලික යන්ත්‍ර සමඟ වඩ වඩාත් වැදගත් වේ. එබැවින් කෙටියෙන් කිවහොත්, ඔබ ඒවා අමතක නොකළ යුතුය.


7

ලැම්බඩා හඳුනා ගැනීමට සමත් වූ පළමු සුබ පැතුම්. මගේ මතය අනුව මෙය සැබවින්ම බලගතු ඉදිකිරීමකි. ක්‍රියාකාරී ක්‍රමලේඛන භාෂාවන් කෙරෙහි මේ දිනවල ඇති ප්‍රවණතාවය නිසැකවම එය වළක්වා නොගත යුතු බවට හෝ නුදුරු අනාගතයේ දී එය නැවත අර්ථ දැක්විය නොහැකි බවට දර්ශකයකි.

ඔබ ටිකක් වෙනස් ලෙස සිතිය යුතුය. මට විශ්වාසයි ඉක්මනින් ඔබ එයට ආදරය කරනු ඇත. නමුත් ඔබ පයිතන් සමඟ පමණක් ගනුදෙනු කරන්නේ නම් ප්‍රවේශම් වන්න. ලැම්බඩා සැබෑ වසා දැමීමක් නොවන නිසා එය කෙසේ හෝ "කැඩී" ඇත: පයිතන් ලැම්බඩා කැඩී ඇත


පයිතන්ගේ ලැම්බඩා කැඩී නැත. ලැම්බඩාස් හි දේශීයයන් හැසිරවීමට ක්‍රම දෙකක් තිබේ. දෙකම වාසි සහ අවාසි ඇත. පයිතන් (සහ සී #) ගත් ප්‍රවේශය තනිකරම ක්‍රියාකාරී භාෂාවන්ට හුරුවී ඇති අයට ප්‍රතිවිරුද්ධ යැයි මම සිතමි, මන්ද තනිකරම ක්‍රියාකාරී භාෂාවක් සමඟ එම ප්‍රවේශය පවා අර්ථවත් යැයි මම නොසිතමි.
බ්‍රයන්

එය සැබවින්ම ප්‍රතිවිරුද්ධ දෙයකි. මම පයිතන් ක්‍රමලේඛකයෙක් නොවුනත් කුඩා කුඩා කතා වලදී එය සමාන වන අතර මම නිතිපතා මේ ගැන පැකිලෙමි. එබැවින් මම එය "කැඩුණු" යැයි සලකමි :)
නොර්බට් හාර්ට්ල්

නැත, මෙය ප්‍රතිවිරුද්ධතාව සමඟ කිසිදු සම්බන්ධයක් නැත. විචල්ය නම්වල ශබ්දකෝෂ විෂය පථය ශ්‍රිතයක් බව පමණක් ය; ලූපයක් ශබ්දකෝෂ විෂය පථයක් හඳුන්වා නොදේ. ජාවාස්ක්‍රිප්ට් හි කාර්යයන් ද එලෙසම ක්‍රියාත්මක වේ. ඔබ var සඳහා විෂය පථය අවශ්ය නම්, ඔබ හැම විටම කළ හැකි (ලැම්ඩා scopedvar: ලැම්ඩා x: scopedvar + x) ()
Antti Haapala

6

මම දැන් පයිතන් ආරම්භ කර මුලින්ම ලැම්බඩා වෙතට දිව ගියෙමි.

මෙය කිසිවක් හෙළා දැකීමක් නොවන බව සලකන්න. සෑම කෙනෙකුටම වෙනස් නොවන දේවල් සමූහයක් ඇත.

ලැම්බඩා සැබෑ ජීවිතයේ අමතක කළ යුතු 'රසවත්' භාෂා අයිතම වලින් එකක් ද?

නැත.

මට විශ්වාසයි එය අවශ්‍ය විය හැකි අවස්ථා කිහිපයක් ඇති නමුත් එහි අපැහැදිලි බව සැලකිල්ලට ගෙන,

එය අපැහැදිලි නොවේ. මම වැඩ කළ පසුගිය කණ්ඩායම් දෙක, සෑම කෙනෙක්ම සෑම විටම මෙම අංගය භාවිතා කළහ.

අනාගත නිකුතුවලදී එය නැවත අර්ථ දැක්වීමේ විභවය (එහි විවිධ අර්ථකථන මත පදනම් වූ මගේ උපකල්පනය)

මීට වසර කිහිපයකට පෙර වසා දැමීමේ අර්ථ නිරූපණය නිවැරදි කිරීමට වඩා එය පයිතන් හි නැවත අර්ථ දැක්වීම සඳහා බරපතල යෝජනා කිසිවක් මා දැක නැත.

සහ අඩු කරන ලද කේතීකරණ පැහැදිලිකම - එය වළක්වා ගත යුතුද?

ඔබ එය නිවැරදිව භාවිතා කරන්නේ නම් එය එතරම් පැහැදිලි නැත. ඊට පටහැනිව, වැඩි භාෂා ප්‍රමාණයක් තිබීම වැඩි වේ ව්‍යුහයක් තිබීම පැහැදිලි බව කරයි.

මෙය මට මතක් කර දෙන්නේ සී වර්ගවල පිටාර ගැලීම (ස්වාරක්ෂක පිටාර ගැලීම) - ඉහළ විචල්‍යයට යොමු කිරීම සහ අනෙක් ක්ෂේත්‍ර අගයන් සැකසීම සඳහා අධික ලෙස පැටවීම ... තාක්‍ෂණික ප්‍රදර්ශනයක් හෝ නඩත්තු කෝඩර් බියකරු සිහිනයක් ..

ලැම්බඩා බෆරය පිටාර ගැලීමකට සමානද? වොව්. ඔබ "නඩත්තු බියකරු සිහිනයක්" යැයි සිතන්නේ නම් ඔබ ලැම්බඩා භාවිතා කරන්නේ කෙසේදැයි මට සිතාගත නොහැකිය.


5
-1 මට (සහ වෙනත් අයට) මුළු ප්‍රශ්නයම නැවත කියවීමට සැලැස්වීම සඳහා. අනෙක් අය එය නොකර පිළිතුරු දීමට සමත් වූ බව සලකන්න.
Paweł Polewicz

6

කේත අනුපිටපත් කිරීමෙන් වැළකීමට මම ලැම්බඩාස් භාවිතා කරමි. එමඟින් ශ්‍රිතය පහසුවෙන් තේරුම්ගත හැකි වනු ඇත උදා:

def a_func()
  ...
  if some_conditon:
     ...
     call_some_big_func(arg1, arg2, arg3, arg4...)
  else
     ...
     call_some_big_func(arg1, arg2, arg3, arg4...)

මම එය තාවකාලික ලැම්බඩා සමඟ ආදේශ කරමි

def a_func()
  ...
  call_big_f = lambda args_that_change: call_some_big_func(arg1, arg2, arg3, args_that_change)
  if some_conditon:
     ...
     call_big_f(argX)
  else
     ...
     call_big_f(argY)

5

මම අද ඩේවිඩ් මර්ට්ස්ගේ පොත කියවීමට පටන් ගත්තේ 'පයිතන්හි පෙළ සැකසීම' යනුවෙනි. පළමු පරිච්ඡේදයේ උපග්‍රන්ථයේ A හි පැහැදිලි කිරීම් සමඟ ලැම්බඩාගේ උදාහරණ පිළිබඳව ඔහු තරමක් තදින් විස්තර කර ඇති අතර, ඔවුන් මා වෙනුවෙන් පිටුවෙන් පැනීමට (අවසානයේ) හේතු වූ අතර හදිසියේම ඒවායේ වටිනාකම මට වැටහුණි. ඔහුගේ පැහැදිලි කිරීම ඔබ වෙනුවෙන් වැඩ කරනු ඇති බවක් නොකියන අතර මම තවමත් සොයාගැනීමේ අවධියේ සිටිමි, එබැවින් පහත සඳහන් කරුණු හැරුණු විට මෙම ප්‍රතිචාර වලට එකතු කිරීමට මම උත්සාහ නොකරමි: මම පයිතන්ට අලුත් වෙමි මම ඕඕපී ලැම්බඩාස්ට අලුත් වෙමි දැන් මම මර්ට්ස් කියවා ඇති විට, මම හිතන්නේ මම ඒවා ලබා ගත් අතර ඒවා ක්‍රමලේඛනයට වඩා පිරිසිදු ප්‍රවේශයකට ඉඩ දෙන බව මා සිතන තරමට ඒවා ප්‍රයෝජනවත් යැයි මම සිතමි.

ඔහු පයිතන්හි සෙන් ප්‍රතිනිෂ්පාදනය කරයි, එහි එක් පේළියක් සරල නම් සංකීර්ණ වේ. OOP නොවන ක්‍රමලේඛකයෙකු ලෙස ලැම්බඩාස් සමඟ කියවීමේ කේතයක් (සහ පසුගිය සතිය දක්වා ලැයිස්තු අවබෝධය) මම සිතුවෙමි- මෙය සරලද ? . ඇත්ත වශයෙන්ම මෙම අංගයන් කේතයට වඩා කියවිය හැකි සහ විකල්පයට වඩා තේරුම් ගත හැකි බව මම අද අවසාන වශයෙන් තේරුම් ගතිමි. එය කිසියම් ආකාරයක ලූපයකි. මූල්‍ය ප්‍රකාශන මෙන් - පයිතන් නවක පරිශීලකයා සඳහා නිර්මාණය කර නැති බවත්, එය අධ්‍යාපනය ලැබීමට කැමති පරිශීලකයා සඳහා නිර්මාණය කර ඇති බවත් මම තේරුම් ගතිමි. මෙම භාෂාව කෙතරම් බලවත්දැයි මට විශ්වාස කළ නොහැක. එය මා වෙත පැමිණි විට (අවසාන වශයෙන්) ලැම්බඩාස් වල අරමුණ හා වටිනාකම මට අවශ්‍ය වූයේ වැඩසටහන් 30 ක් පමණ ඉරා දමා සුදුසු තැනක ලැම්බඩා දැමීම ආරම්භ කිරීමටය.


5

ලැම්බඩාස් භාවිතා කිරීම සඳහා ප්‍රයෝජනවත් අවස්ථාවක් වන්නේ දිගු ලැයිස්තු අවබෝධයේ කියවීමේ හැකියාව වැඩි දියුණු කිරීමයි . මෙම උදාහරණයේ දී loop_dicපැහැදිලිකම සඳහා කෙටි නමුත් loop_dicඉතා දිගු යැයි සිතන්න . ඔබ iඑම අගයේ ලැම්බඩා අනුවාදය වෙනුවට සරල අගයක් භාවිතා කරන්නේ නම් ඔබට ලැබෙනු ඇත NameError.

>>> lis = [{"name": "Peter"}, {"name": "Josef"}]

>>> loop_dic = lambda i: {"name": i["name"] + " Wallace" }
>>> new_lis = [loop_dic(i) for i in lis]

>>> new_lis
[{'name': 'Peter Wallace'}, {'name': 'Josef Wallace'}]

වෙනුවට

>>> lis = [{"name": "Peter"}, {"name": "Josef"}]

>>> new_lis = [{"name": i["name"] + " Wallace"} for i in lis]

>>> new_lis
[{'name': 'Peter Wallace'}, {'name': 'Josef Wallace'}]

5

මට ඇත්ත වශයෙන්ම ලැම්බඩා බැරෑරුම් ලෙස අවශ්‍ය වූ උදාහරණයක් ඔබට දෙන්න පුළුවන්. මම චිත්‍රක වැඩසටහනක් සාදමි, එහිදී භාවිතා කිරීම ගොනුවක් මත දකුණු ක්ලික් කර විකල්ප තුනෙන් එකක් පවරයි. Tkinter හි (මම මෙය ලියන GUI අතුරුමුහුණත් වැඩසටහන), යමෙකු බොත්තමක් එබූ විට, එය තර්ක විතර්කයකට ගෙන යා නොහැකි බව පෙනේ. එබැවින් මම විකල්පයන්ගෙන් එකක් තෝරාගෙන මගේ තේරීමේ ප්‍රති result ලය වීමට අවශ්‍ය නම්:

print 'hi there'

එහෙනම් ලොකු දෙයක් නැහැ. නමුත් විශේෂිත විස්තරයක් ලබා ගැනීමට මගේ තේරීම අවශ්‍ය නම් කුමක් කළ යුතුද? උදාහරණයක් ලෙස, මම තේරීම A තෝරා ගන්නේ නම්, එය A, B හෝ C තේරීම මත රඳා පවතින යම් තර්කයක් ගන්නා ශ්‍රිතයක් ලෙස හැඳින්වේ, TKinter ට මේ සඳහා සහාය විය නොහැක. ඇත්ත වශයෙන්ම මෙය වටහා ගත හැකි එකම විකල්පය ලැම්ඩා ය ...


2
හොඳයි, අනුමාන ඔබ කළ හැකි def foo...හා පසුව සම්මත fooවෙනුවට lambda. එය තවත් කේතයක් වන අතර ඔබට නමක් ඉදිරිපත් කළ යුතුය.
ජෝන් කුම්බ්ස්

4

මම එය බොහෝ විට භාවිතා කරමි, ප්‍රධාන වශයෙන් ශුන්‍ය වස්තුවක් ලෙස හෝ පරාමිතීන් අර්ධ වශයෙන් ශ්‍රිතයකට බන්ධනය කිරීමට ය.

මෙන්න උදාහරණ:

ශුන්‍ය වස්තු රටාව ක්‍රියාත්මක කිරීමට:

{
    DATA_PACKET: self.handle_data_packets
    NET_PACKET: self.handle_hardware_packets
}.get(packet_type, lambda x : None)(payload)

පරාමිති බන්ධනය සඳහා:

මට පහත API ඇති බව කියමු

def dump_hex(file, var)
    # some code
    pass

class X(object):
    #...
    def packet_received(data):
        # some kind of preprocessing
        self.callback(data)
    #...

පසුව, ලැබුනු දත්ත ඉක්මනින් ගොනුවකට දැමිය නොහැකි විට මම එය කරන්නේ:

dump_file = file('hex_dump.txt','w')
X.callback = lambda (x): dump_hex(dump_file, x)
...
dump_file.close()

4

මම පාවිච්චි කරනවා lambdaපරාමිතීන් ඇතුළත් වන ඇමතුම් ලබා ගැනීමට . එකම ක්‍රියාකාරීත්වයක් සිදු කිරීම සඳහා ක්‍රමවේදයක් ලිවීමට වඩා එක් පේළියක ලැම්බඩා ලිවීම වඩා පිරිසිදු ය.

උදාහරණයක් වශයෙන්:

import imported.module

def func():
    return lambda: imported.module.method("foo", "bar")

විරුද්ධ ලෙස:

import imported.module

def func():
    def cb():
        return imported.module.method("foo", "bar")
    return cb

4

මම පයිතන් ආරම්භකයෙක්, එබැවින් ලැම්බඩා පිළිබඳ පැහැදිලි අදහසක් ලබා ගැනීම සඳහා මම එය 'සඳහා' ලූපයක් සමඟ සංසන්දනය කළෙමි; කාර්යක්ෂමතාව අනුව. මෙන්න කේතය (පයිතන් 2.7) -

import time
start = time.time() # Measure the time taken for execution

def first():
    squares = map(lambda x: x**2, range(10))
    # ^ Lambda
    end = time.time()
    elapsed = end - start
    print elapsed + ' seconds'
    return elapsed # gives 0.0 seconds

def second():
    lst = []
    for i in range(10):
        lst.append(i**2)
    # ^ a 'for' loop
    end = time.time()
    elapsed = end - start
    print elapsed + ' seconds'
    return elapsed # gives 0.0019998550415 seconds.

print abs(second() - first()) # Gives 0.0019998550415 seconds!(duh)

6
ඔබ අගය timeitඅඩු කිරීමට වඩා නිවැරදි ප්‍රති results ල ලබා දෙන මොඩියුලය ගැන උනන්දු විය හැකිය time.time().
කෙවින්

2
හ්ම්, පළමු () සහ දෙවන () ආරම්භයේදී ඔබේ ටයිමරය නැවත ආරම්භ කිරීම අවශ්‍ය නොවේද?
qneill

2

ලැම්බඩා යනු ක්‍රියා පටිපාටිය සාදන්නෙකි. පයිතන්ගේ ලැම්බඩා ඉතා බලවත් නොවුවද, ක්‍රියාත්මක වන වේලාවට ඔබට වැඩසටහන් සංස්ලේෂණය කළ හැකිය. ස්වල්ප දෙනෙක් එම ආකාරයේ ක්‍රමලේඛනය තේරුම් ගෙන ඇති බව සලකන්න.

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.