درخواست های ارتباط
جستجو
    لیست دوستان من
    صندوق پیام
    همه را دیدم
    • در حال دریافت لیست پیام ها
    صندوق پیام
    رویدادها
    همه را دیدم
    • در حال دریافت لیست رویدادها
    همه رویدادهای من
    اطلاعات دوره آموزشی
    اطلاعات مطلب
      مدرس/نویسنده
      حسین احمدی
      امتیاز: 464785
      رتبه:3
      340
      253
      402
      2670
      حسین احمدی ، بنیانگذار TOSINSO ، توسعه دهنده وب و برنامه نویس ، بیش از 12 سال سابقه فعالیت حرفه ای در سطح کلان ، مشاور ، مدیر پروژه و مدرس نهادهای مالی و اعتباری ، تخصص در پلتفرم دات نت و زبان سی شارپ ، طراحی و توسعه وب ، امنیت نرم افزار ، تحلیل سیستم های اطلاعاتی و داده کاوی ... پروفایل کاربر
      دوره های مرتبط
      دوره های توسینسو دوره آموزشی مقدماتی برنامه نویسی جاوا به زبان ساده
      دوره آموزشی مقدماتی برنامه نویسی جاوا به زبان ساده
      مدرس: مهدی عادلی فر
      این دوره را در 17 قسط خریداری کنید
      با خرید این دوره مبلغ 5,445 تومان هدیه بگیرید
      دوره آموزشی اسکریپت نویسی Batch یا Batch Scripting در ویندوز به زبان ساده
      دوره آموزشی اسکریپت نویسی Batch یا Batch Scripting در ویندوز به زبان ساده
      مدرس: حسین احمدی
      این دوره را در 11 قسط خریداری کنید
      دوره آموزشی مقدماتی برنامه نویسی به زبان سی شارپ
      دوره آموزشی مقدماتی برنامه نویسی به زبان سی شارپ
      مدرس: حسین احمدی
      این دوره را در 17 قسط خریداری کنید
      با خرید این دوره مبلغ 8,470 تومان هدیه بگیرید
      دوره آموزشی برنامه نویسی به زبان پرل بصورت پروژه محور
      دوره آموزشی برنامه نویسی به زبان پرل بصورت پروژه محور
      مدرس: ایمان جوادی
      این دوره را در 13 قسط خریداری کنید
      ساخت و مدیریت ربات تلگرام از صفر با زبان سی شارپ
      ساخت و مدیریت ربات تلگرام از صفر با زبان سی شارپ
      مدرس: مهدی عادلی فر
      این دوره را در 2 قسط خریداری کنید
      دوره آموزشی برنامه نویسی WPF در ویژوال استودیو
      دوره آموزشی برنامه نویسی WPF در ویژوال استودیو
      مدرس: امیر حسین فضلیخانی
      این دوره را در 12 قسط خریداری کنید
      دوره آموزشی برنامه نویسی اندروید با زبان جاوا به زبان ساده
      دوره آموزشی برنامه نویسی اندروید با زبان جاوا به زبان ساده
      مدرس: مهدی عادلی فر
      این دوره را در 27 قسط خریداری کنید
      با خرید این دوره مبلغ 8,110 تومان هدیه بگیرید
      دوره آموزشی برنامه نویسی حرفه ای پایتون به زبان ساده
      دوره آموزشی برنامه نویسی حرفه ای پایتون به زبان ساده
      مدرس: حسین احمدی
      این دوره را در 23 قسط خریداری کنید
      با خرید این دوره مبلغ 7,425 تومان هدیه بگیرید
      دوره آموزشی برنامه نویسی پیشرفته زبان سی شارپ
      دوره آموزشی برنامه نویسی پیشرفته زبان سی شارپ
      مدرس: حسین احمدی
      این دوره را در 78 قسط خریداری کنید
      با خرید این دوره مبلغ 82,245 تومان هدیه بگیرید
      دوره آموزشی پردازش متن با زبان برنامه نویسی پایتون
      دوره آموزشی پردازش متن با زبان برنامه نویسی پایتون
      مدرس: کاظم تقندیکی
      این دوره را در 20 قسط خریداری کنید
      با خرید این دوره مبلغ 7,040 تومان هدیه بگیرید
      دوره آموزشی ساخت ربات تلگرام
      دوره آموزشی ساخت ربات تلگرام
      مدرس: کاظم تقندیکی
      این دوره را در 8 قسط خریداری کنید
      دوره آموزشی طراحی رابط کاربری با JavaFX
      دوره آموزشی طراحی رابط کاربری با JavaFX
      مدرس: حسام رسولیان
      این دوره را در 13 قسط خریداری کنید
      دوره آموزشی Exploit نویسی به زبان Perl
      دوره آموزشی Exploit نویسی به زبان Perl
      مدرس: ایمان جوادی
      این دوره را در 7 قسط خریداری کنید
      دوره تخصصی آموزش متن کاوی با ابزار NLTK
      دوره تخصصی آموزش متن کاوی با ابزار NLTK
      مدرس: کاظم تقندیکی
      این دوره را در 11 قسط خریداری کنید

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

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