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


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

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

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

یک آبجکت: یک تابع می تواند هر نوع آبجکتی را برگرداند، برای مثال این آبجکت می تواند یک عدد صحیح مانند 4 یا یک آبجکت استرینگی مانند "SokanAcademy.com" و یا یک آبجکت بولینی مانند Ture و یا هر نوع آبجکت تعریف شده ی دیگر باشد.

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

یک عبارت: استفاده از انواع مختلف عبارت ها نظیر عبارت های محاسباتی یا مقایسه ای به عنوان داده ی برگشت داده شده قابل قبول است. برای مثال می توانیم به جای آن که یک متغیر را به نتیجه ی عبارت (2**6)/15 منتسب کنیم و آن متغیر را در ادامه ی دستور return به عنوان داده ی برگشتی فانکشن بیاوریم، مستقیماً همین عبارت را وارد کنیم.

مقدار برگشت داده شده توسط سایر فانکشن ها: آبجکتی که یک فانکشن برمی گرداند می تواند به عنوان یک داده برای فانکشن دیگری در ادامه ی دستور return آن بیاید. برای مثال می دانیم که فانکشن ()len یک دنباله را به عنوان آرگومان ورودی می گیرد و طول آن را برمی گرداند. در مثال زیر از مقدار برگشت داده شده توسط این فانکشن برای برگرداندن تعداد پارامترهای ورودی فانکشن ()getArgsNumber استفاده می کنیم:

def getArgsNumber(*var_arg):
    return len(var_arg)

بر اساس آموزش های قبلی، می دانیم که فانکشن ()getArgsNumber می تواند به تعداد دلخواه آرگومان بگیرد چرا که یک علامت * قبل از آرگومان ورودی قرار گرفته است. در هر نوبت فراخوانی، دستور return تعداد آرگومان های داده شده به فانکشن را بر می گرداند.

از آبجکتی که یک فانکشن برمی گرداند می توانیم در هر بخش از برنامه مانند سایر آبجکت ها استفاده کنیم، برای استفاده از آن، تنها نیاز است که فانکشن را فراخوانی کنیم. اکنون در قالب یک مثال دیگر نحوه ی تعریف و فراخوانی این نوع فانکشن ها را می بینیم. در برنامه ی زیر، فانکشنی با نام doAdd تعریف می کنیم که وظیفه ی آن این است که عملگر + را روی دو آرگومانی که می گیرد اثر دهد و نتیجه را بر گرداند. در ادامه از آبجکتی که این فانکشن برمی گرداند به عنوان آرگومان دستور پرینت استفاده می کنیم.

def doAdd(Value1, Value2):
    return Value1 + Value2
print("7 + 10 =",doAdd(7,10)) # doAdd adds two Integers.
print("Welcome to",doAdd("Sokan","Academy"),"!") # doAdd concatenates two Strings.

اسکریپت این برنامه را در فایل ReturnFunc.py ذخیره می کنیم. خروجی حاصل از اجرای این برنامه به صورت زیر است:

7 + 10 = 17
Welcome to SokanAcademy !

همان طور که می بینید با استفاده از دستور return در بدنه ی تابع می توان یک آبجکت را برگرداند و از آن در سایر دستورات برنامه استفاده کرد.

به خاطر داشته باشید
در زمان فراخوانی یک فانکشن، به محض آن که دستور return اجرا می شود کار فانکشن به پایان می رسد و فانکشن یک آبجکت را برمی گرداند. در این حالت اگر دستورات دیگری در ادامه ی دستور return در بدنه ی تابع آمده باشند، توسط مفسر پایتون نادیده گرفته می شوند و اجرا نخواهند شد.
دانلود فایل‌های تمرین
لیست نظرات
کاربر میهمان
دیدگاه شما چیست؟
کاربر میهمان
محسن
محسن
اما یکی از استفاده های پرکاربرد return وقتی هست که ما میخوایم نتیجه حاصل از اجرای یک تابع A رو به عنوان ورودی بفرستیم به تابع B و بازم روش یه کار دیگه انجام بدیم،مثلا

def welcome(value1):
welcome_sentence = "Hello "+value1
return welcome_sentence

def greeting(value2):
return welcome(value2) + ", How are you?"

user = input('Enter your name: ')
print(greeting(user))

اینجا ما اسم کاربر رو می گیریم،میریزیم داخل متغیر user بعدش می فرستیم به تابع greeting
این تابع هر ورودی رو با اسم value2 میشناسه،اما نکته اینجاست،قبل از اینکه هر کاری رو وروردیش انجام بده اول اونو با
welcome(value2)
می فرسته به یه تابع دیگه با اسم welcome که تو قسمت قبل دیدیم نتیجه اجرای تابع welcome که با return میاد بیرون اینه که یه Hello به اسم اضافه می کنه
یعنی اگه من تا اینجا به برنامه اسمم رو گفته باشم mohsen، نتیجه کار تا اینجا شده Hello mohsen
خب خود تابع greeting هم به چیزی که تا اینجا آماده شده یک ", How are you?" اضافه می کنه یعنی نتیجه اجرای این تابع میشه
Hello mohsen, How are you?
که خب با print تو خروجی چاپ میشه،امیدوارم تونسته باشم خوب توضیحش بدم
این ارتباط تابع ها میتونه خیلی بیشتر و تو در توتر و پیچیده تر که اونجا نقش return پررنگ تر میشه
amir.hosein.ka
amir.hosein.ka
از ریترن هیچی نفهمیدم
محسن
محسن
به طور کلی وقتی یک تابع اجرا میشه حاصل کارش باید یه جوری فرستاده بشه جایی که می خواد ازش استفاده بشه،این کار با return انجام میشه،این مثال رو ببینیم:

def welcome(value1):
welcome_sentence = "Hello "+value1
return welcome_sentence

user = input('Enter your name: ')
print(welcome(user))
اتفاقی که میفته اینه که با input اسم کاربر رو می پرسیم بعدش با
welcome(user)
اسم پرسیده شده رو میفرستیم تو تابع welcome،کاری که این تابع انجام میده اینه که هرچی بهش ورودی بدیم
با اسم value1 در نظرش می گیره بعدش با دستور
welcome_sentence = "Hello "+value1
یک Hello اولش اضافه می کنه و میریزه داخل یک متغیری به اسم welcome_sentence
آخر کار هم با return ایاین نتیجه رو از خودش خارج میکنه..
حالا این خروجی رو ما در بدنه اصلی برنامه خط آخر با print چاپش می کنیم، این میشه یک تعریف ساده از عملکرد return
در کامنت بعدی یکم مثال رو کاملتر می کنم

در پاسخ به

کاربر میهمان
کاربر میهمان
ببخشید من تازه کارم ریترن با دستور چاپ دقیقا چه فرق میکنه؟؟
moohi58
moohi58
راهی هست که یک متغیرو از تابع بیرون بیاریم؟(با همون اسم و به جز این کد:
def a():
.
.
.
return n

n=a()
Mrj
Mrj
با عرض سلام و خسته نباشید.
لطفا اگه امکان داره اون مورد >>به خاطر داشته باشید<< رو با مثال توضیح بدید.
ممنون.
farshid
farshid
با سلام و تشکر بابت آموزش خوبتون
چرا بعد از اجرای این دستور خروجی درست نمی دهد؟
def getArgsNumber(*var_arg):
return len(var_arg)

به این صورت که اگر فانکشن را خالی فراخوانی کنیم صفر برمیگرداند که درست است ولی اگر استرینگ یا عدد صحیح وارد کنیم بدون توجه به تعداد کاراکترها عدد 1 را بر می گرداند
نرگس اسدی
نرگس اسدی
سلام
علت مشخصه. چون دستور return در این فانکشن تعداد آرگومان هارا بر می گردونه نه طول آن ها را. یعنی فرقی نداره که استرینگ "A" که یک کاراکتر داره یا "ABC" که از سه کاراکتر تشکیل شده را بدید. چون در هر صورت یک آرگومان به تابع دادید و مقدار برگشتی 1 است.

در پاسخ به

farshid
farshid
ممنون

در پاسخ به

فردی
فردی
سلام. میشه لطفا توضیح بدید فراخوانی شما در اینجا چطور بوده. یعنی لطفا خطهای دیگه برنامتون هم بگید.

در پاسخ به