درس ۰۴: برنامه‌نویسی تعاملی

در این درس به توضیح حالت تعاملی پایتون می‌پردازیم؛ اینکه چگونه وارد یا خارج شویم، کد بنویسیم یا در مورد چیزی در این زبان راهنمایی بگیریم. پس از مطالعه درس پیش و دو بخش ابتدایی این درس، با اجرای اسکریپت و حالت تعاملی پایتون آشنا شده‌اید؛ بر همین اساس در بخش سوم این درس به توضیح گزینه‌های مورد کاربرد در فراخوانی مفسر پایتون می‌پردازیم که به نوعی به هر دو مبحث یاد شده مربوط می‌شوند. این درس پر از مطالبی است که در آینده سر نوبت(!) بررسی خواهند شد (مانند مفهوم شی) البته برای درک موضوعات، توضیح کوتاهی ارایه شده ولی بهتر است متمرکز به موضوعات اصلی خود درس باشید و زیاد درگیر آن‌ها نشوید؛ فقط به خاطر بسپارید!

سطح: پایه



حالت تعاملی

از درس پیش به خاطر داریم که کدهای پایتون را می‌توان به دو روش اجرا نمود: ۱- ایجاد اسکریپت و معرفی آن به مفسر پایتون که در همان درس بررسی شد ۲- به شکل تعاملی با مفسر پایتون که موضوع همین درس است.

پایتون یک زبان برنامه‌نویسی با قابلیت «حالت تعاملی» (Interactive Mode) است؛ این قابلیت که مبتنی بر خط فرمان است، امکانی را برای پردازش و اجرای کدهای (دستورها، عبارت‌ها [1] و تعریف‌ها) زبان پایتون فراهم می‌آورد. کدنویسی در این حالت به مانند زمانی است که یک اسکریپت را ایجاد می‌نمایید؛ ولی با هر بار فشردن کلید Enter صفحه کلید، مفسر پایتون آن را به صورت خودکار اجرا می‌کند.

البته حالت تعاملی محدودیت‌هایی دارد که خواهید دید ولی از برخی زوایا بسیار مناسب و کاربردی است؛ به عنوان نمونه ممکن است قصد آزمودن یکی از قابلیت‌های زبان پایتون را داشته باشید یا اینکه بخواهید خروجی یک قطعه کد کوتاه را مشاهده نمایید که در این صورت ایجاد اسکریپت و سپس اجرای آن می‌تواند کار پر زحمتی به نظر برسد!،‌ از طرفی دریافت راهنمایی نیز از دیگر مزایای آن است که در یادآوری، شناخت و کسب آگاهی از موارد زبان پایتون (کلمه‌های کلیدی، تابع‌ها، کلاس‌ها، ماژول‌ها و...) بسیار کاربردی و مفید می‌باشد، حتی برخی نیز از این حالت پایتون به عنوان یک ماشین حساب بهره می‌گیرند!.

برای ورود به حالت تعاملی پایتون از دستور فراخوانی مفسر (حالت عمومی: python) - به شکل تنها و بدون آرگومان‌ - در رابط خط فرمان سیستم عامل، استفاده می‌شود.

ورود به حالت تعاملی پایتون 2x - ویندوز:

> cd C:\\Python27
> python
Python 2.7.9 (default, Dec 10 2014, 12:28:03) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>

ورود به حالت تعاملی پایتون 3x - گنولینوکس:

user> python3
Python 3.4.2 (default, Jan 25 2015, 20:02:16)
[GCC 4.9.2 20141101 (Red Hat 4.9.2-1)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>

پس از ورود یک پیغام نمایش داده می‌شود؛ در این پیغام ضمن ارایه اطلاعات پایه در مورد مفسر پایتون و سیستم عامل، پیشنهاد می‌شود که جهت یافتن اطلاعات بیشتر در مورد زبان برنامه‌نویسی پایتون از دستورهای ویژه‌ایی استفاده نمایید:

  • ()license: باعث نمایش چندین صفحه مرتبط با تاریخ توسعه و پروانه‌های پایتون می‌گردد که البته از طریق - صفحه تاریخچه و پروانه پایتون - نیز قابل مشاهده است. برای مرور از کلید Enter و خروج از کلید q صفحه کلید استفاده نمایید.
  • credits: فهرستی از سازمان‌ها و شرکت‌های مشارکت کننده در توسعه زبان پایتون را نمایش می‌دهد.
  • copyright: فهرست کپی‌رایت زبان پایتون از ابتدا تا کنون را نمایش می‌دهد.
  • help: این دستور کاربرد زیادی دارد که در ادامه بررسی می‌شود. با استفاده از این دستور می‌توان در مورد اشیا و اجزای مختلف موجود در زبان پایتون راهنمایی گرفت.

در حالت تعاملی پایتون، به صورت پیش‌فرض هر سطر توسط نماد <<< مشخص می‌شود و از آنجا که امکان وارد کردن دستورهای چند سطری (مانند تابع‌ها) نیز وجود دارد؛ سطرهای مربوط با بدنه یک دستور توسط نماد ... مشخص می‌گردند.

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

>>> print("(50-5×6)÷4 =", (50-5*6)/4)
(50-5×6)÷4 = 5.0

>>> def func():
...     print("(50-5×6)÷4 =", (50-5*6)/4)
...
>>> func()
(50-5×6)÷4 = 5.0

ملاحظه

در پایتون برای تعریف یک تابع از کلمه کلیدی def استفاده می‌گردد که به دنبال آن نام و سپس پارامتر‌های تابع (در صورت نیاز) که درون پرانتز قرار می‌گیرند، آورده می‌شود. بعد از کاراکتر دو‌نقطه (Colon یا :) و در سطرهای بعدی با رعایت یکنواخت تورفتگی، دستورهای بدنه تابع نوشته می‌شوند. با فراخوانی تابع (وارد کردن نام تابع) بدنه تابع اجرا می‌گردد. چنانچه در تعریف تابع پارامترهایی نیز در نظر گرفته شده باشد، در هنگام فراخوانی می‌بایست مقدار متناظر آن‌ها نیز مشخص شود (درون پرانتز جلوی نام تابع) - در کد بالا تابع func فاقد پارامتر بوده بنابراین در هنگام فراخوانی آن مقداری ارسال نشده است. [فقط برای آگاهی اولیه - تابع‌ پایتون در درسی جداگانه بررسی خواهد شد]

توجه

برای پایان دادن به دستورهای چند سطری می‌بایست سطر پایانی را خالی رها کرده و کلید Enter را بفشارید.

برای پاک کردن صفحه از کلید‌های ترکیبی Ctrl–L استفاده نمایید. به منظور خروج نیز می‌توانید عبارت ()quit را وارد کرده یا از کلیدهای ترکیبی Ctrl–D در گنولینوکس و Ctrl–Z با یک Enter پس از آن در ویندوز استفاده نمایید.

از مزایای حالت تعاملی این است که در بیشتر مواقع برای مشاهده نتیجه، نیازی به استفاده از print نمی‌باشد:

>>> a = 2
>>> a
2

>>> (50-5*6)/4
5.0

و چنانچه مشغول انجام محاسبات ریاضی هستید می‌توانید از یک متغیر خاص با نام _ (خط زیرین: Underscore) استفاده نمایید؛ این متغیر همواره به آخرین مقدار [2] محاسبه شده اشاره دارد:

>>> 5 * 6
30
>>> _
30
>>> 50 - _
20
>>> _ / 4
5.0

مثالی دیگر - در کاربرد ریاضی، برخی تابع‌ها توسط ماژول math از کتابخانه استاندارد پایتون در دسترس هستند [اسناد پایتون]:

>>> import math

>>> math.sqrt(36)
6.0

>>> math.pow(3, 2)
9.0

>>> math.radians(90)
1.5707963267948966

>>> math.sin(_)
1.0

برای وارد کردن یک ماژول به اسکریپت (یا ماژولی دیگر) از دستور import استفاده می‌گردد. در یک درس جداگانه به صورت کامل صحبت خواهد شد ولی برای ادامه این درس تا همین حد بدانید که برای فراخوانی تابع‌های موجود در یک ماژول import شده از الگوی «نام ماژول + نقطه + نام تابع مورد نظر» استفاده می‌گردد - در دستور import پسوند ماژول نوشته نمی‌شود.

مثالی دیگر - sys یکی از ماژول‌های مهم پایتون است؛ این ماژول امکان دسترسی به برخی از متغیرهای مورد استفاده مفسر (در زمان اجرا) و همچنین تابع‌هایی که با مفسر در ارتباط هستند را فراهم می‌آورد [اسناد پایتون]:

>>> import sys

>>> sys.version
'3.4.2 (default, Jan 25 2015, 20:02:16) \n[GCC 4.9.2 20141101 (Red Hat 4.9.2-1)]'

>>> sys.version_info
sys.version_info(major=3, minor=4, micro=2, releaselevel='final', serial=0)

>>> sys.platform
'linux'

>>> sys.getdefaultencoding()
'utf-8'

دستور ()sys.exit نیز موجب توقف اجرا (در اینجا: خروج از حالت تعاملی پایتون) می‌گردد. برای کنترل خطاها کاربرد دارد و همچنین می‌توان پیامی مرتبط را به خروجی فرستاد (معمولا گزارش رویدادی که موجب اتمام ناگهانی برنامه شده‌ است):

>>> import sys

>>> sys.exit("Error: Goodbye! :| ")
Error: Goodbye! :|

user>

دریافت راهنمایی

یکی از دستورهای پیشنهادی در پیغام ابتدایی حالت تعاملی، help بود که با وارد کردن آن متن پایین نمایش داده می‌شود:

>>> help
Type help() for interactive help, or help(object) for help about object.

به دو روش می‌توان از امکان راهنمایی استفاده کرد که در ادامه بررسی می‌شود.

توجه

در هر دو روش برای مرور توضیحات طولانی از کلیدهای Enter (سطر به سطر) و Space (صفحه به صفحه) بهره بگیرید و برای خروج از توضیحات نیز از کلید q صفحه کلید استفاده نمایید؛ انتهای توضیحات نیز توسط عبارت (END) مشخص می‌شود.

روش یکم: رفتن به حالت راهنمای تعاملی

برای این منظور از دستور ()help استفاده می‌گردد - با وارد کردن این دستور ضمن نمایش پیغام خوش‌آمد گویی، نماد سطر (<<<) نیز به <help تغییر پیدا می‌کند:

>>> help()

Welcome to Python 3.4's help utility!

If this is your first time using Python, you should definitely check out
the tutorial on the Internet at http://docs.python.org/3/tutorial/.

Enter the name of any module, keyword, or topic to get help on writing
Python programs and using Python modules.  To quit this help utility and
return to the interpreter, just type "quit".

To get a list of available modules, keywords, symbols, or topics, type
"modules", "keywords", "symbols", or "topics".  Each module also comes
with a one-line summary of what it does; to list the modules whose name
or summary contain a given string such as "spam", type "modules spam".

help>

اکنون کافی است نام موردی که می‌خواهید درباره آن اطلاعات بگیرید را وارد نمایید؛ در همین راستا همانطور که در پیغام ابتدایی هم بیان شده است می‌توانید از فرمان‌‌های پایین نیز کمک بگیرید:

  • modules: نمایش فهرستی از نام تمامی ماژول‌های در دسترس
  • keywords:‌ نمایش تمام کلمه‌های کلیدی پایتون
  • symbols:‌ نمایش تمام نماد‌های معنادار در پایتون
  • topics: نمایش فهرستی از مباحث مربوط به پایتون
# Python 3.x

help> keywords

Here is a list of the Python keywords.  Enter any keyword to get more help.

False               def                 if                  raise
None                del                 import              return
True                elif                in                  try
and                 else                is                  while
as                  except              lambda              with
assert              finally             nonlocal            yield
break               for                 not
class               from                or
continue            global              pass

help> def

Function definitions
********************

A function definition defines a user-defined function object (see
section *The standard type hierarchy*):

[...]

A function definition is an executable statement.  Its execution binds
the function name in the current local namespace to a function object
(a wrapper around the executable code for the function).  This
function object contains a reference to the current global namespace
:

برای خروج از راهنمای تعاملی، quit (یا q) را وارد نماید.

روش دوم: فراخوانی تابع راهنما

در این روش از الگوی (help(object برای دریافت اطلاعات درباره یک شی (object)، به صورت مستقیم و بدون ورود به راهنمای تعاملی استفاده می‌شود - تنها کافی است نام شی مورد نظر را درون پرانتز قرار دهید (به جای واژه object):

>>> 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.
(END)

>>>

نکته

print در نسخه 3x پایتون به صورت یک تابع تعریف شده است و تابع‌ها در پایتون یک نوع شی هستند.

از این روش با الگوی دیگری هم استفاده می‌شود. الگوی ("help("string یعنی قرار دادن نام موردی که می‌خواهید درباره آن اطلاعات بگیرید درون پرانتز به شکلی محصور با دو نماد نقل قول ( ” ” ) - این الگو عملکردی مشابه با روش قبل (روش یکم) دارد با این تفاوت که دریافت اطلاعات به صورت مستقیم و بدون ورود به راهنمای تعاملی انجام می‌پذیرد. در واقع برای به دست آوردن اطلاعات درباره موردی که شی نمی‌باشد (مانند هر یک از دستورهای symbols ،keywords ،modules و topics یا دستور print در پایتون 2x یا نام ماژول‌ها یا...) لازم است به این صورت اقدام گردد:

# Python 2.x

>>> help("keywords")

Here is a list of the Python keywords.  Enter any keyword to get more help.

and                 elif                if                  print
as                  else                import              raise
assert              except              in                  return
break               exec                is                  try
class               finally             lambda              while
continue            for                 not                 with
def                 from                or                  yield
del                 global              pass

>>> help("print")

The "print" statement
*********************

print_stmt ::= "print" ([expression ("," expression)* [","]]
                | ">>" expression [("," expression)+ [","]])

"print" evaluates each expression in turn and writes the resulting
object to standard output (see below).  If an object is not a string,
it is first converted to a string using the rules for string
conversions.  The (resulting or original) string is then written.  A
space is written before each object is (converted and) written, unless
the output system believes it is positioned at the beginning of a
line.  This is the case (1) when no characters have yet been written
to standard output, (2) when the last character written to standard
output is a whitespace character except "' '", or (3) when the last
write operation on standard output was not a "print" statement. (In
some cases it may be functional to write an empty string to standard
output for this reason.)

Note: Objects which act like file objects but which are not the
    built-in file objects often do not properly emulate this aspect of
    the file object's behavior, so it is best not to rely on this.

:

گزینه‌های فراخوانی

در کنار دستور فراخوانی پایتون در خط فرمان، می‌توان از گزینه‌ها و دستورهای گوناگونی بهره برد. البته قبلا هم از آن‌ها استفاده کردیم؛ مانند زمانی که قصد داشتیم نسخه پایتون مورد نظر خود را بیابیم یا حتی زمانی که قصد داشیم یک اسکریپت را اجرا کنیم. واقعیت این است که دستور فراخوانی پایتون الگویی دارد که شکل کامل آن در پایین آورده شده است.

در پایتون 2x [اسناد پایتون]:

python [-BdEiOQsRStuUvVWxX3?] [-c command | -m module-name | script | - ] [args]

در پایتون 3x [اسناد پایتون]:

python [-bBdEhiIOqsSuvVWx?] [-c command | -m module-name | script | - ] [args]

همانطور که مشاهده می‌شود این دستور می‌تواند سه دسته آرگومان را بپذیرد:

دسته یکم (Options):

شامل برخی از حروف الفباست که به همراه یک کاراکتر خطِ فاصله (Dash) - بعد از دستور اصلی یعنی python می‌آیند؛ برخی از این گزینه‌ها به شرح زیر است:

  • q− (تنها در پایتون 3x) - در هنگام ورود به حالت تعاملی پایتون از نمایش پیغام ابتدایی صرف نظر می‌شود:

    user> python3 -q
    >>> 2 + 2
    4
    
  • Q- (تنها در پایتون 2x) - در هنگام اجرای یک اسکریپت و برای کنترل عملگرهای تقسیم / موجود در آن به کار می‌رود؛ به این صورت که پس از آن می‌بایست یکی از کلمه‌های warn ،new ،old و warnall ذکر گردد.

    • Qold: حاصل تقسیم دو عدد صحیح یک عدد صحیح باشد.
    • Qnew: حاصل تقسیم دو عدد صحیح یک عدد ممیز شناور باشد - مانند نسخه 3x پایتون.
    • Qwarn: حاصل تقسیم دو عدد صحیح یک عدد صحیح باشد، به همراه نمایش پیام هشدار به ازای هر عملگر.
    • Qwarnall: به مانند Qwarn است ولی به ازای تمام عملگرهای تقسیم به کار رفته در اسکریپت تنها یک پیام هشدار نمایش داده می‌شود.
    python -Qnew script.py
    
  • O- یا OO- - راه‌اندازی بهینه‌ساز (Optimization) پایه بایت‌کد، که می‌تواند تا حدودی موجب بهبود کارایی اسکریپت گردد. استفاده از گزینه OO- علاوه بر بهینه سازی، موجب دور انداختن مستندات [3] (Docstrings) موجود در اسکریپت نیز می‌شود:

    python -O script.py
    

    نکته

    در صورت استفاده از این گزینه‌ها، به جای فایل pyc. (بایت‌کد معمولی)، فایلی با پسوند pyo. (بایت‌کد بهینه شده) ایجاد می‌گردد.

  • B- - مفسر پایتون از ذخیره بایت‌کد ماژول‌های import شده بر روی دیسک خودداری می‌کند:

    python -B script.py
    
  • d- - برخی از گزارش‌های اضافه خطایابی (در صورت وجود) نمایش داده می‌شوند:

    python -d script.py
    
  • i- - پس از اجرای اسکریپت، خط فرمان به حالت تعاملی پایتون وارد می‌شود:

    python -i script.py
    
  • V- (برابر با version--) - نسخه پایتون نمایش داده می‌شود:

    python -V
    
  • ?- یا h- (برابر با help--) - فهرست گزینه‌های فراخوانی پایتون به همراه توضیحاتی کوتاه نمایش داده می‌شود:

    python -h
    
  • S- - از import شدن ماژول site جلوگیری می‌شود:

    python -S
    

    به صورت عادی ماژول site در زمان راه‌اندازی مفسر پایتون به صورت خودکار import می‌گردد و وظیفه آن گسترش sys.path است. به عنوان نمونه؛ این ماژول مسیر دایرکتوری site-packages را به sys.path اضافه می‌کند.

    دایرکتوری site-packages محل نگهداری بسته‌ها یا کتابخانه‌های شخص ثالثی است که با استفاده از pip اقدام به نصب آن‌ها در پایتون کرده‌ایم.

    هر زمان که ماژولی import می‌شود مفسر پایتون در داخل دایرکتوری‌های مشخصی به دنبال آن می‌گردد؛ این دایرکتوری‌ها در sys.path فهرست شده‌اند.

    برای نمونه - پایتون 3x در ویندوز:

    > python -q
    
    >>> import sys
    >>> sys.path
    ['', 'C:\\Python34', 'C:\\Windows\\SYSTEM32\\python34.zip', 'C:\\Python34\\DLLs', 'C:\\Python34\\lib', 'C:\\Python34\\lib\\site-packages']
    >>>
    

    برای نمونه - پایتون 3x در گنولینوکس:

    user> python3 -qS
    
    >>> import sys
    >>> sys.path
    ['', '/usr/local/lib/python34.zip', '/usr/local/lib/python3.4/', '/usr/local/lib/python3.4/plat-linux', '/usr/local/lib/python3.4/lib-dynload']
    >>>
    

    از گزینه S استفاده شده است و همانطور که مشاهده می‌نمایید دیگر از دایرکتوری site-packages خبری نیست!

    نکته

    نخستین دایرکتوری که مفسر در آن به دنبال نام ماژول می‌گردد؛ دایرکتوری حاوی اسکریپت است که در کدهای بالا (چون که مربوط به حالت تعاملی پایتون است) توسط '' مشخص شده است.

    مفسر دایرکتوری‌های این فهرست را به ترتیب (از چپ به راست) برای جستجو در نظر می‌گیرد.

    می‌توانید با نوشتن مسیر دایرکتوری‌های دلخواه خود درون یک فایل متنی با پسوند pth. و قرار دادن آن درون دایرکتوری site-packages، این دایرکتوری‌ها را نیز به sys.path بیافزایید. برای نمونه فایل mypath.pth را (در سیستم عامل گنولینوکس) ایجاد می‌نماییم:

    user> cd /usr/local/lib/python3.4/site-packages
    user> sudo touch mypath.pth
    user> sudo chmod 777 mypath.pth
    

    فایل mypath.pth را با یک ویرایشگر متن باز کرده و مشابه پایین فهرست دایرکتوری‌های مورد نظر خود را در آن وارد می‌نماییم:

    /home/saeid/Documents
    /home/saeid/Documents/me
    

    اکنون تمام ماژول‌های موجود در این دایرکتوری‌ها قابل import هستند؛ به فهرست sys.path توجه نمایید:

    user> python3 -q
    
    >>> import sys
    >>> sys.path
    ['', '/usr/local/lib/python34.zip', '/usr/local/lib/python3.4', '/usr/local/lib/python3.4/plat-linux', '/usr/local/lib/python3.4/lib-dynload', '/usr/local/lib/python3.4/site-packages', '/home/saeid/Documents', '/home/saeid/Documents/me']
    >>>
    

    همین کار را می‌توان از طریق برنامه‌نویسی نیز انجام داد، البته پس از اتمام اجرای اسکریپت (در اینجا: خروج از حالت تعاملی) اثر آن از بین می‌رود:

    user> python3 -q
    
    >>> import sys
    >>> sys.path.append('/home/saeid/Documents')
    >>> sys.path.append('/home/saeid/Documents/me')
    

    تابع append دایرکتوری مورد نظر را به انتهای فهرست sys.path اضافه می‌کند. البته می‌توان با استفاده از تابع insert به جای append جایگاه دایرکتوری دلخواه خود را با استفاده از آرگومان نخست آن در sys.path مشخص نمود؛ با این کار دایرکتوری مورد نظر زودتر از دایرکتوری‌های بعد خودش توسط مفسر مورد جستجو قرار می‌گیرد - فایده این کار زمانی مشخص می‌شود که در دایرکتوری‌هایی مجزا، ماژولی با نام یکسان وجود داشته باشد؛ در این صورت ماژولی که زودتر توسط مفسر دیده شود به عنوان ماژول مورد نظر import می‌شود:

    user> python3 -q
    
    >>> import sys
    >>> sys.path.insert(1,'/home/saeid/Documents/me')
    >>> sys.path
    ['', '/home/saeid/Documents/me', '/usr/local/lib/python34.zip', '/usr/local/lib/python3.4', '/usr/local/lib/python3.4/plat-linux', '/usr/local/lib/python3.4/lib-dynload', '/usr/local/lib/python3.4/site-packages']
    >>>
    

    چند درس جلوتر خواهید آموخت که مقدار sys.path در واقع یک شی از نوع list است؛ append و insert نیز تابع‌هایی [4] هستند که توسط یک شی از نوع list می‌توانند فراخوانی گردند. در این مرحله تنها به یاد داشته باشید که موقعیت‌ها در یک شی از نوع list از عدد صفر شماره‌گذاری می‌گردند.

دسته دوم:

  • c command- - این الگو امکان اجرای دستورهای پایتون را بدون ورود به حالت تعاملی یا ایجاد اسکریپت، فراهم می‌سازد:

    user> python3 -c "import sys; print(sys.path)"
    ['', '/usr/local/lib/python34.zip', '/usr/local/lib/python3.4', '/usr/local/lib/python3.4/plat-linux', '/usr/local/lib/python3.4/lib-dynload', '/usr/local/lib/python3.4/site-packages']
    

    توجه

    دستورها باید درون نمادهای نقل قول محصور باشند.

    استفاده از سمی‌کالن ( ; )‌ در پایان دستورهای پایتون اجباری نیست ولی چنانچه بخواهیم چند دستور را در یک سطر قرار بدهیم می‌بایست از آن استفاده نماییم.

  • m module-name- - این الگو امکان اجرای یک ماژول (از میان فهرست sys.path) را به عنوان ماژول __main__ فراهم می‌سازد.

    جالب‌ترین نمونه برای بیان کاربرد این الگو، اجرای ماژول SimpleHTTPServer است. زمانی که نیاز به راه‌اندازی سریع یک وب سرور را دارید و نمی‌خواهید خود را درگیر نصب و پیکربندی Apache یا دیگر وب سرور‌ها نمایید؛ می‌توانید از این ماژول پایتون بهره بگیرید. این ماژول امکانات یک وب سرور ساده را در اختیار شما قرار می‌دهد. البته این ماژول در نسخه 3x پایتون در ماژول http.server ادغام شده است.

    در پایتون 2x [اسناد پایتون]:

    user> python -m SimpleHTTPServer 8080
    

    در پایتون 3x [اسناد پایتون]:

    user> python3 -m http.server 8080
    

    توجه

    در استفاده از این الگو نیز همانند زمان import، پسوند ماژول (py) نوشته نمی‌شود.

    می‌توان شماره پورت را وارد نکرد که در این حالت به صورت پیش‌فرض پورت 8000 در نظر گرفته می‌شود.

    ولی منظور از ماژول __main__ چیست؟

    هنگامی که ماژولی (برای نخستین بار) import می‌شود، مفسر پایتون به صورت خودکار تمام کد‌های درون آن را اجرا می‌کند. در مواردی ممکن است یک فایل py. حاوی کدهایی باشد که تنها می‌بایست در حالت اسکریپت به اجرا درآید؛ در این شرایط با import شدن فایل، این کد‌ها نیز اجرا می‌گردند که خواست برنامه‌نویس نمی‌باشد!. از طرفی در پایتون یک سری مقادیر و متغیرهای ویژه و از پیش تعریف شده به مانند __name__ وجود دارد. متغیر __name__ به نام ماژول اشاره دارد؛ در حالت اسکریپت (اجرای یک ماژول به صورت مستقیم - نمونه دستور: python script.py - درس پیش توضیح داده شد) مقدار __name__ برابر با یک مقدار ویژه به نام __main__ می‌گردد که از این موضوع می‌توان برای کنترل اجرای کدها استفاده کرد.

    معمولا کدهای اسکریپت به گونه‌ای نوشته می‌شوند که اجرای آن‌ها وابسته به اجرای یک تابع اصلی باشد که معمولا ()main نامیده می‌شود که در انتها بتوان با قرار دادن شرط برابری مقدار __name__ با __main__ برای اجرای تابع یاد شده، از اجرای کد‌های مورد نظر تنها در حالت اجرا به صورت اسکریپت (و نه در زمان import) مطمئن شد.

    1
    2
    3
    4
    5
    def main():
        print("this runs only when executed directly")
    
    if __name__ == '__main__':
        main()
    
  • script - این الگو (python script.py) بیان‌‌گر همان روش اجرای اسکریپت است که در درس پیش به صورت کامل راجب آن صحبت شد.

دسته سوم (Arguments):

همانطور که پیش از این نیز گفته شده بود می‌توان مقادیری را به عنوان آرگومان به اسکریپت در زمان به اجرا درآوردن آن ارسال نمود. این مقادیر از طریق sys.argv داخل کدهای اسکریپت قابل دسترس هستند. به نمونه اسکریپت پایین و اجرای آن توجه نمایید:

1
2
3
4
5
6
7
8
9
# file: Documents/script-argv-3x.py
# Python 3.x

import sys

print(sys.argv)
print(sys.argv[0])
print(sys.argv[1])
print(sys.argv[2])

اسکریپت بالا را با ارسال دو آرگومان arg_1 و arg_2 اجرا می‌نماییم:

user> python3 Documents/script-argv-3x.py arg_1 arg_2

['/home/saeid/Documents/script-argv-3x.py', 'arg_1', 'arg_2']
/home/saeid/Documents/script-argv-3x.py
arg_1
arg_2

مقدار sys.argv نیز یک شی از نوع list است: [... ,Ο, Ο, Ο] - برای دسترسی به عناصر موجود در شی list، از الگویی مشابه [object[index که در آن ...,index=0,1,2,3 است، استفاده می‌گردد؛ به عنوان نمونه [sys.argv[0 به نخستین عنصر موجود در sys.argv اشاره دارد.

عضو نخست sys.argv یا [sys.argv[0 همواره حاوی نام اسکریپت است. البته به جز در مواقعی که از c- استفاده کرده‌ایم که در این صورت برابر مقدار 'c-' خواهد بود:

user> python3 -c "import sys; print(sys.argv)" 2
['-c', '2']

پی‌نوشت

[1]«عبارت» (Expression) یک قطعه از سینتکس است که می‌تواند به یک مقدار ارزیابی گردد، عبارت شامل «کلمه‌های کلیدی» (Keywords) نمی‌شود و «دستور» (Statement) بخشی از یک بلاک کد است که شامل کلمه‌های کلیدی بوده و کاری را به انجام می‌رساند. [کلمه‌های کلیدی در آینده بررسی می‌شوند.]
[2]درست این بود که به جای واژه «مقدار» (Value) از «شی» (Object) استفاده می‌شد؛ چرا که هر چیزی در پایتون یک شی است. به عنوان نمونه، عدد 5 یک شی از کلاس «اعداد صحیح» (Integers) می‌باشد.
[3]توضیحی است که در ابتدای تابع‌ها، کلاس‌ها و ماژول‌ها می‌آید و توسط مفسر نادیده گرفته نمی‌شود. [docstring در آینده بررسی می‌شود]
[4]واژه «تابع» در مفهوم شی، مناسب نیست. در تعریف شی‌گرا از واژه «متد» (Method) به جای «تابع» (Function) استفاده می‌گردد؛ ولی در این مرحله که هنوز به شی‌گرایی پرداخته نشده است، ترجیح داده شد تا از واژه «تابع» استفاده گردد.


😊 امیدوارم مفید بوده باشه

لطفا دیدگاه و سوال‌های مرتبط با این درس خود را در کدرز مطرح نمایید.