دیتابیس Database و مدل Model در Django
دیتابیس Database و مدل Model در جنگو از درس قبل به خاطر دارید که آطلاعات دورهها به صورت ثابت داخل
گاهی اوقات فقط به یک تابع خیلی کوچک نیاز داریم؛ تابعی که قرار است تنها یک کار ساده انجام دهد و احتمالاً فقط یک بار از آن استفاده کنیم. در چنین شرایطی نوشتن یک تابع کامل با def ممکن است غیرضروری باشد. پایتون برای این نوع توابع، قابلیتی به نام Lambda Function را در اختیار ما قرار داده است.
تابع لامبدا در واقع یک تابع ناشناس (Anonymous Function) است؛ یعنی تابعی که بدون نام تعریف میشود و معمولاً تنها از یک عبارت (Expression) تشکیل شده است. به همین دلیل، کدها کوتاهتر، خواناتر و در برخی کاربردها سادهتر میشوند.
معمولاً زمانی که:
sorted()، map() و filter() به یک تابع کوتاه نیاز داریم.به این مثال توجه کنید: فرض کنید میخواهیم عددی را دو برابر کنیم.
با تابع معمولی:
def double(x):
return x * 2
print(double(5))خروجی:
10حال همین کار را با Lambda انجام میدهیم:
double = lambda x: x * 2
print(double(5))خروجی:
10مشاهده میکنید که همان نتیجه را با کد کوتاهتر به دست آوردیم.
ساختار کلی تابع لامبدا به شکل زیر است:
lambda parameters: expressionدر این ساختار:
lambda کلمه کلیدی برای تعریف تابع است.: پارامترها را از بدنه تابع جدا میکند.نکته مهم : در توابع لامبدا نیازی به نوشتن دستور
returnنیست. نتیجه عبارت بهصورت خودکار بازگردانده میشود.
lambda x: x + 10
│ │
│ └── عبارتی که اجرا میشود
└──────── پارامتر ورودییعنی مقدار x هرچه که باشد 10 واحد به آن اضافه شده و نتیجه بازگردانده میشود.
square = lambda x: x ** 2
print(square(4))خروجی:
16add = lambda a, b: a + b
print(add(10, 20))خروجی:
30average = lambda a, b, c: (a + b + c) / 3
print(average(10, 20, 30))خروجی:
20.0از آنجا که لامبدا فقط یک عبارت (Expression) را میپذیرد، برای شرطها باید از عبارت شرطی (Conditional Expression) استفاده کنیم.
maximum = lambda a, b: a if a > b else b
print(maximum(15, 8))خروجی:
15
لامبدا میتواند هیچ پارامتری نداشته باشد:
خروجی:
میتواند هر تعداد پارامتر داشته باشد:
خروجی:
❌ اما نمیتواند چندین دستور داشته باشد. مانند کد زیر که معتبر نیست:
lambda x:
y = x + 1
return y
فرض کنید یک لیست از اعداد داریم.
numbers = [8, 2, 6, 1, 5]
print(sorted(numbers))خروجی:
[1, 2, 5, 6, 8]در این مثال نیازی به Lambda نیست، چون پایتون خودش میداند باید اعداد را بر اساس مقدارشان مرتب کند. اما همیشه موضوع به این سادگی نیست.
keyتوابع sorted() و sort() یک پارامتر مهم به نام key دارند. این پارامتر مشخص میکند که مرتبسازی بر چه اساسی انجام شود.
ساختار کلی:
sorted(iterable, key=function)تابع موجود در key برای هر عضو اجرا میشود و مقدار بازگشتی آن، معیار مرتبسازی خواهد بود. از آنجا که این تابع معمولاً بسیار کوتاه است، بهترین گزینه استفاده از Lambda است.
فرض کنید لیستی از اعداد مثبت و منفی داریم.
numbers = [-8, 3, -1, 6, -5]
result = sorted(numbers, key=lambda x: abs(x))
print(result)خروجی:
[-1, 3, -5, 6, -8]در واقع برای هر عضو لیست، تابع زیر اجرا میشود:
lambda x: abs(x)و در نهایت مرتب سازی بر اساس قدر مطلق همه عضوها و بدون در نظر گرفتن علامت آنها انجام میشود.
words = ["python", "AI", "programming", "code"]
result = sorted(words, key=lambda word: len(word))
print(result)خروجی:
['AI', 'code', 'python', 'programming']
words = ["banana", "apple", "orange", "kiwi"]
result = sorted(words, key=lambda word: word[-1])
print(result)خروجی:
['banana', 'apple', 'orange', 'kiwi']چون آخرین حروف به ترتیب:
banana → a
apple → e
orange → e
kiwi → iفرض کنید اطلاعات دانشآموزان را داریم.
students = [
{"name": "Ali", "score": 18},
{"name": "Sara", "score": 20},
{"name": "Reza", "score": 15}
]اگر بخواهیم بر اساس نمره مرتب کنیم:
result = sorted(students, key=lambda student: student["score"])
print(result)خروجی:
[
{'name': 'Reza', 'score': 15},
{'name': 'Ali', 'score': 18},
{'name': 'Sara', 'score': 20}
]برای مرتب سازی نزولی از پارامتر reverse=True به شکل زیر استفاده میکنیم.
result = sorted(
students,
key=lambda student: student["score"],
reverse=True
)
print(result)خروجی:
[
{'name': 'Sara', 'score': 20},
{'name': 'Ali', 'score': 18},
{'name': 'Reza', 'score': 15}
]sorted() و sort()این دو تابع بسیار شبیه هستند، اما یک تفاوت مهم دارند.
sorted() | sort() |
|---|---|
| یک لیست جدید برمیگرداند. | همان لیست اصلی را تغییر میدهد. |
| روی هر iterable قابل استفاده است. | فقط برای لیستها قابل استفاده است. |
| لیست اولیه بدون تغییر باقی میماند. | لیست اولیه مرتب میشود. |
numbers = [5, 2, 8, 1]
result = sorted(numbers)
print(result)
print(numbers)خروجی:
[1, 2, 5, 8]
[5, 2, 8, 1]اما:
numbers = [5, 2, 8, 1]
numbers.sort()
print(numbers)خروجی:
[1, 2, 5, 8]
این تصور اشتباه است که lambda خودش عمل مرتبسازی را انجام میدهد، lambda فقط مشخص میکند معیار مرتبسازی چیست. خود عمل مرتب کردن توسط sorted() یا sort() انجام میشود. به عنوان مثال، در کد زیر:
تابع map() زمانی استفاده میشود که بخواهیم یک عملیات یکسان را روی تمام اعضای یک لیست (یا هر Iterable دیگر) انجام دهیم. به جای اینکه با یک حلقه for روی تکتک عناصر حرکت کنیم، میتوانیم از map() استفاده کنیم.
map(function, iterable)پارامترها:
function: تابعی که باید روی هر عضو اجرا شود.iterable: مجموعهای از دادهها مانند لیست، تاپل یا رشته.map()یکی از نکات مهم این است که map() مستقیماً یک لیست برنمیگرداند، بلکه یک شیء از نوع Map Object برمیگرداند. برای مشاهده نتیجه معمولاً آن را به لیست تبدیل میکنیم.
list(map(...))فرض کنید لیستی از اعداد داریم.
numbers = [1, 2, 3, 4, 5]
result = list(map(lambda x: x * 2, numbers))
print(result)خروجی:
[2, 4, 6, 8, 10]در اینجا برای هر عدد، عبارت زیر اجرا میشود:
lambda x: x * 2یعنی:
| ورودی | خروجی |
|---|---|
| 1 | 2 |
| 2 | 4 |
| 3 | 6 |
| 4 | 8 |
| 5 | 10 |
numbers = [2, 3, 4, 5]
result = list(map(lambda x: x ** 2, numbers))
print(result)خروجی:
[4, 9, 16, 25]names = ["ali", "sara", "reza"]
result = list(map(lambda name: name.upper(), names))
print(result)خروجی:
['ALI', 'SARA', 'REZA']words = ["Python", "AI", "Programming"]
result = list(map(lambda word: len(word), words))
print(result)خروجی:
[6, 2, 11]فرض کنید ورودیهای کاربر به صورت رشته هستند.
numbers = ["10", "20", "30", "40"]
result = list(map(lambda x: int(x), numbers))
print(result)خروجی:
[10, 20, 30, 40]forکد زیر:
numbers = [1, 2, 3, 4]
result = []
for n in numbers:
result.append(n * 2)
print(result)معادل این کد است:
numbers = [1, 2, 3, 4]
result = list(map(lambda x: x * 2, numbers))
print(result)در مثال سادهی بالا، هر دو روش یک خروجی تولید میکنند. تفاوت اصلی در این است که map() برای اعمال یک عملیات یکسان روی تمام عناصر بهصورت خلاصهتر نوشته میشود.
اگر از قبل یک تابع معمولی داشته باشیم، میتوانیم همان را به map() بدهیم. و نیازی به استفاده از لامبدا نیست.
def square(x):
return x ** 2
numbers = [1, 2, 3, 4]
result = list(map(square, numbers))
print(result)
خروجی:
با اینکه یادگیری map() و lambda مهم است، در پایتون امروزی بسیاری از برنامهنویسان برای عملیات ساده از List Comprehension استفاده میکنند، زیرا خوانایی بیشتری دارد.
numbers = [1, 2, 3, 4] result = [x * 2 for x in numbers]
خروجی:
تابع filter() فقط عناصری را نگه میدارد که یک شرط را داشته باشند و بقیه را حذف میکند.
filter(function, iterable)پارامترها:
function: تابعی که باید برای هر عضو اجرا شود.iterable: مجموعهای از دادهها.این تابع باید برای هر عضو مقدار True یا False برگرداند. اگر نتیجه True باشد، آن عنصر در خروجی باقی میماند. و اگر نتیجه False باشد، آن عنصر حذف میشود.
filter()مانند map()، تابع filter() نیز یک Filter Object برمیگرداند. برای مشاهده نتیجه معمولاً از list() استفاده میکنیم.
list(filter(...))numbers = [1, 2, 3, 4, 5, 6, 7, 8]
result = list(filter(lambda x: x % 2 == 0, numbers))
print(result)خروجی:
[2, 4, 6, 8]در اینجا عبارت زیر برای هر عدد اجرا میشود:
lambda x: x % 2 == 0اگر عدد زوج باشد:
Trueو در خروجی باقی میماند.
| عدد | شرط x % 2 == 0 | نتیجه |
|---|---|---|
| 1 | False | حذف میشود |
| 2 | True | باقی میماند |
| 3 | False | حذف میشود |
| 4 | True | باقی میماند |
| 5 | False | حذف میشود |
| 6 | True | باقی میماند |
| 7 | False | حذف میشود |
| 8 | True | باقی میماند |
numbers = [4, 8, 12, 15, 7, 20]
result = list(filter(lambda x: x > 10, numbers))
print(result)خروجی:
[12, 15, 20]words = ["AI", "Python", "Code", "Programming"]
result = list(filter(lambda word: len(word) > 5, words))
print(result)خروجی:
['Python', 'Programming']scores = [12, 18, 7, 20, 9, 15]
passed = list(filter(lambda score: score >= 10, scores))
print(passed)خروجی:
[12, 18, 20, 15]forکد زیر:
numbers = [1, 2, 3, 4, 5, 6]
result = []
for n in numbers:
if n % 2 == 0:
result.append(n)
print(result)معادل این کد است:
numbers = [1, 2, 3, 4, 5, 6]
result = list(filter(lambda x: x % 2 == 0, numbers))
print(result)در مثالهای ساده، هر دو روش نتیجه یکسانی دارند. تفاوت این است که filter() برای انتخاب عناصر بر اساس یک شرط مشخص، کد کوتاهتری ارائه میدهد.
اگر از قبل یک تابع معمولی داشته باشیم، میتوانیم همان را به filter() بدهیم. و نیازی به استفاده از لامبدا نیست.
def is_even(x):
return x % 2 == 0
numbers = [1, 2, 3, 4, 5, 6]
result = list(filter(is_even, numbers))
print(result)
خروجی:
برای شرطهای ساده، بسیاری از برنامهنویسان امروزی از List Comprehension استفاده میکنند، زیرا خواناتر است.
numbers = [1, 2, 3, 4, 5, 6] result = [x for x in numbers if x % 2 == 0] print(result)
یک تابع Lambda بنویسید که یک عدد را دریافت کرده و مربع آن را برگرداند. سپس عدد 8 را به این تابع ارسال کرده و نتیجه را چاپ کنید.
با استفاده از یک تابع Lambda، دو عدد را دریافت کنید و عدد بزرگتر را برگردانید. تابع را برای اعداد 15 و 23 اجرا کنید.
لیست زیر را در نظر بگیرید:
[5, 10, 15, 20]
با استفاده از map() و یک تابع Lambda، تمام اعداد را در عدد 3 ضرب کرده و نتیجه را در یک لیست جدید ذخیره و چاپ کنید.
لیست زیر را در نظر بگیرید:
[12, 7, 25, 4, 18, 9]
با استفاده از filter() و Lambda، فقط اعداد بزرگتر از 10 را انتخاب کرده و در قالب یک لیست چاپ کنید.
لیست زیر را در نظر بگیرید:
students = [
{"name": "Ali", "score": 17},
{"name": "Sara", "score": 20},
{"name": "Reza", "score": 15}
]
با استفاده از تابع sorted() و یک تابع Lambda، دانشآموزان را بر اساس مقدار score از بیشترین به کمترین مرتب کرده و نتیجه را چاپ کنید.
لیستی از قیمت کالاها را در نظر بگیرید:
prices = [120000, 85000, 200000, 95000]
با استفاده از map() و یک تابع Lambda، قیمت هر کالا را با ۱۰ درصد تخفیف محاسبه کرده و نتیجه را در یک لیست جدید ذخیره و چاپ کنید.
لیست نمرات زیر را در نظر بگیرید:
scores = [8, 15, 19, 7, 12, 9, 20]
با استفاده از filter() و یک تابع Lambda، فقط نمرات قبولی (بزرگتر یا مساوی ۱۰) را انتخاب کرده و چاپ کنید.
لیست محصولات زیر را در نظر بگیرید:
products = [
{"name": "Mouse", "price": 450},
{"name": "Keyboard", "price": 900},
{"name": "Monitor", "price": 3200},
{"name": "Flash", "price": 700}
]
با استفاده از sorted() و Lambda، محصولات را بر اساس قیمت از ارزانترین به گرانترین مرتب کرده و نتیجه را چاپ کنید.
لیست دماهای زیر بر حسب سانتیگراد داده شده است:
temps = [18, 22, 30, 15, 27]
با استفاده از map() و یک تابع Lambda، دماها را به فارنهایت تبدیل کرده و نتیجه را چاپ کنید.
فرمول تبدیل:
F = (C × 9/5) + 32
لیست نامهای زیر را در نظر بگیرید:
names = ["Ali", "Mohammad", "Sara", "Parisa", "Reza"]
با استفاده از filter() و Lambda، فقط نامهایی را انتخاب کنید که کمتر از ۵ حرف دارند.
لیست زیر را در نظر بگیرید:
names = ["Mohammad", "Ali", "Parisa", "Reza", "Sara"]
با استفاده از sorted() و یک تابع Lambda، نامها را بر اساس تعداد حروف از کوتاهترین به بلندترین مرتب کنید.
تا اینجا یاد گرفتید چگونه با استفاده از توابع، برنامههای منظمتر و قابل استفاده مجدد بنویسید. در ادامه با یکی از مهمترین مفاهیم برنامهنویسی، یعنی کلاسها و برنامهنویسی شیءگرا (Object-Oriented Programming یا OOP) آشنا میشوید. در این بخش یاد میگیرید چگونه اشیاء، ویژگیها و رفتارهای آنها را مدلسازی کنید و برنامههایی ساختیافته، قابل توسعه و حرفهای بنویسید.
گام بعدی : کلاس و شی گرایی در پایتوندیتابیس Database و مدل Model در جنگو از درس قبل به خاطر دارید که آطلاعات دورهها به صورت ثابت داخل
طراحی قالب سایت با HTML، CSS و Tailwind CSS تا اینجا با ساختار اصلی Django، URL، View و Template آشنا
Template و رابط کاربری در Django در سه درس قبلی، با ساخت پروژه، ساختار Django، URL و View آشنا شدیم.
URL و View در جنگو در درسهای قبل با Django آشنا شدیم، محیط مجازی را ساختیم، Django را نصب کردیم
ساختار Project و App در Django در درس قبل با Django آشنا شدیم، محیط مجازی ساختیم، Django را نصب کردیم
شروع کار با Django در دوره آموزش جامع پایتون با مفاهیمی مانند متغیرها، شرطها، حلقهها، توابع، کلاسها، فایلها و کار
عملیات CRUD درSQLite در بخش قبل با مفهوم پایگاه داده، SQLite و نحوه اتصال پایتون به پایگاه داده آشنا شدیم.
اتصال به پایگاه داده (Database) در پایتون وقتی یک برنامه اطلاعاتی را از کاربر دریافت میکند، معمولاً لازم است این
مدیریت خطا (Error Handling) در پایتون در هنگام اجرای برنامه، ممکن است کاربر ورودی نامناسبی وارد کند یا برنامه با
کار با فایل، ماژول، پکیج و محیط مجازی در پایتون در پروژههای واقعی، معمولاً همهی کدها را در یک فایل
کپسولهسازی (Encapsulation) در پایتون فرض کنید کلاسی برای حساب بانکی نوشتهاید. اگر هر کسی بتواند موجودی حساب را مستقیماً تغییر
وراثت و مفاهیم پیشرفته شی گرایی تا اینجا یاد گرفتهاید که چگونه با استفاده از کلاس (Class) و شی (Object)
کلاس و شیء در پایتون (Object-Oriented Programming) تا اینجا با متغیرها، شرطها، حلقهها، توابع و ساختارهای داده در پایتون آشنا
تابع لامبدا (Lambda Function) در پایتون گاهی اوقات فقط به یک تابع خیلی کوچک نیاز داریم؛ تابعی که قرار است
توابع در پایتون اگر هنگام برنامهنویسی مجبور شوید یک قطعه کد را بارها تکرار کنید، برنامه شما طولانی، شلوغ و
مجموعه (Set) در پایتون به زبان ساده، Set مجموعهای از عناصر منحصربهفرد (Unique) است که ترتیب مشخصی ندارد و اجازه
دیکشنری در پایتون تا اینجا با لیست (List) و تاپل (Tuple) آشنا شدیم که هر دو مجموعهای از دادهها را
تاپل (Tuple) در پایتون بعد از آشنایی با لیست (List)، نوبت به یکی دیگر از ساختارهای داده در پایتون یعنی
لیست (List) در پایتون پرکاربردترین ساختار داده تا اینجا یاد گرفتید که هر متغیر فقط یک مقدار را در خود
ساختارهای داده در پایتون در برنامههای واقعی معمولاً با یک داده سروکار نداریم، بلکه باید تعداد زیادی اطلاعات را ذخیره
حلقههای تکرار در پایتون (Python Loops) فرض کنید معلم میخواهد نمرات ۳۰ دانشآموز را از کاربر دریافت کند. اگر حلقه
عملگرهای مقایسهای (Comparison Operators) تا اینجا یاد گرفتیم که با عملگرهای محاسباتی میتوانیم اعداد را با هم جمع، تفریق و…
دریافت ورودی از کاربر در پایتون (Python Input) تا اینجا یاد گرفتیم که چگونه مقدار یک متغیر را خودمان داخل
عملگرهای محاسباتی در پایتون (Arithmetic Operators) تقریباً تمام برنامهها به انجام محاسبات نیاز دارند؛ از جمع و تفریق ساده گرفته
کار با رشتهها در پایتون (Python Strings) مدیریت و پردازش متنها در برنامهها در دنیای برنامهنویسی، اطلاعات همیشه عدد و
متغیرها در پایتون (Python Variables) اولین قدم برای ذخیره و پردازش اطلاعات تصور کنید یک برنامه مینویسید که قرار است
شروع برنامه نویسی با پایتون ساخت اولین پروژه (Hello World) فهرست مطالب بعد از نصب Python چه کاری انجام دهیم؟
آموزش نصب پایتون و ابزارهای موردنیاز (راهنمای کامل برای ویندوز) اگر تصمیم گرفتهاید برنامهنویسی را یاد بگیرید، احتمالاً نام زبان
الگوهای کندل استیک پیشرفته: راهنمای جامع برای معاملهگران حرفهای الگو های کندل استیک پیشرفته (یا به بیان دیگر الگوهای شمعی
آیلتس جنرال یا آکادمیک؟ کدام را باید انتخاب کنیم؟ آیا میدانید که انتخاب اشتباه بین آیلتس آکادمیک و جنرال میتواند
دانلود رایگان نمونه سوالات آزمون PTE جنرال اگر تصمیم گرفتهاید با هدف مهاجرت به یک کشور انگلیسی زبان، در آزمون
معرفی آزمون های زبان انگلیسی معتبر در ایران| کدام یک بهتر است؟ اگه قصد ادامه تحصیل یا مهاجرت داشته باشید،
بهترین روشهای آمادگی برای آزمون تافل چگونه برای آزمون تافل آماده شویم؟ آیا شما هم قصد دارید برای کسب نمره
چگونه در خارج از کشور برای آزمون آیلتس ثبت نام کنیم؟ اگر قصد مهاجرت تحصیلی یا کاری دارید، احتمالاً نام
آزمون GRE مناسب چه رشتههایی است؟ اگر قصد ادامه تحصیل در مقاطع کارشناسی ارشد یا دکترا در دانشگاههای بینالمللی را
بهترین نمونه سوالات اسپیکینگ تافل هوم ادیشن آزمون تافل هوم ادیشن این روزها یکی از پرطرفدارترین گزینهها برای سنجش مهارت
نحوه ثبت نام در آزمون دولینگو در ایران به صورت کامل نحوه ثبت نام در آزمون دولینگو در ایران چگونه
هزینه آزمون GRE در ایران چقدر است؟ اگر قصد مهاجرت تحصیلی دارید، احتمالاً نام آزمون GRE به گوشتان خورده است.
راهنمای کامل ثبتنام و پرداخت هزینه آزمون PTE در ترکیه برای متقاضیان ایرانی آزمون PTE (Pearson Test of English) یکی از
ووچر آزمون چیست و چگونه میتوان آن را تهیه کرد؟ ثبتنام در آزمونهای بینالمللی مانند TOEFL، GRE، PTE، GMAT، IELTS
بهترین تکنیک های لیسنینگ آیلتس برای کسب نمره بالا آزمون آیلتس (IELTS) یکی از معتبرترین آزمونهای ارزیابی مهارت زبان انگلیسی
آزمون پلاس مرجع آموزش برنامهنویسی، هوش مصنوعی، شبکه، نمونه سؤالات کنکورهای کامپیوتر، آزمونهای زبان دکتری و مدارک بینالمللی فناوری اطلاعات است. با ارائه آموزشهای تخصصی، منابع آموزشی و راهنمای آزمونها، به دانشجویان و متخصصان کمک میکنیم تا مهارتهای خود را توسعه داده و در مسیر موفقیت تحصیلی و شغلی گام بردارند.