آموزش پایتون - مفسر پایتون

مفسر پایتون

پایتون یک زبان مبتنی بر مفسر است. در سیستم‌عامل لینوکس، فایل اجرایی پایتون در مسیر /usr/bin/ نصب می‌شود. در ویندوز، این فایل اجرایی (python.exe) در پوشهٔ محل نصب قرار دارد (برای مثال C:\python311).

این آموزش به شما نشان می‌دهد که مفسر پایتون چگونه کار می‌کند؛ چه در حالت تعاملی (Interactive) و چه در حالت اسکریپتی (Scripted). کد پایتون به روش اجرا دستور-به-دستور پردازش می‌شود. مفسر پایتون از دو بخش تشکیل شده است: مترجم (Translator) که دستورها را از نظر سنتکس و ساختار بررسی می‌کند و در صورت درست بودن، یک بایت‌کد (Byte Code) میانی می‌سازد. سپس ماشین مجازی پایتون (Python Virtual Machine) این بایت‌کد را به باینری نیتیو تبدیل کرده و آن را اجرا می‌کند. دیاگرام زیر این فرایند را نشان می‌دهد:

Python Interpreter

مفسر پایتون دارای دو حالت تعاملی و اسکریپتی است.

مفسر پایتون - حالت تعاملی (Interactive Mode)

وقتی مفسر پایتون را بدون هیچ آرگومان اضافه‌ای از طریق ترمینال اجرا می‌کنید، علامت پرامپت >>> ظاهر می‌شود و مفسر بر اساس چرخهٔ REPL (خوانش، ارزیابی، چاپ، تکرار) کار می‌کند. هر دستوری که جلوی پرامپت پایتون وارد می‌شود، خوانده، ترجمه و اجرا می‌گردد. یک نمونه نشست تعاملی به شکل زیر است:

>>> price = 100
>>> qty = 5
>>> total = price*qty
>>> total
500
>>> print ("Total = ", total)
Total = 500

برای بستن نشست تعاملی، می‌توانید از کاراکتر پایان خط (ctrl+D در لینوکس و ctrl+Z در ویندوز) استفاده کنید. همچنین می‌توانید عبارت quit() را جلوی پرامپت پایتون تایپ کرده و Enter بزنید تا به محیط سیستم‌عامل بازگردید.

>>> quit()

$

شیل تعاملی که همراه با توزیع استاندارد پایتون ارائه می‌شود، امکاناتی مانند ویرایش خط، جستجو در تاریخچه، تکمیل خودکار و غیره را ندارد. برای بهره‌مندی از امکانات بیشتر می‌توانید از نرم‌افزارهای مفسر تعاملی پیشرفته‌تر مانند IPython و bpython استفاده کنید.

مفسر پایتون - حالت اسکریپتی (Scripting Mode)

به جای این‌که مانند محیط تعاملی دستورها را یکی‌یکی وارد کرده و نتیجه بگیرید، می‌توانید مجموعه‌ای از دستورها را در یک فایل متنی با پسوند py. ذخیره کرده و نام فایل را به عنوان پارامتر ورودی به دستور python بدهید.

خطوط زیر را با استفاده از هر ویرایشگر متنی (مانند vim در لینوکس یا Notepad در ویندوز) با نام prog.py ذخیره کنید:

print ("My first program")
price = 100
qty = 5
total = price*qty
print ("Total = ", total)

وقتی برنامهٔ بالا را در ویندوز اجرا کنیم، خروجی زیر حاصل می‌شود:

C:\Users\Acer>python prog.py
My first program
Total = 500

توجه داشته باشید که اگرچه پایتون کل اسکریپت را یک‌جا اجرا می‌کند، اما در درون خود همچنان کدها را خط‌به‌خط پردازش و اجرا می‌نماید.

در زبان‌های مبتنی بر کامپایلر مانند جاوا، کد منبع تا زمانی که کل برنامه بدون خطا نباشد به بایت‌کد تبدیل نمی‌شود. اما در پایتون، دستورها تا زمانی که به اولین خطا نرسند اجرا می‌شوند.

بیایید عمدی یک خطا در کد بالا ایجاد کنیم:

print ("My first program")
price = 100
qty = 5
total = prive*qty #Error in this statement
print ("Total = ", total)

به املای اشتباه متغیر prive به جای price توجه کنید. حالا دوباره اسکریپت را اجرا کنید:

C:\Users\Acer>python prog.py
My first program
Traceback (most recent call last):
  File "C:\Python311\prog.py", line 4, in <module>
   total = prive*qty
   ^^^^^
NameError: name 'prive' is not defined. Did you mean: 'price'?

دقت کنید که دستورهای قبل از خط دارای خطا اجرا شده‌اند و سپس پیغام خطا نمایش داده شده است. این موضوع نشان می‌دهد که اسکریپت پایتون به صورت مفسری (خط‌به‌خط) اجرا می‌شود.

مفسر پایتون - استفاده از شِبانگ #!

علاوه بر روش قبلی برای اجرای اسکریپت‌های پایتون، می‌توانید فایل اسکریپت را در لینوکس مستقماً به یک فایل قابل‌اجرا (Self-executable) مانند اسکریپت‌های شل تبدیل کنید. برای این کار باید یک خط شبانگ (shebang) در بالایی‌ترین بخش اسکریپت اضافه کنید. شبانگ مشخص می‌کند کدام فایل اجرایی باید برای تفسیر دستورهای پایتون استفاده شود. اولین خط اسکریپت با #! شروع شده و در ادامهٔ آن مسیر فایل اجرایی پایتون قرار می‌گیرد.

اسکریپت prog.py را به شکل زیر تغییر دهید:

#! /usr/bin/python3.11

print ("My first program")
price = 100
qty = 5
total = price*qty
print ("Total = ", total)

برای این‌که اسکریپت مجوز اجرا پیدا کند، از دستور chmod استفاده کنید:

$ chmod +x prog.py

اکنون می‌توانید اسکریپت را مستقیماً و بدون نیاز به پاس دادن آن به عنوان آرگومان به دستور پایتون، اجرا کنید:

$ ./hello.py

پایتون تعاملی - IPython

محیط IPython (مخفف Interactive Python) یک محیط تعاملی پیشرفته و قدرتمند برای پایتون است که در مقایسه با شل استاندارد پایتون، امکانات بسیار بیشتری دارد. IPython در سال ۲۰۰۱ توسط فرناندو پرز توسعه داده شد.

مهم‌ترین ویژگی‌های IPython عبارت‌اند از:

  • قابلیت بازرسی اشیاء (Object Introspection) در IPython برای بررسی ویژگی‌های یک شیء در زمان اجرا.

  • برجسته‌سازی خطوط کد (Syntax Highlighting) که به تشخیص عناصر زبان مانند کلمات کلیدی، متغیرها و غیره کمک می‌کند.

  • ذخیره‌سازی تاریخچهٔ تعاملات که امکان بازخوانی و تکرار آن‌ها را فراهم می‌سازد.

  • تکمیل خودکار با کلید Tab برای کلمات کلیدی، متغیرها و نام توابع که یکی از کاربردی‌ترین ویژگی‌های آن است.

  • سیستم دستورات جادویی (Magic Commands) برای مدیریت محیط پایتون و انجام وظایف سیستم‌عامل.

  • ایفای نقش به عنوان کرنیل اصلی برای Jupyter Notebook و سایر ابزارهای فرانت‌اند در پروژهٔ Jupyter.

برای نصب IPython می‌توانید از ابزار مدیریت پکیج PIP استفاده کنید:

pip3 install ipython

اجرای IPython از طریق خط فرمان:

C:\Users\Acer>ipython
Python 3.11.2 (tags/v3.11.2:878ead1, Feb 7 2023, 16:38:35) [MSC v.1934
64 bit (AMD64)] on win32
Type 'copyright', 'credits' or 'license' for more information
IPython 8.4.0 -- An enhanced Interactive Python. Type '?' for help.
In [1]:

به جای پرامپت معمولی >>> در مفسر استاندارد، دو پرامپت اصلی IPython را مشاهده خواهید کرد که در ادامه توضیح داده شده‌اند:

  • پرامپت In[1] قبل از ورود هر عبارت یا ورودی ظاهر می‌شود.

  • پرامپت Out[1] قبل از نمایش خروجی ظاهر می‌شود.

In [1]: price = 100
In [2]: quantity = 5
In [3]: total = price*quantity
In [4]: total
Out[4]: 500
In [5]:

تکمیل خودکار با Tab یکی از مفیدترین قابلیتهایی است که IPython ارائه می‌دهد. وقتی بعد از نقطه در مقابل یک شیء کلید Tab را فشار می‌دهید، لیستی از متدهای مربوط به آن شیء نمایش داده می‌شود.

همچنین IPython با قرار دادن ? در مقابل هر شیء، اطلاعات جامع آن (بازرسی شیء) را ارائه می‌دهد؛ شامل docstring، تعریف تابع و جزئیات سازندهٔ کلاس. برای مثال جهت بررسی شیء رشته‌ای var که در بالا تعریف شده، در پرامپت ورودی عبارت ?var را تایپ کنید:

In [5]: var = "Hello World"
In [6]: var?
Type: str
String form: Hello World
Length: 11
Docstring:
str(object='') -> str
str(bytes_or_buffer[, encoding[, errors]]) -> str
Create a new string object from the given object. If encoding or
errors is specified, then the object must expose a data buffer
that will be decoded using the given encoding and error handler.
Otherwise, returns the result of object.__str__() (if defined)
or repr(object).
encoding defaults to sys.getdefaultencoding().
errors defaults to 'strict'.

توابع جادویی IPython فوق‌العاده کاربردی هستند. دستورات جادویی خطی به شما اجازه می‌دهند دستورهای محیط DOS را داخل IPython اجرا کنید. بیایید دستور dir را از داخل کنسول IPython اجرا کنیم:

In [8]: !dir *.exe
 Volume in drive F has no label.
 Volume Serial Number is E20D-C4B9

 Directory of F:\Python311

07-02-2023 16:55            103,192 python.exe
07-02-2023 16:55            101,656 pythonw.exe
                2 File(s)    204,848 bytes
                0 Dir(s)  105,260,306,432 bytes free

رابط تعاملی Jupyter notebook یک محیط تحت وب برای برنامه‌نویسی به زبان‌های پایتون، جولیا، R و بسیاری زبان‌های دیگر است که برای پایتون از IPython به عنوان کرنیل اصلی خود استفاده می‌کند.

پیشرفت مطالعه: وضعیت خوانده‌شدن این درس فقط در همین مرورگر ذخیره می‌شود؛ بدون نیاز به حساب کاربری.