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

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

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

در این درس از مجموعه آموزش برنامه نویسی سایت سورس باران، به آموزش توابع در برنامه نویسی پایتون ۳ خواهیم پرداخت.

پیشنهاد ویژه : پکیج آموزش پایتون مختص بازار کار

یک تابع بلوکی از کد سازمان یافته و قابل استفاده مجدد است که برای انجام یک عمل واحد و مرتبط استفاده می شود. توابع ماژولاریت بهتری برای برنامه شما و درجه بالایی از استفاده مجدد از کد ارائه می دهند.

همانطور که می دانید، پایتون توابع داخلی زیادی مانند print() و غیره را به شما می دهد، اما می توانید توابع خود را نیز ایجاد کنید. این توابع را توابع تعریف شده توسط کاربر می نامند.

تعریف یک تابع

شما می توانید توابعی را برای ارائه عملکرد مورد نیاز تعریف کنید. در اینجا قوانین ساده ای برای تعریف یک تابع در پایتون وجود دارد.

  • بلوک های تابع با کلمه کلیدی def و سپس نام تابع و پرانتز ( ( ) شروع می شوند.
  • هر پارامتر یا آرگومان ورودی باید در داخل این پرانتز قرار گیرد. همچنین می توانید پارامترهایی را در داخل این پرانتز تعریف کنید.
  • اولین دستور یک تابع می تواند یک دستور اختیاری باشد – رشته مستندات تابع یا رشته docstring.
  • بلوک کد در هر تابع با دونقطه (:) شروع می شود و تورفتگی دارد.
  • عبارت return [expression] از یک تابع خارج می شود و به صورت اختیاری یک عبارت را به تماس گیرنده پس می دهد. یک عبارت بازگشتی بدون آرگومان همان بازگشت هیچ است.
def functionname( parameters ):
   "function_docstring"
   function_suite
   return [expression]

 

به‌طور پیش‌فرض، پارامترها رفتار موقعیتی دارند و باید به همان ترتیبی که تعریف شده‌اند، آنها را اطلاع دهید.

مثال

تابع زیر یک رشته را به عنوان پارامتر ورودی می گیرد و آن را روی صفحه استاندارد چاپ می کند.

def printme( str ):
   "This prints a passed string into this function"
   print (str)
   return

 

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

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

هنگامی که ساختار اصلی یک تابع نهایی شد، می توانید آن را با فراخوانی آن از یک تابع دیگر یا مستقیماً از اعلان پایتون اجرا کنید. در زیر مثالی برای فراخوانی تابع ()printme آمده است

#!/usr/bin/python3

# Function definition is here
def printme( str ):
   "This prints a passed string into this function"
   print (str)
   return

# Now you can call printme function
printme("This is first call to the user defined function!")
printme("Again second call to the same function")

 

هنگامی که کد بالا اجرا می شود، نتیجه زیر را ایجاد می کند –

This is first call to the user defined function!
Again second call to the same function

 

عبور از مرجع در مقابل مقدار

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

#!/usr/bin/python3

# Function definition is here
def changeme( mylist ):
   "This changes a passed list into this function"
   print ("Values inside the function before change: ", mylist)
   
   mylist[2]=50
   print ("Values inside the function after change: ", mylist)
   return

# Now you can call changeme function
mylist = [10,20,30]
changeme( mylist )
print ("Values outside the function: ", mylist)

 

در اینجا، ما مرجع شیء ارسال شده را حفظ می کنیم و مقادیر را در همان شیء اضافه می کنیم. بنابراین، این نتیجه زیر را ایجاد می کند –

Values inside the function before change:  [10, 20, 30]
Values inside the function after change:  [10, 20, 50]
Values outside the function:  [10, 20, 50]

 

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

#!/usr/bin/python3

# Function definition is here
def changeme( mylist ):
   "This changes a passed list into this function"
   mylist = [1,2,3,4] # This would assi new reference in mylist
   print ("Values inside the function: ", mylist)
   return

# Now you can call changeme function
mylist = [10,20,30]
changeme( mylist )
print ("Values outside the function: ", mylist)

 

پارامتر mylist محلی برای تابع changeme است. تغییر mylist در تابع تاثیری در mylist ندارد. تابع هیچ کاری انجام نمی دهد و در نهایت نتیجه زیر را ایجاد می کند –

Values inside the function:  [1, 2, 3, 4]
Values outside the function:  [10, 20, 30]

 

آرگومان های تابع

می توانید با استفاده از انواع آرگومان های رسمی زیر یک تابع را فراخوانی کنید

  • آرگومان های مورد نیاز
  • آرگومان های کلیدواژه
  • آرگومان های پیش فرض
  • آرگومان های با طول متغیر

آرگومان های مورد نیاز

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

برای فراخوانی تابع ()printme حتما باید یک آرگومان ارسال کنید، در غیر این صورت یک خطای نحوی به صورت زیر می دهد –

#!/usr/bin/python3

# Function definition is here
def printme( str ):
   "This prints a passed string into this function"
   print (str)
   return

# Now you can call printme function
printme()

 

هنگامی که کد بالا اجرا می شود، نتیجه زیر را ایجاد می کند –

Traceback (most recent call last):
   File "test.py", line 11, in <module>
      printme();
TypeError: printme() takes exactly 1 argument (0 given)

 

آرگومان های کلیدواژه

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

این به شما امکان می دهد آرگومان ها را نادیده بگیرید یا آنها را خارج از نظم قرار دهید زیرا مفسر پایتون می تواند از کلمات کلیدی ارائه شده برای تطبیق مقادیر با پارامترها استفاده کند. همچنین می‌توانید به روش‌های زیر به تابع ()printme فراخوانی کلمات کلیدی برقرار کنید

#!/usr/bin/python3

# Function definition is here
def printme( str ):
   "This prints a passed string into this function"
   print (str)
   return

# Now you can call printme function
printme( str = "My string")

 

هنگامی که کد بالا اجرا می شود، نتیجه زیر را ایجاد می کند –

My string

 

مثال زیر تصویر واضح تری را نشان می دهد. توجه داشته باشید که ترتیب پارامترها مهم نیست.

#!/usr/bin/python3

# Function definition is here
def printinfo( name, age ):
   "This prints a passed info into this function"
   print ("Name: ", name)
   print ("Age ", age)
   return

# Now you can call printinfo function
printinfo( age = 50, name = "miki" )

 

هنگامی که کد بالا اجرا می شود، نتیجه زیر را ایجاد می کند –

Name:  miki
Age  50

 

آرگومان های پیش فرض

آرگومان پیش فرض آرگومانی است که اگر مقداری در فراخوانی تابع برای آن آرگومان ارائه نشده باشد، مقدار پیش فرض را در نظر می گیرد. مثال زیر ایده‌ای در مورد آرگومان‌های پیش‌فرض ارائه می‌دهد، در صورت عدم تصویب سن پیش‌فرض را چاپ می‌کند

#!/usr/bin/python3

# Function definition is here
def printinfo( name, age = 35 ):
   "This prints a passed info into this function"
   print ("Name: ", name)
   print ("Age ", age)
   return

# Now you can call printinfo function
printinfo( age = 50, name = "miki" )
printinfo( name = "miki" )

 

هنگامی که کد بالا اجرا می شود، نتیجه زیر را ایجاد می کند –

Name:  miki
Age  50
Name:  miki
Age  35

 

آرگومان های با طول متغیر

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

نحو برای یک تابع با آرگومان های متغیر غیرکلیدی در زیر – آورده شده است

def functionname([formal_args,] *var_args_tuple ):
   "function_docstring"
   function_suite
   return [expression]

 

یک ستاره (*) قبل از نام متغیر قرار می گیرد که مقادیر همه آرگومان های متغیر غیرکلیدی را در خود نگه می دارد. اگر هیچ آرگومان اضافی در طول فراخوانی تابع مشخص نشود، این تاپل خالی می ماند. در زیر یک مثال ساده آمده است –

#!/usr/bin/python3

# Function definition is here
def printinfo( arg1, *vartuple ):
   "This prints a variable passed arguments"
   print ("Output is: ")
   print (arg1)
   
   for var in vartuple:
      print (var)
   return

# Now you can call printinfo function
printinfo( 10 )
printinfo( 70, 60, 50 )

 

هنگامی که کد بالا اجرا می شود، نتیجه زیر را ایجاد می کند –

Output is:
۱۰
Output is:
۷۰
۶۰
۵۰

 

توابع ناشناس

این توابع ناشناس نامیده می شوند زیرا با استفاده از کلمه کلیدی def به صورت استاندارد تعریف نمی شوند. می توانید از کلمه کلیدی لامبدا برای ایجاد توابع ناشناس کوچک استفاده کنید.

  • فرم‌های لامبدا می‌توانند هر تعداد آرگومان را دریافت کنند، اما فقط یک مقدار را در قالب یک عبارت برمی‌گردانند. آنها نمی توانند شامل دستورات یا چندین عبارت باشند.
  • یک تابع ناشناس نمی تواند یک تماس مستقیم برای چاپ باشد زیرا لامبدا به یک عبارت نیاز دارد.
  • توابع لامبدا فضای نام محلی خود را دارند و نمی توانند به متغیرهایی غیر از آنهایی که در لیست پارامترهایشان و در فضای نام سراسری هستند دسترسی داشته باشند.
  • اگرچه به نظر می رسد که لامبداها یک نسخه تک خطی از یک تابع هستند، اما معادل دستورات درون خطی در C یا C++ نیستند، که هدف آنها پشته‌بندی تخصیص با عبور تابع، در حین فراخوانی به دلایل عملکرد است.

نحو توابع لامبدا فقط شامل یک عبارت واحد است که به شرح زیر است –

lambda [arg1 [,arg2,.....argn]]:expression

 

در زیر مثالی برای نشان دادن نحوه عملکرد شکل تابع لامبدا آمده است

#!/usr/bin/python3

# Function definition is here
sum = lambda arg1, arg2: arg1 + arg2

# Now you can call sum as a function
print ("Value of total : ", sum( 10, 20 ))
print ("Value of total : ", sum( 20, 20 ))

 

هنگامی که کد بالا اجرا می شود، نتیجه زیر را ایجاد می کند –

Value of total :  30
Value of total :  40

 

دستور بازگشت

دستور بازگشت از یک تابع خارج می شود و به صورت اختیاری یک عبارت را به تماس گیرنده پس می دهد. یک عبارت بازگشتی بدون آرگومان همان بازگشت هیچ است.

تمام مثال های زیر هیچ مقداری را بر نمی گرداند. می توانید مقداری را از یک تابع به صورت زیر برگردانید

#!/usr/bin/python3

# Function definition is here
def sum( arg1, arg2 ):
   # Add both the parameters and return them."
   total = arg1 + arg2
   print ("Inside the function : ", total)
   return total

# Now you can call sum function
total = sum( 10, 20 )
print ("Outside the function : ", total )

 

هنگامی که کد بالا اجرا می شود، نتیجه زیر را ایجاد می کند –

Inside the function :  30
Outside the function :  30

 

محدوده متغیرها

همه متغیرهای یک برنامه ممکن است در همه مکان های آن برنامه قابل دسترسی نباشند. این بستگی به جایی دارد که شما یک متغیر را اعلام کرده اید.

محدوده یک متغیر، بخشی از برنامه را تعیین می کند که در آن می توانید به یک شناسه خاص دسترسی داشته باشید. دو حوزه اساسی متغیر در پایتون وجود دارد –

  • متغیرهای جهانی
  • متغیرهای محلی

متغیرهای جهانی در مقابل متغیرهای محلی

متغیرهایی که در داخل یک بدنه تابع تعریف می شوند دارای یک محدوده محلی و آنهایی که در خارج تعریف می شوند دارای یک دامنه جهانی هستند.

این بدان معناست که متغیرهای محلی فقط در داخل تابعی که در آن اعلان شده‌اند قابل دسترسی هستند، در حالی که متغیرهای سراسری را می‌توان در سرتاسر بدنه برنامه توسط همه توابع دسترسی داشت. هنگامی که یک تابع را فراخوانی می کنید، متغیرهای اعلام شده در داخل آن وارد محدوده می شوند. در زیر یک مثال ساده آمده است –

#!/usr/bin/python3

total = 0   # This is global variable.
# Function definition is here
def sum( arg1, arg2 ):
   # Add both the parameters and return them."
   total = arg1 + arg2; # Here total is local variable.
   print ("Inside the function local total : ", total)
   return total

# Now you can call sum function
sum( 10, 20 )
print ("Outside the function global total : ", total )

 

هنگامی که کد بالا اجرا می شود، نتیجه زیر را ایجاد می کند –

Inside the function local total :  30
Outside the function global total :  0

 

منبع.

 

 

لیست جلسات قبل آموزش برنامه نوبسی پایتون ۳

  1. آموزش برنامه نویسی پایتون ۳
  2. آموزش موارد جدید در برنامه نویسی پایتون ۳
  3. آموزش مرور کلی برنامه نویسی پایتون ۳
  4. آموزش راه اندازی محیط برنامه نویسی پایتون ۳
  5. آموزش نحو در برنامه نویسی پایتون ۳
  6. آموزش انواع متغیرها در برنامه نویسی پایتون ۳
  7.  آموزش عملگرهای پایه در برنامه نویسی پایتون ۳
  8.  آموزش تصمیم گیری در برنامه نویسی پایتون ۳
  9.  آموزش حلقه ها در برنامه نویسی پایتون ۳
  10. آموزش اعداد در برنامه نویسی پایتون ۳
  11. آموزش رشته ها در برنامه نویسی پایتون ۳
  12.  آموزش لیست ها در برنامه نویسی پایتون ۳
  13.  آموزش تاپل ها در برنامه نویسی پایتون ۳
  14. آموزش دیکشنری در برنامه نویسی پایتون ۳
  15.  آموزش تاریخ و زمان در برنامه نویسی پایتون ۳
0
برچسب ها :
نویسنده مطلب erfan molaei

دیدگاه شما

بدون دیدگاه