تمرین و حل مسئله یکی از بهترین روشها برای یادگیری و تقویت مهارتهای برنامهنویسی است. در این مقاله، ۱۰ تمرین ساده اما مفید برای یادگیری پایتون ارائه میکنیم. هر تمرین شامل توضیح مسئله، راهنمایی کوتاه، و یک پاسخ تشریحی است. این تمرینها برای برنامهنویسان مبتدی تا متوسط مناسب هستند. بیایید مستقیماً سراغ تمرین اول برویم.
تمرین ۱: شمارش تکرار حروف یک رشته
توضیح مسئله
برنامهای بنویسید که یک رشته ورودی را دریافت کند و تعداد تکرار هر حرف را در آن نمایش دهد. خروجی باید بهصورت یک دیکشنری باشد که کلیدهای آن حروف و مقادیر آن تعداد تکرار هر حرف باشد.
مثال ورودی و خروجی
ورودی:
text = "python programming"
خروجی مورد انتظار:
{'p': 2, 'y': 1, 't': 1, 'h': 1, 'o': 2, 'n': 2, ' ': 1, 'r': 2, 'g': 2, 'a': 1, 'm': 2, 'i': 1}
راهنمایی
- میتوانید از یک
dict
برای نگهداری تعداد تکرار هر کاراکتر استفاده کنید. - از
collections.Counter
هم میتوان استفاده کرد که راه سادهتری است.
پاسخ تشریحی
روش ۱: استفاده از حلقه for
def count_characters(text):
char_count = {} # یک دیکشنری خالی برای شمارش حروف
for char in text:
if char in char_count:
char_count[char] += 1
else:
char_count[char] = 1
return char_count
text = "python programming"
print(count_characters(text))
توضیح کد:
- یک دیکشنری خالی به نام
char_count
ایجاد میکنیم. - با یک حلقه
for
، روی تمام کاراکترهای متن ورودی پیمایش میکنیم. - اگر کاراکتر در دیکشنری وجود داشت، مقدار آن را یک واحد افزایش میدهیم. در غیر این صورت، مقدار اولیهی آن را ۱ قرار میدهیم.
- در نهایت، دیکشنری نهایی که شامل شمارش هر کاراکتر است، برگردانده میشود.
روش ۲: استفاده از collections.Counter
from collections import Counter
text = "python programming"
char_count = Counter(text)
print(char_count)
چرا این روش بهتر است؟
- این روش فقط در دو خط کد انجام میشود.
Counter
بهصورت داخلی همین عملیات شمارش را بهینه انجام میدهد.
تمرین ۲: پیدا کردن عدد گمشده در لیست
توضیح مسئله
یک لیست از اعداد متوالی از ۱ تا n داریم که یکی از اعداد آن بهطور تصادفی حذف شده است. برنامهای بنویسید که عدد گمشده را پیدا کند.
مثال ورودی و خروجی
ورودی:
numbers = [1, 2, 3, 4, 6, 7, 8, 9, 10]
خروجی مورد انتظار:
5
راهنمایی
- مجموع دنباله حسابی از ۱ تا n را میتوان با فرمول
n * (n + 1) // 2
محاسبه کرد. - مجموع مقادیر موجود در لیست را از این مقدار کم کنید تا عدد گمشده را پیدا کنید.
- همچنین میتوان از عملیات
set
استفاده کرد.
پاسخ تشریحی
روش ۱: استفاده از مجموع دنباله حسابی
def find_missing_number(numbers):
n = len(numbers) + 1 # تعداد کل اعداد باید یک واحد بیشتر از طول لیست باشد
expected_sum = n * (n + 1) // 2 # محاسبه مجموع دنباله ۱ تا n
actual_sum = sum(numbers) # محاسبه مجموع اعداد موجود در لیست
return expected_sum - actual_sum # اختلاف برابر با عدد گمشده است
numbers = [1, 2, 3, 4, 6, 7, 8, 9, 10]
print(find_missing_number(numbers)) # خروجی: 5
توضیح کد:
- تعداد کل اعداد (
n
) را برابر با طول لیست بهعلاوهی ۱ در نظر میگیریم. - مجموع مورد انتظار دنبالهی ۱ تا
n
را با استفاده از فرمول دنباله حسابی محاسبه میکنیم. - مجموع مقادیر واقعی در لیست را محاسبه کرده و از مجموع مورد انتظار کم میکنیم.
- مقدار باقیمانده همان عدد گمشده است.
روش ۲: استفاده از set
def find_missing_number_set(numbers):
n = len(numbers) + 1
full_set = set(range(1, n + 1)) # ایجاد مجموعه کامل اعداد از ۱ تا n
numbers_set = set(numbers) # تبدیل لیست ورودی به مجموعه
missing_number = full_set - numbers_set # پیدا کردن تفاوت بین دو مجموعه
return missing_number.pop() # استخراج مقدار باقیمانده
numbers = [1, 2, 3, 4, 6, 7, 8, 9, 10]
print(find_missing_number_set(numbers)) # خروجی: 5
چرا این روش جالب است؟
- از مزیتهای
set
استفاده میکند که جستجو در آن سریع است. - نیازی به انجام محاسبات ریاضی ندارد.
- کد خواناتر است.
تمرین ۳: تشخیص عدد اول
توضیح مسئله
برنامهای بنویسید که یک عدد را دریافت کند و تشخیص دهد که آیا عدد اول است یا خیر.
تعریف عدد اول
عدد اول، عددی بزرگتر از ۱ است که فقط دو مقسومعلیه دارد: ۱ و خودش.
مثال ورودی و خروجی
ورودی:
n = 29
خروجی مورد انتظار:
True # 29 یک عدد اول است
ورودی:
n = 15
خروجی:
False # 15 عدد اول نیست چون بر 3 و 5 بخشپذیر است
راهنمایی
- عددی که بر عددی کوچکتر از خودش (غیر از ۱) بخشپذیر باشد، اول نیست.
- نیازی به بررسی مقسومعلیههای بزرگتر از رادیکال آن عدد نیست، زیرا اگر عددی مقسومعلیه بزرگتر داشته باشد، یک مقسومعلیه کوچکتر از رادیکال هم خواهد داشت.
- بررسی بخشپذیری تا
√n
زمان اجرای بهتری نسبت به بررسی همه اعداد دارد.
پاسخ تشریحی
روش ۱: بررسی تمامی مقسومعلیهها تا n
def is_prime(n):
if n < 2:
return False # اعداد کمتر از 2 اول نیستند
for i in range(2, n):
if n % i == 0:
return False # اگر بر عددی بخشپذیر باشد، اول نیست
return True
print(is_prime(29)) # خروجی: True
print(is_prime(15)) # خروجی: False
مشکل این روش:
- زمان اجرای آن
O(n)
است، زیرا برای هر مقدارn
باید تاn-1
بررسی انجام شود. - برای اعداد بزرگ، کند خواهد شد.
روش ۲: بهینهسازی با بررسی تا √n
import math
def is_prime_optimized(n):
if n < 2:
return False
if n in (2, 3):
return True # 2 و 3 جزو اعداد اول هستند
if n % 2 == 0 or n % 3 == 0:
return False # اعداد زوج (غیر از 2) و مضارب 3 اول نیستند
for i in range(5, int(math.sqrt(n)) + 1, 2): # بررسی از ۵ تا √n با گام ۲ (فقط اعداد فرد)
if n % i == 0:
return False
return True
print(is_prime_optimized(29)) # خروجی: True
print(is_prime_optimized(15)) # خروجی: False
چرا این روش بهتر است؟
- به جای بررسی تمام اعداد تا
n
، فقط تا√n
را بررسی میکنیم. - به جای بررسی تمام اعداد، فقط اعداد فرد و غیرقابل تقسیم بر ۲ و ۳ را چک میکنیم.
- اجرای سریعتری نسبت به روش اول دارد، مخصوصاً برای اعداد بزرگ.
تمرین ۴: برعکس کردن رشته (بدون استفاده از توابع آماده)
توضیح مسئله
برنامهای بنویسید که یک رشته ورودی را دریافت کرده و آن را بدون استفاده از توابع آماده (مثل [::-1]
یا reversed()
) برعکس کند.
مثال ورودی و خروجی
ورودی:
text = "Python"
خروجی مورد انتظار:
"nohtyP"
راهنمایی
- از یک حلقه
for
برای پیمایش از انتهای رشته به ابتدا استفاده کنید. - از لیست و متد
join()
برای ساختن رشته برعکس استفاده کنید. - روش دیگر، استفاده از دو اشارهگر (Two Pointers) است که از دو سمت رشته حرکت میکنند و کاراکترها را جابهجا میکنند.
پاسخ تشریحی
روش ۱: استفاده از حلقه for
def reverse_string(text):
reversed_text = ""
for char in text:
reversed_text = char + reversed_text # کاراکتر جدید را در ابتدای رشته قرار میدهیم
return reversed_text
print(reverse_string("Python")) # خروجی: "nohtyP"
توضیح کد:
- متغیر
reversed_text
را بهصورت یک رشته خالی تعریف میکنیم. - با پیمایش روی
text
، هر کاراکتر جدید را در ابتدایreversed_text
اضافه میکنیم. - در نهایت، رشته معکوس شده را برمیگردانیم.
مشکل این روش:
- این روش کار میکند اما از نظر کارایی بهینه نیست، زیرا هر بار یک رشته جدید ساخته میشود (عملیات اضافه کردن به ابتدای رشته کند است).
روش ۲: استفاده از لیست و join()
def reverse_string_list(text):
reversed_chars = [] # لیست خالی برای نگهداری کاراکترها
for char in text:
reversed_chars.insert(0, char) # درج کاراکتر در ابتدای لیست
return "".join(reversed_chars) # تبدیل لیست به رشته
print(reverse_string_list("Python")) # خروجی: "nohtyP"
چرا این روش بهتر است؟
- لیستها تغییرپذیر هستند و عملیات
insert(0, char)
سریعتر از الحاق مستقیم به ابتدای رشته است. - در نهایت با
join()
تمام عناصر را به رشته تبدیل میکنیم.
روش ۳: استفاده از دو اشارهگر (بهینهترین روش)
def reverse_string_pointers(text):
text_list = list(text) # تبدیل رشته به لیست (زیرا رشتهها تغییرناپذیرند)
left, right = 0, len(text_list) - 1
while left < right:
text_list[left], text_list[right] = text_list[right], text_list[left] # جابجایی کاراکترها
left += 1
right -= 1
return "".join(text_list) # تبدیل لیست به رشته
print(reverse_string_pointers("Python")) # خروجی: "nohtyP"
چرا این روش بهتر است؟
- از دو اشارهگر برای جابهجایی مقدارها استفاده میکند.
- پیچیدگی زمانی
O(n/2)
دارد که سریعتر از روشهای قبلی است. - این روش دقیقاً همانکاری را انجام میدهد که در توابع داخلی
[::-1]
یاreversed()
انجام میشود.
تمرین ۵: حذف عناصر تکراری از یک لیست (حفظ ترتیب اولیه)
توضیح مسئله
برنامهای بنویسید که یک لیست از اعداد یا رشتهها را دریافت کند و عناصر تکراری را حذف کند، اما ترتیب اولیه لیست را حفظ کند.
مثال ورودی و خروجی
ورودی:
numbers = [1, 2, 3, 2, 4, 1, 5, 6, 3, 7]
خروجی مورد انتظار:
[1, 2, 3, 4, 5, 6, 7]
راهنمایی
- از
set
برای حذف تکراریها استفاده کنید، اما چونset
ترتیب را حفظ نمیکند، نمیتوان آن را مستقیماً به کار برد. - از یک لیست کمکی برای نگهداشتن عناصر یکتا استفاده کنید.
- روش دیگر، استفاده از
OrderedDict
درcollections
است که میتواند هم ترتیب را حفظ کند و هم عناصر تکراری را حذف کند.
پاسخ تشریحی
روش ۱: استفاده از لیست و set
def remove_duplicates(lst):
unique_list = []
seen = set()
for item in lst:
if item not in seen:
unique_list.append(item) # اگر قبلاً دیده نشده، اضافه شود
seen.add(item) # اضافه کردن به مجموعهی دیدهشدهها
return unique_list
numbers = [1, 2, 3, 2, 4, 1, 5, 6, 3, 7]
print(remove_duplicates(numbers)) # خروجی: [1, 2, 3, 4, 5, 6, 7]
توضیح کد:
- یک لیست
unique_list
برای ذخیره مقادیر یکتا و یکset
برای ذخیره موارد دیدهشده ایجاد میکنیم. - در حلقه
for
، بررسی میکنیم که آیا عنصر قبلاً درseen
وجود دارد یا نه. - اگر وجود ندارد، آن را به لیست
unique_list
اضافه کرده و درset
ثبت میکنیم.
چرا این روش خوب است؟
✅ ترتیب عناصر را حفظ میکند.
✅ پیچیدگی زمانی O(n)
دارد، چون هر عنصر فقط یک بار پردازش میشود.
روش ۲: استفاده از OrderedDict
from collections import OrderedDict
def remove_duplicates_ordered(lst):
return list(OrderedDict.fromkeys(lst)) # از OrderedDict برای حذف تکراریها و حفظ ترتیب استفاده میکنیم
numbers = [1, 2, 3, 2, 4, 1, 5, 6, 3, 7]
print(remove_duplicates_ordered(numbers)) # خروجی: [1, 2, 3, 4, 5, 6, 7]
چرا این روش جالب است؟
OrderedDict.fromkeys(lst)
بهطور خودکار کلیدها (عناصر لیست) را در ترتیب اصلی حفظ میکند و تکراریها را حذف میکند.- بسیار کوتاه و خوانا است!
- زمان اجرای مشابه روش قبلی (
O(n)
) دارد.
تمرین ۶: مجموع اعداد موجود در یک رشته
توضیح مسئله
برنامهای بنویسید که یک رشتهی شامل حروف و اعداد را دریافت کرده و مجموع تمام اعداد داخل آن را محاسبه کند.
مثال ورودی و خروجی
ورودی:
text = "abc123xyz45lmn7"
خروجی مورد انتظار:
175 # مجموع 123 + 45 + 7
راهنمایی
- میتوان از یک حلقه برای پیمایش روی رشته استفاده کرد و اعداد را استخراج کرد.
- از ماژول
re
(Regular Expressions) نیز میتوان برای یافتن سریع تمام اعداد استفاده کرد.
پاسخ تشریحی
روش ۱: استفاده از حلقه و متغیر کمکی
def sum_numbers_in_string(text):
total_sum = 0 # متغیر برای ذخیره مجموع
current_number = "" # متغیر برای نگهداری عدد فعلی
for char in text:
if char.isdigit(): # اگر کاراکتر عددی است، به current_number اضافه شود
current_number += char
else:
if current_number: # اگر عددی قبلاً ساخته شده، آن را به مجموع اضافه کن
total_sum += int(current_number)
current_number = "" # ریست کردن متغیر برای عدد بعدی
if current_number: # بررسی آخرین عدد (در صورتی که در انتهای رشته باشد)
total_sum += int(current_number)
return total_sum
text = "abc123xyz45lmn7"
print(sum_numbers_in_string(text)) # خروجی: 175
توضیح کد:
- دو متغیر
total_sum
برای ذخیره مجموع وcurrent_number
برای نگهداری عدد فعلی تعریف میکنیم. - روی
text
پیمایش میکنیم:
- اگر کاراکتر عددی بود، آن را به
current_number
اضافه میکنیم. - اگر غیرعددی بود، مقدار
current_number
را به عدد تبدیل کرده و به مجموع اضافه میکنیم. - در انتها، اگر رشته به عدد ختم شود، بررسی میکنیم که مقدار نهایی اضافه شود.
- مقدار نهایی
total_sum
را برمیگردانیم.
چرا این روش کار میکند؟
✅ از حلقه for
و متغیر کمکی استفاده کرده و نیازی به کتابخانه اضافی ندارد.
✅ برای پردازش رشتههایی که شامل اعداد طولانی هستند، عملکرد مناسبی دارد.
روش ۲: استفاده از re
(تعبیر با عبارات منظم)
import re
def sum_numbers_regex(text):
numbers = re.findall(r'\d+', text) # پیدا کردن همه اعداد متوالی در رشته
return sum(map(int, numbers)) # تبدیل لیست اعداد به عدد صحیح و محاسبه مجموع
text = "abc123xyz45lmn7"
print(sum_numbers_regex(text)) # خروجی: 175
چرا این روش بهتر است؟
re.findall(r'\d+', text)
تمام اعداد متوالی را در یک لیست استخراج میکند.map(int, numbers)
اعداد را از رشته به عدد تبدیل میکند.- بسیار سریع و خوانا است و در یک خط کد کار را انجام میدهد!
تمرین ۷: یافتن دو عدد در لیست که مجموعشان مقدار مشخصی شود
توضیح مسئله
برنامهای بنویسید که یک لیست از اعداد و یک عدد هدف دریافت کند و دو عدد از لیست را پیدا کند که مجموعشان برابر عدد هدف باشد. اگر چنین زوجی وجود نداشت، مقدار None
برگرداند.
مثال ورودی و خروجی
ورودی:
numbers = [2, 7, 11, 15]
target = 9
خروجی مورد انتظار:
(2, 7) # چون 2 + 7 برابر 9 است
راهنمایی
- میتوان از حلقه تو در تو استفاده کرد، اما این روش کند است (
O(n²)
). - روش بهینهتر استفاده از
set
یاdict
برای بررسی سریعتر مقادیر است (O(n)
).
پاسخ تشریحی
روش ۱: استفاده از دو حلقه (روش ساده اما ناکارآمد)
def find_pair_bruteforce(numbers, target):
for i in range(len(numbers)):
for j in range(i + 1, len(numbers)): # بررسی تمام جفتها
if numbers[i] + numbers[j] == target:
return (numbers[i], numbers[j])
return None
numbers = [2, 7, 11, 15]
target = 9
print(find_pair_bruteforce(numbers, target)) # خروجی: (2, 7)
چرا این روش کند است؟
- در بدترین حالت، همه جفتها را بررسی میکند (
O(n²)
). - برای لیستهای طولانی، کارایی خوبی ندارد.
روش ۲: استفاده از set
برای بهینهسازی
def find_pair_optimized(numbers, target):
seen = set() # مجموعه برای نگه داشتن اعداد دیدهشده
for num in numbers:
complement = target - num # عدد مورد نیاز برای رسیدن به target
if complement in seen:
return (complement, num) # زوج مناسب پیدا شد
seen.add(num) # اضافه کردن عدد فعلی به مجموعه
return None
numbers = [2, 7, 11, 15]
target = 9
print(find_pair_optimized(numbers, target)) # خروجی: (2, 7)
چرا این روش بهتر است؟
✅ زمان اجرا O(n)
است، چون فقط یک بار روی لیست حرکت میکنیم.
✅ از set
برای بررسی سریعتر (O(1)
) استفاده میشود.
تمرین ۸: تبدیل حروف کوچک به بزرگ و برعکس
توضیح مسئله
برنامهای بنویسید که یک رشته ورودی را دریافت کند و تمام حروف کوچک را به بزرگ و حروف بزرگ را به کوچک تبدیل کند. بقیه کاراکترها (اعداد، فاصله، نشانهگذاری و …) بدون تغییر باقی بمانند.
مثال ورودی و خروجی
ورودی:
text = "PyThOn 123!"
خروجی مورد انتظار:
"pYtHoN 123!"
راهنمایی
- میتوان از حلقه
for
و متدهایisupper()
وislower()
برای بررسی نوع حروف استفاده کرد. - روش بهینهتر استفاده از متد آماده
swapcase()
است که همین کار را انجام میدهد.
پاسخ تشریحی
روش ۱: استفاده از for
و بررسی دستی
def swap_case_manual(text):
new_text = ""
for char in text:
if char.isupper():
new_text += char.lower() # تبدیل به کوچک
elif char.islower():
new_text += char.upper() # تبدیل به بزرگ
else:
new_text += char # اگر کاراکتر حرف نبود، بدون تغییر اضافه شود
return new_text
text = "PyThOn 123!"
print(swap_case_manual(text)) # خروجی: "pYtHoN 123!"
چرا این روش کار میکند؟
✅ از متدهای isupper()
و islower()
برای تشخیص حروف بزرگ و کوچک استفاده کردهایم.
✅ در هر مرحله فقط یک تغییر انجام میشود، بنابراین ترتیب حفظ میشود.
روش ۲: استفاده از متد آماده swapcase()
def swap_case_builtin(text):
return text.swapcase() # خودکار تمام حروف را برعکس میکند
text = "PyThOn 123!"
print(swap_case_builtin(text)) # خروجی: "pYtHoN 123!"
چرا این روش بهتر است؟
- بسیار سریع و خوانا است.
- در یک خط کد عملیات را انجام میدهد.
- از نظر عملکرد، متد
swapcase()
از لحاظ بهینهسازی داخلی سریعتر از حلقه دستی است.
تمرین ۹: پیدا کردن طولانیترین کلمه در یک جمله
توضیح مسئله
برنامهای بنویسید که یک جمله را دریافت کند و طولانیترین کلمه را از آن استخراج کند. اگر چندین کلمه با بیشترین طول وجود داشتند، اولین مورد را برگرداند.
مثال ورودی و خروجی
ورودی:
sentence = "Python is an amazing programming language"
خروجی مورد انتظار:
"programming"
راهنمایی
- میتوان از
split()
برای جدا کردن کلمات جمله استفاده کرد. - از حلقه
for
برای بررسی طول هر کلمه استفاده کنید. - روش سادهتر، استفاده از
max()
همراه با پارامترkey=len
است.
پاسخ تشریحی
روش ۱: استفاده از for
و متغیر کمکی
def longest_word(sentence):
words = sentence.split() # جدا کردن کلمات با توجه به فاصلهها
longest = "" # متغیر برای نگهداشتن طولانیترین کلمه
for word in words:
if len(word) > len(longest):
longest = word # جایگزینی در صورت پیدا کردن کلمه طولانیتر
return longest
sentence = "Python is an amazing programming language"
print(longest_word(sentence)) # خروجی: "programming"
چرا این روش کار میکند؟
✅ ابتدا جمله را به لیستی از کلمات تبدیل میکنیم.
✅ سپس با یک حلقه، طول هر کلمه را بررسی کرده و در صورت نیاز مقدار longest
را بهروز میکنیم.
روش ۲: استفاده از max()
با key=len
def longest_word_max(sentence):
words = sentence.split()
return max(words, key=len) # پیدا کردن بیشترین مقدار بر اساس طول کلمه
sentence = "Python is an amazing programming language"
print(longest_word_max(sentence)) # خروجی: "programming"
چرا این روش بهتر است؟
✅ از تابع max()
برای یافتن طولانیترین مقدار در یک خط استفاده میکنیم.
✅ کد سادهتر و خواناتر است.
✅ زمان اجرا بهینهتر است زیرا مستقیماً مقدار بیشینه را پیدا میکند.
تمرین ۱۰: فاکتوریل یک عدد (بهینه و بازگشتی)
توضیح مسئله
برنامهای بنویسید که یک عدد صحیح مثبت دریافت کرده و فاکتوریل آن را محاسبه کند.
(فاکتوریل n!
برابر است با n × (n-1) × ... × 2 × 1
و مقدار 0!
برابر ۱ است.)
مثال ورودی و خروجی
ورودی:
n = 5
خروجی مورد انتظار:
120 # چون 5 × 4 × 3 × 2 × 1 = 120
راهنمایی
- میتوان از یک حلقه
for
برای محاسبه فاکتوریل استفاده کرد. - روش بازگشتی (Recursive) نیز برای این مسئله پرکاربرد است.
- برای اعداد خیلی بزرگ،
math.factorial()
سریعترین گزینه است.
پاسخ تشریحی
روش ۱: استفاده از for
(روش ساده و بهینه)
def factorial_iterative(n):
if n == 0 or n == 1:
return 1 # مقدار 0! و 1! برابر 1 است
result = 1
for i in range(2, n + 1): # از 2 تا n ضرب میکنیم
result *= i
return result
print(factorial_iterative(5)) # خروجی: 120
print(factorial_iterative(10)) # خروجی: 3628800
چرا این روش خوب است؟
✅ بدون نیاز به تابع بازگشتی کار میکند.
✅ پیچیدگی زمانی O(n) دارد که برای مقادیر بزرگ مناسب است.
✅ حلقه for
ساده و خواناست.
روش ۲: استفاده از بازگشت (Recursive)
def factorial_recursive(n):
if n == 0 or n == 1:
return 1 # مقدار 0! و 1! برابر 1 است
return n * factorial_recursive(n - 1) # فراخوانی بازگشتی
print(factorial_recursive(5)) # خروجی: 120
مشکل این روش چیست؟
- ممکن است باعث سرریز شدن پشته (Stack Overflow) برای اعداد بزرگ شود.
- سرعت اجرای آن نسبت به روش
for
کندتر است. - پیچیدگی زمانی
O(n)
است، اما بهخاطر فراخوانیهای بازگشتی، حافظه بیشتری مصرف میکند.
روش ۳: استفاده از math.factorial()
(بهترین روش برای اعداد خیلی بزرگ)
import math
def factorial_math(n):
return math.factorial(n) # سریعترین روش برای محاسبه فاکتوریل
print(factorial_math(5)) # خروجی: 120
print(factorial_math(100)) # عددی بسیار بزرگ را محاسبه میکند
چرا این روش عالی است؟
✅ از الگوریتمهای داخلی بهینهشده در Python استفاده میکند.
✅ برای اعداد خیلی بزرگ (مثل 100!) بدون خطای پشته اجرا میشود.
✅ خواناترین روش است.
جمعبندی
در این مقاله، ۱۰ تمرین کاربردی برای تقویت مهارتهای پایتون را بررسی کردیم. این تمرینها از مسائل ساده تا تکنیکهای بهینهسازی را پوشش دادند و برای توسعه مهارتهای برنامهنویسی مفید هستند.
✅ مباحث کلیدی که یاد گرفتیم:
- کار با رشتهها و لیستها (مثل برعکس کردن رشته و حذف عناصر تکراری)
- کار با اعداد و ریاضیات (مثل فاکتوریل و تشخیص عدد اول)
- مدیریت دادهها و مجموعهها (مثل شمارش تکرار کاراکترها و یافتن دو عدد با مجموع مشخص)
- بهینهسازی الگوریتمها (استفاده از
set
،dict
وmath
برای بهبود کارایی) - استفاده از کتابخانههای داخلی پایتون (
re
،collections
،math
) برای حل مسائل بهصورت کارآمد
📌 تمرین بیشتر:
اگر میخواهی مهارتهای پایتونت را بیشتر تقویت کنی، میتوانی:
- تمرینهای مشابه را با دادههای مختلف اجرا کنی.
- سعی کنی روشهای بهینهتر و جدیدتری برای حل مسائل پیدا کنی.
- همین تمرینها را با استفاده از برنامهنویسی شیگرا (OOP) پیادهسازی کنی.
دیدگاهها