در توسینسو تدریس کنید

و

با دانش خود درآمد کسب کنید

آموزش پایتون (Python) به زبان خیلی ساده قسمت 17 : توابع (Function

تا این لحظه از دوره آموزشی پایتون تمام کدهایی که نوشتیم به صورت یکجا نوشته می شدند، اما این حالت برای برنامه های کوچک که تعداد خطوط آن ها کم است کاربرد دارد و برای برنامه های بزرگتر نیاز است که کدها را دسته بندی کنیم که کار مدیریت کدها ساده تر باشد و علاوه بر آن امکان استفاده از یک قطعه کد به تعداد مختلف و بدون دوباره نویسی آن ها وجود داشته باشد. اولین قدم و ساده ترین کار برای دسته بندی کدها استفاده از توابع یا Function ها است. قطعه ای از کد که یک نام به آن تخصیص داده و از سایر کدها متمایز می شود. یک تابع می تواند شامل یک یا چندین ورودی و خروجی باشد. برای استفاده از توابع باید ابتدا آن ها را تعریف (Define) کرد و بعد با فراخوانی (Call) تابع، کدهای آن اجرا می شوند. برای تعریف یک تابع از ساختار زیر استفاده می شود:

def function_name(parameters):
    statement(s)

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

>>> def display_message():
...     print("Welcome to ITPro.ir")
...
>>> display_message()
Welcome to ITPro.ir

در صورت تعریف تابعی که داخل آن هیچ عملیاتی انجام نمی شود، باید به عنوان بدنه تابع عبارت pass را بنویسیم:

>>> def do_nothing():
...     pass
...
>>> do_nothing()

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

>>> def sum(num1,num2):
...     print(num1+num2)
...
>>> sum(2,5)
7


مقادیر بازگشتی توابع و کلمه کلیدی return



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

>>> def sum(num1,num2):
...     return num1 + num2
...
>>> result = sum(2,5)
>>> print(result)
7

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

>>> def do_nothing():
...     pass
...
>>> print(do_nothing())
None


None در پایتون


در زبان پایتون None یعنی هیچ چیز! یعنی متغیری که هیچ چیزی داخل آن قرار نگرفته است، None را می توان داخل یک متغیر به صورت زیر قرار داد:

>>> none_var = None
>>> print(none_var)
None

متغیرهایی که None هستند را بوسیله دستور if به صورت زیر می توان استفاده کرد:

>>> if none_var:
...     print("Initialized")
...

در حقیقت زمانی یک متغیر None است که مقدار دهی نشده است! برعکس کد بالا به صورت زیر است:

>>> if not none_var:
...     print("Not Initialized")
...
Not Initialized

یکی از مواردی که None با False اشتباه گرفته می شود این است که در صورت False بودن متغیر none__var در مثال بالا نیز دستور print بدنه if اجرا می شود، برای حل این مشکل می توان از کلمه کلیدی is استفاده کرد:

>>> none_var = None
>>> if none_var is None:
...     print('Not Initialized')
...
Not Initialized
>>> none_var = False
>>> if none_var is None:
...     print('Not Initialized')
...

دقت کنید که None با مقدار False متفاوت است، مقدار false داخل یک متغیر از نوع Boolean قرار میگیرد، اما None بیانگر این است که متغیر مقدار دهی نشده و هر متغیری می توان مقدار None داشته باشد.


مقدار دهی پارامتر ها بر اساس نام



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

>>> def div(n1,n2):
...     print(n1/n2)
...
>>> div(n1=10,n2=5)
2.0
>>> div(n2=10,n1=5)
0.5

همچنین امکان مشخص کردن بخشی از متغیرها با نام و بخشی بی نام نیز وجود دارد، اما پارامترهایی که نام آن ها مشخص می شود باید در انتهای لیست پارامتر ها آمده باشند و متغیرهایی که مقدار آن ها بر اساس ترتیب مشخص شده امکان مقدار دهی بر اساس نام را ندارند:

>>> def print_nums(n1,n2,n3,n4):
...     print(n1)
...     print(n2)
...     print(n3)
...     print(n4)
...
>>> print_nums(2,7,n4=5,n3=2)
2
7
2
5

در صورتی که پارامتر n1 را به صورت بر اساس نام مقدار دهی کنیم پیغام خطای زیر را دریافت خواهیم کرد:

>>> print_nums(2,7,n1=5,n3=2)
Traceback (most recent call last):
  File "", line 1, in 
TypeError: print_nums() got multiple values for argument 'n1'


مقادیر پیش فرض پارامتر ها


یکی از قابلیت های زبان پایتون امکان مشخص کردن مقادیر پیش فرض برای توابع است، نمونه کد زیر نحوه مشخص کردن مقدار پیش فرض برای پارامتر های توابع را مشخص می کند:

>>> def print_num(n1=2,n2=5):
...     print(n1,n2)
...
>>> print_num()
2 5

دقت کنید که تابع sum بدون مقدار دهی پارامتر ها فراخوانی شده است و مقادیر پیش فرض در خروجی نمایش داده شده اند، زمانی که پارامتر ها مقادیر پیش فرض دارند می توان تنها بخشی از پارامتر ها را در زمان فراخوانی مقدار دهی کرد:

>>> print_num(6)
6 5
>>> print_num(6,8)
6 8

مقادیر پیش باید برای آخرین پارامتر ها مشخص شود، نمی توان در تابعی که چهار پارامتر دارد، برای پارامتر سوم مقدار پیش فرض مشخص کرد، اما برای پارامتر چهارم خیر:

>>> def print_nums(n1,n2,n3=4,n4):
...     print(n1,n2,n3,n4)
...
  File "", line 1
SyntaxError: non-default argument follows default argument


پارامترهای نامتنهای


یکی از قابلیت های زبان پایتون این است که می توان به صورتی تابع را تعریف کرد که تعداد پارامتر های آن نامشخص باشد، برای مثال، فرض کنید که می خواهیم تابعی بنویسیم که اعدادی را به عنوان ورودی از کاربر گرفته و جمع آن ها نمایش دهد، اما تعداد اعداد نامشخص است، بوسیله علامت ** در کنار نام پارامتر می توان کاری کرد که مقادیر مشخص شده در زمان فراخوانی تابع، به صورت یک Tuple داخل متغیری که با علامت ** مشخص شده قرار بگیرند، برای درک بهتر این موضوع به مثال زیر توجه کنید:

>>> def sum(*nums):
...     print(nums)
...
>>> sum(1,3)
(1, 3)
>>> sum(4,7,9,1,2,5)
(4, 7, 9, 1, 2, 5)

همانطور که مشاهده می کنید، اعدادی که به عنوان پارامتر برای تابع sum مشخص شده اند به عنوان آیتم های یک tuple در پارامتر nums قرار گرفته اند. این نوع پارامتر ها تنها به عنوان آخرین پارامتر می توانند استفاده شوند:

>>> def display_message(name,*messages):
...     print(name)
...     for item in messages:
...         print(item)
...
>>> display_message("Hossein","Welcome to ITPro.ir","Python course",20)
Hossein
Welcome to ITPro.ir
Python course
20

یکی از قابلیت های جالب در زبان پایتون این است که در صورت استفاده از دو علامت ** در کنار نام پارامتر و در صورت فراخوانی متد به همراه نام پارامتر و مقدار آن (مانند زمان مقدار دهی پارامتر ها بر اساس نام)، پارامتری که با دو علامت ** مشخص شده تبدیل به یک دیکشنری می شود که کلید آن نام پارامتری که در زمان فراخوانی مشخص شده و مقدار آن مقدار پارامتر می باشد:

>>> def print_args(**args):
...     print(args)
...
>>> print_args(website="ITPro.ir", author="Hossein Ahmadi", course="Python")
{'website': 'ITPro.ir', 'author': 'Hossein Ahmadi', 'course': 'Python'}


افزودن راهنما برای توابع (Docstrings)


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

>>> def sum(n1,n2):
...     'Calculate sum of n1 and n2'
...     print(n1+n2)
...
>>> help(sum)
Help on function sum in module __main__:

sum(n1, n2)
    Calculate sum of n1 and n2

مثالی از راهنمای تابع print:

>>> help(print)
Help on built-in function print in module builtins:

print(...)
    print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)

    Prints the values to a stream, or to sys.stdout by default.
    Optional keyword arguments:
    file:  a file-like object (stream); defaults to the current sys.stdout.
    sep:   string inserted between values, default a space.
    end:   string appended after the last value, default a newline.
    flush: whether to forcibly flush the stream.


ارسال توابع به عنوان پارامتر یک تابع


در زبان پایتون امکان ارسال یک تابع به عنوان پارامتر ورودی تابع دیگر وجود دارد، برای مثال، یک تابع تعریف می کنیم که پارامتر ورودی آن یک تابع دیگر است که آن را فراخوانی می کند:

>>> def runner(func):
...     func()
>>> runner(print)

>>

مثالی دیگر که یک پارامتر را به عنوان ورودی نیز مشخص می کنیم:

>>> def runner(func,arg1):
...     func(arg1)
...
>>> runner(print,"Welcome")
Welcome


توابع تو در تو (Inner Functions)


شما می توانید یک تابع را داخل یک تابع دیگر به صورت زیر تعریف کنید:

>>> def func1():
...     def func2(a,b):
...         return a+b
...     return func2(2,6)
...
>>> func1()
8


عبارت های Lambda


همانطور که گفتیم در زبان پایتون امکان ارسال یک تابع به عنوان پارامتر ورودی وجود دارد، بوسیله عبارت های Lambda می توان به صورت درجا و در زمان فراخوانی تابع، به جای نوشتن نام یک تابع یک متد را نوشت، عبارت های Lambda مناسب برای پارامتر هایی هستند که یک کار کوچک را انجام می دهند و با نوشتن یک Lambda و عدم تعریف یک متد سرعت نوشتن کد افزایش می یابد:

>>> def math(nums, func):
...     for num in nums:
...         func(num)
...
>>> math([1,2,3,4,5],lambda num: print(num*2))
2
4
6
8
10

در مثال بالا، یک تابع تعریف کردیم با نام math که پارامتر اول آن یک لیست و پارامتر دوم آن یک تابع است، نکته مهم اینجا در زمان فراخوانی تابع است که به عنوان پارامتر اول لیست اعداد رو مشخص کردیم، اما به عنوان پارامتر دوم، به جای نوشتن نام یک تابع از کلمه کلیدی lambda برای تعریف تابع به صورت درجا استفاده کردیم، در مقابل کلمه کلیدی lambda یک نام به عنوان پارامتر ورودی تابع مشخص کرده و در مقابل آن و بعد از علامت : کاری که بر روی پارامتر ورودی باید انجام شود را مشخص کردیم که نمایش خروجی عدد ضربدر 2 می باشد.

در این قسمت از آموزش با توابع و نحوه تعریف و فراخوانی آن ها آشنا شدیم. در قسمت بعدی با Closure ها آشنای می شویم. ITpro باشید

نویسنده: حسین احمدی
منبع: جزیره برنامه نویسی وب سایت توسینسو
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی است
#توابع_در_پایتون #function_ها_در_پایتون #lambda_expression_ها_در_پایتون #آموزش_پایتون #عبارت_های_lambda_در_پایتون #آموزش_برنامه_نویسی_پایتون #آموزش_زبان_پایتون
عنوان
1 آموزش پایتون (Python) به زبان خیلی ساده قسمت 1 : آشنایی با پایتون رایگان
2 آموزش پایتون (Python) به زبان خیلی ساده قسمت 2: نوشتن برنامه اول رایگان
3 آموزش پایتون (Python) به زبان خیلی ساده قسمت 3 : ساختار اسکریپت رایگان
4 آموزش پایتون (Python) به زبان خیلی ساده قسمت 4 : نوع داده ها رایگان
5 آموزش پایتون (Python) به زبان خیلی ساده قسمت 5 : تبدیل نوع داده رایگان
6 آموزش پایتون (Python) به زبان خیلی ساده قسمت 6 : عملگرها رایگان
7 آموزش پایتون (Python) به زبان خیلی ساده قسمت 7 : دستور شرطی IF رایگان
8 آموزش پایتون (Python) به زبان خیلی ساده قسمت 8 : حلقه ها رایگان
9 آموزش پایتون (Python) به زبان خیلی ساده قسمت 9 : توابع عددی و عدد رایگان
10 آموزش پایتون (Python) به زبان خیلی ساده قسمت 10 : رشته و توابع آن رایگان
11 آموزش پایتون (Python) به زبان خیلی ساده قسمت 11 : لیست ها رایگان
12 آموزش پایتون (Python) به زبان خیلی ساده قسمت 12 : Tuple ها رایگان
13 آموزش پایتون (Python) به زبان خیلی ساده قسمت 13 : دیکشنری ها رایگان
14 آموزش پایتون (Python) به زبان خیلی ساده قسمت 14 : مجموعه ها Sets رایگان
15 آموزش پایتون (Python) به زبان خیلی ساده قسمت 15 : Zip و پیمایش رایگان
16 آموزش پایتون (Python) به زبان خیلی ساده قسمت 16 : Comprehension رایگان
17 آموزش پایتون (Python) به زبان خیلی ساده قسمت 17 : توابع (Function رایگان
18 آموزش پایتون (Python) به زبان خیلی ساده قسمت 18 : Closure ها رایگان
19 آموزش پایتون (Python) به زبان خیلی ساده قسمت 19 : توابع بازگشتی رایگان
20 آموزش پایتون (Python) به زبان خیلی ساده قسمت 20 : ماژول ها رایگان
21 آموزش پایتون (Python) به زبان خیلی ساده قسمت 21 : پکیج ها رایگان
22 آموزش پایتون (Python) به زبان خیلی ساده قسمت 22 : شی گرایی رایگان
زمان و قیمت کل 0″ 0
1 نظر
Mohamadtech

فوق العاده خوب و کامل ممنونم

نظر شما
برای ارسال نظر باید وارد شوید.
از سرتاسر توسینسو
تنظیمات حریم خصوصی
تائید صرفنظر
×

تو می تونی بهترین نتیجه رو تضمینی با بهترین های ایران بدست بیاری ، پس مقایسه کن و بعد خرید کن : فقط توی جشنواره پاییزه می تونی امروز ارزونتر از فردا خرید کنی ....