درخواست های ارتباط
جستجو
لیست دوستان من
صندوق پیام
همه را دیدم
  • در حال دریافت لیست پیام ها
صندوق پیام
رویدادها
همه را دیدم
  • در حال دریافت لیست رویدادها
همه رویدادهای من
دوره های مرتبط
دوره آموزشی ساخت ربات تلگرام
مدرس: taghandiki
این دوره را در 8 قسط خریداری کنید
ساخت و مدیریت ربات تلگرام از صفر با زبان سی شارپ
مدرس: مهدی عادلی
این دوره را در 2 قسط خریداری کنید
دوره آموزشی مقدماتی برنامه نویسی به زبان سی شارپ
مدرس: حسین احمدی
این دوره را در 17 قسط خریداری کنید
دوره آموزشی پردازش متن با زبان برنامه نویسی پایتون
مدرس: taghandiki
این دوره را در 20 قسط خریداری کنید
دوره آموزشی برنامه نویسی حرفه ای پایتون به زبان ساده
مدرس: حسین احمدی
این دوره را در 23 قسط خریداری کنید
دوره آموزشی برنامه نویسی اندروید با زبان جاوا به زبان ساده
مدرس: مهدی عادلی
این دوره را در 27 قسط خریداری کنید
دوره آموزشی طراحی رابط کاربری با JavaFX
مدرس: hharddy
این دوره را در 13 قسط خریداری کنید
دوره آموزشی برنامه نویسی به زبان پرل بصورت پروژه محور
مدرس: dr-iman
این دوره را در 13 قسط خریداری کنید
دوره آموزشی مقدماتی برنامه نویسی جاوا به زبان ساده
مدرس: مهدی عادلی
این دوره را در 17 قسط خریداری کنید
دوره آموزشی Exploit نویسی به زبان Perl
مدرس: dr-iman
این دوره را در 7 قسط خریداری کنید

آموزش زبان پایتون :: قسمت شانزدهم - توابع (Functions)

0 نظرات
726 بازدیدها
تا این لحظه از دوره آموزشی پایتون تمام کدهایی که نوشتیم به صورت یکجا نوشته می شدند، اما این حالت برای برنامه های کوچک که تعداد خطوط آن ها کم است کاربرد دارد و برای برنامه های بزرگتر نیاز است که کدها را دسته بندی کنیم که کار مدیریت کدها ساده تر باشد و علاوه بر آن امکان استفاده از یک قطعه کد به تعداد مختلف و بدون دوباره نویسی آن ها وجود داشته باشد. اولین قدم و ساده ترین کار برای دسته بندی کدها استفاده از توابع یا 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 "<stdin>", line 1, in <module>
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 "<stdin>", 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 باشید

نویسنده: حسین احمدی
منبع: جزیره برنامه نویسی وب سایت توسینسو
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی است
برچسب ها
ردیف عنوان قیمت
1 آموزش زبان پایتون :: قسمت اول - مقدمات و آشنایی اولیه با پایتون رایگان
2 آموزش زبان پایتون :: قسمت دوم - دانلود پایتون و نوشتن اولین برنامه رایگان
3 آموزش زبان پایتون :: قسمت سوم - آشنایی با ساختار اسکریپت های پایتون رایگان
4 آموزش زبان پایتون :: قسمت چهارم - نوع های داده در زبان پایتون رایگان
5 آموزش زبان پایتون :: قسمت پنجم - تبدیل نوع ها به یکدیگر رایگان
6 آموزش زبان پایتون :: قسمت ششم - عملگرها در پایتون رایگان
7 آموزش زبان پایتون :: قسمت هفتم - دستور if رایگان
8 آموزش زبان پایتون :: قسمت هشتم - حلقه ها رایگان
9 آموزش زبان پایتون :: قسمت نهم - نوع های عددی و توابع کار با اعداد رایگان
10 آموزش زبان پایتون :: قسمت دهم - کار با رشته ها و توابع مرتبط رایگان
11 آموزش زبان پایتون :: قسمت یازدهم - لیست ها رایگان
12 آموزش زبان پایتون :: قسمت دوازدهم - Tuple ها رایگان
13 آموزش زبان پایتون :: قسمت سیزدهم - دیکشنری ها (Dictionaries) رایگان
14 آموزش زبان پایتون :: قسمت چهاردهم - مجموعه ها (Sets) رایگان
15 آموزش زبان پایتون :: قسمت پانزدهم - تابع zip و پیمایش چند لیست به صورت همزمان رایگان
16 آموزش زبان پایتون :: قسمت پانزدهم - روش Comprehension برای ایجاد لیست ها، دیکشنری ها و مجموعه ها رایگان
17 آموزش زبان پایتون :: قسمت شانزدهم - توابع (Functions) رایگان
18 آموزش زبان پایتون :: قسمت هفدهم - Closure ها رایگان
19 آموزش زبان پایتون :: قسمت هجدهم - توابع بازگشتی (Recursive Functions) رایگان
20 آموزش زبان پایتون :: قسمت نوزدهم - ماژول ها (Modules) رایگان
21 آموزش زبان پایتون :: قسمت بیستم - پکیج ها (Packages) رایگان
22 برنامه نویسی شئ گرا در پایتون :: مقدمات و آشنایی با کلاس و شئ رایگان
مطالب مرتبط

در حال دریافت اطلاعات

نظرات
هیچ نظری ارسال نشده است

    برای ارسال نظر ابتدا به سایت وارد شوید

    arrow