توابع بینام lambda در پایتون یا راهحل فراخوانی توابع آرگوماندار در tkinter
توسط: vahit
تابع بینام lambda جزء خصوصیات زبانهای برنامهنویسی تابعی مانند lisp هست که وارد پایتون شده است.
– با کلمهی کلیدی lambda میشه توابع کوچیک و بدون نام ایجاد کرد.
– هر جا که نیاز به تابع بود میشه از این نوع تابع هم استفاده کرد
با کلمهی کلیدی lambda میشه توابع کوچیک و بدون نام ایجاد کرد. برای مثال تابع زیر مجموع آرگومانهاش رو بر میگردونه:
1 |
lambda a, b: a + b |
این نوع از توابع مثل همهی توابع نرمال هستن یعنی هر جا که نیاز به تابع بود میشه از اینها هم استفاده کرد امّا این نوع تابع یه مشکل خیلی خیلی بزرگی داره اونهم اینه که فقط یک عبارت داخل خودش میتونه داشته باشه حتی نمیشه اون عبارت رو شرطی نوشت! ولی با این حال خیلی کار راهانداز هست. در مثال زیر، از تابع بدون نام داخل یک تابع به اسم make_incrementor استفاده کردیم تا حاصل جمع آرگومان تابع اصلی رو با آرگومان خودش برگردونه:
1 2 3 4 5 6 7 |
>>> def make_incrementor(n): ... return lambda x: x + n ... >>> f = make_incrementor(42) >>> print(f(2)) 44 >>> |
در خط ۴ مقدار ۴۲ داخل آرگومان n قرار میگیره و در خط ۵ عدد ۲ داخل متغیر x، که در نهایت موجب میشه مقدار ۴۴ در خروجی چاپ بشه. پیشنهاد میکنم با مقادیر کاراکتر یا رشتهای تست کنیم که بهتر متوجه بشیم داخل این بلوک چی به چیه:
1 2 3 4 |
>>> g = make_incrementor('a') >>> print(g('b')) ba >>> |
همینطور که میبینید میشه به مزایای استفاده از lambda کاهش تعداد خطوط برنامه رو هم اشاره کرد امّا من یه مورد دیگه رو هم که بنظر خودم مهم و خوب هست رو میگم، در برنامههایی که رابط کاربریشون با tkinter نوشته شده برای انجام کارهای با فشردن دکمه، لازم هست تابعی داشته باشیم و اون رو به دکمه متصل کنیم تا با فشردنش اون تابع اجرا بشه. خب مثهی همهی توابع، توابع ما هم گاهی لازم دارن که آرگومانهای بگیرن و امّا … نکته اینجاست که tkinter موقع فراخوندن همچین توابعی خطا میده! یعنی اصلاً همچین امکانی وجود نداره! (فراخوانی تابع به همراه آرگومان در دکمهها!!) راهکارش استفاده از توابع بینام lambda هست، یعنی تابع lambda رو به عنوان تابع مورد نظر به tkinter معرفی میکنیم در حالی که تنها عبارتش تابع مورد نظرمون با تعداد آرگومانهای مورد نظرش هست. به مثال زیر توجه کنید:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#!/usr/sbin/env python from tkinter import ttk import tkinter as tk def test_func(name, day): print('hello', name) print('How are you', day, '?') win = tk.Tk() my_name = 'vahit' date = 'today' bt = ttk.Button( win, text="Press Me :)", command=lambda: test_func(my_name, date)) bt.grid(row=0, column=0) tk.mainloop() |
خط ۱۵ همون خطی هست که منظور ما رو میروسه. به عبارتی در این حالت tkinter فقط تابع lambda رو میشناسه و نمیدونه داخل اون چیه و ما به این صورت میتونیم تابع خودمون رو به شکل دلخواه اجرا کنیم. :)
قرار بود پست مینیمال باشه، ولی موقع نوشتن که میشه کش میاد. تازه احساس میکنم یه چیزایی رو فراموش کردم D:
دمت گرم دادا