Oruji.org
Oruji.orgPersian Tutorials
ورود
ویرایش: 1396/11/16 20:26

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

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

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

تعریف یک تابع

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

نحوه تعریف تابع

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

فراخوانی با مقدار و با reference

تمامی پارامترها در زبان پایتون با reference ارسال می شوند. این بدان معناست که اگر شما پارامتر را درون تابع تغییر دهید، این پارامتر همچنین در تابع فراخوانی شده نیز تغییر خواهد کرد. برای مثال:

#!/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]

در مثالی دیگر آرگومانی که با reference ارسال شده است و reference آن درون تابع فراخوانی شده تغییر می کند:

#!/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()، شما نیاز خواهید داشت دقیقا یک آرگومان به آن ارسال کنید، در غیر اینصورت خطای syntax همانند زیر ایجاد خواهد شد:

#!/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 printme(); TypeError: printme() takes exactly 1 argument (0 given)

آرگومان های Keyword

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

مثال زیر فراخوانی keyword در تابع 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

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

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

#!/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" )

خروجی

Name: miki Age 50 Name: miki Age 35

آرگومان variable-length

شما ممکن است برای پردازش یک تابع نیاز به آرگومان هایی بیش از آن هایی که در تعریف تابع تعریف کرده اید داشته باشید. این آرگومان ها را variable-length می نامند و در تعریف تابع نام گذاری نمی شوند، به جز آرگومان های اجباری و پیشفرض.

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

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

#!/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: 10 Output is: 70 60 50

توابع Anonymous

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

شکل دستوری

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

مثال زیر فرم lambda و نحوه کارکرد آن را نشان می دهد:

#!/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

عبارت return

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

#!/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

Scope متغیرها

تمامی متغیرهای موجود در برنامه ممکن است در همه جای برنامه در دسترس نباشند. این موضوع به مکانی که متغیر تعریف شده است بستگی دارد.

Scope یک متغیر تعیین می کند که یک متغیر در کدام بخش از برنامه قابل دسترسی می باشد. در پایتون دو scope برای متغیرها وجود دارد:

متغیرهای Local در برابر Global

متغیرهایی که درون بدنه تابع تعریف می شوند دارای محدوده local و آن هایی که بیرون از تابع تعریف می شوند دارای محدوده global می باشند.

این بدان معناست که متغیرهای local تنها درون تابعی که تعریف شده اند قابل دسترسی می باشند، در حالی که متغیرهای global در سراسر بدنه برنامه توسط تمامی توابع در دسترس می باشند. زمانیکه شما یک تابع را فراخوانی می کنید، متغیرهایی که درون آن تعریف شده اند به scope آورده می شوند:

#!/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. Python 3 - Functions