حالت تعاملی
از درس پیش به خاطر داریم که کدهای پایتون را میتوان به دو روش اجرا نمود: ۱- ایجاد اسکریپت و معرفی آن به مفسر پایتون ۲- به شکل تعاملی با مفسر پایتون که موضوع همین درس است.
برای ورود به حالت تعاملی پایتون از دستور فراخوانی مفسر (Python) به شکل تنها و بدون آرگومان – در رابط خط فرمان سیستم عامل، استفاده میشود.
ورود به حالت تعاملی پایتون ۲x ویندوز:
شکل ۱
پس از ورود یک پیغام نمایش داده میشود؛ در این پیغام ضمن ارایه اطلاعات پایه در مورد مفسر پایتون و سیستم عامل، پیشنهاد میشود که جهت یافتن اطلاعات بیشتر در مورد زبان برنامهنویسی پایتون از دستورهای ویژهای استفاده نمایید:
- ()license : باعث نمایش چندین صفحه مرتبط با تاریخ توسعه و پروانههای پایتون میگردد. برای مرور از کلید Enter و خروج از کلید q صفحه کلید استفاده نمایید.
- credits : فهرستی از سازمانها و شرکتهای مشارکت کننده در توسعه زبان پایتون را نمایش میدهد.
- copyright : فهرست کپیرایت زبان پایتون از ابتدا تا کنون را نمایش میدهد.
- help : این دستور کاربرد زیادی دارد که در ادامه بررسی میشود. با استفاده از این دستور میتوان در مورد اشیا و اجزای مختلف موجود در زبان پایتون راهنمایی گرفت.
در حالت تعاملی پایتون، به صورت پیشفرض هر سطر توسط نماد <<< مشخص میشود و از آنجا که امکان وارد کردن دستورهای چند سطری (مانند تابعها) نیز وجود دارد؛ سطرهای مربوط با بدنه یک دستور توسط نماد … مشخص میگردند.پس از درج هر سطر و با فشردن کلید Enter، مفسر آن سطر را پردازش کرده و در صورت لزوم نتیجه یا گزارش بروز استثنا مربوط را نمایش میدهد. در واقع پس از فشردن کلید Enter دیگر امکان بازگشت و اصلاح سطر وارد شده وجود نخواهد داشت و میبایست آن سطر از نو وارد گردد. بدیهی است که بروز اشتباه در دستورهای چند سطری به معنی لزوم وارد کردن دوباره تمام دستور میباشد!
شکل ۲
در پایتون برای تعریف یک تابع از کلمه کلیدی def استفاده میگردد که به دنبال آن نام و سپس پارامترهای تابع (در صورت نیاز) که درون پرانتز قرار میگیرند، آورده میشود. بعد از کاراکتر دونقطه(: یا Colon ) و در سطرهای بعدی با رعایت یکنواخت تورفتگی، دستورهای بدنه تابع نوشته میشوند. با فراخوانی تابع (وارد کردن نام تابع) بدنه تابع اجرا میگردد. چنانچه در تعریف تابع پارامترهایی نیز در نظر گرفته شده باشد، در هنگام فراخوانی میبایست مقدار متناظر آنها نیز مشخص شود (درون پرانتز جلوی نام تابع) – در کد بالا تابع func فاقد پارامتر بوده بنابراین در هنگام فراخوانی آن مقداری ارسال نشده است.
نکته: برای پایان دادن به دستورهای چند سطری میبایست سطر پایانی را خالی رها کرده و کلید Enter را بفشارید.
نکته: برای پاک کردن صفحه از کلیدهای ترکیبی Ctrl–L استفاده نمایید. به منظور خروج نیز عبارت()quit را وارد کرده یا از کلیدهای ترکیبی Ctrl–Z با یک Enter پس از آن در ویندوز استفاده نمایید.
از مزایای حالت تعاملی این است که در بیشتر مواقع برای مشاهده نتیجه، نیازی به استفاده از print نمیباشد:
شکل ۳
و چنانچه مشغول انجام محاسبات ریاضی هستید میتوانید از یک متغیر خاص با نام خط زیرین(- یا underscore) استفاده نمایید؛ این متغیر همواره به آخرین مقدار محاسبه شده اشاره دارد:
شکل ۴
در کاربرد ریاضی، برخی تابعها توسط ماژول math از کتابخانه استاندارد پایتون در دسترس هستند :
شکل ۵
نکته: برای وارد کردن یک ماژول به اسکریپت (یا ماژولی دیگر) از دستور import استفاده میگردد برای فراخوانی تابعهای موجود در یک ماژول import شده از الگوی «نام ماژول + نقطه + نام تابع مورد نظر» استفاده میگردد – در دستور import پسوند ماژول نوشته نمیشود.
مثالی دیگر- sys یکی از ماژولهای مهم پایتون است؛ این ماژول امکان دسترسی به برخی از متغیرهای مورد استفاده مفسر (در زمان اجرا) و همچنین تابعهایی که با مفسر در ارتباط هستند را فراهم میآورد:
شکل ۶
دستور()sys.exit نیز موجب توقف اجرا (در اینجا: خروج از حالت تعاملی پایتون) میگردد. برای کنترل خطاها کاربرد دارد و همچنین میتوان پیامی مرتبط را به خروجی فرستاد .
شکل ۷
دریافت راهنمایی
یکی از دستورهای پیشنهادی در پیغام ابتدایی حالت تعاملی، help بود که با وارد کردن آن متن پایین نمایش داده میشود:
شکل ۸
اکنون کافی است نام موردی که میخواهید درباره آن اطلاعات بگیرید را وارد نمایید؛ در همین راستا همانطور که در پیغام ابتدایی هم بیان شده است میتوانید از فرمانهای پایین نیز کمک بگیرید:
- modules: نمایش فهرستی از نام تمامی ماژولهای در دسترس
- keywords: نمایش تمام کلمههای کلیدی پایتون(شکل ۹)
- symbols: نمایش تمام نمادهای معنادار در پایتون
- topics: نمایش فهرستی از مباحث مربوط به پایتون
شکل ۹
برای خروج از راهنمای تعاملی، quit یا(q) را وارد نمایید.
روش دوم: فراخوانی تابع راهنما
در این روش از الگوی (help(object برای دریافت اطلاعات درباره یک شی (object)، به صورت مستقیم و بدون ورود به راهنمای تعاملی استفاده میشود – تنها کافی است نام شی مورد نظر را درون پرانتز قرار دهید (به جای واژه (object):
شکل ۱۰
نکته:print در نسخه ۳x پایتون به صورت یک تابع تعریف شده است و تابعها در پایتون یک نوع شی هستند.
از این روش با الگوی دیگری هم استفاده میشود. الگوی help(“string”) یعنی قرار دادن نام موردی که میخواهید درباره آن اطلاعات بگیرید درون پرانتز به شکلی محصور با دو نماد نقل قول ( ” ” ) – این الگو عملکردی مشابه با روش قبل (روش یکم) دارد با این تفاوت که دریافت اطلاعات به صورت مستقیم و بدون ورود به راهنمای تعاملی انجام میپذیرد. در واقع برای به دست آوردن اطلاعات درباره موردی که شی نمیباشد (مانند هر یک از دستورهای symbols ،keywords ،modules و topics یا دستور print در پایتون۲x یا نام ماژولها یا…) لازم است به این صورت اقدام گردد:
شکل ۱۱
شکل ۱۲
گزینههای فراخوانی
در کنار دستور فراخوانی پایتون در خط فرمان، میتوان از گزینهها و دستورهای گوناگونی بهره برد. البته قبلا هم از آنها استفاده کردیم؛ مانند زمانی که قصد داشتیم نسخه پایتون مورد نظر خود را بیابیم یا حتی زمانی که قصد داشیم یک اسکریپت را اجرا کنیم. واقعیت این است که دستور فراخوانی پایتون الگویی دارد که شکل کامل آن در پایین آورده شده است.
در پایتون ۲x :
python [-BdEiOQsRStuUvVWxX3?] [-c command | -m module-name | script | – ] [args]
در پایتون ۳x :
python [-bBdEhiIOqsSuvVWx?] [-c command | -m module-name | script | – ] [args]
همانطور که مشاهده میشود این دستور میتواند سه دسته آرگومان را بپذیرد:
دسته یکم(Options):
شامل برخی از حروف الفباست که به همراه یک کاراکتر خطِ فاصله (Dash) – بعد از دستور اصلی یعنی python میآیند؛ برخی از این گزینهها به شرح زیر است:
- (-q) تنها در پایتون ۳x در هنگام ورود به حالت تعاملی پایتون از نمایش پیغام ابتدایی صرف نظر میشود:
شکل ۱۳
- (-Q) تنها در پایتون ۲x در هنگام اجرای یک اسکریپت و برای کنترل عملگرهای تقسیم / موجود در آن به کار میرود؛ به این صورت که پس از آن میبایست یکی از کلمههای warn ،new ،old و warnall ذکر گردد.
-
- Qold : حاصل تقسیم دو عدد صحیح یک عدد صحیح باشد.
- Qnew : حاصل تقسیم دو عدد صحیح یک عدد ممیز شناور باشد – مانند نسخه ۳x پایتون.
- Qwarn : حاصل تقسیم دو عدد صحیح یک عدد صحیح باشد، به همراه نمایش پیام هشدار به ازای هر عملگر.
- Qwarnall به مانند Qwarn است ولی به ازای تمام عملگرهای تقسیم به کار رفته در اسکریپت تنها یک پیام هشدار نمایش داده میشود.
شکل ۱۴
- O- یاOO- – : راهاندازی بهینهساز (Optimization) پایه بایتکد، که میتواند تا حدودی موجب بهبود کارایی اسکریپت گردد. استفاده از گزینه OO- علاوه بر بهینه سازی، موجب دور انداختن مستندات (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
- (-? Or –h): (برابر با–help) فهرست گزینههای فراخوانی پایتون به همراه توضیحاتی کوتاه نمایش داده میشود:
python -h
- (-S): از import شدن ماژول site جلوگیری میشود:
python -S
به صورت عادی ماژول site در زمان راهاندازی مفسر پایتون به صورت خودکار import میگردد و وظیفه آن گسترشsys.path است. به عنوان نمونه؛ این ماژول مسیر دایرکتوری site-packages را به sys.path اضافه میکند.
دایرکتوری site-packages محل نگهداری بستهها یا کتابخانههای شخص ثالثی است که با استفاده از pip اقدام به نصب آنها در پایتون کردهایم. هر زمان که ماژولی import میشود مفسر پایتون در داخل دایرکتوریهای مشخصی به دنبال آن میگردد؛ این دایرکتوریها در sys.path فهرست شدهاند.
برای نمونه – پایتون ۳x در ویندوز:
شکل ۱۵
نکته: نخستین دایرکتوری که مفسر در آن به دنبال نام ماژول میگردد؛ دایرکتوری حاوی اسکریپت است که در کدهای بالا (چون که مربوط به حالت تعاملی پایتون است) توسط ” مشخص شده است.
مفسر دایرکتوریهای این فهرست را به ترتیب (از چپ به راست) برای جستجو در نظر میگیرد. میتوانید با نوشتن مسیر دایرکتوریهای دلخواه خود درون یک فایل متنی با پسوند .pth و قرار دادن آن درون دایرکتوری site-packages، این دایرکتوریها را نیز به sys.path بیافزایید. برای نمونه فایل mypath.pth را (در سیستم عامل گنولینوکس) ایجاد مینماییم:
شکل ۱۶
فایل mypath.pth را با یک ویرایشگر متن باز کرده و مشابه پایین فهرست دایرکتوریهای مورد نظر خود را در آن وارد مینماییم:
شکل ۱۷
اکنون تمام ماژولهای موجود در این دایرکتوریها قابل import هستند؛ به فهرست sys.path توجه نمایید:
شکل ۱۸
همین کار را میتوان از طریق برنامهنویسی نیز انجام داد، البته پس از اتمام اجرای اسکریپت (در اینجا: خروج از حالت تعاملی) اثر آن از بین میرود:
شکل ۱۹
تابع append دایرکتوری مورد نظر را به انتهای فهرستsys.path اضافه میکند. البته میتوان با استفاده از تابعinsert به جای append جایگاه دایرکتوری دلخواه خود را با استفاده از آرگومان نخست آن در sys.path مشخص نمود؛ با این کار دایرکتوری مورد نظر زودتر از دایرکتوریهای بعد خودش توسط مفسر مورد جستجو قرار میگیرد – فایده این کار زمانی مشخص میشود که در دایرکتوریهایی مجزا، ماژولی با نام یکسان وجود داشته باشد؛ در این صورت ماژولی که زودتر توسط مفسر دیده شود به عنوان ماژول مورد نظر import میشود:
شکل ۲۰
چند درس جلوتر خواهید آموخت که مقدار sys.path در واقع یک شی از نوع list است؛ append و insert نیز تابعهایی هستند که توسط یک شی از نوع list میتوانند فراخوانی گردند. در این مرحله تنها به یاد داشته باشید که موقعیتها در یک شی از نوع list از عدد صفر شمارهگذاری میگردند.
دسته دوم:
- -c command: این الگو امکان اجرای دستورهای پایتون را بدون ورود به حالت تعاملی یا ایجاد اسکریپت، فراهم میسازد:
شکل ۲۱
نکته: دستورها باید درون نمادهای نقل قول محصور باشند.
نکته: استفاده از سمیکالن ( ; ) در پایان دستورهای پایتون اجباری نیست ولی چنانچه بخواهیم چند دستور را در یک سطر قرار بدهیم میبایست از آن استفاده نماییم.
- -m module-name: این الگو امکان اجرای یک ماژول (از میان فهرست sys.path) را به عنوان ماژول __main__ فراهم میسازد. جالبترین نمونه برای بیان کاربرد این الگو، اجرای ماژول SimpleHTTPServer است. زمانی که نیاز به راهاندازی سریع یک وب سرور را دارید و نمیخواهید خود را درگیر نصب و پیکربندی Apache یا دیگر وب سرورها نمایید؛ میتوانید از این ماژول پایتون بهره بگیرید. این ماژول امکانات یک وب سرور ساده را در اختیار شما قرار میدهد. البته این ماژول در نسخه ۳x پایتون در ماژول http.server ادغام شده است.
شکل ۲۲
نکته: در استفاده از این الگو نیز همانند زمان import، پسوند ماژول (py) نوشته نمیشود.
میتوان شماره پورت را وارد نکرد که در این حالت به صورت پیشفرض پورت ۸۰۰۰ در نظر گرفته میشود.
ولی منظور از ماژول __main__ چیست؟ هنگامی که ماژولی (برای نخستین بار) import میشود، مفسر پایتون به صورت خودکار تمام کدهای درون آن را اجرا میکند. در مواردی ممکن است یک فایل .py حاوی کدهایی باشد که تنها میبایست در حالت اسکریپت به اجرا درآید؛ در این شرایط با import شدن فایل، این کدها نیز اجرا میگردند که خواست برنامهنویس نمیباشد!. از طرفی در پایتون یک سری مقادیر و متغیرهای ویژه و از پیش تعریف شده به مانند __name__ وجود دارد. متغیر __name__ به نام ماژول اشاره دارد؛ در حالت اسکریپت مقدار __name__ برابر با یک مقدار ویژه به نام __main__ میگردد که از این موضوع میتوان برای کنترل اجرای کدها استفاده کرد. معمولا کدهای اسکریپت به گونهای نوشته میشوند که اجرای آنها وابسته به اجرای یک تابع اصلی باشد که معمولا main() نامیده میشود که در انتها بتوان با قرار دادن شرط برابری مقدار __name__ با __main__ برای اجرای تابع یاد شده، از اجرای کدهای مورد نظر تنها در حالت اجرا به صورت اسکریپت (و نه در زمانimport) مطمئن شد.
شکل ۲۳
- -script: این الگو (python script.py) بیانگر همان روش اجرای اسکریپت است.
دسته سوم (Arguments):
همانطور که پیش از این نیز گفته شده بود میتوان مقادیری را به عنوان آرگومان به اسکریپت در زمان به اجرا درآوردن آن ارسال نمود. این مقادیر از طریق sys.argv داخل کدهای اسکریپت قابل دسترس هستند. به نمونه اسکریپت پایین و اجرای آن توجه نمایید:
شکل ۲۴
اسکریپت بالا را با ارسال دو آرگومان arg_1 و arg_2 اجرا مینماییم:
شکل ۲۵
مقدار sys.argv نیز یک شی از نوع list است: [… ,Ο, Ο, Ο]- برای دسترسی به عناصر موجود در شی list، از الگویی مشابه object[index] که در آن index=0,1,2,3,… است، استفاده میگردد؛ به عنوان نمونه [sys.argv0] به نخستین عنصر موجود در sys.argv اشاره دارد.
عضو نخست sys.argv یا [sys.argv0] همواره حاوی نام اسکریپت است. البته به جز در مواقعی که از –c استفاده کردهایم که در این صورت برابر مقدار ‘-c’ خواهد بود:
شکل ۲۶
راه های ارتباطی با گروه برنامه نویسان آرک پای:
سایت: Arcpy.ir
کانال تلگرامt.me/Arcpy