تمرین و پروژه‌های پایتون

۵۰ تمرین پایتون با جواب؛ از مقدماتی تا متوسط (با خروجی اجرا)

۵۰ تمرین پایتون با جواب و خروجی

🗓 آخرین به‌روزرسانی:

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

چطور از این تمرین‌ها بیشترین استفاده را ببرید؟

  1. صورت مسئله را بخوانید و پیش از دیدن جواب، حداقل ۱۰ تا ۱۵ دقیقه خودتان تلاش کنید.
  2. اگر گیر کردید، فقط خط اول جواب را ببینید و دوباره ادامه دهید.
  3. بعد از حل، کد خودتان را با جواب مقایسه کنید. راه‌حل شما لازم نیست یکسان باشد؛ همین که خروجی درست باشد و کد خوانا، کافی است.
  4. هر تمرین را کمی تغییر دهید: ورودی دیگری بدهید، حالت خطا را مدیریت کنید یا آن را به تابع تبدیل کنید.
  5. هر چند روز تمرین‌های قبلی را دوباره، بدون نگاه کردن، بنویسید. تکرار با فاصله، دانسته‌ها را ماندگار می‌کند.

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

سطح ۱: تمرین‌های مقدماتی (۱ تا ۱۵)

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

تمرین 1: سلام با نام

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

name = input("Name: ")
print(f"Hello, {name}!")

خروجی:

Name: Ali
Hello, Ali!

تمرین 2: جمع دو عدد

دو عدد صحیح از کاربر بگیرید و جمع آن‌ها را چاپ کنید.

a = int(input("a: "))
b = int(input("b: "))
print("sum =", a + b)

خروجی:

a: 7
b: 5
sum = 12

تمرین 3: مساحت و محیط مستطیل

طول و عرض را بگیرید و مساحت و محیط را چاپ کنید.

w = float(input("width: "))
h = float(input("height: "))
print("area =", w * h, "perimeter =", 2 * (w + h))

خروجی:

width: 4
height: 2.5
area = 10.0 perimeter = 13.0

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

دما را به سلسیوس بگیرید و به فارنهایت تبدیل کنید (F = C × 9/5 + 32).

c = float(input("C: "))
print(f"{c} C = {c * 9 / 5 + 32:.1f} F")

خروجی:

C: 37
37.0 C = 98.6 F

تمرین 5: زوج یا فرد

عددی بگیرید و بگویید زوج است یا فرد.

n = int(input("n: "))
print("even" if n % 2 == 0 else "odd")

خروجی:

n: 13
odd

تمرین 6: بزرگ‌ترین از سه عدد

سه عدد بگیرید و بزرگ‌ترین را بدون تابع max پیدا کنید.

a, b, c = 8, 21, 14
big = a
if b > big:
    big = b
if c > big:
    big = c
print("max:", big)

خروجی:

max: 21

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

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

for y in (1900, 2000, 2024, 2026):
    leap = y % 4 == 0 and (y % 100 != 0 or y % 400 == 0)
    print(y, leap)

خروجی:

1900 False
2000 True
2024 True
2026 False

تمرین 8: نمره به حرف

نمره ۰ تا ۲۰ را به A، B، C یا F تبدیل کنید.

def grade(s):
    if s >= 17: return "A"
    if s >= 14: return "B"
    if s >= 10: return "C"
    return "F"

print([grade(s) for s in (19, 15.5, 10, 7)])

خروجی:

['A', 'B', 'C', 'F']

تمرین 9: جدول ضرب

جدول ضرب عدد ۷ را تا ۱۰ چاپ کنید.

for i in range(1, 11):
    print(f"7 x {i:2} = {7 * i}")

خروجی:

7 x  1 = 7
7 x  2 = 14
7 x  3 = 21
7 x  4 = 28
7 x  5 = 35
7 x  6 = 42
7 x  7 = 49
7 x  8 = 56
7 x  9 = 63
7 x 10 = 70

تمرین 10: جمع ۱ تا n

مجموع اعداد ۱ تا n را با حلقه و با فرمول حساب کنید.

n = 100
total = 0
for i in range(1, n + 1):
    total += i
print(total, n * (n + 1) // 2)

خروجی:

5050 5050

تمرین 11: فاکتوریل

فاکتوریل عدد را با حلقه حساب کنید.

n = 6
f = 1
for i in range(2, n + 1):
    f *= i
print(f"{n}! = {f}")

خروجی:

6! = 720

تمرین 12: شمارش ارقام

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

n = 907321
count = 0
while n > 0:
    n //= 10
    count += 1
print("digits:", count)

خروجی:

digits: 6

تمرین 13: مقلوب عدد

ارقام یک عدد را برعکس کنید.

n = 12345
rev = 0
while n:
    rev = rev * 10 + n % 10
    n //= 10
print(rev)

خروجی:

54321

تمرین 14: مثلث ستاره

یک مثلث ستاره‌ای با ۵ ردیف چاپ کنید.

for i in range(1, 6):
    print(" " * (5 - i) + "*" * (2 * i - 1))

خروجی:

    *
   ***
  *****
 *******
*********

تمرین 15: میانگین تا صفر

تا وقتی کاربر صفر وارد نکرده عدد بگیرید و میانگین را چاپ کنید.

nums = []
while True:
    x = float(input("number (0 to stop): "))
    if x == 0:
        break
    nums.append(x)
print("average:", sum(nums) / len(nums))

خروجی:

number (0 to stop): 10
number (0 to stop): 20
number (0 to stop): 45
number (0 to stop): 0
average: 25.0

سطح ۲: لیست، رشته و دیکشنری (۱۶ تا ۳۰)

این تمرین‌ها مهارت کار با ساختارهای داده را می‌سازند؛ مهارتی که تقریباً در هر برنامه واقعی به آن نیاز دارید. آموزش‌های لیست، رشته، دیکشنری، مجموعه و list comprehension پشتیبان این بخش‌اند.

تمرین 16: بزرگ‌ترین و کوچک‌ترین عضو لیست

بدون max و min، بزرگ‌ترین و کوچک‌ترین عضو لیست را پیدا کنید.

nums = [34, 7, 89, 12, 56]
lo = hi = nums[0]
for n in nums[1:]:
    if n < lo: lo = n
    if n > hi: hi = n
print(lo, hi)

خروجی:

7 89

تمرین 17: حذف تکراری‌ها با حفظ ترتیب

عضوهای تکراری لیست را حذف کنید اما ترتیب حفظ شود.

items = [3, 1, 3, 2, 1, 5]
seen, out = set(), []
for x in items:
    if x not in seen:
        seen.add(x)
        out.append(x)
print(out)

خروجی:

[3, 1, 2, 5]

تمرین 18: شمارش کلمات

تعداد تکرار هر کلمه در یک جمله را بشمارید.

text = "the cat and the dog and the bird"
counts = {}
for w in text.split():
    counts[w] = counts.get(w, 0) + 1
print(counts)

خروجی:

{'the': 3, 'cat': 1, 'and': 2, 'dog': 1, 'bird': 1}

تمرین 19: پالیندروم

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

def is_pal(s):
    s = "".join(s.lower().split())
    return s == s[::-1]

print(is_pal("Never odd or even"), is_pal("python"))

خروجی:

True False

تمرین 20: شمارش حروف صدادار

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

s = "Programming in Python"
print(sum(1 for ch in s.lower() if ch in "aeiou"))

خروجی:

5

تمرین 21: معکوس کردن کلمات

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

s = "learn python step by step"
print(" ".join(reversed(s.split())))

خروجی:

step by step python learn

تمرین 22: مربع اعداد زوج

با list comprehension مربع اعداد زوج ۱ تا ۲۰ را بسازید.

print([n * n for n in range(1, 21) if n % 2 == 0])

خروجی:

[4, 16, 36, 64, 100, 144, 196, 256, 324, 400]

تمرین 23: ادغام دو دیکشنری

دو دیکشنری قیمت را ادغام کنید؛ اگر کلید مشترک بود، مقدار دوم بماند.

a = {"pen": 10, "book": 120}
b = {"book": 100, "bag": 450}
print(a | b)

خروجی:

{'pen': 10, 'book': 100, 'bag': 450}

تمرین 24: معکوس کردن دیکشنری

جای کلید و مقدار دیکشنری را عوض کنید.

codes = {"IR": "Iran", "TR": "Turkey", "DE": "Germany"}
print({v: k for k, v in codes.items()})

خروجی:

{'Iran': 'IR', 'Turkey': 'TR', 'Germany': 'DE'}

تمرین 25: اشتراک و اختلاف لیست‌ها

عضوهای مشترک و عضوهای فقط در لیست اول را پیدا کنید.

a = [1, 2, 3, 4, 5]
b = [4, 5, 6, 7]
print(sorted(set(a) & set(b)), sorted(set(a) - set(b)))

خروجی:

[4, 5] [1, 2, 3]

تمرین 26: دومین عدد بزرگ

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

nums = [10, 40, 40, 25, 30]
print(sorted(set(nums))[-2])

خروجی:

30

تمرین 27: چرخش لیست

لیست را k خانه به راست بچرخانید.

def rotate(lst, k):
    k %= len(lst)
    return lst[-k:] + lst[:-k]

print(rotate([1, 2, 3, 4, 5], 2))

خروجی:

[4, 5, 1, 2, 3]

تمرین 28: صاف کردن لیست تودرتو

لیست دوسطحی را به یک لیست ساده تبدیل کنید.

matrix = [[1, 2], [3, 4, 5], [6]]
print([x for row in matrix for x in row])

خروجی:

[1, 2, 3, 4, 5, 6]

تمرین 29: گروه‌بندی بر اساس طول

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

words = ["hi", "cat", "dog", "tree", "go", "python"]
groups = {}
for w in words:
    groups.setdefault(len(w), []).append(w)
print(groups)

خروجی:

{2: ['hi', 'go'], 3: ['cat', 'dog'], 4: ['tree'], 6: ['python']}

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

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

students = [("Sara", 18.5), ("Reza", 15), ("Nima", 19.25)]
for name, score in sorted(students, key=lambda s: s[1], reverse=True):
    print(f"{name:5} {score}")

خروجی:

Nima  19.25
Sara  18.5
Reza  15

سطح ۳: الگوریتم‌ها و حل مسئله (۳۱ تا ۴۵)

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

تمرین 31: اعداد اول تا n

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

from math import isqrt

def primes(n):
    return [k for k in range(2, n + 1) if all(k % d for d in range(2, isqrt(k) + 1))]

print(primes(50))

خروجی:

[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47]

تمرین 32: دنباله فیبوناچی

n جمله اول فیبوناچی را تولید کنید.

def fib(n):
    a, b, out = 0, 1, []
    for _ in range(n):
        out.append(a)
        a, b = b, a + b
    return out

print(fib(12))

خروجی:

[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]

تمرین 33: ب.م.م و ک.م.م

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

def gcd(a, b):
    while b:
        a, b = b, a % b
    return a

a, b = 84, 120
print("gcd:", gcd(a, b), "lcm:", a * b // gcd(a, b))

خروجی:

gcd: 12 lcm: 840

تمرین 34: تبدیل ده‌دهی به دودویی

عدد را بدون bin به مبنای دو تبدیل کنید.

def to_bin(n):
    bits = ""
    while n > 0:
        bits = str(n % 2) + bits
        n //= 2
    return bits or "0"

print(to_bin(37), bin(37)[2:])

خروجی:

100101 100101

تمرین 35: عدد آرمسترانگ

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

print([n for n in range(100, 1000) if n == sum(int(d) ** 3 for d in str(n))])

خروجی:

[153, 370, 371, 407]

تمرین 36: عدد کامل

اعدادی زیر ۱۰۰۰۰ که برابر مجموع مقسوم‌علیه‌های کوچک‌ترشان هستند را پیدا کنید.

def is_perfect(n):
    s = 1
    d = 2
    while d * d <= n:
        if n % d == 0:
            s += d + (n // d if d != n // d else 0)
        d += 1
    return n > 1 and s == n

print([n for n in range(2, 10000) if is_perfect(n)])

خروجی:

[6, 28, 496, 8128]

تمرین 37: جستجوی دودویی

در لیست مرتب، جای یک عدد را با جستجوی دودویی پیدا کنید.

def bsearch(arr, x):
    lo, hi = 0, len(arr) - 1
    while lo <= hi:
        mid = (lo + hi) // 2
        if arr[mid] == x: return mid
        if arr[mid] < x: lo = mid + 1
        else: hi = mid - 1
    return -1

data = [3, 8, 15, 23, 42, 57, 91]
print(bsearch(data, 42), bsearch(data, 5))

خروجی:

4 -1

تمرین 38: مرتب‌سازی حبابی

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

def bubble(a):
    a = a[:]
    for i in range(len(a)):
        for j in range(len(a) - 1 - i):
            if a[j] > a[j + 1]:
                a[j], a[j + 1] = a[j + 1], a[j]
    return a

print(bubble([5, 2, 9, 1, 7]))

خروجی:

[1, 2, 5, 7, 9]

تمرین 39: آناگرام

بررسی کنید دو کلمه آناگرام هم هستند (حروف یکسان با ترتیب متفاوت).

from collections import Counter
print(Counter("listen") == Counter("silent"), Counter("apple") == Counter("pale"))

خروجی:

True False

تمرین 40: فشرده‌سازی رشته

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

def compress(s):
    out, i = "", 0
    while i < len(s):
        j = i
        while j < len(s) and s[j] == s[i]:
            j += 1
        out += s[i] + str(j - i)
        i = j
    return out

print(compress("aaabccdddd"))

خروجی:

a3b1c2d4

تمرین 41: ترانهاده ماتریس

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

m = [[1, 2, 3], [4, 5, 6]]
print([list(row) for row in zip(*m)])

خروجی:

[[1, 4], [2, 5], [3, 6]]

تمرین 42: مجموع ارقام بازگشتی

مجموع ارقام عدد را با تابع بازگشتی حساب کنید. اگر با بازگشت آشنا نیستید، ابتدا آموزش تابع بازگشتی در پایتون را ببینید.

def digit_sum(n):
    return n if n < 10 else n % 10 + digit_sum(n // 10)

print(digit_sum(98765))

خروجی:

35

تمرین 43: تولید رمز تصادفی

رمز ۱۲ کاراکتری امن با حروف، عدد و نماد بسازید (برای رمز واقعی از secrets استفاده کنید).

import secrets, string
chars = string.ascii_letters + string.digits + "!@#$%"
pwd = "".join(secrets.choice(chars) for _ in range(12))
print(len(pwd), all(c in chars for c in pwd))

خروجی:

12 True

تمرین 44: اعتبارسنجی کد ملی

الگوریتم رقم کنترل کد ملی ده‌رقمی را پیاده کنید.

def valid_national_id(code):
    if len(code) != 10 or not code.isdigit() or len(set(code)) == 1:
        return False
    s = sum(int(code[i]) * (10 - i) for i in range(9)) % 11
    check = int(code[9])
    return check == s if s < 2 else check == 11 - s

print(valid_national_id("0000000019"), valid_national_id("1234567890"))

خروجی:

True False

تمرین 45: تعداد روز تا تاریخ

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

from datetime import date
d1, d2 = date(2026, 10, 15), date(2027, 3, 21)
print((d2 - d1).days, "days")

خروجی:

157 days

سطح ۴: تمرین‌های سطح متوسط (۴۶ تا ۵۰)

این پنج تمرین شما را به مفاهیم سطح متوسط می‌برد: کلاس و شیء، فایل JSON، فایل متنی و ابزارهای پیشرفته‌تر تابع. ادامه این مسیر در دوره پایتون سطح متوسط است.

تمرین 46: کلاس حساب بانکی

کلاسی با واریز، برداشت و جلوگیری از برداشت بیش از موجودی بسازید.

class Account:
    def __init__(self, owner, balance=0):
        self.owner, self.balance = owner, balance
    def deposit(self, amount):
        self.balance += amount
    def withdraw(self, amount):
        if amount > self.balance:
            raise ValueError("insufficient funds")
        self.balance -= amount

acc = Account("Sara", 100)
acc.deposit(50)
acc.withdraw(30)
try:
    acc.withdraw(500)
except ValueError as e:
    print("error:", e)
print(acc.owner, acc.balance)

خروجی:

error: insufficient funds
Sara 120

تمرین 47: ذخیره و خواندن JSON

دیکشنری مخاطبان را در فایل JSON ذخیره و دوباره بخوانید.

import json
contacts = {"Ali": "0912-000-0000", "Mina": "0935-000-0000"}
with open("contacts.json", "w", encoding="utf-8") as f:
    json.dump(contacts, f, ensure_ascii=False)
with open("contacts.json", encoding="utf-8") as f:
    print(json.load(f))

خروجی:

{'Ali': '0912-000-0000', 'Mina': '0935-000-0000'}

تمرین 48: شمارش خطوط و کلمات فایل

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

from pathlib import Path
p = Path("note.txt")
p.write_text("first line\nsecond line here\nend\n", encoding="utf-8")
text = p.read_text(encoding="utf-8")
print(len(text.splitlines()), len(text.split()), len(text))

خروجی:

3 6 32

تمرین 49: دکوراتور زمان‌سنج

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

import time
from functools import wraps

def timer(fn):
    @wraps(fn)
    def wrapper(*args, **kwargs):
        t = time.perf_counter()
        result = fn(*args, **kwargs)
        print(f"{fn.__name__} took {(time.perf_counter() - t) * 1000:.1f} ms")
        return result
    return wrapper

@timer
def total(n):
    return sum(range(n))

print(total(1_000_000))

خروجی:

total took 8.0 ms
499999500000

اگر سینتکس @timer برایتان تازه است، آموزش دکوراتور در پایتون به زبان ساده را بخوانید تا بفهمید wrapper و functools.wraps دقیقاً چه کاری می‌کنند.

تمرین 50: ژنراتور اعداد زوج

ژنراتوری بنویسید که اعداد زوج را یکی‌یکی تولید کند.

def evens(limit):
    n = 0
    while n <= limit:
        yield n
        n += 2

g = evens(10)
print(next(g), next(g), list(g))

خروجی:

0 2 [4, 6, 8, 10]

بعد از این ۵۰ تمرین چه کنیم؟

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

📌 همچنین بخوانید: بازار کار پایتون در ایران، ساخت بازی با پایتون و Pygame و ساخت ربات با پایتون

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

سوالات متداول

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

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

اگر جواب من با جواب این صفحه فرق داشت چه کنم؟

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

این تمرین‌ها برای کدام نسخه پایتون هستند؟

همه با پایتون 3.13.5 اجرا شده‌اند و روی نسخه‌های جدید پایتون ۳ هم کار می‌کنند. عملگر | برای ادغام دیکشنری از پایتون ۳.۹ به بعد در دسترس است.

بعد از تمرین‌های مقدماتی چه چیزی یاد بگیرم؟

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

آموزش‌های مرتبط

آموزش‌های تازه، کد آماده و رفع خطاهر هفته در کانال Dev Source؛ رایگان.
🧭 مسیر یادگیری پایتون از صفر
ماژول 10: جمع‌بندی و پروژه پایانی — درس 43 از 44

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

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

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *