آموزش پایتون (python) با فیبیست

word image 1231 7

ZZZ

چرا پایتون؟ نگاهی به آینده برنامه‌نویسی

آموزش پایتون (python) با فیبیست چه ارزشی دارد؟جهان امروز با سرعتی کم‌سابقه در حال تغییر است. بخش بزرگی از این تغییر نه در کارخانه‌ها و ساختمان‌ها، بلکه در دنیای داده، نرم‌افزار، هوش مصنوعی و سامانه‌های هوشمند اتفاق می‌افتد. در چنین جهانی، برنامه‌نویسی دیگر مهارتی مخصوص مهندسان کامپیوتر نیست؛ بلکه به یکی از ابزارهای مهم برای فکر کردن، حل مسئله و ساختن تبدیل شده است.

در میان زبان‌های برنامه‌نویسی، پایتون (Python) جایگاه ویژه‌ای پیدا کرده است. دلیل این جایگاه فقط ساده بودن دستورات آن نیست. پایتون زبانی است که می‌توان با آن از یک مسئله ساده و آموزشی شروع کرد و قدم‌به‌قدم به پروژه‌های پیچیده و حرفه‌ای رسید.

پایتون را می‌توان از یک سؤال ساده شروع کرد

مثلاً:

«اگر دمای هوا را به برنامه بدهیم، چگونه می‌توانیم آن را تحلیل کنیم؟»

یا:

«چگونه فهرستی از کالاها را ذخیره و جست‌وجو کنیم؟»

یا حتی:

«چگونه یک موج سینوسی تولید کنیم و شکل آن را روی صفحه ببینیم؟»

در همه این مسائل، برنامه‌نویسی فقط نوشتن چند دستور نیست؛ بلکه تبدیل یک فکر یا مسئله واقعی به یک فرایند قابل اجرا است.

این همان نقطه‌ای است که برنامه‌نویسی ارزش آموزشی پیدا می‌کند.

پایتون فقط برای کامپیوتر نیست

دامنه کاربرد پایتون بسیار گسترده است. از آموزش و علوم گرفته تا صنعت و هوش مصنوعی، می‌توان از آن استفاده کرد.

برخی از مهم‌ترین حوزه‌های کاربرد پایتون عبارت‌اند از:

  • هوش مصنوعی و یادگیری ماشین
  • تحلیل داده و علم داده
  • محاسبات علمی و مهندسی
  • فیزیک و شبیه‌سازی پدیده‌های طبیعی
  • رباتیک و سامانه‌های هوشمند
  • توسعه وب و ساخت نرم‌افزار
  • خودکارسازی کارهای تکراری
  • پردازش متن، تصویر و صدا
  • آموزش برنامه‌نویسی و تفکر محاسباتی
  • تحلیل اطلاعات و تصمیم‌گیری مبتنی بر داده

به همین دلیل، یادگیری پایتون را می‌توان نوعی سرمایه‌گذاری برای آینده دانست؛ نه به این معنا که هرکس پایتون بداند الزاماً برنامه‌نویس حرفه‌ای خواهد شد، بلکه به این معنا که فرد با یادگیری آن، یک ابزار قدرتمند برای ساختن و حل مسئله در اختیار خواهد داشت.

ارتباط پایتون با هوش مصنوعی

یکی از مهم‌ترین دلایل توجه جهان به پایتون، رشد سریع هوش مصنوعی است.

امروزه بسیاری از ابزارها و کتابخانه‌های مهم حوزه هوش مصنوعی، یادگیری ماشین و تحلیل داده با پایتون مورد استفاده قرار می‌گیرند. بنابراین آشنایی با پایتون می‌تواند نقطه شروع مناسبی برای ورود به دنیای هوش مصنوعی باشد.

اما یک نکته مهم وجود دارد:

هدف از آموزش پایتون نباید فقط حفظ کردن دستورها باشد.

دانش‌آموز نباید صرفاً بداند for چیست یا list چگونه ساخته می‌شود؛ بلکه باید بتواند با این ابزارها چیزی بسازد، مسئله‌ای را حل کند و نتیجه کار خود را ببیند.

آینده متعلق به کسانی است که بتوانند بسازند

در گذشته، استفاده از فناوری بیشتر به معنای مصرف کردن ابزارهای آماده بود.

امروز اما شرایط در حال تغییر است.

کسی که بتواند کمی برنامه‌نویسی کند، می‌تواند ابزارهای ساده خودش را بسازد، داده‌هایش را تحلیل کند، یک آزمایش علمی را شبیه‌سازی کند، یک فرایند تکراری را خودکار کند یا ایده‌ای را به یک نمونه واقعی تبدیل کند.

به همین دلیل، برنامه‌نویسی را می‌توان نوعی زبان ساختن دانست.

همان‌طور که فیزیک به ما کمک می‌کند طبیعت را بهتر بفهمیم، برنامه‌نویسی به ما کمک می‌کند ایده‌های خود را به یک فرایند قابل اجرا تبدیل کنیم.

چرا آموزش پایتون در فیبیست؟

در فیبیست قرار نیست برنامه‌نویسی را صرفاً با مجموعه‌ای از دستورها آموزش دهیم.

می‌خواهیم از مسئله، کنجکاوی و تجربه شروع کنیم.

ممکن است یک روز با چند خط کد، فهرستی از کالاها بسازیم؛ روز دیگر دمای چند شهر را مقایسه کنیم؛ روزی دیگر صدایی تولید کنیم و شکل موج آن را ببینیم و بعد، همان تجربه را به مفاهیم فیزیک پیوند بزنیم.

در این مسیر، کد وسیله است؛ فهمیدن هدف است.

به همین دلیل آموزش پایتون در فیبیست می‌تواند در کنار آموزش فیزیک قرار بگیرد و پلی میان فیزیک، ریاضیات، داده، رایانه و هوش مصنوعی ایجاد کند.

از چند خط کد تا یک دنیای بزرگ

ممکن است نخستین برنامه یک دانش‌آموز فقط چند خط باشد.

اما پشت همان چند خط، مفاهیمی مانند:

متغیر → داده → شرط → تکرار → تابع → فهرست → الگوریتم → مدل‌سازی → تحلیل داده → هوش مصنوعی

قرار گرفته است.

و این مسیر می‌تواند بسیار دورتر از چیزی باشد که در اولین روز آموزش تصور می‌کنیم.

پایتون نقطه پایان نیست؛ نقطه شروع است.

در فیبیست می‌خواهیم برنامه‌نویسی را نه به عنوان حفظ کردن دستورهای یک زبان، بلکه به عنوان روشی برای فکر کردن، آزمایش کردن، ساختن و فهمیدن جهان تجربه کنیم.

می‌سازیم، می‌فهمیم، تجربه می‌کنیم و ادامه می‌دهیم.

ZZZ
ZZZ

درس نخست پایتون

حاصل جمع دو عدد را از ورودی بگیرید و نمایش دهید

در نخستین برنامه، می‌خواهیم از کاربر دو عدد دریافت کنیم و حاصل جمع آن‌ها را نمایش دهیم.

کد برنامه

number1 = int(input("Enter the first number: "))
number2 = int(input("Enter the second number: "))

result = number1 + number2

print("The sum is:", result)

برنامه چه کاری انجام می‌دهد؟

ابتدا با دستور input() از کاربر عدد اول را می‌گیریم:

number1 = int(input("Enter the first number: "))

سپس عدد دوم را دریافت می‌کنیم:

number2 = int(input("Enter the second number: "))

علامت + برای جمع کردن دو عدد استفاده می‌شود:

result = number1 + number2

و در پایان، نتیجه را با print() نمایش می‌دهیم:

print("The sum is:", result)

یک نمونه اجرا

اگر کاربر وارد کند:

Enter the first number: 12
Enter the second number: 8

برنامه نمایش می‌دهد:

The sum is: 20

یک نکته مهم

input() اطلاعات واردشده توسط کاربر را به صورت رشته (Text/String) دریافت می‌کند.

به همین دلیل برای تبدیل آن به عدد صحیح از int() استفاده کردیم:

int(input())

پس در این درس، سه ابزار بسیار مهم را برای نخستین بار می‌بینیم:

input() → دریافت اطلاعات

int() → تبدیل متن به عدد صحیح

print() → نمایش نتیجه

این سه دستور، پایه بسیاری از برنامه‌های بعدی ما خواهند بود.

┌─────────────────────────────────────┐
│ Python Playground │
│ │
│ number1 = int(input(…)) │
│ number2 = int(input(…)) │
│ result = number1 + number2 │
│ print(result) │
│ │
│ [ ▶ Run ] │
│ │
│ Output: 20 │
└─────────────────────────────────────┘

ZZZ

درس دوم: محاسبه مجموع نمرات ۱۰ دانش‌آموز

درس دوم — جمع نمرات ۱۰ دانش‌آموز

در این برنامه، نمرهٔ ۱۰ دانش‌آموز از کاربر گرفته می‌شود و در پایان مجموع نمرات نمایش داده می‌شود:

# فیبیست | PHY20
# آموزش برنامه‌نویسی پایتون
# وب‌سایت: https://www.phy20.com
# طراح و برنامه‌نویس: مرتضی محمدی‌وند خوشخو
# تاریخ:
# مجوز و لایسنس کد:
# استفاده از این کد برای مقاصد آموزشی و بدون مقاصد تجاری رایگان است.
# مالکیت معنوی کد متعلق به فیبیست (PHY20)
# و طراح و برنامه‌نویس آن محفوظ است.

total = 0

for i in range(10):
grade = int(input(“Enter the grade: “))
total += grade

print(“The sum of grades is:”, total)

درس دوم: محاسبه مجموع نمرات ۱۰ دانش‌آموز

در این برنامه، نمرهٔ ۱۰ دانش‌آموز از کاربر دریافت می‌شود و در پایان، مجموع نمرات نمایش داده می‌شود.

۱. ایجاد متغیر برای مجموع نمرات

total = 0

در ابتدا متغیری به نام total ایجاد می‌کنیم.

این متغیر قرار است مجموع نمرات را در خود نگهداری کند.

چون هنوز هیچ نمره‌ای وارد نشده است، مقدار آن را برابر صفر قرار می‌دهیم.


۲. ایجاد یک حلقه برای دریافت ۱۰ نمره

for i in range(10):

این دستور به پایتون می‌گوید:

دستورات داخل این حلقه را ۱۰ بار تکرار کن.

دلیل استفاده از range(10) این است که می‌خواهیم نمرهٔ ۱۰ دانش‌آموز را دریافت کنیم.


۳. دریافت نمره از کاربر

grade = int(input("Enter the grade: "))

در این خط، ابتدا از کاربر می‌خواهیم یک نمره وارد کند.

دستور:

input()

برای دریافت اطلاعات از کاربر استفاده می‌شود.

از آنجا که input() اطلاعات را به صورت متن دریافت می‌کند، با استفاده از:

int()

آن را به عدد صحیح تبدیل می‌کنیم.

سپس نمره در متغیر grade ذخیره می‌شود.


۴. اضافه کردن نمره به مجموع

total += grade

این دستور یعنی:

نمرهٔ جدید را به مجموع قبلی اضافه کن.

در واقع:

total += grade

معادل است با:

total = total + grade

مثلاً اگر مجموع قبلی ۴۵ باشد و نمرهٔ جدید ۱۸ باشد:

45 + 18 = 63

بنابراین مقدار total برابر ۶۳ می‌شود.


۵. نمایش مجموع نمرات

بعد از اینکه حلقه ۱۰ بار اجرا شد، به این دستور می‌رسیم:

print("The sum of grades is:", total)

دستور print() مقدار نهایی total را روی صفحه نمایش می‌دهد.

بنابراین در پایان، مجموع نمرات ۱۰ دانش‌آموز به کاربر نشان داده می‌شود.


خلاصهٔ روند برنامه

برنامه به این شکل عمل می‌کند:

شروع
  ↓
total = 0
  ↓
دریافت نمرهٔ دانش‌آموز
  ↓
اضافه کردن نمره به total
  ↓
آیا ۱۰ نمره دریافت شده است؟
  ↓
اگر نه ← دریافت نمرهٔ بعدی
  ↓
اگر بله
  ↓
نمایش مجموع نمرات
  ↓
پایان

مفاهیم جدید این درس

در این برنامه با چهار مفهوم مهم آشنا می‌شویم:

  • for → تکرار یک دستور
  • range(10) → ایجاد محدودهٔ ۱۰تایی
  • total += grade → اضافه کردن مقدار جدید به مقدار قبلی
  • input() → دریافت اطلاعات از کاربر

این درس اولین تجربهٔ ما با تکرار در برنامه‌نویسی است.

ZZZ

درس سوم پایتون

معرفی خودتان به پایتون

در این برنامه، می‌خواهیم اطلاعات ساده‌ای مانند نام و سن را از کاربر دریافت کنیم و سپس پایتون با استفاده از این اطلاعات، یک پیام خوش‌آمدگویی نمایش دهد.

کد برنامه

# ============================================================
#                    فیبیست | PHY20
#                 آموزش برنامه‌نویسی پایتون
# ============================================================
#
# وب‌سایت: https://www.phy20.com
#
# طراح و برنامه‌نویس:
# مرتضی محمدی‌وند خوشخو
#
# تاریخ:
# ..............................
#
# مجوز و لایسنس کد:
# استفاده از این کد برای مقاصد آموزشی و
# بدون مقاصد تجاری رایگان است.
#
# مالکیت معنوی کد متعلق به فیبیست (PHY20)
# و طراح و برنامه‌نویس آن محفوظ است.
#
# ============================================================


name = input("نام شما چیست؟ ")

age = input("چند سال دارید؟ ")

print("سلام", name)

print("شما", age, "سال دارید.")

print("به دنیای Python خوش آمدید!")

شرح برنامه

۱. دریافت نام کاربر

name = input("نام شما چیست؟ ")

دستور input() یک سؤال از کاربر می‌پرسد و پاسخ او را دریافت می‌کند.

مثلاً:

نام شما چیست؟ سارینا

پاسخ کاربر در متغیر name ذخیره می‌شود.


۲. دریافت سن کاربر

age = input("چند سال دارید؟ ")

در این خط، سن کاربر دریافت و در متغیر age ذخیره می‌شود.

در این مرحله، سن به صورت متن ذخیره می‌شود؛ چون هنوز قصد انجام محاسبات ریاضی روی آن نداریم.


۳. نمایش نام کاربر

print("سلام", name)

دستور print() اطلاعات را روی صفحه نمایش می‌دهد.

اگر نام کاربر «سارینا» باشد:

سلام سارینا

نمایش داده می‌شود.


۴. نمایش سن کاربر

print("شما", age, "سال دارید.")

پایتون مقدار ذخیره‌شده در age را همراه با متن نمایش می‌دهد.

مثلاً:

شما 15 سال دارید.

۵. پیام خوش‌آمدگویی

print("به دنیای Python خوش آمدید!")

در پایان، برنامه یک پیام دوستانه نمایش می‌دهد.


مفاهیم جدید این درس

در این برنامه با مفاهیم زیر آشنا شدیم:

  • input() → دریافت اطلاعات از کاربر
  • متغیرها (name و age) → نگهداری اطلاعات
  • print() → نمایش نتیجه

خروجی نمونه برنامه

نام شما چیست؟ سارینا

چند سال دارید؟ 15

سلام سارینا

شما 15 سال دارید.

به دنیای Python خوش آمدید!

این برنامه اولین ارتباط دوطرفه بین انسان و کامپیوتر را ایجاد می‌کند؛ کاربر اطلاعات می‌دهد و برنامه بر اساس آن پاسخ می‌سازد.

ZZZ

پروژه ۱

اگر بخواهیم برای ۱۰ دانش آموز کد ورود سن و اسم پایتون بنویسیم خیلی طولانی می سود…امتحان کنید…!!!!

name1 = input(“نام دانش‌آموز اول: “)
age1 = input(“سن: “)

name2 = input(“نام دانش‌آموز دوم: “)
age2 = input(“سن: “)

name3 = input(“نام دانش‌آموز سوم: “)
age3 = input(“سن: “)

name4 = input(“نام دانش‌آموز چهارم: “)
age4 = input(“سن: “)

name5 = input(“نام دانش‌آموز پنجم: “)
age5 = input(“سن: “)

name6 = input(“نام دانش‌آموز ششم: “)
age6 = input(“سن: “)

name7 = input(“نام دانش‌آموز هفتم: “)
age7 = input(“سن: “)

name8 = input(“نام دانش‌آموز هشتم: “)
age8 = input(“سن: “)

name9 = input(“نام دانش‌آموز نهم: “)
age9 = input(“سن: “)

name10 = input(“نام دانش‌آموز دهم: “)
age10 = input(“سن: “)

print(“nلیست دانش‌آموزان”)

print(name1, age1, “سال”)
print(name2, age2, “سال”)
print(name3, age3, “سال”)
print(name4, age4, “سال”)
print(name5, age5, “سال”)
print(name6, age6, “سال”)
print(name7, age7, “سال”)
print(name8, age8, “سال”)
print(name9, age9, “سال”)
print(name10, age10, “سال”)

ZZZ

درس چهارم پایتون

دستور لیست برای ذخیره اطلاعات در مجموعه‌ها

در برنامه‌های واقعی، معمولاً با یک داده سروکار نداریم؛ بلکه باید اطلاعات تعداد زیادی افراد، کالاها، نمرات یا داده‌های مختلف را ذخیره کنیم.

برای این کار در پایتون از لیست (List) استفاده می‌کنیم.

در این برنامه، نام و سن چند دانش‌آموز را در یک مجموعه ذخیره می‌کنیم و سپس اطلاعات آن‌ها را نمایش می‌دهیم.


کد برنامه

# ============================================================
#                    فیبیست | PHY20
#                 آموزش برنامه‌نویسی پایتون
# ============================================================
#
# وب‌سایت: https://www.phy20.com
#
# طراح و برنامه‌نویس:
# مرتضی محمدی‌وند خوشخو
#
# تاریخ:
# ..............................
#
# مجوز و لایسنس کد:
# استفاده از این کد برای مقاصد آموزشی و
# بدون مقاصد تجاری رایگان است.
#
# مالکیت معنوی کد متعلق به فیبیست (PHY20)
# و طراح و برنامه‌نویس آن محفوظ است.
#
# ============================================================


students = [
    ["علی", 12],
    ["رضا", 12],
    ["مهران", 13],
    ["جواد", 12]
]


print("لیست دانش‌آموزان")


for student in students:
    print(student[0], student[1], "سال")

شرح برنامه

۱. ایجاد یک لیست از دانش‌آموزان

students = [
    ["علی", 12],
    ["رضا", 12],
    ["مهران", 13],
    ["جواد", 12]
]

در این قسمت یک لیست به نام students ساخته‌ایم.

هر دانش‌آموز خودش یک لیست کوچک‌تر است که شامل دو اطلاعات می‌باشد:

  • نام دانش‌آموز
  • سن دانش‌آموز

مثلاً:

["علی", 12]

یعنی:

نام: علی
سن: 12 سال

۲. نمایش عنوان برنامه

print("لیست دانش‌آموزان")

با دستور print() یک عنوان برای خروجی نمایش داده می‌شود.


۳. پیمایش لیست با حلقه for

for student in students:

این دستور یعنی:

هر بار یکی از دانش‌آموزان موجود در لیست را بردار و در متغیر student قرار بده.

حلقه چهار بار اجرا می‌شود؛ چون چهار دانش‌آموز در لیست داریم.


۴. دسترسی به اطلاعات داخل لیست

print(student[0], student[1], "سال")

در پایتون شماره‌گذاری اعضای لیست از صفر شروع می‌شود.

بنابراین:

student[0]  ← نام دانش‌آموز

student[1]  ← سن دانش‌آموز

مثلاً برای:

["علی", 12]

نتیجه می‌شود:

علی 12 سال

خروجی برنامه

لیست دانش‌آموزان

علی 12 سال
رضا 12 سال
مهران 13 سال
جواد 12 سال

مفاهیم جدید این درس

در این درس با مفاهیم مهمی آشنا شدیم:

  • List → ذخیره چندین داده در یک مجموعه
  • Nested List → قرار دادن یک لیست داخل لیست دیگر
  • for loop → پیمایش اعضای یک مجموعه
  • Index → دسترسی به اعضای لیست با شماره

ارتباط این درس با آینده برنامه‌نویسی

تقریباً همه نرم‌افزارهای واقعی با مجموعه‌ای از داده‌ها کار می‌کنند:

  • فهرست دانش‌آموزان یک مدرسه
  • محصولات یک فروشگاه
  • اطلاعات مشتریان
  • داده‌های آزمایش‌های فیزیک
  • اطلاعات مورد استفاده در هوش مصنوعی

بنابراین یادگیری List یکی از پایه‌های اصلی ورود به دنیای برنامه‌نویسی است.

ZZZ

درس پنجم پایتون

کاربرد دستور append برای اضافه کردن اطلاعات به لیست

در برنامه‌های واقعی، معمولاً اطلاعات از قبل آماده نیستند؛ بلکه کاربران اطلاعات خود را وارد می‌کنند.

در این برنامه، نام و سن ۵ دانش‌آموز را از کاربر دریافت می‌کنیم، سپس با استفاده از دستور append() آن‌ها را به لیست اضافه کرده و در پایان نمایش می‌دهیم.


کد برنامه

# ============================================================
#                    فیبیست | PHY20
#                 آموزش برنامه‌نویسی پایتون
# ============================================================
#
# وب‌سایت: https://www.phy20.com
#
# طراح و برنامه‌نویس:
# مرتضی محمدی‌وند خوشخو
#
# تاریخ:
# ..............................
#
# مجوز و لایسنس کد:
# استفاده از این کد برای مقاصد آموزشی و
# بدون مقاصد تجاری رایگان است.
#
# مالکیت معنوی کد متعلق به فیبیست (PHY20)
# و طراح و برنامه‌نویس آن محفوظ است.
#
# ============================================================


students = []


for i in range(5):

    name = input("نام دانش‌آموز: ")

    age = input("سن دانش‌آموز: ")

    students.append([name, age])


print("nلیست دانش‌آموزان")


for student in students:

    print(student[0], student[1], "سال")

شرح برنامه

۱. ایجاد یک لیست خالی

students = []

در ابتدا یک لیست خالی به نام students می‌سازیم.

در این لحظه هیچ دانش‌آموزی داخل لیست وجود ندارد.

بعداً اطلاعات دانش‌آموزان را به آن اضافه می‌کنیم.


۲. دریافت اطلاعات ۵ دانش‌آموز

for i in range(5):

این حلقه باعث می‌شود برنامه ۵ بار اطلاعات دریافت کند.

یعنی:

  • بار اول → دانش‌آموز اول
  • بار دوم → دانش‌آموز دوم
  • …
  • بار پنجم → دانش‌آموز پنجم

۳. دریافت نام و سن

name = input("نام دانش‌آموز: ")

age = input("سن دانش‌آموز: ")

برنامه از کاربر می‌خواهد:

  • نام دانش‌آموز را وارد کند.
  • سن دانش‌آموز را وارد کند.

اطلاعات وارد شده در متغیرهای name و age ذخیره می‌شوند.


۴. اضافه کردن اطلاعات به لیست

students.append([name, age])

این مهم‌ترین دستور درس است.

دستور:

append()

یک عضو جدید به پایان لیست اضافه می‌کند.

مثلاً بعد از وارد کردن:

علی
12

لیست تبدیل می‌شود به:

[
 ["علی", "12"]
]

بعد از اضافه شدن دانش‌آموز دوم:

[
 ["علی", "12"],
 ["رضا", "13"]
]

۵. نمایش اطلاعات ذخیره‌شده

for student in students:

برنامه همه اعضای لیست را یکی‌یکی بررسی می‌کند.

سپس:

print(student[0], student[1], "سال")

نام و سن هر دانش‌آموز را نمایش می‌دهد.


نمونه اجرای برنامه

نام دانش‌آموز: علی
سن دانش‌آموز: 12

نام دانش‌آموز: رضا
سن دانش‌آموز: 13

نام دانش‌آموز: مهران
سن دانش‌آموز: 14

نام دانش‌آموز: جواد
سن دانش‌آموز: 12

نام دانش‌آموز: حسن
سن دانش‌آموز: 13


لیست دانش‌آموزان

علی 12 سال
رضا 13 سال
مهران 14 سال
جواد 12 سال
حسن 13 سال

مفاهیم جدید این درس

در این برنامه یاد گرفتیم:

  • [] → ساخت لیست خالی
  • append() → اضافه کردن اطلاعات جدید به لیست
  • دریافت اطلاعات از کاربر
  • ذخیره داده‌ها در زمان اجرای برنامه
  • ترکیب for و list

نکته مهم آموزشی

تا این مرحله، برنامه‌های ما فقط دستور اجرا می‌کردند؛ اما از این درس به بعد، برنامه شروع می‌کند به جمع‌آوری و مدیریت داده‌ها.

این همان مفهومی است که بعدها در:

  • بانک‌های اطلاعاتی
  • نرم‌افزارهای مدرسه
  • فروشگاه‌های اینترنتی
  • تحلیل داده
  • هوش مصنوعی

استفاده می‌شود.

ZZZ

درس ششم پایتون

تولید نام‌های اندیس‌دار با کمک حلقه for

در برنامه‌نویسی گاهی لازم است تعداد زیادی نام مشابه تولید کنیم.

مثلاً در فیزیک، ریاضیات و مهندسی از متغیرهایی مانند:

x₁
x₂
x₃
...
x₁₀

استفاده می‌کنیم.

به جای اینکه این نام‌ها را یکی‌یکی بنویسیم، می‌توانیم از حلقه for کمک بگیریم.


روش ساده

برای تولید متغیرهای x از ۱ تا ۹:

for i in range(1, 10):
    print("x", i)

خروجی:

x 1
x 2
x 3
x 4
...
x 9

اما برای نمایش زیباتر، می‌خواهیم عددها به صورت اندیس پایین نمایش داده شوند:

x₁
x₂
x₃

تولید اندیس‌های استاندارد

# ============================================================
#                    فیبیست | PHY20
#                 آموزش برنامه‌نویسی پایتون
# ============================================================


subscript = "₀₁₂₃₄₅₆₇₈₉"


for i in range(1, 11):

    text = ""

    for digit in str(i):

        text += subscript[int(digit)]

    print("x" + text)

شرح برنامه

۱. ساخت مجموعه اعداد اندیس

subscript = "₀₁₂₃₄₅₆₇₈₉"

در این خط، عددهای کوچک پایین را به ترتیب ذخیره کرده‌ایم.

مثلاً:

subscript[1]  →  ₁
subscript[5]  →  ₅

۲. شمارش از ۱ تا ۱۰

for i in range(1, 11):

یعنی:

از عدد ۱ شروع کن و تا قبل از ۱۱ ادامه بده.

پس اعداد تولیدشده:

1 2 3 4 5 6 7 8 9 10

خواهند بود.


۳. تبدیل عدد به متن

for digit in str(i):

چون عدد ۱۰ دو رقم دارد، باید رقم‌های آن جدا شوند.

مثلاً:

10

به شکل:

"1" و "0"

خوانده می‌شود.


۴. ساخت اندیس

text += subscript[int(digit)]

هر رقم را به اندیس پایین تبدیل می‌کنیم.

مثلاً:

1 → ₁

0 → ₀

پس:

10 → ₁₀

خروجی برنامه

x₁
x₂
x₃
x₄
x₅
x₆
x₇
x₈
x₉
x₁₀

کاربرد این درس

این مفهوم در بسیاری از علوم استفاده می‌شود:

  • فیزیک:
F₁ , F₂ , F₃
  • ریاضیات:
x₁ , x₂ , x₃
  • داده‌ها:
student₁ , student₂
  • شبیه‌سازی‌ها و مدل‌سازی‌ها

در این درس یاد می‌گیریم که کامپیوتر فقط محاسبه‌گر نیست؛ بلکه می‌تواند الگوها را تشخیص دهد و تعداد زیادی نام و داده تولید کند.

ZZZ

درس هفتم

🎯 عنوان: تحلیل فروش روزانه قصابی

📚 دستورها:

LIST / FOR / range / str / int / APPEND / +=


مسئله پروژه

در یک فروشگاه قصابی، ۱۰ مشتری در طول روز خرید کرده‌اند.

نام مشتریان:

علی، مریم، رضا، محسن، شوکت، آریانا، ماهان، ماریانا، هایپرمارکت، رضوان

مقدار خرید هر مشتری:

۳، ۶، ۸، ۲، ۱، ۶۰، ۴، ۸، ۱، ۶۵ کیلوگرم

برنامه باید:

  1. مقدار خرید هر مشتری را نمایش دهد.
  2. مجموع کل فروش را محاسبه کند.
  3. درصد سهم وزنی هر مشتری از کل فروش را نمایش دهد.

فرمول درصد:

درصد سهم مشتری =
مقدار خرید مشتری ÷ کل فروش × 100

کد برنامه

# ============================================================
#                    فیبیست | PHY20
#                 آموزش برنامه‌نویسی پایتون
# ============================================================
#
# وب‌سایت: https://www.phy20.com
#
# طراح و برنامه‌نویس:
# مرتضی محمدی‌وند خوشخو
#
# تاریخ:
# ..............................
#
# مجوز و لایسنس کد:
# استفاده از این کد برای مقاصد آموزشی و
# بدون مقاصد تجاری رایگان است.
#
# مالکیت معنوی کد متعلق به فیبیست (PHY20)
# و طراح و برنامه‌نویس آن محفوظ است.
#
# ============================================================


# لیست مشتریان
customers = [
    "علی",
    "مریم",
    "رضا",
    "محسن",
    "شوکت",
    "آریانا",
    "ماهان",
    "ماریانا",
    "هایپرمارکت",
    "رضوان"
]


# مقدار خرید هر مشتری (کیلوگرم)
weights = [
    3,
    6,
    8,
    2,
    1,
    60,
    4,
    8,
    1,
    65
]


# لیست گزارش فروش
report = []


# محاسبه کل فروش
total = 0

for weight in weights:
    total += weight


# ساخت گزارش مشتریان
for i in range(10):

    percent = (weights[i] / total) * 100

    report.append(
        customers[i] +
        " : " +
        str(weights[i]) +
        " کیلوگرم - " +
        str(round(percent, 2)) +
        " درصد"
    )


# نمایش گزارش
print("🐄 گزارش فروش روزانه قصابی")
print("----------------------------")


for item in report:
    print(item)


print("----------------------------")

print("کل فروش روزانه:", total, "کیلوگرم")

نمونه خروجی

🐄 گزارش فروش روزانه قصابی
----------------------------

علی : 3 کیلوگرم - 1.82 درصد
مریم : 6 کیلوگرم - 3.61 درصد
رضا : 8 کیلوگرم - 4.82 درصد
محسن : 2 کیلوگرم - 1.2 درصد
شوکت : 1 کیلوگرم - 0.6 درصد
آریانا : 60 کیلوگرم - 36.14 درصد
ماهان : 4 کیلوگرم - 2.41 درصد
ماریانا : 8 کیلوگرم - 4.82 درصد
هایپرمارکت : 1 کیلوگرم - 0.6 درصد
رضوان : 65 کیلوگرم - 39.16 درصد

----------------------------
کل فروش روزانه: 158 کیلوگرم

مفاهیم جدید پروژه

۱. ذخیره اطلاعات در لیست

customers = []

برای نگهداری چندین داده از لیست استفاده می‌کنیم.


۲. شمارش و تکرار

for i in range(10):

یعنی عملیات را برای ۱۰ مشتری انجام بده.


۳. اضافه کردن اطلاعات جدید

report.append()

هر گزارش جدید را به انتهای لیست گزارش اضافه می‌کند.


۴. جمع کردن مقادیر

total += weight

هر خرید جدید به مجموع فروش اضافه می‌شود.


ارتباط پروژه با دنیای واقعی

این پروژه نمونه ساده‌ای از سیستم‌های واقعی است:

  • فروشگاه‌ها
  • انبارداری
  • حسابداری
  • تحلیل مشتری
  • علم داده

در مراحل بعدی می‌توانیم همین پروژه را توسعه دهیم:

مرحله بعدی:

  • دریافت نام و وزن خرید از خود کاربر
  • جست‌وجوی مشتری
  • مرتب‌سازی بیشترین خرید
  • رسم نمودار فروش با پایتون

این دقیقاً همان مسیر تبدیل «کدنویسی ساده» به «تحلیل داده واقعی» است.

ZZZ

درس هشتم پایتون

تحلیل دمای شهرهای ایران

در این پروژه، یک هواشناس جوان دمای ۱۰ شهر ایران را ثبت کرده است.

هدف برنامه:

  1. نمایش دمای هر شهر
  2. محاسبه مجموع دماها
  3. محاسبه میانگین دما
  4. پیدا کردن کمترین و بیشترین دما
  5. پیدا کردن شهرهای گرم‌تر از ۳۰ درجه

در این درس، با مفهوم مهم تحلیل داده‌ها آشنا می‌شویم.


مفاهیم آموزشی درس

۱. LIST (لیست)

لیست برای ذخیره چندین مقدار در کنار هم استفاده می‌شود.

در این برنامه دو لیست داریم:

لیست شهرها:

cities = [
    "تهران",
    "تبریز",
    "رشت"
]

این لیست نام شهرها را نگهداری می‌کند.


لیست دماها:

temperatures = [
    25,
    18,
    22
]

این لیست دمای مربوط به هر شهر را ذخیره می‌کند.

مثلاً:

cities[0]  → تهران

temperatures[0] → 25

یعنی:

دمای تهران 25 درجه است.

۲. FOR (حلقه تکرار)

دستور for برای بررسی چندین داده استفاده می‌شود.

مثلاً:

for i in range(10):

یعنی:

۱۰ بار این عملیات را انجام بده.

در این برنامه، با کمک حلقه، تمام شهرها و دماها یکی‌یکی بررسی می‌شوند.


۳. range (شمارش)

دستور:

range(10)

یک مجموعه عدد از ۰ تا ۹ تولید می‌کند.

چون شماره‌گذاری لیست‌ها در پایتون از صفر شروع می‌شود، این دستور برای دسترسی به ۱۰ عضو لیست استفاده می‌شود.

مثلاً:

cities[0]

اولین شهر است.

cities[9]

دهمین شهر است.


۴. str (تبدیل عدد به متن)

دستور str() یک عدد را به متن تبدیل می‌کند.

مثلاً:

str(25)

تبدیل می‌شود به:

"25"

این کار زمانی لازم است که بخواهیم عدد را همراه با متن نمایش دهیم.

مثلاً:

"دمای شهر: " + str(25)

۵. += (جمع کردن مقادیر)

دستور:

total += temp

یعنی:

total = total + temp

در این برنامه برای محاسبه مجموع دمای شهرها استفاده می‌شود.

مثلاً:

25 + 18 + 22 + ...

در پایان مقدار کل دما به دست می‌آید.


۶. IF (شرط)

دستور if برای تصمیم‌گیری استفاده می‌شود.

در این برنامه:

if temperatures[i] > 30:

یعنی:

اگر دمای شهر بیشتر از ۳۰ درجه بود، آن را نمایش بده.

مثلاً:

اهواز : 38 درجه
بندرعباس : 34 درجه

نمایش داده می‌شوند.


۷. پیدا کردن کمینه و بیشینه

برای پیدا کردن سردترین و گرم‌ترین شهر، ابتدا مقدار اول لیست را انتخاب می‌کنیم:

minimum = temperatures[0]

maximum = temperatures[0]

سپس با حلقه همه دماها را بررسی می‌کنیم.

اگر مقدار جدید کمتر باشد:

if temp < minimum:

کمینه تغییر می‌کند.

اگر مقدار جدید بیشتر باشد:

if temp > maximum:

بیشینه تغییر می‌کند.


۸. محاسبه میانگین

میانگین از رابطه زیر به دست می‌آید:

میانگین = مجموع داده‌ها ÷ تعداد داده‌ها

در برنامه:

average = total / 10

استفاده شده است.


روند اجرای برنامه

شروع
  ↓
دریافت لیست شهرها و دماها
  ↓
نمایش دمای شهرها
  ↓
محاسبه مجموع دماها
  ↓
محاسبه میانگین
  ↓
پیدا کردن کمینه و بیشینه
  ↓
بررسی دماهای بیشتر از ۳۰ درجه
  ↓
نمایش نتیجه
  ↓
پایان

جمع‌بندی درس هشتم

در این درس یاد گرفتیم:

✅ چگونه چندین داده را در LIST ذخیره کنیم.
✅ چگونه با FOR روی داده‌ها حرکت کنیم.
✅ چگونه با IF داده‌های خاص را انتخاب کنیم.
✅ چگونه مجموع و میانگین محاسبه کنیم.
✅ چگونه از داده خام، اطلاعات مفید استخراج کنیم.

این درس اولین قدم جدی در مسیر تحلیل داده با پایتون است؛ جایی که برنامه‌نویسی از اجرای دستورها به سمت فهمیدن و تفسیر اطلاعات حرکت می‌کند.

ZZZ

درس نهم پایتون

پروژه ۵: خرید تجهیزات جشن تولد

مسئله پروژه

دختری به نام سارینا می‌خواهد برای جشن تولد خود خرید کند.

او:

  • ۱۰ کالای مختلف دارد.
  • برای خرید خود ۳ میلیون تومان بودجه دارد.
  • باید کالاهای موردنظر را انتخاب کند.
  • برنامه باید فاکتور خرید ایجاد کند.
  • مجموع خرید را محاسبه کند.
  • بررسی کند که بودجه کافی است یا خیر.

مفاهیم آموزشی

در این پروژه از دستورهای زیر استفاده می‌کنیم:

LIST
FOR
range
INPUT
int
APPEND
+=
IF

نکته مهم پروژه

در برنامه‌های واقعی، فقط درست بودن محاسبات کافی نیست.

خروجی باید برای کاربر واضح باشد.

مثلاً این خروجی:

کیک 700000
لیوان 100000

چندان مناسب نیست.

اما:

🎀 فاکتور خرید جشن تولد

1- کیک تولد       700,000 تومان
2- لیوان          100,000 تومان

----------------------------
جمع کل: 800,000 تومان
باقی‌مانده بودجه: 2,200,000 تومان

برای کاربر قابل فهم‌تر است.


کد برنامه

# ============================================================
#                    فیبیست | PHY20
#              آموزش برنامه‌نویسی پایتون
# ============================================================
#
# وب‌سایت:
# https://www.phy20.com
#
# طراح و برنامه‌نویس:
# مرتضی محمدی‌وند خوشخو
#
# تاریخ:
# ..............................
#
# مجوز و لایسنس کد:
# استفاده از این کد برای مقاصد آموزشی و
# بدون مقاصد تجاری رایگان است.
#
# مالکیت معنوی:
# تمامی حقوق معنوی این کد متعلق به فیبیست (PHY20)
# و طراح و برنامه‌نویس آن محفوظ است.
#
# ============================================================


# بودجه سارینا

budget = 3_000_000


# لیست کالاها و قیمت‌ها

items = [
    ("کیک تولد", 700_000),
    ("بادکنک", 150_000),
    ("شمع", 80_000),
    ("ظرف یکبار مصرف", 120_000),
    ("لیوان", 100_000),
    ("دستمال کاغذی", 70_000),
    ("ریسه تولد", 180_000),
    ("کلاه تولد", 90_000),
    ("تنقلات", 600_000),
    ("نوشیدنی", 500_000)
]


# نمایش کالاها

print("🎀 لیست کالاهای جشن تولد")
print("----------------------------")


for i in range(10):

    print(
        str(i + 1),
        "-",
        items[i][0],
        ":",
        items[i][1],
        "تومان"
    )


print("----------------------------")


# ساخت فاکتور

factor = []


# مجموع خرید

total = 0


# انتخاب کالاها

for i in range(5):

    number = int(
        input(
            "شماره کالای انتخابی را وارد کنید: "
        )
    )


    name = items[number - 1][0]

    price = items[number - 1][1]


    factor.append(
        name + " : " + str(price) + " تومان"
    )


    total += price



# نمایش فاکتور

print()

print("🎀 فاکتور خرید جشن تولد 🎀")

print("----------------------------")


for item in factor:

    print(item)


print("----------------------------")


print(
    "جمع کل خرید:",
    total,
    "تومان"
)


print(
    "بودجه:",
    budget,
    "تومان"
)


# بررسی بودجه

if total <= budget:

    print("✅ خرید با موفقیت انجام شد.")

    print(
        "مبلغ باقی‌مانده:",
        budget - total,
        "تومان"
    )


else:

    print("❌ بودجه کافی نیست.")

    print(
        "مبلغ کمبود:",
        total - budget,
        "تومان"
    )

شرح مفاهیم جدید

۱. لیست دو بعدی

("کیک تولد", 700000)

هر کالا شامل دو بخش است:

  • نام کالا
  • قیمت کالا

۲. انتخاب کاربر با input

برنامه منتظر انتخاب کاربر می‌ماند:

number = int(input())

کاربر شماره کالا را وارد می‌کند.


۳. ساخت فاکتور با append

مهم‌ترین بخش پروژه:

factor.append()

هر خرید جدید به فاکتور اضافه می‌شود.

یعنی برنامه در هنگام اجرا، فاکتور را می‌سازد.


۴. مدیریت بودجه با if

برنامه تصمیم می‌گیرد:

اگر:

total <= budget

خرید امکان‌پذیر است.

در غیر این صورت:

بودجه کافی نیست.


نکته پایانی پروژه

در این پروژه یک مفهوم مهم یاد گرفتیم:

برنامه خوب فقط درست کار نمی‌کند؛ بلکه باید برای انسان قابل استفاده باشد.

از اینجا به بعد می‌توانیم برنامه‌ها را به سمت:

  • سیستم فروشگاه
  • مدیریت انبار
  • فاکتور حرفه‌ای
  • رابط گرافیکی

توسعه دهیم.

# 🎯 عنوان: خرید تجهیزات جشن تولد
# 📚 دستورها: LIST / FOR / range / INPUT / int / APPEND / += / IF

# بودجه
budget = 3_000_000

# لیست مرجع کالاها و قیمت‌ها
items = [
(“کیک تولد”, 700_000),
(“بادکنک”, 150_000),
(“شمع”, 80_000),
(“ظرف یکبار مصرف”, 120_000),
(“لیوان”, 100_000),
(“دستمال کاغذی”, 70_000),
(“ریسه تولد”, 180_000),
(“کلاه تولد”, 90_000),
(“تنقلات”, 600_000),
(“نوشیدنی”, 500_000)
]

# نمایش لیست مرجع
print(“🎀 لیست کالاها”)
print(“—————————-“)

for i in range(10):
print(
str(i + 1) + ” – ” +
items[i][0] + ” : ” +
str(items[i][1]) + ” تومان”
)

print(“—————————-“)

# لیست خرید کاربر
factor = []

# جمع خرید
total = 0

# انتخاب ۵ کالا
for i in range(5):

number = int(input(“شماره کالای ” + str(i + 1) + ” را وارد کنید: “))

name = items[number – 1][0] price = items[number – 1][1]

factor.append(
name + ” : ” + str(price) + ” تومان”
)

total += price

# چاپ فاکتور
print()
print(“🎀 فاکتور خرید جشن تولد 🎀”)
print(“—————————-“)

for item in factor:
print(item)

print(“—————————-“)

print(“جمع کل خرید:”, total, “تومان”)
print(“بودجه:”, budget, “تومان”)

# بررسی بودجه
if total <= budget:
print(“✅ خرید با موفقیت انجام شد.”)
print(“مبلغ باقی‌مانده:”, budget – total, “تومان”)
else:
print(“❌ بودجه کافی نیست.”)
print(“مبلغ کمبود:”, total – budget, “تومان”)

ZZZ

درس دهم پایتون

پروژه 05: ساخت نمودار میله‌ای دمای شهرهای ایران

در درس هشتم، دمای ۱۰ شهر ایران را در یک لیست ذخیره کردیم و توانستیم:

  • دمای شهرها را نمایش دهیم.
  • مجموع دماها را محاسبه کنیم.
  • میانگین را به دست آوریم.
  • کمینه و بیشینه را پیدا کنیم.
  • شهرهای گرم‌تر از ۳۰ درجه را شناسایی کنیم.

در این درس یک قدم جلوتر می‌رویم.

می‌خواهیم همین اطلاعات را به شکل یک نمودار میله‌ای نمایش دهیم.

اما یک نکته جالب وجود دارد:

برای ساخت این نمودار هیچ کتابخانه‌ای استفاده نمی‌کنیم.

نه matplotlib داریم و نه هیچ ابزار گرافیکی دیگری.

فقط با امکانات ساده خود پایتون این کار را انجام می‌دهیم.


ایده اصلی نمودار

فرض کنید دمای تهران ۲۵ درجه باشد.

اگر بخواهیم برای هر درجه یک علامت █ قرار دهیم، می‌توانیم بنویسیم:

"█" * 25

پایتون این علامت را ۲۵ بار تکرار می‌کند.

نتیجه چیزی شبیه این خواهد بود:

█████████████████████████

پس:

"█" * temperature

می‌تواند یک میله نمودار بسازد.


کد کامل برنامه

# ============================================================
#                    فیبیست | PHY20
#              آموزش برنامه‌نویسی پایتون
# ============================================================
#
# وب‌سایت:
# https://www.phy20.com
#
# طراح و برنامه‌نویس:
# مرتضی محمدی‌وند خوشخو
#
# تاریخ:
# ..............................
#
# مجوز و لایسنس کد:
# استفاده از این کد برای مقاصد آموزشی و
# بدون مقاصد تجاری رایگان است.
#
# مالکیت معنوی:
# تمامی حقوق معنوی این کد متعلق به فیبیست (PHY20)
# و طراح و برنامه‌نویس آن محفوظ است.
#
# ============================================================
#
# پروژه 05:
# نمودار دمای شهرهای ایران
#
# مفاهیم:
# LIST / FOR / range / IF / str / *
#
# ============================================================


cities = [
    "تهران", "تبریز", "رشت", "اهواز", "مشهد",
    "شیراز", "اصفهان", "کرمان", "اردبیل", "بندرعباس"
]


temperatures = [
    25, 18, 22, 38, 27,
    29, 26, 24, 15, 34
]


# رنگ‌ها

yellow = "�33[93m"
red = "�33[91m"
reset = "�33[0m"


# ساخت نمودار

for i in range(10):

    bars = "█" * temperatures[i]

    if temperatures[i] > 30:
        color = red
    else:
        color = yellow

    print(
        str(i + 1) + "- " +
        cities[i] + " : " +
        str(temperatures[i]) + "°C " +
        color + bars + reset
    )

شرح مفاهیم درس

۱. استفاده از LIST

دو لیست داریم:

cities = [...]

و:

temperatures = [...]

هر خانه از لیست دما با خانه متناظر خود در لیست شهرها ارتباط دارد.

مثلاً:

cities[0]         → تهران
temperatures[0]   → 25

پس می‌دانیم دمای تهران ۲۵ درجه است.


۲. استفاده از FOR

for i in range(10):

این دستور باعث می‌شود برنامه هر ۱۰ شهر را یکی‌یکی بررسی کند.

مقدار i به ترتیب:

0
1
2
3
...
9

خواهد بود.


۳. ساخت میله نمودار با *

مهم‌ترین قسمت این پروژه:

bars = "█" * temperatures[i]

اینجا از قابلیت مهم پایتون استفاده می‌کنیم:

ضرب رشته در عدد

مثلاً:

"*" * 5

نتیجه:

*****

و:

"█" * 10

نتیجه:

██████████

بنابراین اگر دما ۳۸ باشد:

"█" * 38

یک میله ۳۸تایی تولید می‌کند.


۴. استفاده از IF

در این پروژه می‌خواهیم شهرهای گرم‌تر از ۳۰ درجه را با رنگ متفاوت نمایش دهیم.

بنابراین می‌نویسیم:

if temperatures[i] > 30:

اگر دما بیشتر از ۳۰ بود:

color = red

و اگر بیشتر از ۳۰ نبود:

color = yellow

۵. رنگ در محیط متنی

این قسمت:

red = "�33[91m"

یک کد رنگ برای محیط ترمینال است.

و:

yellow = "�33[93m"

رنگ زرد را فعال می‌کند.

در پایان برای برگشتن به رنگ عادی:

reset = "�33[0m"

استفاده می‌کنیم.

بنابراین خود پایتون در اینجا یک محیط گرافیکی ایجاد نکرده است؛ بلکه از کدهای کنترلی ترمینال برای تغییر رنگ متن استفاده کرده‌ایم.


۶. استفاده از STR

در این قسمت:

str(temperatures[i])

عدد دما را به متن تبدیل می‌کنیم تا بتوانیم آن را همراه با متن در خروجی قرار دهیم.

مثلاً:

str(25)

تبدیل می‌شود به:

"25"

نمونه خروجی

در محیطی که از رنگ‌های ANSI پشتیبانی کند، خروجی تقریباً چنین شکلی خواهد داشت:

1- تهران : 25°C █████████████████████████
2- تبریز : 18°C ██████████████████
3- رشت : 22°C ██████████████████████
4- اهواز : 38°C ██████████████████████████████████████
5- مشهد : 27°C ███████████████████████████
6- شیراز : 29°C █████████████████████████████
7- اصفهان : 26°C ██████████████████████████
8- کرمان : 24°C ████████████████████████
9- اردبیل : 15°C ███████████████
10- بندرعباس : 34°C ██████████████████████████████████

اهواز و بندرعباس که دمای آن‌ها بیشتر از ۳۰ درجه است، با رنگ قرمز نمایش داده می‌شوند.


نکته مهم آموزشی

در این پروژه یک ایده بسیار مهم را یاد می‌گیریم:

برای نمایش تصویری اطلاعات، همیشه به یک کتابخانه گرافیکی نیاز نداریم.

در ساده‌ترین حالت:

داده → عدد → تکرار یک علامت → تصویر ساده

یعنی:

"█" * 25

در واقع یک عدد را به یک نمایش تصویری تبدیل می‌کند.


مفاهیم جدید درس دهم

در این پروژه با این مفاهیم کار می‌کنیم:

  • LIST → نگهداری داده‌ها
  • FOR → پیمایش داده‌ها
  • range() → شمارش
  • IF → تصمیم‌گیری
  • str() → تبدیل عدد به متن
  • * → تکرار رشته
  • کدهای ANSI → تغییر رنگ خروجی متنی

ارتباط این درس با علم داده

در درس‌های قبلی، داده را ذخیره و محاسبه کردیم.

در این درس یاد می‌گیریم داده را قابل مشاهده کنیم.

این همان مسیری است که بعدها در علم داده به آن Data Visualization یا «نمایش بصری داده‌ها» می‌گوییم.

و نکته زیبای این پروژه این است که سارینا قبل از استفاده از کتابخانه‌های آماده، ابتدا منطق ساخت نمودار را خودش می‌فهمد.

# ============================================================
# فیبیست | PHY20
# آموزش برنامه‌نویسی پایتون
# ============================================================
#
# وب‌سایت:
# https://www.phy20.com
#
# طراح و برنامه‌نویس:
# مرتضی محمدی‌وند خوشخو
#
# تاریخ:
# …………………………
#
# مجوز و لایسنس کد:
# استفاده از این کد برای مقاصد آموزشی و
# بدون مقاصد تجاری رایگان است.
#
# مالکیت معنوی:
# تمامی حقوق معنوی این کد متعلق به فیبیست (PHY20)
# و طراح و برنامه‌نویس آن محفوظ است.
#
# ============================================================

cities = [
“تهران”,
“تبریز”,
“رشت”,
“اهواز”,
“مشهد”,
“شیراز”,
“اصفهان”,
“کرمان”,
“اردبیل”,
“بندرعباس”
]

temperatures = [
25,
18,
22,
38,
27,
29,
26,
24,
15,
34
]

# رنگ‌ها در محیط ترمینال
yellow = “�33[93m”
red = “�33[91m”
reset = “�33[0m”

# نمایش نمودار دمای شهرها
for i in range(10):

bars = “█” * temperatures[i]

if temperatures[i] > 30:
color = red
else:
color = yellow

print(
str(i + 1) + “- ” +
cities[i] + ” : ” +
str(temperatures[i]) + “°C ” +
color + bars + reset
)

ZZZ

درس یازدهم

تولید صدای ۴۴۰ هرتز با پایتون 🎵

در این پروژه می‌خواهیم با پایتون یک موج سینوسی با فرکانس ۴۴۰ هرتز تولید کنیم و آن را به مدت ۳ ثانیه پخش کنیم.

۴۴۰ هرتز یعنی موج صوتی در هر ثانیه ۴۴۰ بار نوسان می‌کند.

برای تولید صدا از کتابخانه pygame و برای ساخت موج سینوسی از math استفاده می‌کنیم.

کد برنامه

# ============================================================
#                    فیبیست | PHY20
#              آموزش برنامه‌نویسی پایتون
# ============================================================
#
# وب‌سایت:
# https://www.phy20.com
#
# طراح و برنامه‌نویس:
# مرتضی محمدی‌وند خوشخو
#
# تاریخ:
# ..............................
#
# مجوز و لایسنس کد:
# استفاده از این کد برای مقاصد آموزشی و
# بدون مقاصد تجاری رایگان است.
#
# مالکیت معنوی:
# تمامی حقوق معنوی این کد متعلق به فیبیست (PHY20)
# و طراح و برنامه‌نویس آن محفوظ است.
#
# ============================================================

import pygame
import math
import struct
import time


# تنظیمات صدا
rate = 44100
freq = 440
duration = 3

pygame.mixer.init(
    rate,
    -16,
    1,
    4096
)


# ساخت موج سینوسی
data = bytearray()

for i in range(rate * duration):

    x = math.sin(
        2 * math.pi * freq * i / rate
    )

    sample = int(x * 12000)

    data += struct.pack("<h", sample)


# پخش صدا
sound = pygame.mixer.Sound(buffer=bytes(data))

sound.play()

time.sleep(duration)


# پایان
pygame.mixer.stop()
pygame.mixer.quit()

مفاهیم اصلی درس

1. rate = 44100

یعنی در هر ثانیه، صدا با ۴۴۱۰۰ نمونه ساخته می‌شود.

2. freq = 440

فرکانس صدای ما ۴۴۰ هرتز است.

3. duration = 3

مدت پخش صدا ۳ ثانیه است.

پس تعداد نمونه‌هایی که باید بسازیم:

44100 × 3 = 132300

4. موج سینوسی

قسمت اصلی برنامه این است:

math.sin(
    2 * math.pi * freq * i / rate
)

این دستور مقدار موج سینوسی را در هر لحظه محاسبه می‌کند.

بنابراین کامپیوتر به‌جای اینکه یک فایل صوتی آماده را پخش کند، خودش شکل موج صدا را محاسبه و تولید می‌کند.

5. تبدیل موج به صدای دیجیتال

sample = int(x * 12000)

مقدار موج سینوسی را به یک عدد مناسب برای نمونه صوتی تبدیل می‌کنیم.

سپس:

struct.pack("<h", sample)

این عدد را به داده‌ای تبدیل می‌کند که سیستم صوتی بتواند آن را پخش کند.

یک نکته مهم

در این پروژه سه مفهوم بسیار مهم به هم وصل می‌شوند:

فرکانس → موج سینوسی → صدای واقعی

یعنی دانش‌آموز فقط یک صدای آماده را پخش نمی‌کند؛ بلکه می‌بیند که چگونه می‌توان با چند دستور ساده، یک موج صوتی را از نظر ریاضی ساخت و به صدا تبدیل کرد.

آزمایش

حالا فقط این عدد را تغییر دهید:

freq = 440

مثلاً:

freq = 220

یا:

freq = 880

و تفاوت صدای فرکانس‌های مختلف را بشنوید.

در واقع در اینجا یک آزمایش ساده فیزیک را با پایتون انجام داده‌ایم.

ZZZ

درس دوازدهم

ساخت فایل صوتی ۴۴۰ هرتز در گوشی 📱🎵

در درس قبل، پایتون موج صوتی ۴۴۰ هرتز را تولید و پخش کرد.

در این درس می‌خواهیم این موج را به یک فایل صوتی WAV تبدیل کنیم و آن را در گوشی ذخیره کنیم.

فایل تولیدشده را می‌توان بعداً با برنامه‌های پخش صوت گوشی باز کرد.

کد برنامه

# ============================================================
#                    فیبیست | PHY20
#              آموزش برنامه‌نویسی پایتون
# ============================================================
#
# وب‌سایت:
# https://www.phy20.com
#
# طراح و برنامه‌نویس:
# مرتضی محمدی‌وند خوشخو
#
# تاریخ:
# ..............................
#
# مجوز و لایسنس کد:
# استفاده از این کد برای مقاصد آموزشی و
# بدون مقاصد تجاری رایگان است.
#
# مالکیت معنوی:
# تمامی حقوق معنوی این کد متعلق به فیبیست (PHY20)
# و طراح و برنامه‌نویس آن محفوظ است.
#
# ============================================================

import math
import wave
import struct


# مشخصات صدا
frequency = 440
duration = 5
sample_rate = 44100


# ساخت موج سینوسی
samples = []

for i in range(int(duration * sample_rate)):

    t = i / sample_rate

    value = math.sin(
        2 * math.pi * frequency * t
    )

    sample = int(value * 32767)

    samples.append(sample)


# ساخت فایل WAV
filename = "beep_440Hz.wav"

with wave.open(filename, "w") as file:

    file.setnchannels(1)
    file.setsampwidth(2)
    file.setframerate(sample_rate)

    for sample in samples:
        file.writeframes(
            struct.pack("<h", sample)
        )


print("Audio file created successfully!")
print("File name:", filename)
print("Frequency:", frequency, "Hz")
print("Duration:", duration, "seconds")

فایل کجا ذخیره می‌شود؟

در این خط:

filename = "beep_440Hz.wav"

فایل با نام:

beep_440Hz.wav

در پوشه‌ای که برنامه پایتون از آنجا اجرا می‌شود ذخیره خواهد شد.

اگر از Pydroid 3 استفاده می‌کنید، می‌توانیم مسیر ذخیره را هم مشخص کنیم؛ مثلاً مستقیماً در پوشه Download گوشی.

چه اتفاقی در برنامه می‌افتد؟

ابتدا مشخصات صدا را تعیین می‌کنیم:

frequency = 440
duration = 5
sample_rate = 44100

یعنی:

  • فرکانس: ۴۴۰ هرتز
  • مدت: ۵ ثانیه
  • نرخ نمونه‌برداری: ۴۴۱۰۰ نمونه در ثانیه

سپس پایتون برای هر نمونه، مقدار موج سینوسی را محاسبه می‌کند:

value = math.sin(
    2 * math.pi * frequency * t
)

بعد مقدار موج به یک عدد ۱۶ بیتی تبدیل می‌شود:

sample = int(value * 32767)

در نهایت این نمونه‌ها در یک فایل WAV نوشته می‌شوند.

نکته مهم آموزشی

در درس یازدهم:

موج → صدا

اما در درس دوازدهم:

موج → داده دیجیتال → فایل WAV

یعنی دانش‌آموز می‌بیند که یک مفهوم ریاضی و فیزیکی چگونه به یک فایل واقعی قابل ذخیره و پخش تبدیل می‌شود.

آزمایش

فقط این مقدار را تغییر دهید:

frequency = 440

مثلاً:

frequency = 880

و فایل جدیدی بسازید.

یا:

frequency = 220

به این ترتیب می‌توانیم یک آزمایش ساده درباره رابطه فرکانس و زیر و بمی صدا انجام دهیم.

 

import math
import wave
import struct
import os

# ————————-
# تنظیمات صدا
# ————————-

frequency = 440 # فرکانس: 440 هرتز
duration = 5 # مدت: 5 ثانیه
sample_rate = 44100 # نرخ نمونه‌برداری

# نام فایل
filename = “/sdcard/Download/beep_440Hz.wav”

# ————————-
# ساخت موج سینوسی
# ————————-

with wave.open(filename, “w”) as wav:

wav.setnchannels(1) # Mono
wav.setsampwidth(2) # 16 bit
wav.setframerate(sample_rate)

for i in range(int(duration * sample_rate)):

t = i / sample_rate

# موج سینوسی
value = math.sin(2 * math.pi * frequency * t)

# تبدیل به 16 بیت
sample = int(value * 32767)

wav.writeframes(struct.pack(“<h”, sample))

print(“فایل ساخته شد:”)
print(filename)

ZZZ

درس سیزدهم

تولید یک فرکانس صوتی در خود پایتون 🎵

در این پروژه، پایتون خودش یک موج سینوسی با فرکانس ۴۴۰ هرتز تولید می‌کند.

این بار هیچ فایل صوتی ساخته نمی‌شود.

پایتون:

فرکانس → موج سینوسی → داده دیجیتال → بلندگو

را مستقیماً انجام می‌دهد.


کد برنامه

# ============================================================
#                    فیبیست | PHY20
#              آموزش برنامه‌نویسی پایتون
# ============================================================
#
# وب‌سایت:
# https://www.phy20.com
#
# طراح و برنامه‌نویس:
# مرتضی محمدی‌وند خوشخو
#
# تاریخ:
# ..............................
#
# مجوز و لایسنس کد:
# استفاده از این کد برای مقاصد آموزشی و
# بدون مقاصد تجاری رایگان است.
#
# مالکیت معنوی:
# تمامی حقوق معنوی این کد متعلق به فیبیست (PHY20)
# و طراح و برنامه‌نویس آن محفوظ است.
#
# ============================================================

import pygame
import math
import struct


# -------------------------
# تنظیمات صدا
# -------------------------

frequency = 440
duration = 5
sample_rate = 44100


# -------------------------
# ساخت موج سینوسی
# -------------------------

samples = []

for i in range(int(sample_rate * duration)):

    t = i / sample_rate

    value = math.sin(
        2 * math.pi * frequency * t
    )

    sample = int(value * 32767)

    samples.append(
        struct.pack("<h", sample)
    )


# تبدیل نمونه‌ها به داده صوتی
sound_data = b"".join(samples)


# -------------------------
# پخش صدا
# -------------------------

pygame.mixer.init(
    frequency=sample_rate,
    size=-16,
    channels=1
)

sound = pygame.mixer.Sound(
    buffer=sound_data
)

sound.play()


# صبر تا پایان پخش
pygame.time.wait(
    int(duration * 1000)
)


pygame.mixer.quit()


print("صدای 440 هرتز تمام شد.")

مفاهیم مهم درس

۱. فرکانس

frequency = 440

یعنی می‌خواهیم صدایی با فرکانس ۴۴۰ هرتز تولید کنیم.

۴۴۰ هرتز یعنی موج در هر ثانیه ۴۴۰ چرخه کامل دارد.


۲. نرخ نمونه‌برداری

sample_rate = 44100

یعنی پایتون برای ساخت صدا، در هر ثانیه ۴۴۱۰۰ نمونه تولید می‌کند.

پس برای ۵ ثانیه:

44100 × 5 = 220500 نمونه

ساخته می‌شود.


۳. ساخت موج سینوسی

قسمت اصلی برنامه:

value = math.sin(
    2 * math.pi * frequency * t
)

اینجا پایتون مقدار موج سینوسی را در هر لحظه محاسبه می‌کند.

مقدار موج بین تقریباً:

-1  تا  +1

تغییر می‌کند.


۴. تبدیل موج به نمونه صوتی

sample = int(value * 32767)

مقدار موج را به یک عدد دیجیتال تبدیل می‌کنیم.

سپس:

struct.pack("<h", sample)

این عدد را به شکل داده‌ای درمی‌آورد که سیستم صوتی بتواند آن را دریافت کند.


۵. جمع کردن نمونه‌ها

sound_data = b"".join(samples)

تمام نمونه‌های کوچک صوتی را کنار هم قرار می‌دهیم تا یک جریان کامل از داده صوتی تشکیل شود.


۶. پخش مستقیم

sound = pygame.mixer.Sound(
    buffer=sound_data
)

اینجا نکته جالب درس اتفاق می‌افتد:

ما هیچ فایل WAV روی دیسک نمی‌سازیم.

داده صوتی مستقیماً از حافظه به pygame داده می‌شود و پخش می‌شود.


آزمایش فیزیک با پایتون

حالا مقدار:

frequency = 440

را تغییر دهید.

مثلاً:

frequency = 220

یا:

frequency = 880

و تفاوت صداها را بشنوید.

در اینجا دانش‌آموز می‌تواند ارتباط میان یک کمیت فیزیکی و یک پدیده واقعی را مستقیماً تجربه کند:

فرکانس بیشتر → صدای زیرتر

فرکانس کمتر → صدای بم‌تر


مسیر سه درس صوتی

تا اینجا سه مرحله مهم را طی کرده‌ایم:

درس ۱۱

موج سینوسی را تولید کردیم و پخش کردیم.

درس ۱۲

موج را تولید کردیم و به یک فایل WAV تبدیل و ذخیره کردیم.

درس ۱۳

موج را در حافظه تولید کردیم و بدون ساخت فایل مستقیماً به بلندگو فرستادیم.

این دقیقاً همان نقطه‌ای است که برنامه‌نویسی، ریاضیات و فیزیک به یکدیگر متصل می‌شوند.

 

# ============================================================
# فیبیست | PHY20
# آموزش برنامه‌نویسی پایتون
# ============================================================
#
# وب‌سایت:
# https://www.phy20.com
#
# طراح و برنامه‌نویس:
# مرتضی محمدی‌وند خوشخو
#
# تاریخ:
# …………………………
#
# مجوز و لایسنس کد:
# استفاده از این کد برای مقاصد آموزشی و
# بدون مقاصد تجاری رایگان است.
#
# مالکیت معنوی:
# تمامی حقوق معنوی این کد متعلق به فیبیست (PHY20)
# و طراح و برنامه‌نویس آن محفوظ است.
#
# ============================================================

import pygame
import math
import struct

# ————————-
# تنظیمات صدا
# ————————-

frequency = 440
duration = 5
sample_rate = 44100

# ————————-
# ساخت موج سینوسی
# ————————-

samples = []

for i in range(int(sample_rate * duration)):

t = i / sample_rate

value = math.sin(
2 * math.pi * frequency * t
)

sample = int(value * 32767)

samples.append(
struct.pack(“<h”, sample)
)

# تبدیل نمونه‌ها به داده صوتی
sound_data = b””.join(samples)

# ————————-
# پخش صدا
# ————————-

pygame.mixer.init(
frequency=sample_rate,
size=-16,
channels=1
)

sound = pygame.mixer.Sound(
buffer=sound_data
)

sound.play()

# صبر تا پایان پخش
pygame.time.wait(
int(duration * 1000)
)

pygame.mixer.quit()

print(“صدای 440 هرتز تمام شد.”)

ZZZ

درس چهاردهم

ساخت کشوی لغزنده برای تولید فرکانس صوتی 🎵

در درس‌های قبلی، فرکانس را مستقیماً داخل برنامه تعیین می‌کردیم:

frequency = 440

اما در این درس می‌خواهیم کاربر خودش فرکانس را انتخاب کند.

برای این کار یک کشوی لغزنده (Slider) می‌سازیم.

کاربر می‌تواند کشو را حرکت دهد و هم‌زمان صدای تولیدشده را تغییر دهد.


۱. کتابخانه‌های مورد استفاده

در ابتدای برنامه داریم:

import tkinter as tk
import pygame
import math
import struct
import threading
import time

هر کتابخانه یک وظیفه دارد:

tkinter

برای ساخت پنجره و اجزای گرافیکی برنامه استفاده می‌شود.

در این پروژه:

  • پنجره
  • نوشته
  • Slider
  • دکمه START
  • دکمه STOP

را با tkinter می‌سازیم.

pygame

برای تولید و پخش صدای دیجیتال استفاده می‌شود.

math

برای محاسبه موج سینوسی استفاده می‌شود.

struct

اعداد تولیدشده را به داده صوتی ۱۶ بیتی تبدیل می‌کند.

threading

اجازه می‌دهد تولید صدا هم‌زمان با کار کردن پنجره ادامه پیدا کند.

time

برای ایجاد فاصله زمانی مناسب بین قطعات صوتی استفاده می‌شود.


۲. محدوده فرکانس

در این قسمت:

MIN_FREQ = 100
MAX_FREQ = 1000

حداقل فرکانس را ۱۰۰ هرتز و حداکثر را ۱۰۰۰ هرتز قرار داده‌ایم.

بنابراین کاربر می‌تواند با Slider هر فرکانسی بین این دو مقدار را انتخاب کند.

مثلاً:

100 Hz
200 Hz
440 Hz
600 Hz
880 Hz
1000 Hz

۳. فرکانس اولیه

current_frequency = 440.0

در ابتدای برنامه فرکانس روی ۴۴۰ هرتز قرار دارد.

پس وقتی برنامه باز می‌شود، Slider نیز روی ۴۴۰ قرار می‌گیرد.


۴. متغیر playing

playing = False

این متغیر مشخص می‌کند که صدا در حال پخش است یا نه.

اگر:

playing = True

باشد، برنامه تولید صدا را ادامه می‌دهد.

اگر:

playing = False

باشد، تولید صدا متوقف می‌شود.

این یک مفهوم مهم برنامه‌نویسی است:

یک متغیر می‌تواند وضعیت یک سیستم را کنترل کند.


۵. نرخ نمونه‌برداری

SAMPLE_RATE = 44100

یعنی در هر ثانیه، ۴۴۱۰۰ نمونه صوتی تولید می‌کنیم.

این همان مفهومی است که در درس‌های قبلی داشتیم.


۶. اندازه قطعه صوتی

CHUNK_SIZE = 8192

ما صدا را یک‌باره برای مدت طولانی تولید نمی‌کنیم.

صدا به قطعات کوچک تقسیم می‌شود.

هر قطعه:

8192 نمونه

دارد.

این کار باعث می‌شود بتوانیم فرکانس را در حین پخش تغییر دهیم.


۷. مهم‌ترین قسمت برنامه؛ ساخت موج

تابع:

def sound_loop():

وظیفه تولید مداوم صدا را دارد.

داخل آن داریم:

while playing:

یعنی:

تا زمانی که playing برابر True است، تولید صدا ادامه پیدا کند.


۸. دریافت فرکانس فعلی

در هر مرحله:

frequency = current_frequency

برنامه فرکانس فعلی را می‌خواند.

این موضوع بسیار مهم است.

زیرا کاربر ممکن است Slider را از:

440 Hz

به:

700 Hz

حرکت دهد.

در این حالت برنامه در قطعه صوتی بعدی فرکانس جدید را دریافت می‌کند.


۹. ساخت موج سینوسی

قسمت اصلی:

value = math.sin(phase)

مقدار موج سینوسی را محاسبه می‌کند.

در واقع برنامه در حال ساختن چیزی شبیه این است:

      /‾      /‾
     /       /   
----/-------/---------
   /       /       

این همان موج سینوسی است که در فیزیک با آن آشنا هستیم.


۱۰. تبدیل موج به صدای دیجیتال

sample = int(value * 12000)

مقدار موج سینوسی به یک مقدار عددی تبدیل می‌شود.

عدد 12000 دامنه صدا را تعیین می‌کند.

یعنی اینجا عملاً داریم:

موج ریاضی → نمونه صوتی


۱۱. ساختن موج با فرکانس مشخص

این قسمت بسیار مهم است:

phase += (
    2 * math.pi *
    frequency /
    SAMPLE_RATE
)

اینجا مشخص می‌شود موج با چه سرعتی نوسان کند.

فرکانس بالاتر:

نوسان سریع‌تر

فرکانس پایین‌تر:

نوسان آهسته‌تر

بنابراین وقتی Slider را حرکت می‌دهیم، مقدار frequency تغییر می‌کند و شکل زمانی موج نیز تغییر می‌کند.


۱۲. چرا phase داریم؟

اگر هر بار موج را از صفر شروع کنیم، ممکن است هنگام اتصال قطعات صوتی، پرش ایجاد شود.

به همین دلیل:

phase = 0.0

را خارج از حلقه قرار داده‌ایم.

و سپس دائماً آن را جلو می‌بریم:

phase += ...

بنابراین موج می‌تواند به‌صورت پیوسته ادامه پیدا کند.

این مفهوم برای ساخت صدای پیوسته بسیار مهم است.


۱۳. چرا phase دوباره کوچک می‌شود؟

این قسمت:

if phase >= 2 * math.pi:
    phase -= 2 * math.pi

به این دلیل است که یک دور کامل سینوسی برابر با:

2π

است.

وقتی از یک دور کامل عبور کردیم، دوباره به ابتدای چرخه برمی‌گردیم.

در نتیجه:

0 → 2π → 0 → 2π → 0 ...

و موج می‌تواند دائماً تکرار شود.


۱۴. تبدیل نمونه‌ها به داده صوتی

samples.extend(
    struct.pack("<h", sample)
)

اینجا عددی که ساخته‌ایم به قالب صوتی ۱۶ بیتی تبدیل می‌شود.

سپس تمام نمونه‌ها داخل:

samples

جمع می‌شوند.


۱۵. تبدیل یک قطعه به صدای قابل پخش

sound = pygame.mixer.Sound(
    buffer=bytes(samples)
)

اینجا داده‌هایی که خودمان ساخته‌ایم به pygame داده می‌شوند.

پس هیچ فایل WAV لازم نیست.

برنامه:

موج را می‌سازد → داده صوتی تولید می‌کند → بلندگو آن را پخش می‌کند.


۱۶. نقش time.sleep

time.sleep(
    CHUNK_SIZE / SAMPLE_RATE * 0.85
)

برنامه کمی صبر می‌کند تا قطعه صوتی فرصت پخش داشته باشد.

عدد 0.85 باعث می‌شود قطعه بعدی کمی زودتر آماده شود تا پخش صدا روان‌تر باشد.


۱۷. ساخت Slider

قسمت:

slider = tk.Scale(
    window,
    from_=MIN_FREQ,
    to=MAX_FREQ,
    orient=tk.HORIZONTAL,
    length=550,
    width=40,
    sliderlength=65,
    resolution=1,
    command=change_frequency
)

کشوی لغزنده را می‌سازد.

مهم‌ترین قسمت:

from_=MIN_FREQ
to=MAX_FREQ

یعنی:

100 ←──────────────→ 1000

و:

resolution=1

یعنی فرکانس با گام یک هرتز تغییر کند.


۱۸. وقتی Slider حرکت می‌کند چه اتفاقی می‌افتد؟

این دستور بسیار مهم است:

command=change_frequency

یعنی هر بار کاربر Slider را حرکت دهد، تابع:

change_frequency()

اجرا شود.

داخل تابع داریم:

current_frequency = float(value)

فرکانس جدید را دریافت می‌کنیم.

بعد:

label.config(
    text=f"Frequency: {int(current_frequency)} Hz"
)

عدد روی صفحه نیز تغییر می‌کند.

مثلاً:

Frequency: 440 Hz

تبدیل می‌شود به:

Frequency: 725 Hz

۱۹. دکمه START

وقتی کاربر روی START کلیک می‌کند:

start_sound()

اجرا می‌شود.

و:

playing = True

می‌شود.

سپس این دستور:

threading.Thread(
    target=sound_loop,
    daemon=True
).start()

تابع تولید صدا را در یک Thread جداگانه اجرا می‌کند.


۲۰. چرا Thread لازم داریم؟

این یکی از مهم‌ترین مفاهیم این درس است.

اگر تولید صدا را مستقیماً داخل حلقه اصلی Tkinter انجام دهیم، ممکن است پنجره قفل شود.

یعنی:

تولید صدا
     ↓
حلقه طولانی
     ↓
پنجره دیگر پاسخ نمی‌دهد

اما با threading:

              ┌── تولید صدا
Tkinter ──────┤
              └── پنجره و Slider

هر دو می‌توانند هم‌زمان کار کنند.

بنابراین کاربر می‌تواند:

هم صدا را بشنود و هم Slider را حرکت دهد.


۲۱. دکمه STOP

وقتی STOP را فشار می‌دهیم:

playing = False

می‌شود.

در نتیجه شرط:

while playing:

دیگر برقرار نیست و حلقه تولید صدا متوقف می‌شود.

همچنین:

pygame.mixer.stop()

صدای در حال پخش را متوقف می‌کند.


۲۲. نکته بسیار مهم فیزیکی

حالا یک آزمایش واقعی انجام دهید.

برنامه را اجرا کنید.

ابتدا روی:

440 Hz

قرار دهید.

سپس Slider را آرام حرکت دهید.

مثلاً:

200 Hz → 440 Hz → 600 Hz → 800 Hz → 1000 Hz

گوش شما تغییر زیر و بمی صدا را احساس می‌کند.

در اینجا دانش‌آموز عملاً رابطه زیر را تجربه می‌کند:

فرکانس کم → صدای بم‌تر

فرکانس زیاد → صدای زیرتر


جمع‌بندی درس چهاردهم

در این درس چند مفهوم مهم را به یکدیگر متصل کردیم:

Tkinter
   ↓
Slider
   ↓
انتخاب فرکانس
   ↓
موج سینوسی
   ↓
داده دیجیتال
   ↓
Pygame
   ↓
بلندگو

و هم‌زمان با آن با یک مفهوم مهم برنامه‌نویسی نیز آشنا شدیم:

Thread

بنابراین این پروژه فقط یک برنامه تولید صدا نیست؛ یک آزمایشگاه کوچک فیزیک با پایتون است.

دانش‌آموز می‌تواند یک کمیت فیزیکی، یعنی فرکانس، را با دست تغییر دهد و اثر آن را مستقیماً بشنود.

# ============================================================
# فیبیست | PHY20
# آموزش برنامه‌نویسی پایتون
# ============================================================
#
# وب‌سایت:
# https://www.phy20.com
#
# طراح و برنامه‌نویس:
# مرتضی محمدی‌وند خوشخو
#
# تاریخ:
# …………………………
#
# مجوز و لایسنس کد:
# استفاده از این کد برای مقاصد آموزشی و
# بدون مقاصد تجاری رایگان است.
#
# مالکیت معنوی:
# تمامی حقوق معنوی این کد متعلق به فیبیست (PHY20)
# و طراح و برنامه‌نویس آن محفوظ است.
#
# ============================================================

import tkinter as tk
import pygame
import math
import struct
import threading
import time

# ————————-
# Sound settings
# ————————-

SAMPLE_RATE = 44100

MIN_FREQ = 100
MAX_FREQ = 1000

CHUNK_SIZE = 8192

current_frequency = 440.0
playing = False

pygame.mixer.init(
frequency=SAMPLE_RATE,
size=-16,
channels=1,
buffer=4096
)

# ————————-
# Continuous sound
# ————————-

def sound_loop():

global playing
global current_frequency

phase = 0.0

while playing:

frequency = current_frequency

samples = bytearray()

for i in range(CHUNK_SIZE):

value = math.sin(phase)

sample = int(value * 12000)

samples.extend(
struct.pack(“<h”, sample)
)

phase += (
2 * math.pi *
frequency /
SAMPLE_RATE
)

if phase >= 2 * math.pi:
phase -= 2 * math.pi

sound = pygame.mixer.Sound(
buffer=bytes(samples)
)

sound.play()

time.sleep(
CHUNK_SIZE / SAMPLE_RATE * 0.85
)

# ————————-
# Frequency slider
# ————————-

def change_frequency(value):

global current_frequency

current_frequency = float(value)

label.config(
text=f”Frequency: {int(current_frequency)} Hz”
)

# ————————-
# Start sound
# ————————-

def start_sound():

global playing

if not playing:

playing = True

threading.Thread(
target=sound_loop,
daemon=True
).start()

# ————————-
# Stop sound
# ————————-

def stop_sound():

global playing

playing = False

pygame.mixer.stop()

# ————————-
# User Interface
# ————————-

window = tk.Tk()

window.title(“PHY20 – Frequency Laboratory”)

window.geometry(“650×420″)

label = tk.Label(
window,
text=”Frequency: 440 Hz”,
font=(“Arial”, 30)
)

label.pack(pady=30)

# ————————-
# Frequency slider
# ————————-

slider = tk.Scale(
window,

from_=MIN_FREQ,
to=MAX_FREQ,

orient=tk.HORIZONTAL,

length=550,

width=40,
sliderlength=65,

resolution=1,

command=change_frequency
)

slider.set(440)

slider.pack(pady=25)

# ————————-
# Start button
# ————————-

start_button = tk.Button(
window,
text=”▶ START”,
font=(“Arial”, 20),
width=12,
command=start_sound
)

start_button.pack(pady=10)

# ————————-
# Stop button
# ————————-

stop_button = tk.Button(
window,
text=”■ STOP”,
font=(“Arial”, 20),
width=12,
command=stop_sound
)

stop_button.pack()

# ————————-
# Start application
# ————————-

window.mainloop()

stop_sound()

pygame.mixer.quit()

ZZZ

دیدگاهتان را بنویسید