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

Photo by Anton Maksimov juvnsky
در این درس به توضیح حالت تعاملی پایتون میپردازیم؛ اینکه چگونه وارد یا خارج شویم، کد بنویسیم یا در مورد چیزی در این زبان راهنمایی بگیریم. پس از مطالعه درس پیش و دو بخش ابتدایی این درس، با اجرای اسکریپت و حالت تعاملی پایتون آشنا شدهاید؛ بر همین اساس در بخش سوم این درس به توضیح گزینههای مورد کاربرد در فراخوانی مفسر پایتون میپردازیم که به نوعی به هر دو مبحث یاد شده مربوط میشوند. این درس پر از مطالبی است که در آینده سر نوبت(!) بررسی خواهند شد (مانند مفهوم شی) البته برای درک موضوعات، توضیح کوتاهی ارایه شده ولی بهتر است متمرکز به موضوعات اصلی خود درس باشید و زیاد درگیر آنها نشوید؛ فقط به خاطر بسپارید!
✔ سطح: پایه
سرفصلها
حالت تعاملی¶
از درس پیش به خاطر داریم که کدهای پایتون را میتوان به دو روش اجرا نمود: ۱- ایجاد اسکریپت و معرفی آن به مفسر پایتون که در همان درس بررسی شد ۲- به شکل تعاملی با مفسر پایتون که موضوع همین درس است.
پایتون یک زبان برنامهنویسی با قابلیت «حالت تعاملی» (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) استفاده میگردد؛ ولی در این مرحله که هنوز به شیگرایی پرداخته نشده است، ترجیح داده شد تا از واژه «تابع» استفاده گردد. |
😊 امیدوارم مفید بوده باشه
لطفا دیدگاه و سوالهای مرتبط با این درس خود را در کدرز مطرح نمایید.