Table of Contents
مقدمه
در این بخش یک پروژهٔ کوچک انتخاب میکنیم که با امکاناتی که تا اینجا یاد گرفتهاید، قابل انجام باشد.
هدف این پروژهها:
- تقویت مهارت ترکیب مفاهیم (متغیر، شرط، حلقه، لیست، دیکشنری، فایل، توابع و …)
- آشنا شدن اولیه با یکی از دو مسیر مهم:
- وب (با Flask)
- داده (با pandas و matplotlib)
در حد یک «نمونهٔ خیلی ساده» جلو میرویم؛ کافی است بتوانید ایده را ببینید و خودتان نسخهٔ شخصیتان را بسازید.
در ادامه دو مسیر پیشنهادی را میبینید. لازم نیست هر دو را انجام دهید؛ یکی را انتخاب کنید و تا حد ممکن کاملش کنید.
پروژهٔ کوچک وب: «دفترچهٔ تماس ساده با Flask»
ایدهٔ پروژه
یک وباپلیکیشن خیلی ساده میسازیم که:
- فهرست مخاطبها (نام و شماره تلفن) را نشان میدهد.
- اجازه میدهد از طریق یک فرم، مخاطب جدید اضافه کنید.
- دادهها را موقتاً در حافظهٔ برنامه نگه میداریم (نه پایگاه داده حرفهای).
این پروژه فقط برای آشنا شدن با روند کار یک برنامهٔ وب است، نه ساختن یک سایت واقعی کامل.
پیشنیازها
- آشنایی ابتدایی با مفهوم وب و Flask (از فصل ۱۵).
- توانایی اجرای یک اسکریپت پایتون.
- نصب کتابخانهٔ Flask:
pip install flask
(اگر از pip قبلاً استفاده نکردهاید، در فصل کتابخانهها و pip توضیح داده شده است.)
ساختار پروژه
پیشنهاد میشود یک پوشهٔ جدید بسازید، مثلاً:
- پوشه:
contact_app - فایل:
app.py - پوشه:
templates - فایل:
index.html
در این پروژه خیلی ساده، یک فایل HTML کافی است.
گام ۱: راهاندازی اولیهٔ Flask
در فایل app.py:
from flask import Flask, render_template, request, redirect
app = Flask(__name__)
contacts = [] # لیست برای نگهداشتن مخاطبها در حافظهٔ برنامه
@app.route("/")
def index():
return render_template("index.html", contacts=contacts)
if __name__ == "__main__":
app.run(debug=True)نکتههای مهم این مرحله:
- متغیر
contactsیک لیست سراسری است که مخاطبها را نگه میدارد. - تابع
indexصفحهٔ اصلی (/) را نمایش میدهد و لیست مخاطبها را به قالب (template) میفرستد.
گام ۲: ساخت قالب HTML ساده
در پوشهٔ templates، فایل index.html:
<!DOCTYPE html>
<html lang="fa">
<head>
<meta charset="UTF-8">
<title>دفترچه تماس ساده</title>
</head>
<body>
<h1>دفترچه تماس</h1>
<h2>افزودن مخاطب جدید</h2>
<form method="post" action="/add">
<label>نام: <input type="text" name="name" required></label><br>
<label>شماره: <input type="text" name="phone" required></label><br>
<button type="submit">افزودن</button>
</form>
<h2>مخاطبها</h2>
{% if contacts %}
<ul>
{% for c in contacts %}
<li>{{ c["name"] }} - {{ c["phone"] }}</li>
{% endfor %}
</ul>
{% else %}
<p>هنوز مخاطبی ثبت نشده است.</p>
{% endif %}
</body>
</html>در این فایل:
- از متغیر
contactsکه از پایتون فرستادهایم، استفاده میکنیم. - با حلقهی
{% for ... %}(قالب Flask) روی مخاطبها تکرار میکنیم. {{ ... }}برای نمایش مقدار متغیر در HTML است.
(این سینتکس مخصوص سیستم قالبدهی Flask است و به خود پایتون تعلق ندارد.)
گام ۳: افزودن مسیر برای ثبت مخاطب جدید
در app.py، زیر تابع index یک تابع جدید اضافه کنید:
@app.route("/add", methods=["POST"])
def add_contact():
name = request.form.get("name")
phone = request.form.get("phone")
if name and phone:
contact = {"name": name, "phone": phone}
contacts.append(contact)
return redirect("/")اینجا:
- دادههای فرم با
request.formدریافت میشوند. - یک دیکشنری ساده برای هر مخاطب استفاده میکنیم.
- در انتها با
redirect("/")دوباره به صفحهٔ اصلی برمیگردیم.
گام ۴: اجرای برنامه
در ترمینال داخل پوشهٔ پروژه:
python app.pyمعمولاً Flask آدرسای شبیه این چاپ میکند:
* Running on http://127.0.0.1:5000/این آدرس را در مرورگر باز کنید؛ باید صفحهٔ دفترچه تماس را ببینید، مخاطب اضافه کنید و در لیست ببینید.
گسترشهای پیشنهادی
اگر این پروژه برایتان آسان شد، میتوانید:
- حذف مخاطب
یک دکمه برای حذف هر مخاطب بگذارید و یک مسیر/delete/<index>تعریف کنید که با استفاده ازdel contacts[index]او را حذف کند. - ذخیره در فایل
بهجای نگهداشتن داده فقط در حافظه، هنگام افزودن مخاطب، همهٔ لیست را در یک فایل متنی (مثلاً JSON ساده) ذخیره کنید و هنگام شروع برنامه، فایل را بخوانید. - اعتبارسنجی ساده
اگر شماره تلفن فقط باید عدد باشد، قبل از اضافهکردن بررسی کنید کهphone.isdigit()باشد.
پروژهٔ کوچک داده: «تحلیل سادهٔ نمرهٔ دانشجویان»
اگر مسیر داده برایتان جالبتر است، میتوانید این پروژه را انتخاب کنید.
ایدهٔ پروژه
- یک فایل CSV ساده شامل نمرهٔ چند دانشجو داریم.
- میخواهیم:
- این فایل را بخوانیم.
- میانگین نمرهها را حساب کنیم.
- بهترین و بدترین نمره را نمایش دهیم.
- یک نمودار ساده رسم کنیم.
از کتابخانههای متداول علم داده استفاده میکنیم:
pandasبرای کار با دادهٔ جدولیmatplotlibبرای رسم نمودار
پیشنیازها
نصب کتابخانهها:
pip install pandas matplotlibگام ۱: ساختن فایل CSV نمونه
در پوشهٔ پروژه، فایلی بهنام grades.csv ایجاد کنید با محتوای ساده مثل:
name,grade
Ali,17
Sara,19
Reza,14
Mina,18
Omid,12هر خط یک دانشجو و نمرهٔ او را نشان میدهد.
گام ۲: خواندن داده و محاسبات ساده
فایل analyze_grades.py:
import pandas as pd
# خواندن فایل CSV
df = pd.read_csv("grades.csv")
print("دادههای خام:")
print(df)
# محاسبهٔ میانگین، بیشینه و کمینه
avg = df["grade"].mean()
mx = df["grade"].max()
mn = df["grade"].min()
print("\nآمار نمرهها:")
print("میانگین:", avg)
print("بیشترین نمره:", mx)
print("کمترین نمره:", mn)
# پیدا کردن دانشجویان با بیشترین و کمترین نمره
best_students = df[df["grade"] == mx]
worst_students = df[df["grade"] == mn]
print("\nبهترین دانشجو(ها):")
print(best_students)
print("\nضعیفترین دانشجو(ها):")
print(worst_students)اینجا:
- با
pd.read_csvفایل CSV را به یک جدول (DataFrame) تبدیل میکنیم. - با توابع
mean(),max(),min()تحلیلهای ساده انجام میدهیم. - با فیلترکردن
df[df["grade"] == mx]ردیفهایی را که نمرهٔ آنها برابر با بیشترین نمره است، برمیگردانیم.
گام ۳: رسم نمودار
در همان فایل:
import matplotlib.pyplot as plt
# رسم نمودار میلهای نمرهها
plt.bar(df["name"], df["grade"])
plt.title("نمرهٔ دانشجویان")
plt.xlabel("نام")
plt.ylabel("نمره")
plt.ylim(0, 20) # چون نمره از 0 تا 20 است
plt.grid(axis="y")
plt.tight_layout()
plt.show()با اجرای این اسکریپت:
python analyze_grades.py- آمار در ترمینال چاپ میشود.
- یک پنجرهٔ نمودار باز میشود که در آن نمرهٔ هر دانشجو بهصورت میلهای نمایش داده میشود.
گسترشهای پیشنهادی
اگر این پروژه را خوب انجام دادید، میتوانید:
- خواندن نام فایل از کاربر
باinput()از کاربر نام فایل CSV را بگیرید و همان را بخوانید. - افزودن ستونی برای وضعیت قبولی/ردی
مثلاً هرکس نمرهاش $\geq ۱۰$ است، «قبول» و بقیه «رد شده».
میتوانید یک ستون جدید به DataFrame اضافه کنید:
df["status"] = df["grade"].apply(
lambda g: "قبول" if g >= 10 else "رد شده"
)
print(df)- ذخیرهٔ نتایج در فایل جدید
خروجی پردازششده را در یک فایل CSV جدید ذخیره کنید:
df.to_csv("grades_with_status.csv", index=False)- ساخت نمودارهای دیگر
مثلاً یک نمودار دایرهای (pie chart) برای تعداد قبولشدهها و ردشدهها.
چگونه از این پروژهها بیشترین یادگیری را بگیرید؟
- کد را خطبهخط درک کنید: هر جا چیزی را نمیفهمید، یک
printاضافه کنید یا در حالت تعاملی امتحان کنید. - نسخهٔ خودتان را بسازید:
- بهجای دفترچه تماس، «فهرست کارها» را روی وب بسازید.
- بهجای نمره، روی «هزینههای ماهانه» کار کنید.
- بهتدریج سختتر کنید:
ابتدا نسخهٔ ساده را بسازید؛ سپس هر بار یک ویژگی کوچک اضافه کنید (ذخیره در فایل، حذف، ویرایش، فیلتر کردن، مرتبسازی و …).
در فصلهای بعدی و منابع تکمیلی، میتوانید نسخههای حرفهایتر این ایدهها را دنبال کنید؛ هدف این پروژه فقط این است که ببینید دانستههای فعلیتان چگونه به یک برنامهٔ واقعی کوچک تبدیل میشوند.