|
34 | 34 |
|
35 | 35 | تابع جایگزینی برای بخشهای تکراری برنامه است که با یک بار نوشتن و چندین بار فراخوانی و اجرای آن میتوان از پیچیدگی برنامه جلوگیری و تغییر در آن را آسان نمود. استفاده از توابع باعث بالابردن قابلیت استفاده مجدد از کدها میشود و افزونگی را نیز کاهش میدهد. توابع ابزاری برای خرد کردن منطق برنامه به واحدهای اجرایی کوچکتر برای تسهیل ساخت برنامههای بزرگ است. |
36 | 36 |
|
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) قرار دارند و رویکردی که اینها نسبت به تابع دارند کاملا متفاوت از چیزی است که در زبانهای برنامهنویسی تابعی وجود دارد. توضیح تفاوت این دو کمی سخت است ولی حتما توسط برنامهنویسی با زبانهای موجود در این دو دسته به آن پی خواهید برد. :) |
38 | 38 |
|
39 | 39 | رویکرد این آموزش به تابع بر اساس برنامهنویسی اعلانی است. زبان پایتون قابلیت برنامهنویسی تابعی را نیز در کنار رویکردهای دیگر همچون اعلانی یا شیگرایی ارایه میدهد. برای چگونگی برنامهنویسی تابعی با استفاده از زبان پایتون میتوانید به کتاب Functional Programming in Python از انتشارات O'Reilly مراجعه نمایید (`دریافت نسخه pdf - رایگان <http://www.oreilly.com/programming/free/functional-programming-python.csp>`__). |
40 | 40 |
|
|
487 | 487 |
|
488 | 488 | در ادامه به ارایه سینتکسهایی در این زمینه میپردازیم که هنگام تعیین پارامترهای تابع نقش دارند. |
489 | 489 |
|
490 | | -* سینتکس معمول که تاکنون استفاده میکردیم یعنی به صراحت تک تک پارامترها را تعرف کنیم:: |
| 490 | +* سینتکس معمول که تاکنون استفاده میکردیم یعنی به صراحت تک تک پارامترها را تعریف کنیم:: |
491 | 491 |
|
492 | 492 | >>> def f(a, b, c): |
493 | 493 | ... print(a, b, c) |
494 | 494 | ... |
495 | 495 | >>> f(1, 2, 3) |
496 | 496 | 1 2 3 |
497 | 497 |
|
498 | | -* سینتکس تعیین مقدار پیشفرض برای پارمترها. میتوان هنگام تعیین هر پارامتر در تعریف تابع، مقداری را نیز به آن انتساب داد؛ در این شرایط اگر آرگومانی نظیر با آن پارامتر ارسال نگردد، مقدار پیشفرض آن پارمتر در نظر گرفته خواهد شد. به این گونه پارامترها، اختیاری نیز گفته میشود:: |
| 498 | +* سینتکس تعیین مقدار پیشفرض برای پارامترها. میتوان هنگام تعیین هر پارامتر در تعریف تابع، مقداری را نیز به آن انتساب داد؛ در این شرایط اگر آرگومانی نظیر با آن پارامتر ارسال نگردد، مقدار پیشفرض آن پارامتر در نظر گرفته خواهد شد. به این گونه پارامترها، اختیاری نیز گفته میشود:: |
499 | 499 |
|
500 | 500 | >>> def chaap(text=None): |
501 | 501 | ... if text: |
|
598 | 598 |
|
599 | 599 |
|
600 | 600 |
|
| 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 | + |
601 | 669 |
|
602 | 670 | * سینتکس ``name**``، تمام آرگومانهای کلید:مقدار ارسالی را در قالب یک شی دیکشنری دریافت میکند:: |
603 | 671 |
|
|
648 | 716 |
|
649 | 717 |
|
650 | 718 |
|
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 | | - |
695 | 719 |
|
696 | 720 |
|
697 | 721 |
|
|
0 commit comments