درخواست های ارتباط
جستجو
لیست دوستان من
صندوق پیام
همه را دیدم
  • در حال دریافت لیست پیام ها
صندوق پیام
رویدادها
همه را دیدم
  • در حال دریافت لیست رویدادها
همه رویدادهای من
تخفیف های وب سایت
همه تخفیف ها

عضویت در

کانال تلگرام

توسینسو

اطلاعات مطلب
مدرس/نویسنده
حسین احمدی
امتیاز: 215360
رتبه:3
343
265
413
2781
حسین احمدی ، بنیانگذار TOSINSO ، توسعه دهنده وب و برنامه نویس ، بیش از 12 سال سابقه فعالیت حرفه ای در سطح کلان ، مشاور ، مدیر پروژه و مدرس نهادهای مالی و اعتباری ، تخصص در پلتفرم دات نت و زبان سی شارپ ، طراحی و توسعه وب ، امنیت نرم افزار ، تحلیل سیستم های اطلاعاتی و داده کاوی ... پروفایل کاربر

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

تاریخ 25 ماه قبل
نظرات 1
بازدیدها 3845
تا این لحظه از دوره آموزشی پایتون تمام کدهایی که نوشتیم به صورت یکجا نوشته می شدند، اما این حالت برای برنامه های کوچک که تعداد خطوط آن ها کم است کاربرد دارد و برای برنامه های بزرگتر نیاز است که کدها را دسته بندی کنیم که کار مدیریت کدها ساده تر باشد و علاوه بر آن امکان استفاده از یک قطعه کد به تعداد مختلف و بدون دوباره نویسی آن ها وجود داشته باشد. اولین قدم و ساده ترین کار برای دسته بندی کدها استفاده از توابع یا 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 برنامه نویسی شئ گرا در پایتون :: مقدمات و آشنایی با کلاس و شئ
دوره مجموعه کل دوره
مطالب مرتبط

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

نظرات
  • فوق العاده خوب و کامل ممنونم

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