آموزش پایتون از صفر – بخش دوم: حلقه‌ها، توابع و ساخت پروژه

بازدید: 62 بازدید
آموزش پایتون مبتدی

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

حالا وقت آن است که یک قدم جلوتر برویم و یاد بگیریم چگونه کارهای تکراری را ساده‌تر انجام دهیم و کدهای منظم‌تری بنویسیم. در این بخش با حلقه‌ها، توابع و در نهایت ساخت یک پروژه واقعی در پایتون آشنا خواهیم شد

این آموزش با الهام از دوره Python Bootcamp از Angela Yu و با بازنویسی آموزشی، مثال‌های تکمیلی و تمرین‌های اختصاصی تهیه شده است.

فهرست مطالب این بخش

1. چرا به حلقه‌ها نیاز داریم؟

فرض کنید لیستی از چند محصول داریم:

products = ["Laptop", "Phone", "Tablet", "Camera"]

اگر بخواهیم همه محصولات را نمایش دهیم، می‌توانیم به صورت دستی بنویسیم:

print(products[0])
print(products[1])
print(products[2])
print(products[3])

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

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

حلقه‌ها به ما اجازه می‌دهند یک بخش از کد را چندین بار اجرا کنیم، بدون اینکه مجبور باشیم کد تکراری بنویسیم

2. حلقه For در پایتون

حلقه for برای حرکت روی اعضای یک مجموعه استفاده می‌شود.

ساختار کلی:

for item in collection:
    do something

مثال:

books = ["Python", "Java", "C++"]

for book in books:
    print(book)

خروجی:

Python
Java
C++

در هر بار اجرای حلقه، یک مقدار از لیست داخل متغیر book قرار می‌گیرد.

# مرحله اول
book = Python

# مرحله دوم
book = Java

# مرحله سوم
book = C++

نکته مهم: فاصله‌گذاری در حلقه‌ها

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

درست:

for book in books:
    print(book)

غلط:

for book in books:
print(book)

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

3. محاسبه مجموع مقادیر یک لیست با For Loop

فرض کنید قیمت چند محصول را داریم:

prices = [120, 250, 80, 400, 150]

می‌خواهیم مجموع قیمت‌ها را محاسبه کنیم.

ابتدا یک متغیر برای نگهداری مجموع ایجاد می‌کنیم:

total_price = 0

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

prices = [120, 250, 80, 400, 150]

total_price = 0

for price in prices:
    total_price += price

print(total_price)

خروجی:

1000

در هر مرحله مقدار جدید به مقدار قبلی اضافه می‌شود.

مثلاً:

0 + 120 = 120

120 + 250 = 370

370 + 80 = 450

450 + 400 = 850

850 + 150 = 1000

4. محاسبه میانگین با استفاده از حلقه

حالا می‌خواهیم میانگین قیمت‌ها را حساب کنیم.

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

  • مجموع قیمت‌ها
  • تعداد محصولات
prices = [120, 250, 80, 400, 150]

total_price = 0
number_of_products = 0

for price in prices:
    total_price += price
    number_of_products += 1

average_price = round(total_price / number_of_products)

print(average_price)

خروجی:

200

در این مثال، تعداد محصولات را هم با استفاده از حلقه محاسبه کردیم.

البته در پایتون تابع آماده len() وجود دارد:

len(prices)

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

5. پیدا کردن بزرگ‌ترین مقدار در یک لیست

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

فرض کنید نمرات یک کلاس را داریم:

scores = [75, 88, 92, 64, 95]

پایتون تابع آماده max() دارد:

print(max(scores))

اما برای یادگیری، خودمان این کار را انجام می‌دهیم.

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

highest_score = 0

سپس تمام مقادیر را بررسی می‌کنیم:

scores = [75, 88, 92, 64, 95]

highest_score = 0

for score in scores:

    if score > highest_score:
        highest_score = score

print(f"The highest score is {highest_score}")

خروجی:

The highest score is 95

منطق برنامه:

  • ابتدا بالاترین مقدار را صفر در نظر می‌گیریم.
  • هر مقدار جدید را بررسی می‌کنیم.
  • اگر مقدار جدید بزرگ‌تر باشد، جایگزین می‌شود.

6. استفاده از Range در حلقه For

تا اینجا حلقه for را برای حرکت روی اعضای یک لیست استفاده کردیم. اما گاهی اوقات می‌خواهیم یک دستور را تعداد مشخصی بار اجرا کنیم.

برای مثال، اگر بخواهیم اعداد ۱ تا ۱۰ را چاپ کنیم، لازم نیست یک لیست بسازیم.

برای این کار از تابع range() استفاده می‌کنیم.

ساختار کلی:

range(start, stop)

مثال:

for number in range(1, 11):
    print(number)

خروجی:

1
2
3
4
5
6
7
8
9
10

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

range(1, 11)

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

مشخص کردن فاصله بین اعداد در Range

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

ساختار کامل:

range(start, stop, step)

مثال:

for number in range(0, 20, 2):
    print(number)

خروجی:

0
2
4
6
8
10
12
14
16
18

در این مثال:

  • شروع از صفر است.
  • قبل از رسیدن به ۲۰ متوقف می‌شود.
  • هر بار ۲ واحد اضافه می‌شود.

7. محاسبه مجموع اعداد با Range

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

فرض کنید می‌خواهیم مجموع اعداد ۱ تا ۱۰۰ را محاسبه کنیم.

total = 0

for number in range(1, 101):
    total += number

print(total)

خروجی کد بالا: 5050

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

total = 0

قرار داده‌ایم.

سپس در هر بار اجرای حلقه، مقدار جدید را به آن اضافه کرده‌ایم.

مثلاً:

0 + 1 = 1

1 + 2 = 3

3 + 3 = 6

...

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

8. محاسبه مجموع اعداد زوج

حالا می‌خواهیم مجموع اعداد زوج بین ۱ تا ۱۰۰ را پیدا کنیم.

روش اول: استفاده از شرط

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

total = 0

for number in range(1, 101):

    if number % 2 == 0:
        total += number

print(total)

در اینجا از عملگر % استفاده کرده‌ایم. این عملگر باقی‌مانده تقسیم را برمی‌گرداند.

روش دوم: استفاده از Step در Range

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

total = 0

for number in range(2, 101, 2):
    total += number

print(total)

در این روش حلقه فقط این اعداد را بررسی می‌کند:

2, 4, 6, 8, 10, ...

بنابراین دیگر نیازی به شرط if نداریم.

9. تمرین FizzBuzz

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

قوانین برنامه:

  • اعداد ۱ تا ۱۰۰ بررسی شوند.
  • اگر عدد بر ۳ بخش‌پذیر بود، کلمه Fizz نمایش داده شود.
  • اگر عدد بر ۵ بخش‌پذیر بود، کلمه Buzz نمایش داده شود.
  • اگر همزمان بر ۳ و ۵ بخش‌پذیر بود، FizzBuzz نمایش داده شود.
  • در غیر این صورت خود عدد چاپ شود.
for number in range(1, 101):

    if number % 3 == 0 and number % 5 == 0:
        print("FizzBuzz")

    elif number % 3 == 0:
        print("Fizz")

    elif number % 5 == 0:
        print("Buzz")

    else:
        print(number)

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

برای مثال عدد ۱۵ هم بر ۳ و هم بر ۵ بخش‌پذیر است.

اگر شرط ۳ را اول بررسی کنیم:

if number % 3 == 0:

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

10. Code Block و مفهوم Indentation در پایتون

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

در زبان‌هایی مثل JavaScript یا C معمولاً از {} استفاده می‌شود.

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

مثال:

temperature = 35

if temperature > 30:
    print("The weather is hot.")
    print("Drink water.")

print("Program finished.")

در این مثال دو دستور اول داخل شرط هستند:

print("The weather is hot.")
print("Drink water.")

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

print("Program finished.")

خارج از شرط قرار دارد. بنابراین همیشه اجرا می‌شود.

استفاده از Tab و Space

برای ایجاد فاصله می‌توان از Tab یا Space استفاده کرد. اما نباید این دو را در یک پروژه با هم ترکیب کنیم.

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

چهار فاصله برای هر سطح:

if True:
    print("Hello")

11. Function در پایتون

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

مثلاً:

print()
len()
range()
int()

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

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

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

ساختار کلی:

def function_name():
    code

مثال:

def say_hello():
    print("Hello Python")

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

say_hello()

کد کامل:

def say_hello():
    print("Hello Python")


say_hello()

خروجی:

Hello Python

چرا از Function استفاده می‌کنیم؟

فرض کنید یک بخش از کد را چند بار در برنامه نیاز داریم. بدون تابع مجبور هستیم کد را تکرار کنیم.

مثلاً:

print("Welcome user")
print("Have a nice day")

اما با تابع:

def welcome_message():
    print("Welcome user")
    print("Have a nice day")

هر زمان نیاز داشتیم:

welcome_message()

را اجرا می‌کنیم.

مزیت‌های تابع:

  • جلوگیری از تکرار کد
  • خواناتر شدن برنامه
  • مدیریت ساده‌تر پروژه

12. حلقه While در پایتون

نوع دیگری از حلقه‌ها در پایتون، حلقه while است.

ساختار:

while condition:
    code

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


مثال:

count = 5

while count > 0:
    print(count)
    count -= 1

خروجی:

5
4
3
2
1

در هر بار اجرا مقدار count یک واحد کم می‌شود. وقتی مقدار آن به صفر برسد:

count > 0

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


مراقب حلقه بی‌نهایت باشید

یکی از خطاهای رایج در حلقه‌های while ایجاد Infinite Loop است.

مثال اشتباه:

number = 10

while number > 0:
    print(number)

چون مقدار number هیچ‌وقت تغییر نمی‌کند، شرط همیشه درست باقی می‌ماند. در نتیجه برنامه بدون توقف اجرا می‌شود.

نسخه صحیح:

number = 10

while number > 0:
    print(number)
    number -= 1

13. تفاوت For و While

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

حلقه For

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

مثال:

names = ["Ali", "Sara", "Reza"]

for name in names:
    print(name)

یا:

for number in range(1, 10):
    print(number)

حلقه While

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

مثال:

password = ""

while password != "1234":
    password = input("Enter password: ")

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

14. پروژه تمرینی بخش دوم: Hangman؛ ساخت بازی حدس کلمه

بازی Hangman یکی از پروژه‌های معروف برای تمرین برنامه‌نویسی است.

ایده بازی:

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

مثلاً کلمه:

python

در ابتدا:

_ _ _ _ _ _

اگر کاربر حرف P را حدس بزند:

p _ _ _ _ _

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

انتخاب تصادفی کلمه

ابتدا از ماژول random استفاده می‌کنیم.

import random

words = ["python", "computer", "programming", "developer"]

chosen_word = random.choice(words)

print(chosen_word)

تابع random.choice() یک مقدار تصادفی از لیست انتخاب می‌کند.

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

ساخت جای خالی برای کلمه

ابتدا باید به تعداد حروف کلمه، جای خالی ایجاد کنیم.

chosen_word = "python"

display = []

for letter in chosen_word:
    display.append("_")

print(display)

خروجی:

['_', '_', '_', '_', '_', '_']

بررسی حدس کاربر

حالا یک حرف از کاربر می‌گیریم:

guess = input("Guess a letter: ").lower()

سپس حروف کلمه را بررسی می‌کنیم:

chosen_word = "python"

guess = input("Guess a letter: ").lower()

for letter in chosen_word:

    if letter == guess:
        print("Correct")

    else:
        print("Wrong")

نمایش وضعیت واقعی بازی

به جای چاپ درست یا غلط، باید جای حرف درست را تغییر دهیم.

chosen_word = "python"

display = []

for letter in chosen_word:
    display.append("_")


guess = input("Guess a letter: ").lower()


for position in range(len(chosen_word)):

    if chosen_word[position] == guess:
        display[position] = guess


print(display)

اگر کاربر حرف P را وارد کند خروجی به صورت زیر می‌شود:

['p', '_', '_', '_', '_', '_']

کامل کردن بازی با While

برای اینکه بازی ادامه پیدا کند، از حلقه while استفاده می‌کنیم.

import random

words = ["python", "computer", "programming"]

chosen_word = random.choice(words)

display = []

for letter in chosen_word:
    display.append("_")


game_over = False


while not game_over:

    guess = input("Guess a letter: ").lower()


    for position in range(len(chosen_word)):

        if chosen_word[position] == guess:
            display[position] = guess


    print(display)


    if "_" not in display:
        game_over = True
        print("You win!")

در اینجا:

while not game_over:

یعنی تا زمانی که بازی تمام نشده است، ادامه بده.

اضافه کردن تعداد فرصت‌ها

می‌توانیم تعداد جان‌ها را هم اضافه کنیم.

lives = 6

اگر کاربر حرف اشتباه وارد کرد:

if guess not in chosen_word:
    lives -= 1

و اگر فرصت‌ها تمام شد:

if lives == 0:
    print("Game Over")

جمع‌بندی بخش دوم

در این بخش وارد مرحله جدیدی از برنامه‌نویسی با پایتون شدیم. یاد گرفتیم چگونه با استفاده از حلقه‌ها، عملیات تکراری را ساده کنیم. با for روی داده‌ها حرکت کردیم:

for item in list:

با range بازه‌های عددی ساختیم:

range(1,10)

با Function کدهای خود را مرتب‌تر کردیم:

def function_name():

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

در نهایت همه این مفاهیم را در پروژه Hangman کنار هم قرار دادیم و یک بازی واقعی ساختیم.

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


15. چند تمرین برای این بخش:

تمرین 1 : برنامه‌ای بنویسید که تمام اعداد زوج بین ۱ تا ۵۰ را چاپ کند.

مشاهده پاسخ تمرین 1

for number in range(2, 51, 2):
    print(number)

تمرین 2: برنامه‌ای بنویسید که مجموع اعداد بین ۱ تا ۲۰۰ را با استفاده از حلقه for محاسبه و چاپ کند.

مشاهده پاسخ تمرین 2
total = 0

for number in range(1, 201):
    total += number

print(total)

تمرین 3: با استفاده از حلقه while برنامه‌ای بنویسید که از عدد ۱۰ تا ۱ شمارش معکوس کند و در پایان Go! را نمایش دهد.

مشاهده پاسخ تمرین 3:

number = 10

while number > 0:
    print(number)
    number -= 1

print("Go!")

تمرین 4: برنامه‌ای بنویسید که اعداد ۱ تا ۳۰ را بررسی کند و فقط اعدادی را نمایش دهد که بر ۳ بخش‌پذیر هستند.

مشاهده پاسخ تمرین 4:
# روش اول:

for number in range(1, 31):
    if number % 3 == 0:
        print(number)
#روش دوم

for number in range(3, 31, 3):
    print(number)

تمرین 5: یک بازی حدس عدد بسازید که تا زمانی که کاربر عدد درست را وارد نکرده است ادامه پیدا کند.

مشاهده پاسخ تمرین 5:

secret_number = 7

guess = int(input("Guess the number: "))


while guess != secret_number:

    print("Try again")

    guess = int(input("Guess the number: "))


print("Correct!")

ادامه مطلب