کانال بله, جهت پشتیبانی و اطلاع رسانی کانال بله, جهت پشتیبانی و اطلاع رسانی
عضویت

توابع در پایتون

آموزش توابع در برنامه نویسی پایتون


میتوانیم تابعی ایجاد کنیم که سری فیبوناتچی را تا مرز دلخواه بنویسد:

    >>> def fib(n):    # write Fibonacci series up to n
    ...     """Print a Fibonacci series up to n."""
    ...     a, b = 0, 1
    ...     while a < n:
    ...         print(a, end=' ')
    ...         a, b = b, a+b
    ...     print()
    ...
    >>> # Now call the function we just defined:
    ... fib(2000)
    0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597

کلمه کلیدی def تعریف یک تابع را معرفی می کند. پس از آن باید نام تابع و لیست پارامترهای رسمی آن درون پرانتز، قرار گیرد. عباراتی که بدنه تابع را می سازد، از خط بعد شروع می شود و باید فرو رفته باشند. عبارت اول در بدنه تابع می تواند به صورت اختیاری یک رشته حروف باشد. این رشته حروف، مدارک و مستندات یا docstring تابع است (اطلاعات بیشتر درباره docstring در بخش Documentation Strings موجود است).

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

زیرا مرجع های متغیر ابتدا درون جدول نماد محلی را نگاه می کنند، سپس جداول نماد محلی توابع داخلی، سپس درون جدول نماد سراسری، و در انتها جدول داخلی نام ها. بنابراین، نمی توان مستقیما در محدوده یک تابع یک مقدار را به متغیرهای سراسری و متغیرهای توابع محصور، تخصیص داد (مگر، برای متغیرهای سراسری، بیان شده در عبارت سراسری، یا برای متغیرهای توابع محصور، بیان شده در عبارت غیر محلی)، اگرچه ممکن است به آنها ارجاع داده شود.

پارامترهای (آرگومان) حقیقی برای فراخوانی یک تابع درون جدول نماد محلی تابع فراخوانی شده، در هنگام فراخوانی، معرفی می شوند. بنابراین، آرگومان ها با استفاده از فراخوانی با مقدار (call by value) پاس داده می شوند (جایی که "مقدار" همیشه مرجع شی است، نه مقدار یک شی). 1 زمانی که یک تابع، تابع دیگری را فراخوانی می کند، یک جدول نماد محلی جدید برای آن فراخوانی ایجاد می شود.

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

    >>> fib
    
    >>> f = fib
    >>> f(100)
    0 1 1 2 3 5 8 13 21 34 55 89

اگر از زبان های دیگر آمده باشید، ممکن است مخالف این باشید که fib یک تابع است، بلکه میگویید یک روند (procedure) است زیرا مقداری باز نمی گرداند. در حقیقت، حتی توابع بدون عبارت return نیز یک مقدار باز می گردانند، هرچند که مقداری خسته کننده است. این مقدار None نام دارد(این یک نام داخلی است). معمولا نوشتن مقدار None , در صورتی که تنها مقدار نوشته شده باشد، توسط مفسر سرکوب می شود. با استفاده از تابع print() میتوانید آن را ببینید.

    >>> fib(0)
    >>> print(fib(0))
    None

نوشتن یک تابع که لیستی از اعداد دنباله فیبوناتچی را به جای چاپ کردن، بازگرداند ساده است.

    >>> def fib2(n):  # return Fibonacci series up to n
    ...     """Return a list containing the Fibonacci series up to n."""
    ...     result = []
    ...     a, b = 0, 1
    ...     while a < n:
    ...         result.append(a)    # see below
    ...         a, b = b, a+b
    ...     return result
    ...
    >>> f100 = fib2(100)    # call it
    >>> f100                # write the result
    [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]

این مثال، طبق معمول، تعدادی ویژگی جدید پایتون را نمایش می دهد.

1. عبارت return با یک مقدار از یک تابع باز می گردد. Return بدون آرگومان عبارت، none باز میگرداند. در انتهای یک تابع نیز none باز می گرداند.

2. عبارت result.append(a) یک متد از شی result لیست را صدا می کند. یک متد تابعی است که متعلق به یک شی است و به صورت obj.methodname نامگذاری می شود، که obj یک شی است (این می تواند یک اصطلاح باشد)، و methodname نام متدی است که توسط نوع شی تعریف شده است. انواع مختلف، متدهای مختلفی تعریف می کنند. متدها از انواع مختلف می توانند بدون بروز ابهام، نام مشابه داشته باشند. (همچنین می توان با استفاده از کلاس ها، انواع شی و متدهای خودتان را تعریف کنید. لینک Classes را ببینید.) متد append() نشان داده شده در مثال، برای اشیای لیست تعریف شده است. این متد یک عنصر جدید به انتهای لیست اضافه می کند که در این مثال با عبارت result = result + [a] برابر است اما کارآمد تر است.

1403/05/28 2452 714
رمز عبور : tahlildadeh.com یا www.tahlildadeh.com
نظرات شما

نظرات خود را ثبت کنید...