توابع

اصلاح شده

2025-07-28

فراخوانی تابع

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

type(32)
<class 'int'>

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

توابع داخلی

توابع داخلی (Built-in) این‌ها توابعی هستند که توسط سازندگان پایتون تعبیه شده‌اند و برای حل مسائل عمومی مورد استفاده قرار می‌گیرند.

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

max('Hello world')
'w'
min('Hello world')
' '
len('Hello world')
11

توابع تبدیل نوع

توابع تبدیل نوع (Type Conversion) این‌ها نوع دیگری از توابع داخلی هستند که مقدار یک نوع را به نوعی دیگر تبدیل می‌کنند:

int(3.99999)
3
int(-2.3)
-3
float('3.14159')
3.14159

توابع ریاضی

پایتون دارای یک ماژول ریاضی است که اکثر توابع ریاضی مشهور را ارائه می‌دهد. اما قبل از اینکه بتوانیم از ماژول استفاده کنیم، باید آن را وارد (import) کنیم:

import math

این عبارت یک شی ماژول به نام math ایجاد می کند.

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

ratio = signal_power / noise_power
decibels = 10 * math.log10(ratio)
radians = 0.7
height = math.sin(radians)

اعداد تصادفی

به نظر می‌رسد که ساختن یک برنامه واقعاً غیر قطعی چندان آسان نیست، اما راه‌هایی وجود دارد که حداقل غیرقطعی به نظر برسد. یکی از آنها استفاده از الگوریتم‌هایی است که اعداد شبه تصادفی (Random) تولید می‌کنند. درست است که اعداد شبه تصادفی واقعاْ تصادفی نیستند اما بازهم تمایز آن‌ها از اعداد تصادفیُ غیرممکن است.

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

یک مثال را باهم ببینیم:

import random

for i in range(10):
    x = random.random()
    print(x)
0.0920530236235576
0.6250171315179012
0.7706549349232131
0.7402147110407385
0.15988207593735793
0.4024047009691475
0.8179640452074257
0.44502244153994786
0.8980030614870437
0.9357510761663985

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

مثال‌هایی دیگر از توابع random‌ عبارتند از:

random.randint(5, 10)
7
t = [1, 2, 3]
random.choice(t)
3

افزودن یک تابع جدید

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

در مثال زیر، یک تابع به نام print_lyrics تعریف می‌کنیم:

def print_lyrics():
    print("I'm a lumberjack, and I'm okay.")
    print('I sleep all night and I work all day.')

همانطور که در این مثال می‌بینید، کلمه کلیدی def برای تعریف تابع بکار برده می‌شود. با تعریف یک تابع، یک متغیر با همان نام ایجاد می‌شود. نحو فراخوانی تابع جدید مانند توابع داخلی است:

print_lyrics()
I'm a lumberjack, and I'm okay.
I sleep all night and I work all day.

ما حتی می‌توانیم یک تابع تعریف شده را درون تابع دیگر، فراخوانی کنیم.

پارامترها و آرگومان‌ها

برخی از توابع داخلی که دیده‌ایم به آرگومان نیاز دارند. برای مثال، وقتی تابع math.sin را فراخوانی می‌کنیم، باید یک عدد را به آن بدهیم. به این ورودی، آرگومان (Argument)

گفته می‌شود.

توابع دارای خروجی و توابع بدون خروجی

در اجرای برخی توابع، با اتمام آخرین دستور تابع، مقداری را به عنوان نتیجه در خروجی می‌بینیم. این توابع را Fruitful می‌نامند:

import math

math.sqrt(5)
2.23606797749979

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

def No_reult_func ():
    x = math.cos(radians)

پروژه

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

# وارد کردن پکیج های مورد نیاز
import tkinter as tk


# تابع برای محاسبه نتیجه بر اساس عملگر
def calculate():
    try:
        num1 = float(entry1.get())  # گرفتن عدد اول
        num2 = float(entry2.get())  # گرفتن عدد دوم
        op = operator.get()  # گرفتن عملگر

        # بررسی نوع عملگر با شرط‌ها
        if op == "+":
            result = num1 + num2
        elif op == "-":
            result = num1 - num2
        elif op == "*":
            result = num1 * num2
        elif op == "/":
            if num2 == 0:
                result_label.config(text="خطا: تقسیم بر صفر!")
                return
            result = num1 / num2
        else:
            result_label.config(text="عملگر نامعتبر است")
            return

        # نمایش نتیجه
        result_label.config(text=f"نتیجه: {result}")

    except ValueError:
        # خطا در صورت وارد کردن عدد نامعتبر
        result_label.config(text="لطفاً فقط عدد وارد کنید")


# ساخت پنجره اصلی
window = tk.Tk()
window.title("ماشین حساب ساده")
window.geometry("300x250")

# ساخت ویجت‌ها
label1 = tk.Label(window, text="عدد اول:")
entry1 = tk.Entry(window)

label2 = tk.Label(window, text="عدد دوم:")
entry2 = tk.Entry(window)

label_op = tk.Label(window, text="عملگر (+ - * /):")
operator = tk.Entry(window)

calc_button = tk.Button(window, text="محاسبه", command=calculate)
result_label = tk.Label(window, text="نتیجه: ", fg="blue")

# قرار دادن ویجت‌ها در پنجره
label1.pack()
entry1.pack()

label2.pack()
entry2.pack()

label_op.pack()
operator.pack()

calc_button.pack(pady=10)
result_label.pack()

# اجرای برنامه
window.mainloop()