Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit b7e6007

Browse filesBrowse files
author
Saeid Darvishi
committed
write last section
1 parent e54696d commit b7e6007
Copy full SHA for b7e6007

File tree

Expand file treeCollapse file tree

1 file changed

+71
-47
lines changed
Open diff view settings
Filter options
Expand file treeCollapse file tree

1 file changed

+71
-47
lines changed
Open diff view settings
Collapse file

‎lessons/l12.rst‎

Copy file name to clipboardExpand all lines: lessons/l12.rst
+71-47Lines changed: 71 additions & 47 deletions
  • Display the source diff
  • Display the rich diff
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434

3535
تابع جایگزینی برای بخش‌های تکراری برنامه است که با یک بار نوشتن و چندین بار فراخوانی و اجرای آن می‌توان از پیچیدگی برنامه جلوگیری و تغییر در آن را آسان نمود. استفاده از توابع باعث بالابردن قابلیت استفاده مجدد از کدها می‌شود و افزونگی را نیز کاهش می‌دهد. توابع ابزاری برای خرد کردن منطق برنامه به واحدهای اجرایی کوچکتر برای تسهیل ساخت برنامه‌های بزرگ است.
3636

37-
مفهوم تابع از علم ریاضی وارد برنامه‌نویسی شده و به معنی ابزاری است که می‌تواند نتیجه (یا خروجی) را بر اساس داده‌های ورودی محاسبه نماید. چنانچه تمام بخش‌های اساسی برنامه با چنین رویکردی توسعه یابد، به این شیوه توسعه «برنامه‌نویسی تابعی» (Functional Programming) گفته می‌شود، شیوه‌ایی که با آن در زبان‌های برنامه‌نویسی همچون Scala ،Scheme ،Lisp و Haskell مواجه هستید. تابع در زبان‌های دیگری همچون C++ ،C ،Pascal و Java نیز وجود دارد که البته این زبان‌ها در دسته «برنامه‌نویسی اعلانی» (Imperative programming) قرار دارند و رویکردی که این‌ها نسبت به تابع دارند کاملا متفاوت از چیزی است که در زبان‌های برنامه‌نویسی تابعی وجود دارد. توضیح تفاوت این دو کمی سخت است ولی حتما توسط برنامه‌نویسی با زبان‌های موجود در این دو دسته به آن پی خواهید برد. :)
37+
مفهوم تابع از علم ریاضی وارد برنامه‌نویسی شده و به معنی ابزاری است که می‌تواند نتیجه (یا خروجی) را بر اساس داده‌های ورودی محاسبه نماید. چنانچه تمام بخش‌های اساسی برنامه با چنین رویکردی توسعه یابد، به این شیوه توسعه «برنامه‌نویسی تابعی» (Functional Programming) گفته می‌شود، شیوه‌ایی که با آن در زبان‌های برنامه‌نویسی همچون Scala ،Scheme ،Lisp و Haskell مواجه هستید. تابع در زبان‌های دیگری همچون C ،Pascal و ++C نیز وجود دارد که البته این زبان‌ها در دسته «برنامه‌نویسی اعلانی» (Imperative programming) قرار دارند و رویکردی که این‌ها نسبت به تابع دارند کاملا متفاوت از چیزی است که در زبان‌های برنامه‌نویسی تابعی وجود دارد. توضیح تفاوت این دو کمی سخت است ولی حتما توسط برنامه‌نویسی با زبان‌های موجود در این دو دسته به آن پی خواهید برد. :)
3838

3939
رویکرد این آموزش به تابع بر اساس برنامه‌نویسی اعلانی است. زبان پایتون قابلیت برنامه‌نویسی تابعی را نیز در کنار رویکردهای دیگر همچون اعلانی یا شی‌گرایی ارایه می‌دهد. برای چگونگی برنامه‌نویسی تابعی با استفاده از زبان پایتون می‌توانید به کتاب Functional Programming in Python از انتشارات O'Reilly مراجعه نمایید (`دریافت نسخه pdf - رایگان <http://www.oreilly.com/programming/free/functional-programming-python.csp>`__).
4040

@@ -487,15 +487,15 @@
487487

488488
در ادامه به ارایه سینتکس‌هایی در این زمینه می‌پردازیم که هنگام تعیین پارامترهای تابع نقش دارند.
489489

490-
* سینتکس معمول که تاکنون استفاده می‌کردیم یعنی به صراحت تک تک پارامترها را تعرف کنیم::
490+
* سینتکس معمول که تاکنون استفاده می‌کردیم یعنی به صراحت تک تک پارامترها را تعریف کنیم::
491491

492492
>>> def f(a, b, c):
493493
... print(a, b, c)
494494
...
495495
>>> f(1, 2, 3)
496496
1 2 3
497497

498-
* سینتکس تعیین مقدار پیش‌فرض برای پارمترها. می‌توان هنگام تعیین هر پارامتر در تعریف تابع، مقداری را نیز به آن انتساب داد؛ در این شرایط اگر آرگومانی نظیر با آن پارامتر ارسال نگردد، مقدار پیش‌فرض آن پارمتر در نظر گرفته خواهد شد. به این گونه پارامترها، اختیاری نیز گفته می‌شود::
498+
* سینتکس تعیین مقدار پیش‌فرض برای پارامترها. می‌توان هنگام تعیین هر پارامتر در تعریف تابع، مقداری را نیز به آن انتساب داد؛ در این شرایط اگر آرگومانی نظیر با آن پارامتر ارسال نگردد، مقدار پیش‌فرض آن پارامتر در نظر گرفته خواهد شد. به این گونه پارامترها، اختیاری نیز گفته می‌شود::
499499

500500
>>> def chaap(text=None):
501501
... if text:
@@ -598,6 +598,74 @@
598598

599599

600600

601+
**Keyword-Only Arguments** `PEP 3102 <https://www.python.org/dev/peps/pep-3102/>`_
602+
603+
در پایتون نسخه 2x پس از پارامتری ستاره‌دار، نمی‌توان پارامتر دیگری قرار داد و این امکان تنها در پایتون نسخه 3x امکان‌‌پذیر می‌باشد. باید توجه داشت که در این نسخه‌ (3x) آرگومان نظیر تمامی پارامترهایی که پس از پارامتر ستاره‌دار قرار گرفته‌اند، می‌بایست به صورت **نام=مقدار** ارسال گردند.
604+
605+
606+
تابع با سرآیند ``(def f(a, *b, c`` را در نظر بگیرید. در چنین شرایطی که پارامتر ``a`` با استفاده از موقعیت آن مقدار دهی می‌شود و پارامتر ``b`` هر تعداد آرگومان دیگری را دریافت می‌کند، دیگر برای ارسال آرگومان به پارامتر ``c`` چاره‌ای جز ذکر نام آن باقی نمی‌ماند! ::
607+
608+
609+
>>> def f(a, *b, c):
610+
... print(a, b, c)
611+
...
612+
>>>
613+
614+
>>> f(1, 2, c=3)
615+
1 (2,) 3
616+
617+
>>> f(1, c=3)
618+
1 () 3
619+
620+
>>> f(1, 2 ,3 ,4 , 5, c=30)
621+
1 (2, 3, 4, 5) 30
622+
623+
624+
>>> f(1)
625+
Traceback (most recent call last):
626+
File "<stdin>", line 1, in <module>
627+
TypeError: f() missing 1 required keyword-only argument: 'c'
628+
629+
630+
>>> f(1, 2, 3)
631+
Traceback (most recent call last):
632+
File "<stdin>", line 1, in <module>
633+
TypeError: f() missing 1 required keyword-only argument: 'c'
634+
635+
636+
>>> f(1, 2 ,3 ,4 , 5, c=30, 40)
637+
File "<stdin>", line 1
638+
SyntaxError: positional argument follows keyword argument
639+
640+
641+
642+
::
643+
644+
>>> def f(a, *b, c, d=5):
645+
... print(a, b, c, d)
646+
...
647+
>>>
648+
649+
>>> f(1, 2, 3, c=4)
650+
1 (2, 3) 4 5
651+
652+
>>> f(1, 2, 3, 4, c=7, d=9)
653+
1 (2, 3, 4) 7 9
654+
655+
656+
::
657+
658+
>>> # Python 2.x
659+
>>> def f(a, *b, c):
660+
File "<stdin>", line 1
661+
def f(a, *b, c):
662+
^
663+
SyntaxError: invalid syntax
664+
665+
666+
667+
668+
601669

602670
* سینتکس ``name**``، تمام آرگومان‌های کلید:مقدار ارسالی را در قالب یک شی دیکشنری دریافت می‌کند::
603671

@@ -648,50 +716,6 @@
648716

649717

650718

651-
در پایتون نسخه 3x دو سینتکس جدید نیز منظور شده است:
652-
653-
* ``def func(*other, name)`` - این سینتکس امکانی است که بتوان تابعی تعریف که از یک طرف بتواند هر تعداد آرگومان را دریافت کند و از طرف دیگر نیز تعداد مشخصی آرگومان خاص را تعیین کرد. تنها باید توجه داشت که آرگومان نظیر تمامی پارامترهایی که پس از پارامتر ستاره‌دار قرار گرفته‌اند، می‌بایست به صورت نام=مقدار ارسال گردند::
654-
655-
>>> def f(a, *b, c):
656-
... print(a, b, c)
657-
...
658-
>>>
659-
660-
>>> f(1, 2, c=3)
661-
1 (2,) 3
662-
663-
>>> f(1, c=3)
664-
1 () 3
665-
666-
>>> f(1)
667-
Traceback (most recent call last):
668-
File "<stdin>", line 1, in <module>
669-
TypeError: f() missing 1 required keyword-only argument: 'c'
670-
671-
672-
>>> f(1, 2, 3)
673-
Traceback (most recent call last):
674-
File "<stdin>", line 1, in <module>
675-
TypeError: f() missing 1 required keyword-only argument: 'c'
676-
677-
678-
::
679-
680-
>>> def f(a, *b, c, d=5):
681-
... print(a, b, c, d)
682-
...
683-
>>>
684-
685-
>>> f(1, 2, 3, c=4)
686-
1 (2, 3) 4 5
687-
688-
>>> f(1, 2, 3, 4, c=7, d=9)
689-
1 (2, 3, 4) 7 9
690-
691-
692-
693-
* ``def func(*, name)`` - استفاده از کاراکتر ستاره خالی نیز ممکن است که در این حالت آرگومان‌های اضافی نادیده گرفته می‌شوند ولی همانند مورد قبل امکان دریافت برخی پارامترها آن‌هم تنها به صورت نام=مقدار ممکن است:
694-
695719

696720

697721

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.