دوره H برنامه نویسی پایتون
فصل سوم: توابع و ماژولها در پایتون
درس اول: تابع در پایتون «Functions»
رسیدیم به فصل سوم دوره H پایتون 🙂
برای شروع فصل سوم و آشنایی با روش استفاده از توابع در پایتون، درصورتی که نمیدانید تابع چیست، ابتدا مقالهی «تابع چیست؟! متد چیست؟!» را مطالعه کنید. سپس در ادامه با ما همراه باشید.
توابعی که دیدید
در دروس قبلی از توابع استفاده کردیم! در پایتون ما برای اینکه یک تابع را صدا زده و از آن استفاده کنیم، ابتدا نام تابع را نوشته و سپس یک پرانتز باز و بسته پشت سرهم قرار میدهیم، ورودیها نیز در بین پرانتزها و با ویرگول از هم جداشده و نوشته میشوند؛ هرتابعی همانطور که در تعریف تابع گفته شد، میتواند ورودی داشته و نداشته باشد.
به مثال زیر که در آن از توابع مختلفی استفاده شده است دقت کنید:
1 2 3 4 |
print("Welcom to FuLLKade") range(2, 20) str(12) range(10, 20, 3) |
در کد بالا، از تابع print، range و str استفاده شده است. تابع range علاوه بر اینکه میتواند دو ورودی بگیرد، توانایی گرفتن سه ورودی را نیز دارد!
تعریف یک تابع در پایتون
در مثال قبلی توانستیم از توابعی که از قبل تعریف شدهاند استفاده کنیم؛ اما حالا میخواهیم تابع اختصاصی خودمان را با استفاده از دستور def تعریف کنیم:
در مثال زیر، ما تابع my_func را تعریف میکنیم. این تابع ورودی نداشته و روش کار آن به این صورت است که سه بار پیام spam را print میکند! همچنین پس از تعریف تابع، آن را در انتهای کد صدا میزنیم:
1 2 3 4 5 6 |
def my_func(): print("spam") print("spam") print("spam") my_func() |
اگر دقت کنید، در اینجا نیز همانند while و if و …، بلاک یا بدنهی تابع را با استفاده از فاصله مشخص میکنیم. بنابراین در همهجا اینگونه خواهد بود! 😀
نتیجه کد بالا:
spam
spam
spam
>>>
محل تعریف تابع
توابع در پایتون، باید قبل از اجرا شدن تعریف شوند! برای مثال کد زیر با خطا رو به رو خواهد شد:
1 2 3 4 |
hello() def hello(): print("Hello world!") |
نتیجه کد بالا:
NameError: name ‘hello’ is not defined
>>>
ورودی توابع
در مثال زیر، تابع print_with_exclamation را تعریف کردیم که یک ورودی به نام word (اسم دلخواه) از ما میگیرد و سپس آن را به همراه یک علامت تعجب پرینت میکند. در اینجا ما پس از تعریف تابع، آن را سه بار با ورودیهای مختلف صدا میزنیم: (در پایتون نیازی به تعریف نوع ورودی نیست و فقط کافیست ورودها با یک ویرگول مشخص شوند)
1 2 3 4 5 6 |
def print_with_exclamation(word): print(word + "!") print_with_exclamation("Welcome") print_with_exclamation("To") print_with_exclamation("FuLLKade") |
نتیجه کد بالا:
Welcome!
To!
FuLLKade!
>>>
حالا تابع دیگری با نام print_sum_twice تعریف میکنیم که با گرفتن دو ورودی، آنها را باهم جمع میکند:
1 2 3 4 5 |
def print_sum_twice(x, y): print(x + y) print(x + y) print_sum_twice(5, 8) |
نتیجه کد بالا:
1 2 3 4 |
>>> 13 13 >>> |
توجه داشته باشید که متغیر تعریف شده به عنوان ورودی یک تابع، از قبیل word و x,y ای که در بالا تعریف کردیم، تنها در داخل بدنهی همان تابع قابل دسترسی هستند و در بیرون از تابع نمیتوان از آنها استفاده کرد. برای مثال کد زیر با خطا رو به رو خواهد شد:
1 2 3 4 5 6 |
def function(variable): variable += 1 print(variable) function(7) print(variable) |
نتیجه کد بالا:
8
NameError: name ‘variable‘ is not defined
>>>
خروجی یک تابع
شاید فکر کنید در بالا، print همان خروجی تابع است یا اینکه بپرسید در تعریف تابع گفته شد فقط یک خروجی دارد، پس چطور در بالا چندین بار پرینت کردیم؟!
البته که پرینت کردن، خروجی تابع نیست!!!! بلکه کدی است که در بدنهی تابع استفاده شده است و خروجی تابع، چیزی است که از تابع به سمت بیرون برگردانده شده و برنامهنویس میتواند آن را درون یک متغیر ریخته و سپس استفاده کند. بنابراین خروجی الزاما قرار نیست که پرینت شود.
در مثال زیر، تابع max را با قابلیت داشتن خروجی تعریف میکنیم. به این صورت که این تابع، دو عدد از ما گرفته و در خروجی خود، عدد بزرگتر را به ما برمیگرداند! و اگرچنانچه ورودیها برابر باشند، یکی از آن دو برگردانده میشود (که در اینجا ورودی اول را نوشتیم تا برگرداند):
1 2 3 4 5 6 7 8 9 |
def max(x, y): if x >=y: return x else: return y print(max(4, 7)) z = max(8, 5) print(z) |
همانطور که میبینید، از کلیدواژهی return برای بیرون دادن خروجی استفاده شده است. این دستور مقداری را از داخل تابع به بیرون برمیگرداند و بدنهی تابع از آن نقطه به بعد دیگر اجرا نخواهد شد. همچنین ما پس از این که تابع max را با ورودیهای 4 و 7 صدا زدیم، خروجی آن را مستقیم داخل یک print ریختهایم؛ ولی یا پس از اینکه دوباره همین تابع را با مقادیر 8 و 5 صدا زدیم، خروجی آن را داخل z ریخته و سپس z را پرینت کردهایم! و البته میتوان اصلا پرینت نکرد و استفادههای دیگری از خروجی داشت و یا بعد از انجام عملیاتی روی خروجی، آن را پرینت کرد!
نتیجه کد بالا:
7
8
>>>
شاید بگویید داخل همان max نیز میتوان پرینت کرد! ولی در اینصورت تابع یک تابع منطقی نیست و ما نمیتوانیم خروجی را گرفته و روی آن عملیات دلخواهمان را انجام دهیم و شاید اصلا نخواهیم آن را پرینت کنیم. پس نوشتن این تابع به صورت بالا بهتر است.
همانطور که گفته شد، موقع نوشتن return، تابع دیگر متوقف شده و خروجی را برمیگرداند. از آن جهت که مثال بالا این را بهتر نشان نمیدهد، یک مثال دیگر میزنیم:
1 2 3 4 5 6 |
def add_numbers(x, y): total = x + y return total print("This won't be printed") print(add_numbers(4, 5)) |
در اینجا، ورودیهای x و y باهم جمع شده و سپس نتیجهی آن برگردانده میشود. البته ما میتوانستیم به جای ریختن x + y داخل یک متغیر دیگر و سپس برگرداندن آن، مستقیم x + y را مقابل return بنویسیم. اما نکتهای که میخواهم بگویم این است که پس از return، خط سوم که print است اجرا نخواهد شد.
نتیجه کد بالا:
9
>>>
البته در این کد اصلا نباید print را نوشت! چون تحت هیچ شرایطی اجرا نخواهد شد و لذا منطقی نیست و ما فقط برای جنبه آموزشی آن را نوشتیم! اما در توابعی که شرطی هستند، ممکن است پس از شروطی که داخل آنها return وجود دارد، کدهای دیگری نیز وجود داشته باشند که اگر شروط صحیح نباشند میشوند و در اینگونه مثالها منطقی بوده و میشود استفاده کرد.
نظرات ثبت شده بدون دیدگاه