تمرین۱ : برنامه خوشامدگویی ساده
تابعی به نام welcome بنویسید که یک نام (رشته) را به عنوان پارامتر ورودی بگیرد و یک پیام خوشامدگویی شامل آن نام را چاپ کند. فرض کنید میخواهیم پس از ورود کاربر به برنامه، با ذکر نام به او خوشامد بگوییم. ورودی از کاربر: یک نام. خروجی نمونه: اگر ورودی “علی” باشد، تابع پیام “علی عزیز، خوش آمدی!” را نمایش دهد.
def welcome(name):
print(f"{name} عزیز، خوش آمدی!")
# دریافت نام از کاربر و استفاده از تابع
user_name = input("نام شما چیست؟ ")
welcome(user_name)
این برنامه, تابع welcome را با استفاده از کلیدواژه def تعریف میکند. تابع یک پارامتر name دارد و با استفاده از تابع print پیام خوشامدگویی را در خروجی نمایش میدهد. سپس در بخش اصلی برنامه، نام کاربر با دستور input گرفته شده و به عنوان آرگومان به تابع welcome فرستاده میشود. (در اینجا تابع مقداری برنمیگرداند و فقط نمایش انجام میدهد.)
تمرین2 : مجذور یک عدد
تابعی به نام square بنویسید که یک عدد صحیح را به عنوان ورودی بگیرد و مجذور (توان ۲) آن عدد را محاسبه کرده و برگرداند. برنامهای که مساحت یک مربع را از روی طول ضلع آن محاسبه میکند (طول ضلع ورودی کاربر است).
ورودی از کاربر: یک عدد صحیح (مثلاً ۵).
خروجی نمونه: اگر ورودی ۵ باشد، خروجی تابع ۲۵ خواهد بود.
def square(n):
result = n * n
return result
# دریافت عدد از کاربر و استفاده از تابع
num = int(input("یک عدد برای مجذور گرفتن وارد کنید: "))
squared = square(num)
print(f"مجذور {num} برابر است با {squared}")
تابع square یک پارامتر n دارد و مقدار مجذور آن را محاسبه میکند. برای برگرداندن نتیجه به بخش اصلی برنامه از دستور return استفاده شده است. هنگام اجرای برنامه، کاربر یک عدد وارد میکند؛ این مقدار به نوع int تبدیل شده و سپس به تابع square ارسال میشود. نتیجه بازگشتی در متغیر squared ذخیره و در خروجی چاپ میشود.
تمرین ۳:تشخیص زوج یا فرد بودن
تابعی به نام is_even بنویسید که یک عدد صحیح را به عنوان ورودی بگیرد و مشخص کند عدد زوج است یا فرد.برنامهای که کاربر یک عدد وارد میکند و تابع اعلام میکند این عدد زوج است یا فرد (مثلاً برای نمایش در یک بازی یا فرم اطلاعات).
ورودی از کاربر: یک عدد صحیح. خروجی نمونه: اگر ورودی ۴ باشد، تابع پیامی چاپ کند که «عدد ۴ زوج است.»؛ اگر ورودی ۷ باشد پیام «عدد ۷ فرد است.» نمایش دهد.
def is_even(n):
if n % 2 == 0:
print(f"عدد {n} زوج است.")
else:
print(f"عدد {n} فرد است.")
# دریافت عدد از کاربر و استفاده از تابع
number = int(input("یک عدد صحیح وارد کنید: "))
is_even(number)
تابع is_even با استفاده از عملگر % باقیماندهی تقسیم عدد را بر ۲ محاسبه میکند. اگر باقیمانده صفر باشد عدد زوج است، در غیر این صورت فرد است. در اینجا از ساختار شرطی if/else برای تصمیمگیری استفاده شده است. پس از تعریف تابع، برنامه عدد را از ورودی خوانده و تابع را صدا میزند. (تابع نیازی به return ندارد چون فقط نتیجه را چاپ میکند.)
تمرین 4:جمع دو عدد
تابعی به نام add بنویسید که دو عدد را به عنوان پارامتر بپذیرد و حاصل جمع آنها را برگرداند.فرض کنید میخواهیم مجموع دو نمرهی امتحانی دانشآموز را محاسبه کنیم.
ورودی از کاربر: دو عدد (مثلاً ۱۲ و ۱۸).
خروجی نمونه: اگر ورودیها ۱۲ و ۱۸ باشند، نتیجهی برگشتی تابع ۳۰ خواهد بود.
def add(a, b):
return a + b
# دریافت دو عدد از کاربر و استفاده از تابع
x = float(input("عدد اول را وارد کنید: "))
y = float(input("عدد دوم را وارد کنید: "))
result = add(x, y)
print(f"حاصل جمع {x} و {y} برابر است با {result}")
این تابع دارای دو پارامتر a و b است. داخل بدنهی تابع مستقیماً از عبارت a + b برای جمع استفاده شده و نتیجه با return برگردانده میشود. در کد اصلی، دو عدد (که میتوانند اعشاری باشند) از ورودی دریافت و به تابع add فرستاده میشوند. مقدار برگشتی تابع در متغیر result ذخیره شده و سپس چاپ میگردد.
تمرین 5:بزرگترین عدد (بین دو عدد)
تابعی به نام max_of_two بنویسید که دو عدد را دریافت کرده و عدد بزرگتر را مشخص کند (برگرداند یا چاپ کند). یک برنامه مقایسه سن افراد دو نفر؛ کاربر سن دو نفر را وارد میکند و تابع اعلام میکند کدام سن بیشتر است.
ورودی: دو عدد (مثلاً ۳۰ و ۲۵).
خروجی نمونه: پیام «۳۰ از ۲۵ بزرگتر است.» یا بازگرداندن عدد ۳۰.
def max_of_two(x, y):
if x > y:
return x
else:
return y
# دریافت سن دو نفر از کاربر و استفاده از تابع
age1 = int(input("سن نفر اول: "))
age2 = int(input("سن نفر دوم: "))
bigger = max_of_two(age1, age2)
print(f"بزرگترین مقدار بین {age1} و {age2} برابر {bigger} است.")
تابع max_of_two با یک ساختار شرطی ساده بررسی میکند کدام پارامتر بزرگتر است و همان را برمیگرداند. اگر مقدار x بزرگتر یا مساوی y باشد، نتیجهی تابع x خواهد بود، در غیر این صورت y را برمیگرداند. سپس در برنامه اصلی، سن دو نفر از ورودی گرفته شده و برای یافتن بزرگترین مقدار به تابع ارسال میشود. مقدار برگشتی (سن بزرگتر) در متغیر bigger ذخیره و چاپ میشود.
تمرین 6:بزرگترین عدد (بین سه عدد)
تابعی به نام max_of_three بنویسید که سه عدد را به عنوان پارامتر بگیرد و بزرگترینِ آنها را برگرداند. فرض کنید سه شرکتکننده در مسابقه امتیازاتی کسب کردهاند؛ میخواهیم بدانیم بیشترین امتیاز مربوط به چه کسی است.
ورودی از کاربر: سه عدد (مثلاً ۴۵، ۷۰ و ۶۶).
خروجی نمونه: اگر این اعداد ورودی باشند، خروجی تابع ۷۰ خواهد بود (بیشترین امتیاز).
def max_of_three(a, b, c):
max_val = a
if b > max_val:
max_val = b
if c > max_val:
max_val = c
return max_val
# دریافت سه عدد از کاربر و استفاده از تابع
num1 = float(input("عدد اول: "))
num2 = float(input("عدد دوم: "))
num3 = float(input("عدد سوم: "))
maximum = max_of_three(num1, num2, num3)
print(f"بزرگترین عدد بین مقادیر وارد شده برابر {maximum} است.")
در این تابع برای یافتن بزرگترین عدد، ابتدا max_val را برابر اولین پارامتر a قرار دادهایم. سپس با دو شرط پیاپی مقدار max_val را با b و c مقایسه میکنیم و در صورت بزرگتر بودن هر کدام، مقدار جدید را در max_val ذخیره میکنیم. در پایان، max_val که حاوی بیشترین مقدار است بازگردانده میشود. (میتوانستیم از تابع داخلی max نیز استفاده کنیم، اما این روش دستی برای درک بهتر منطق مقایسه است.) با گرفتن سه ورودی از کاربر و فراخوانی تابع، بیشترین عدد محاسبه و گزارش میشود.
تمرین 7:توان با پارامتر پیشفرض
تابعی به نام power بنویسید که دو پارامتر عددی داشته باشد: base (پایه) و exp (توان)؛ به طوری که پارامتر exp پیشفرضاً ۲ در نظر گرفته شود. این تابع مقدار base به توان exp را محاسبه کرده و برگرداند. کاربر یک عدد را وارد میکند و میخواهد به طور پیشفرض مجذور آن حساب شود؛ اما اگر کاربر توان دیگری نیز وارد کرد، تابع آن را هم محاسبه کند.
ورودی از کاربر: یک عدد پایه و (اختیاری) یک عدد توان.
خروجی نمونه: برای ورودی پایه ۳ (بدون ذکر توان) خروجی ۹ (مجذور) خواهد بود؛ و برای ورودی ۳ و توان ۳، خروجی ۲۷ خواهد بود.
def power(base, exp=2):
result = 1
for i in range(exp):
result *= base
return result
# دریافت ورودی از کاربر
base_val = float(input("عدد پایه را وارد کنید: "))
# پرسش توان به صورت اختیاری
exp_input = input("توان (در صورت عدم ورود، توان ۲ در نظر گرفته میشود): ")
if exp_input.strip() == "":
# کاربر مقداری برای توان نداده است
print(f"{base_val} به توان ۲ = {power(base_val)}") # استفاده از مقدار پیشفرض exp=2
else:
exp_val = int(exp_input)
print(f"{base_val} به توان {exp_val} = {power(base_val, exp_val)}")
در تعریف این تابع، برای پارامتر exp مقدار پیشفرض 2 تعیین شده است. بدین ترتیب اگر در زمان فراخوانی، آرگومان دوم را ندهیم، تابع به طور خودکار exp=2 را در نظر میگیرد. در پیادهسازی، تابع با یک حلقه for، مقدار پایه را به تعداد مرتبههای توان در خود ضرب میکند (در نتیجه از بهکارگیری مستیم عملگر ** صرفنظر کردیم تا مفهوم حلقه تکرار روشن شود). در برنامه اصلی، ابتدا پایه از ورودی گرفته میشود؛ سپس از کاربر پرسیده میشود که آیا توان را وارد میکند یا نه. اگر کاربر ورودی توان را خالی بگذارد، تابع تنها با یک آرگومان (base_val) صدا زده میشود که در این حالت از توان پیشفرض ۲ استفاده میکند. در غیر این صورت، مقدار توان ورودی به عدد تبدیل شده و تابع با هر دو آرگومان فراخوانی میشود. این روش به کاربر امکان میدهد که توابع با آرگومان پیشفرض را در عمل ببیند. (توجه: در خود پایتون، مقدار پیشفرض پارامترها در زمان تعریف تابع تعیین میشود نه زمان اجرا.)
تمرین 8: جمع مقادیر دلخواه
تابعی بنویسید که بتواند هر تعداد عدد را به عنوان ورودی بپذیرد و مجموع آنها را محاسبه کند. یک برنامه حسابداری که ممکن است بخواهد مجموع لیستی از مبالغ با تعداد متغیر را حساب کند. چون تعداد اعداد مشخص نیست، باید تابع انعطاف پذیر باشد. ورودی از کاربر: کاربر چند عدد دلخواه را در یک خط وارد میکند.
خروجی نمونه: اگر کاربر اعداد 5 10 15 را وارد کند، نتیجهی چاپشده باید ۳۰ باشد.
def sum_all(*numbers):
total = 0
for n in numbers:
total += n
return total
# دریافت چند عدد از کاربر در یک خط
nums_input = input("چند عدد را با فاصله وارد کنید: ")
nums_list = [] # تبدیل ورودی به لیست اعداد
for part in nums_input.split():
if part.isdigit() or (part.startswith('-') and part[1:].isdigit()):
nums_list.append(int(part))
# فراخوانی تابع با استفاده از عملگر unpacking برای *args
result = sum_all(*nums_list)
print(f"مجموع اعداد وارد شده برابر {result} است.")
در تعریف تابع ازدستور numbers* استفاده شده که امکان میدهد هر تعداد آرگومان عددی به تابع ارسال شود. داخل تابع، همه آرگومانها به صورت یک تاپل در متغیر numbers در دسترس هستند؛ سپس با یک حلقه for روی این تاپل، تمام مقادیر جمع میشوند. در قسمت اصلی، اعداد را از یک خط ورودی دریافت کرده و با متد split() آنها را از هم جدا میکنیم. پس از تبدیل رشتهها به int و آمادهسازی لیست nums_list، از عملگر * (ستاره) برای باز کردن لیست به صورت چند آرگومان در زمان فراخوانی تابع استفاده کردهایم. این اجازه میدهد لیستی از مقادیر به شکل آرگومانهای متعددی به تابع فرستاده شود. در نهایت نتیجه برگشتی تابع sum_all چاپ میشود.
تمرین 9:تقسیم و باقیمانده (چند مقدار بازگشتی)
تابعی به نام divide بنویسید که دو عدد صحیح (مثلاً تعداد کل شکلاتها و تعداد افراد) را بگیرد و تعداد تقسیمشدهی مساوی بین افراد و باقیمانده را به صورت دو مقدار بازگشتی بدهد. فرض کنید x شکلات داریم و میخواهیم به y نفر به طور مساوی تقسیم کنیم و ببینیم به هر نفر چندتا میرسد و چند شکلات اضافه میماند.
ورودی از کاربر: دو عدد (کل شکلاتها و تعداد نفرات). خروجی نمونه: برای ورودی 17 شکلات و 3 نفر، تابع باید (5, 2) برگرداند (۵ شکلات به هر نفر میرسد و ۲ تا اضافه میماند).
def divide(total, people):
if people == 0:
raise ValueError("تعداد نفرات نمیتواند صفر باشد!")
quotient = total // people # خارج قسمت صحیح
remainder = total % people # باقیمانده
return quotient, remainder
# دریافت ورودی از کاربر
total_chocolates = int(input("تعداد کل شکلاتها: "))
num_people = int(input("تعداد افراد: "))
q, r = divide(total_chocolates, num_people)
print(f"به هر نفر {q} شکلات میرسد و {r} شکلات اضافه میماند.")
این تابع از دو عملگر ریاضی % و // به ترتیب برای بهدستآوردن باقیمانده و خارجقسمت استفاده میکند. در صورت صفر بودن ورودی people، یک خطا ایجاد میکنیم (با raise) تا از تقسیم بر صفر جلوگیری شود. تابع با یک دستور return دو مقدار را برمیگرداند که در واقع یک تاپل حاوی خارجقسمت و باقیمانده است. هنگام فراخوانی، میتوان این دو مقدار را به دو متغیر جداگانه (q و r) نسبت داد. برای مثال، در سناریوی شکلات، اگر total=17 و people=3 باشد، تابع مقدار (5, 2) را برمیگرداند که به ترتیب در متغیرهای q و r ذخیره و سپس چاپ میشوند. (برگرداندن چند مقدار به این شکل یکی از قابلیتهای پایتون است.)
تمرین ۱۰:مجموع ۱ تا n
تابعی به نام sum_to_n بنویسید که یک عدد مثبت n را دریافت کند و مجموع اعداد ۱ تا n را محاسبه و برگرداند.فرض کنید میخواهیم مجموع اعداد ۱ تا تعداد طبقات یک ساختمان را حساب کنیم (به عنوان یک محاسبه فرضی). ورودی از کاربر: یک عدد صحیح مثبت. خروجی نمونه: اگر ورودی 5 باشد، خروجی تابع باید 15 باشد (زیرا ۱+۲+۳+۴+۵=۱۵).
def sum_to_n(n):
"""مجموع اعداد ۱ تا n را محاسبه و برمیگرداند."""
total = 0
for i in range(1, n+1):
total += i
return total
# دریافت ورودی از کاربر و استفاده از تابع
end = int(input("محاسبه مجموع تا عدد: "))
result = sum_to_n(end)
print(f"مجموع اعداد ۱ تا {end} برابر است با {result}")
در این تابع از یک حلقه for استفاده شده که از ۱ تا خود عدد n را پیمایش میکند و جمع کل را در متغیر total نگه میدارد. در پایان، مقدار total (که مجموع ۱ تا n است) بازگردانده میشود. این روش پیادهسازی درکی از محاسبه جمع به صورت مرحلهبهمرحله میدهد. (البته فرمول مستقیم ریاضی نیز برای این کار وجود دارد، اما هدف تمرین، بهکارگیری حلقه است). برنامه اصلی عدد n را از ورودی میگیرد و با صدا زدن تابع نتیجه را چاپ میکند.
تمرین ۱۱:تکرار یک کلمه n بار
تابعی به نام repeat_word بنویسید که دو ورودی داشته باشد: یک رشته (کلمه) و یک عدد صحیح n، سپس آن کلمه را n بار روی صفحه چاپ کند. برای تزئین خروجی یا تاکید، گاهی لازم است یک کلمه چند مرتبه تکرار شود (مثلاً نمایش بنر خوشامدگویی چندبار).
ورودی از کاربر: یک کلمه و یک عدد تعداد تکرار.
خروجی نمونه: اگر ورودی کلمه “سلام” و عدد ۳ باشد، خروجی باید سه خط شامل «سلام» باشد (یا در یک خط با فاصله، بسته به نیاز سوال).
def repeat_word(word, count):
for i in range(count):
print(word)
# دریافت ورودی از کاربر
w = input("کلمهای برای تکرار: ")
n = int(input("چند بار تکرار شود؟ "))
repeat_word(w, n)
تابع repeat_word از یک حلقه for برای تکرار چاپ کلمه استفاده میکند. ساختار for i in range(count) باعث میشود بدنهی حلقه به تعداد count مرتبه اجرا شود. در هر تکرار، کلمهی ورودی بدون هیچ تغییری چاپ میشود. با گرفتن کلمه و تعداد از کاربر، تابع فراخوانی شده و کلمه را به تعداد دلخواه تکرار میکند. (توجه: اگر count صفر باشد، حلقه اصلاً اجرا نخواهد شد و هیچ خروجی چاپ نمیشود.)
تمرین ۱۲:تکرار یک کلمه n بار
تابعی به نام max_in_list بنویسید که یک لیست از اعداد را به عنوان آرگومان بپذیرد و بزرگترین مقدار در آن لیست را پیدا کرده و برگرداند. یک مسابقه برگزار شده و امتیازات شرکتکنندگان در یک لیست ثبت شده است؛ میخواهیم بالاترین امتیاز را بیابیم.
ورودی از کاربر: تعدادی عدد در قالب لیست (مثلاً [4, 11, 2, 9]).
خروجی نمونه: برای لیست [4, 11, 2, 9] مقدار برگشتی باید 11 باشد.
def max_in_list(numbers):
if not numbers:
return None # در صورت خالی بودن لیست
max_val = numbers[0]
for num in numbers:
if num > max_val:
max_val = num
return max_val
# دریافت لیست از کاربر (اعداد جداشده با فاصله) و استفاده از تابع
nums_input = input("لیستی از اعداد را با فاصله وارد کنید: ")
nums_list = [float(x) for x in nums_input.split()] # تبدیل به لیست اعداد اعشاری
largest = max_in_list(nums_list)
if largest is not None:
print(f"بزرگترین مقدار لیست برابر {largest} است.")
else:
print("لیست خالی است!")
ابتدا در تابع بررسی میکنیم که اگر لیست ورودی خالی بود، تابع None برگرداند (یا میتوانستیم یک پیام خطا چاپ کنیم). سپس فرض میکنیم اولین عنصر لیست بزرگترین است و آن را در max_val قرار میدهیم. با یک حلقه for روی عناصر لیست، هر عنصر با max_val مقایسه میشود و اگر بزرگتر بود، جایگزین میگردد. پس از پایان حلقه، متغیر max_val حاوی بیشترین مقدار خواهد بود و آن را بازمیگردانیم. در بخش اصلی، ورودی کاربر (رشته شامل اعداد) با split جدا و با list comprehension یا حلقه به نوع عددی (float) تبدیل شده است. سپس خروجی تابع max_in_list گرفته شده و چاپ میشود. (در صورت خالی بودن ورودی، خروجی None کنترل شده است.)
تمرین ۱۳:شمارش کلمات جمله
تابعی به نام count_words بنویسید که یک رشته جمله را ورودی بگیرد و تعداد کلمات موجود در آن جمله را برگرداند. میخواهیم بدانیم یک جملهی وارد شده توسط کاربر چند کلمه دارد (برای مثال در فرم آنلاین محدودیت تعداد کلمات وجود دارد).
ورودی از کاربر: یک جمله.
خروجی نمونه: اگر ورودی “Python barname nevisi khosh ast” باشد، خروجی باید ۵ باشد (۵ کلمه).
def count_words(sentence):
words = sentence.split()
return len(words)
# دریافت یک جمله از کاربر و استفاده از تابع
text = input("یک جمله وارد کنید: ")
word_count = count_words(text)
print(f"تعداد کلمات جمله: {word_count}")
این تابع از متد رشتهای split() استفاده میکند که بر اساس فاصلهی خالی جمله را به لیستی از کلمات تقسیم میکند. سپس با استفاده از تابع داخلی len تعداد اعضای این لیست (که همان تعداد کلمات است) محاسبه و بازگردانده میشود. در مثال دادهشده، رشتهی ورودی به ۵ کلمه تفکیک میشود و طول لیست ۵ است. استفاده از split راهی ساده و استاندارد برای جداسازی کلمات یک جمله در پایتون است. پس از دریافت ورودی، تابع صدا زده شده و نتیجه (تعداد کلمات) چاپ میگردد.
تمرین ۱۴:نمایش اطلاعات با kwargs
تابعی به نام print_info بنویسید که قادر باشد هر تعداد دلخواه پارامتر کلیدی (keyword arguments) را بپذیرد و اطلاعات را به شکل «کلید: مقدار» چاپ کند. میخواهیم تابعی بنویسیم که اطلاعات مختلف دانشجو (مثل نام، سن، شهر و …) را گرفته و مرتب چاپ کند، در حالی که تعداد و نوع این اطلاعات میتواند متغیر باشد.
ورودی از کاربر: مقادیر مربوط به چند کلید از پیش تعیینشده (مثلاً نام، سن، شهر).
خروجی نمونه: اگر کاربر نام «رضا»، سن ۲۲ و شهر «اصفهان» را وارد کند، تابع باید چاپ کند:
name: رضا
age: 22
city: اصفهان
def print_info(**kwargs):
if kwargs:
print("\n--- Information ---")
for key, value in kwargs.items():
print(f"{key}: {value}")
else:
print("\nNo information provided.")
# دریافت اطلاعات از کاربر
name = input("نام: ")
age = input("سن: ")
city = input("شهر: ")
# فراخوانی تابع با آرگومانهای کلیدی
print_info(name=name, age=age, city=city)
پارامتر **kwargs این امکان را میدهد که تابع هر تعداد آرگومان کلیدی (کلید=مقدار) را دریافت کند. در داخل تابع، kwargs مانند یک دیکشنری عمل میکند که کلیدها و مقادیر را در خود دارد. با متد kwargs.items() روی تمام زوجهای کلید-مقدار حلقه زدهایم و هر کدام را در قالب مناسب چاپ کردهایم. اگر هیچ آرگومانی به تابع داده نشده باشد، یک پیام مبنی بر خالی بودن اطلاعات چاپ میشود. در قسمت اصلی، ابتدا نام، سن و شهر از کاربر پرسیده میشوند؛ سپس تابع print_info با استفاده از keyword arguments فراخوانی میشود (مثلاً print_info(name=name_value, age=age_value, city=city_value)). ترتیب نوشتن این آرگومانها مهم نیست و بر اساس نام کلیدها تطبیق انجام میشود. نتیجهی اجرا، نمایش تمام اطلاعات ورودی به صورت مرتب و همراه با عنوان است.
تمرین ۱۵:فیلتر کردن اعداد زوج از لیست
تابعی به نام filter_evens بنویسید که یک لیست از اعداد را گرفته و فقط اعداد زوج آن را در قالب یک لیست جدید برگرداند. یک لیست شامل نمرات دانشآموزان داریم و میخواهیم فقط اعداد زوج (مثلاً نمرات زوج یا اعداد خاص) را جدا کنیم.
ورودی از کاربر: چند عدد در قالب لیست.
خروجی نمونه: برای ورودی [3, 4, 1, 10, 17, 14] باید تابع لیست [4, 10, 14] را برگرداند.
def filter_evens(numbers):
evens = []
for num in numbers:
if num % 2 == 0:
evens.append(num)
return evens
# دریافت ورودی لیست از کاربر و استفاده از تابع
nums_input = input("لیستی از اعداد را وارد کنید: ")
nums_list = [int(x) for x in nums_input.split()]
even_list = filter_evens(nums_list)
print(f"اعداد زوج فیلترشده: {even_list}")
در این تابع با پیمایش کل لیست ورودی، هر عدد که بر ۲ بخشپذیر باشد (باقیماندهی تقسیم آن بر ۲ صفر شود) به لیست جدید evens اضافه میگردد. در پایان این لیست شامل فقط اعداد زوج خواهد بود و آن را برمیگردانیم. در برنامه اصلی ورودی متنی کاربر به لیست اعداد تبدیل شده و به تابع فرستاده میشود. برای مثال، از لیست [3, 4, 1, 10, 17, 14] اعداد ۴، ۱۰ و ۱۴ زوج هستند و تنها همینها در خروجی ظاهر میشوند. (این کار را میتوانستیم با استفاده از توابع پیشرفته مثل filter و lambda نیز انجام دهیم اما در اینجا از روش معمول با حلقه استفاده کردهایم، طبق شرایط سؤال.)
تمرین ۱۶: تشخیص پالیندروم بودن رشته
– تابعی به نام is_palindrome_str بنویسید که یک رشته را دریافت کرده و تشخیص دهد آیا از هر دو سمت یکسان خوانده میشود یا خیر (پالیندروم است). به عنوان مثال واژه «level» یا عبارت «radar» پالیندروم هستند اما «hello» پالیندروم نیست. ساخت یک بررسیکننده کلمات خاص (مثلاً برای بازیهای کلمهای یا چک کردن ورودی کاربر به عنوان پالیندروم).
ورودی از کاربر: یک رشته (کلمه یا جمله).
خروجی نمونه: برای ورودی “radar” خروجی True (یا پیام «پالیندروم است») و برای ورودی “Python” خروجی False خواهد بود.
def is_palindrome_str(text):
normalized = text.replace(" ", "").lower()
return normalized == normalized[::-1]
# دریافت ورودی از کاربر و استفاده از تابع
s = input("یک کلمه یا عبارت وارد کنید: ")
if is_palindrome_str(s):
print("پالیندروم است!")
else:
print("پالیندروم نیست.")
برای درنظرگرفتن عبارات چندکلمهای و حروف بزرگ/کوچک، ابتدا در تابع رشتهی ورودی را نرمالسازی کردهایم: با replace(” “, “”) فاصلههای خالی حذف و با lower() تمام حروف کوچک شدهاند. سپس از قابلیت برش معکوس رشته در پایتون [::-1] برای بدست آوردن عکس رشته استفاده شده است. اگر رشتهی نرمال برابر معکوسش باشد، یعنی پالیندروم است و تابع True برمیگرداند؛ در غیر اینصورت False. این روش سادهترین راه برای چک کردن پالیندروم بودن یک رشته است. در استفاده از تابع، برنامه رشته را میگیرد و بر اساس مقدار برگشتی پیام مناسب چاپ میکند. مثلاً برای «Radar» (صرفنظر از بزرگی R)، تابع ابتدا آن را “radar” میکند و سپس مقایسه نشان میدهد برابر معکوس خودش است، لذا خروجی True خواهد داد.
تمرین ۱۷: پیدا کردن طولانیترین کلمه
تابعی به نام longest_word بنویسید که یک جمله (رشته) را دریافت کند و بلندترین کلمه موجود در آن جمله را برگرداند.فرض کنید کاربری یک جمله وارد کرده و ما میخواهیم طولانیترین کلمه (از لحاظ تعداد حروف) را مشخص کنیم؛ شاید برای هایلایت کردن آن در متن یا تحلیل ساده متن.
ورودی از کاربر: یک جمله.
خروجی نمونه: برای ورودی “برنامه نویسی پایتون هیجان انگیز است” خروجی باید “هیجان” باشد (چرا که ۵ حرف دارد که از بقیه کلمات جمله بیشتر است).
def longest_word(sentence):
words = sentence.split()
if not words:
return ""
longest = words[0]
for w in words:
if len(w) > len(longest):
longest = w
return longest
# دریافت جمله از کاربر و استفاده از تابع
text = input("یک جمله وارد کنید: ")
lw = longest_word(text)
if lw:
print(f"بلندترین کلمه: \"{lw}\"")
else:
print("جملهای وارد نشده است.")
این تابع ابتدا با split() کلمات جمله را جدا میکند. اگر جمله خالی بود، رشتهی خالی برگردانده میشود. سپس فرض را بر این میگذاریم که اولین کلمه بلندترین است و در متغیر longest ذخیره میکنیم. با یک حلقه روی لیست کلمات، اگر کلمهای طول بیشتری از longest داشت، آن را جایگزین میکنیم. پس از پایان حلقه، longest حاوی بلندترین کلمه خواهد بود. در برنامه اصلی، کاربر جمله را وارد میکند و خروجی تابع نمایش داده میشود. (در مثال، واژه “هیجان” ۵ حرف دارد در حالی که سایر کلمات حداکثر ۴ حرفیاند، لذا به عنوان نتیجه چاپ میشود.)
تمرین ۱۸:بازی سنگ-کاغذ-قیچی
تابعی به نام rps_winner بنویسید که دو رشته به نامهای player1_choice و player2_choice (هر یک میتواند “سنگ”, “کاغذ”, یا “قیچی”) را به عنوان ورودی بگیرد و نتیجه بازی سنگ-کاغذ-قیچی را تعیین کند. قوانین: سنگ قیچی را میبُرد، قیچی کاغذ را، و کاغذ سنگ را؛ اگر هر دو انتخاب یکی بود، بازی مساوی است. شبیهسازی ساده بازی دو نفره سنگ-کاغذ-قیچی و تعیین برنده. ورودی از کاربر: انتخاب اول و انتخاب دوم.
خروجی نمونه: اگر ورودیها “سنگ” و “قیچی” باشد، خروجی “Player 1 wins” باید باشد؛ اگر “کاغذ” و “سنگ” باشد، “Player 2 wins” باید باشد (چون انتخاب دوم برنده است)؛ و اگر هر دو یکسان باشند “Draw”.
def rps_winner(choice1, choice2):
# اگر هر دو یکسان باشند
if choice1 == choice2:
return "Draw"
# قوانین بازی:
if choice1 == "سنگ":
if choice2 == "قیچی":
return "Player 1 wins"
elif choice2 == "کاغذ":
return "Player 2 wins"
elif choice1 == "قیچی":
if choice2 == "کاغذ":
return "Player 1 wins"
elif choice2 == "سنگ":
return "Player 2 wins"
elif choice1 == "کاغذ":
if choice2 == "سنگ":
return "Player 1 wins"
elif choice2 == "قیچی":
return "Player 2 wins"
# در صورتی که ورودیها خارج از مقادیر معتبر باشند:
return "Invalid input"
# دریافت انتخابها از کاربر و استفاده از تابع
p1 = input("بازیکن ۱ (سنگ/کاغذ/قیچی): ")
p2 = input("بازیکن ۲ (سنگ/کاغذ/قیچی): ")
print(rps_winner(p1, p2))
تابع rps_winner تمام حالتهای ممکن بازی را بررسی میکند. ابتدا شرط مساوی بودن دو انتخاب را چک میکند؛ در این حالت برندهای وجود ندارد و “Draw” برمیگرداند. سپس با ساختارهای شرطی تو در تو، تکتک حالات برنده-بازنده را مطابق قوانین بازی تعریف کردهایم. برای مثال اگر انتخاب اول “سنگ” و انتخاب دوم “قیچی” باشد، سنگ قیچی را میبُرد پس “Player 1 wins” برگردانده میشود. بالعکس، اگر اولی “سنگ” و دومی “کاغذ” باشد، کاغذ سنگ را میبُرد پس “Player 2 wins” بازگردانده میشود. این الگو برای سه گزینه کامل شده است. اگر ورودیها یکی از سه عبارت معتبر نباشند، در انتهای تابع خروجی “Invalid input” تعیین شده است. در برنامه اصلی، دو ورودی از کاربر گرفته شده و نتیجهی تابع مستقیماً چاپ میشود. این تابع چندین شرط تو در تو دارد که میتوانست به روشهای دیگری (مانند استفاده از دیکشنری قوانین) هم پیادهسازی شود، اما به صورت صریح نیز به خوبی مفهوم را میرساند.
تمرین ۱۹:اشتراک دو لیست
تابعی به نام list_intersection بنویسید که دو لیست را دریافت کرده و عناصر مشترک بین آنها را به صورت یک لیست برگرداند (بدون تکرار عناصر تکراری در نتیجه). فرض کنید لیست اسامی پذیرفتهشدگان دو مرحله آزمون را داریم و میخواهیم بفهمیم چه کسانی در هر دو مرحله قبول شدهاند.
ورودی از کاربر: دو لیست (مثلاً دو رشته که اسامی با فاصله جدا شده).
خروجی نمونه: برای ورودی [“Ali”,”Reza”,”Sara”] و [“Mina”,”Ali”,”Sara”,”John”] باید لیست [“Ali”,”Sara”] برگردانده شود.
def list_intersection(list1, list2):
common = []
for item in list1:
if item in list2 and item not in common:
common.append(item)
return common
# دریافت دو لیست از کاربر و استفاده از تابع
list1_input = input("لیست اول (موارد را با فاصله جدا کنید): ").split()
list2_input = input("لیست دوم (موارد را با فاصله جدا کنید): ").split()
common_items = list_intersection(list1_input, list2_input)
print(f"اشتراک دو لیست: {common_items}")
در این تابع با یک حلقه روی عناصر list1، هر آیتمی را که در list2 هم وجود داشته باشد، پیدا میکنیم. به علاوه با شرط item not in common مطمئن میشویم از افزودن موارد تکراری به لیست نتیجه اجتناب شود. این تضمین میکند هر عنصر مشترک فقط یکبار در خروجی بیاید. اگر ترتیب اهمیت نداشت، میتوانستیم مستقیماً از ساختار set و عملگر & (اشتراک) استفاده کنیم؛ اما در اینجا خروجی براساس ترتیب ظهور در list1 ساخته میشود و همچنین برای آموزش هدفمند از حلقه و شرط استفاده شده است. در برنامه اصلی، با دریافت ورودیهای کاربر و جداسازی با split، دو لیست ایجاد میشود (توجه: این روش برای لیست از رشتههای تککلمهای مناسب است). سپس اشتراک آنها محاسبه و نمایش داده میشود. مثال دادهشده نشان میدهد “Ali” و “Sara” تنها اسامی مشترک بین دو لیست ورودی هستند.
تمرین ۲۰:یافتن مقسومعلیههای یک عدد
تابعی به نام list_factors بنویسید که یک عدد صحیح مثبت را بگیرد و تمامی مقسومعلیههای (عوامل) مثبت آن عدد را در قالب لیست برگرداند. در برنامههای ریاضی ممکن است نیاز باشد لیستی از همهٔ اعداد که یک عدد را تقسیم میکنند داشته باشیم (مثلاً برای تجزیه عدد یا بررسی اول بودن). ورودی از کاربر: یک عدد. خروجی نمونه: برای ورودی ۱۲ باید لیست [1, 2, 3, 4, 6, 12] برگردانده شود (تمام اعداد مثبتی که ۱۲ را تقسیم میکنند).
def list_factors(n):
factors = []
for i in range(1, n+1):
if n % i == 0:
factors.append(i)
return factors
# دریافت ورودی از کاربر و استفاده از تابع
num = int(input("یک عدد وارد کنید: "))
factor_list = list_factors(num)
print(f"عوامل عدد {num}: {factor_list}")
این تابع ساده با یک حلقه از ۱ تا n تمام اعداد را چک میکند و هر کدام که n بر آنها بخشپذیر باشد (یعنی باقیماندهی n % i صفر شود) به لیست عوامل افزوده میشود. هر چند این روش از نظر کارایی ایدهآل نیست (میتوان فقط تا ریشه n پیمایش کرد و زوج عوامل را افزود)، ولی برای درک مفهوم کافیست. مثلاً برای n=12، در طی حلقه اعداد ۱،۲،۳،۴،۶،۱۲ شرایط if را پاس میکنند و به لیست اضافه میشوند. در انتها این لیست برگردانده میشود. برنامه اصلی پس از دریافت ورودی، لیست عوامل را از تابع میگیرد و چاپ میکند.