Fahim 9563 اشتراک گذاری ارسال شده در 13 شهریور، ۱۳۹۰ احمد شريفپور اشاره: اول: زمانی به برنامهنویسی به دید امری عجیب، پیچیده و حتی جادویی نگریسته میشد که تنها درتوان خورههای کامپیوتر و نوابغ علوم الکترونیک و کامپیوتر بود. با سادهتر شدن زبانهای برنامهنویسی و کاربرد روزافزون کامپیوتر در زندگی روزمره این دیدگاه بهسرعت در حال منسوخ شدن است. تقریباً هر کاربر ساده کامپیوتر ممکن است در شرایطی قرار گرفته باشد که آرزو کند کاش برنامهای برای انجام عملی خاص وجود داشت یا چه خوب میشد سیستم را برای انجام چنین عملی برنامهریزی کرد. امروزه، این آرزو بیشاز هر زمان دیگری قابل تحقق است. دوم: میگویند یادگیری هر زبان تازه، بعد جدیدی به شخصیت فرد میافزاید. اگرچه این مَثل ممکن است درباره زبانهای برنامهنویسی درست نباشد، اما آشنا شدن با هر زبان برنامهنویسی جدید و پارادایمهای حاکم بر آن، بهیقین به تعالی منطق برنامهنویس، افزایش قابلیتهای وی و از همه مهمتر بهبود روش حل مسئله توسط وی منجرخواهدشد. دراينميان، پایتون انتخابی مناسب برای کاربران مبتدی و حرفهای خواهد بود (کمی بعد با دلایل این انتخاب آشنا خواهید شد). اين مقاله گزيدهاي است از مجموعه مقالاتي در شمارههای مختلف مجله Full Circle Magazine (مجله رسمی توزیع لینوکس اوبونتو) كه بهصورت بسیار ساده و درعينحال کاربردی به معرفی این زبان و قابلیتهای آن خواهد پرداخت. يكي دو قسمت ابتدايي اين مجموعه به معرفي زبان پايتون و آشنايي ابتدايي با آن اختصاص داده شده است. مطالب سایر قسمتها کاملاً مستقل از یکدیگر بوده و هریک با ارائه مثالهای کاربردی به بررسی جنبهای خاص از پایتون خواهد پرداخت. انتخاب اول مجموعه عظیم زبانهای برنامهنویسی موجود را براساس ویژگیها و قابلیتهایشان به دستههای مختلفی طبقهبندی کردهاند. دستهبندیهایی نظیر شيءگرا در برابر روالگرا یا اپنسورس در برابر منبع بسته، مستقل از پلتفرم در برابر وابسته به پلتفرم، ترجمهای در برابر تفسیری و . . . هر یک از این دستهها نشانگر ویژگیها و امکاناتی هستند که ممکن است از یک دیدگاه خاص بسیار مفید و ارزنده محسوب شده و از دیدگاهی دیگر بهعنوان محدودیت شناختهشوند. همین امر انتخاب یک زبان را برای شروع یادگیری به انتخابی دشوار تبديل ميكند. دراينميان، زبانهای مشهور یا زبانهای پرکاربرد لزوماً انتخابهای مناسبی نخواهندبود. بهعنوانمثال، زبانهایی نظیر C یا ++C به برنامهنویس این امکان را میدهند که برنامههای خود را با جزئیات بسیار بالا نوشته و با سرعت فوق العادهای اجرا كنند. اما این سرعت بالا و کنترل شدید برنامهنویس بر تمام جزئیات به قیمت صرف زمان بیشتر برای کدنویسی و رفع اشکال کد تمام خواهد شد. نکته جالبتوجه اينكه در بسیاری از موارد سرعت اجرای برنامهها چندان مهم نیست. درحالحاضر نیز با ارزان شدن مداوم قدرت پردازش سیستمها، بسیاری از برنامهنویسان معتقدند، هدر رفتن درصدی از نیروی پردازش پردازنده در اثر استفاده از زبانهای سطح بالا و درعوض فراهمشدن زمان بیشتر برای تمرکز برنامهنویس بر فعالیت اصلیاش یعنی کدنویسی، معاملهای مقرونبهصرفه است. زبانی که برای شروع یادگیری انتخاب میشود در ابتدا باید ساده باشد، به برنامهنویس تفکر سیستمی و منطقی را بیاموزد، اصول کدنویسی درست را به کاربر آموزش دهد، قادر به پاسخگویی به غالب نیازهای کاربر باشد و درنهايت اینکه بهتراست به سیستمعامل یا ابزار خاص و پیچیدهای وابسته نباشد. برهمیناساس، بسیاری پایتون را بهترین زبان برای شروع یادگیری برنامهنویسی میدانند. پایتون زبانی سطح بالا، داینامیک، اسکریپتی، تفسیری، شيءگرا، آزاد، اپنسورس و مستقل از پلتفرم است که در سال 1991 توسط گوئيدو وان روسوم ابداع شد. باید توجه داشت که معرفی پایتون بهعنوان زبان مناسب مبتدیان بهمعنای کم بودن قابلیتهای آن نیست. هماکنون پایتون بهعنوان یکی از قدرتمندترین ابزارهای برنامهنویسی سیستمی، برنامهنویسی وب و... مورد استفاده قرار میگیرد. چرا پایتون؟ اگرچه ممكن است بسیاری از برنامهنویسان قديمي که با زبانهایی نظیر جاوا و C سروکار داشتهاند، برنامهنویسی با پایتون را چندان جدی نگیرند و حتی آن را کودکانه بدانند، اما این امر از قابلیتهای این زبان نخواهد کاست. درعوض، تعداد زیادی از برنامهنویسان (کسانی نظیر برنامهنویسان گوگل) پایتون را بهدلیل سادگی، خوانایی و امکانات فراوان به هر زبان دیگری ترجیح میدهند. طرفداران پایتون که غالباً Pythonistas نامیده میشوند، معتقدند، این زبان بهقدری کامل و کار با آن بهقدری لذتبخش است که برای تمام نیازهای برنامهنویسی میتوان به آن مراجعهکرد. آنها برای این ادعا دلایل فنی هم ارائه میکنند که برخی از آنها بهشرح زیر است: سادگی پایتون زبانی بسیار ساده و مینیمالیستی است. خواندن یک برنامه خوب پایتون همانند خواندن یک متن انگلیسی است. این طبیعت شبهکد (Pseudo-Code) یکی از بزرگترین نقاط قوت پایتون است و به شما این امکان را میدهد که بهجای تمرکز روی زبان بر روش حل مسئله تمرکز کنید. سهولت یادگیری سادگی این زبان باعث میشود، یادگیری آن از غالب زبانهای موجود سادهتر باشد. برخی عقیده دارند ، یک روز تعطیلي آخر هفته برای یادگیری دستور و قواعد زبان پایتون و بخشی از کتابخانه استاندارد آن کافی است. آزاد و اپنسورس بودن (FLOSS) یکی از بارزترین نمونههایFLOSS (سرنام Free/Libre and Open Source Software) پايتون است. بهعبارتسادهتر، شما میتوانید نسخههایی از این نرمافزار را آزادانه توزیع کنید، کدهای منبع آن را بخوانید، تغییر دهید و از آن در برنامههايتان استفاده کنید. اساس FLOSS برجامعهای بنا شده که افراد آن دانش خود را با یکدیگر بهاشتراک میگذارند. یکی از دلایل برتری پایتون نیز همین است که بهصورت مداوم توسط جامعهای که تنها خواستهاش بهتر شدن این زبان است، بررسی شده و بهبود داده میشود. سطح بالا بودن (High-Level) هنگام کدنویسی در پایتون لازم نیست نگران جزئیات سطح پایین باشید. مدیریت حافظه، جمعآوری پسماندها (Garbage Collection) و... همه توسط خود زبان انجام خواهدشد. قابلیت حمل (Portable) بهواسطه طبیعت اپنسورس پایتون، این زبان به بسیاری از پلتفرمها انتقال داده شدهاست. تمام برنامههای شما میتوانند بدون هیچ تغییری روی تمامی این پلتفرمها اجرا شوند. البته بهشرطی که با هوشیاری از قابلیتهای خاص وابسته به پلتفرم پرهیزکنید. برنامههای پایتون شما بهسادگی روی لینوکس، ویندوز، FreeBSD، مک، سولاریس، آمیگا، پلیاستیشن، Pocket PC و... قابل اجرا هستند. تفسیری بودن (Interpreted) برنامهای که با یکی از زبانهای ترجمهای نظیر C یا #C نوشته میشود، توسط کامپایلر و تنظیم تعداد زیادی گزینه و Flag به زبان قابل فهم ماشین تبدیلمیشود. وقتی برنامه را اجرا میکنید، Loader/Linker برنامه، آن را به حافظه کپی کرده و اجرا میکند. برخلاف این زبانها پایتون به مترجم نيازي ندارد و برنامه شما بهطورمستقيم از روی کد اجرا میشود. درواقع در پشت پرده، مفسر پایتون برنامه شما را بهحالتی واسطهای بهنام ByteCode تبدیل کرده و سپس اجرامیكند. تمام اینها باعث میشود که استفاده از پایتون سادهتر شود. زیرا لازم نیست نگران چرخه کدنویسی، کامپایل، کنترل، اصلاح کد، کامپایل دوباره یا نگران گزینههای کامپایلر، در دسترس بودن و لینک شدن کتابخانههای موردنظر و... باشید. این سیستم قابلیت حمل برنامه را نیز افزایش میدهد. زیرا کافی است شما کد را به سیستم دیگری کپی کنید و برنامه بدون نیاز به کامپایل دوباره بهسادگی اجرا میشود. شيء گرایی (Object Oriented) پایتون از هر دو شیوه برنامهنویسی شيءگرا و روالگرا بهخوبی پشتیبانی میکند. در زبانهای روالگرا، برنامه برمبنای تعدادی روال یا تابع ساخته میشود که درواقع چیزی جزء قطعات کد با قابلیت استفاده دوباره نیستند. در زبانهای شيءگرا برنامه برپایه اشیايی ساخته میشود که اطلاعات و عملکرد را یکجا نگهداری میکنند. پایتون در مقایسه با زبانهایی نظیر #C یا جاوا روش بسیار سادهتری برای برنامهنویسی OOP دارد. قابلیت توسعه (Extensible) اگر در برنامه شما قطعه کدی حساس وجود دارد که لازم است با سرعت بالایی اجرا شود یا میخواهید الگوریتم بهکاررفته در آن را مخفی کنید، میتوانید آن قسمت را به زبانC یا #C بنویسید و آن را از داخل برنامه پایتون اجرا کنید. قابلیت جاسازی (Embeddable) میتوان پایتون را بهصورت توکار (Embedded) در برنامههای C یا #C یا زبانهای دیگر بهکار برد و از اين طريق به استفادهكنندگان برنامه قابلیت اسکریپتنویسی را هدیه کرد. کتابخــانــه استــانــــدارد غنــــــی (Extensive Library) کتابخانه استاندارد پایتون بسیار گسترده و غنی است. این کتابخانه که بههمراه نصب استاندارد پایتون در دسترس خواهد بود، میتواند گستره عظیمی از امور را نظیر Regular Expression، Document Generation، UnitTesting،Threading،Database،Web Browsing،FTP، XML، HTML ،Cryptography ،GUI وEmail پوشش دهد. در کنار کتابخانه استاندارد پایتون، تعداد زیادی کتابخانه خوشساخت دیگر نظیر wxPython (برای ساخت رابط گرافیکی)، Twisted (فریم ورک توسعه اینترنت)، PIL یا Python Imaging Library (برای ویرایش تصاویر) نیز در دسترس شما است.اما درنهایت شاید مهمترین دلیل طرفداران پایتون هیچ یک از موارد فوق نباشد. آنچه آنها را شیفته این زبان میکند لذتی است که از کار با چنین زبان ساده و قدرتمندی نصیب برنامهنویس خواهد شد. چه کسانی از پایتون استفاده میکنند؟ بهدلیل ماهیت اپنسورس و رایگانبودن، آمار دقیقی از استفادهکنندگان این زبان در دسترس نیست، اما شاید نامبردن تعدادی از بزرگترین شرکتهای مرتبط و غیرمرتبط با IT که از این زبان استفاده میکنند تا حدینشاندهنده عمومیت و قدرت این زبان باشد. مشهورترین کاربر زبان پایتون غول دنیای اینترنت یعنی گوگل است. پایتون بهعنوان زبان موردعلاقه برنامهنویسان گوگل شناخته میشود. موتور پردازش ابری گوگل با نام Google App Engine از پایتون پشتیبانی میکند. شما میتوانید برنامههایی را که بهمحاسبههاي سنگین و پیچیده نياز دارند با پایتون نوشته و از طریق App Engine اجرای آن را به سرورهای قدرتمند گوگل بسپارید. ناسا نیز از دیگر استفادهکنندگان پایتون است. بهصورت دقیقتر شرکت United Space Alliance شرکت اصلی پیمانکار مسئول نگهداری شاتلها در ناسا از پایتون برای برنامهنویسیهای علمی، طراحی رابط کاربر و توسعه سریع نرمافزار بهره میبرد. همچنین شرکت اتودسك که از بزرگترین تولیدکنندگان نرمافزارهای طراحي به كمك كامپيوتر (CAD) و مصورسازي است، از پایتون برای ایجاد قابلیت اسکریپتنویسی در محیط مايا استفاده میکند. اما تصور نکنید که استفاده از پایتون تنها بهمحاسبههاي علمی و کاربردهای مهندسی محدود است؛ جرج لوكاس شرکت ILM (سرنام Industrial Light and Magic) را در سال 1975 برای ایجاد جلوههای ویژه فیلم اصلی جنگ ستارگان تأسیس كرد. اين شركت هم اکنون برای ایجاد جلوههای ویژه، گرافیک کامپیوتری و مدیریت سیستمها از پایتون استفاده میکند. و درنهایت میتوان از شرکت فيليپس نام برد. این توليدكننده سرشناس وسایل الکترونیکی و مصرفی برای توسعه سریع نرمافزار، کنترل خط تولید و سیستم کنترل کیفیت خود از پایتون بهره میبرد. براي مشاهده فهرست کاملی از کاربران مشهور پایتون براساس زمینه فعالیت بههمراه خلاصهای کوتاه از نحوه استفاده و دلایل بهکارگیری این زبان ميتوانيد به آدرسhttp://python.org/about/success مراجعه كنيد. کدام پایتون ؟ کدام ابزار؟ زبان پایتون درحالحاضر در دو ويرايش متفاوت منتشر میشود. ويرايش اول سری2.x پایتون است که اکنون توزیع استاندارد پایتون بهشمارميآيد وبه نسخه 7/2 رسیده است. توسعه در این دسته برمبنای حفظ سازگاری با نسخههای قبلی انجام میشود. ويرايش دوم سری 3.x پایتون است که از ابتدا بدون سازگاری با نسخههای 2.x و با هدف ایجاد قابلیتهای بیشتر و بهروزتر در زبان تولیدشده و اکنون به نسخه 1/3 رسیده است. این نسخه هنوز همانند سری دوم عمومیت نیافته و بههمیندلیل در این مجموعه مقالهها از سری 2.x استفاده خواهدشد. بهيقين تمام کدهای نوشته شده در این مجموعه با هر نسخهاي بالاتر از 2/2 سازگار بوده و قابل اجرا هستند.این سری مقالهها برمبنای سیستمعامل لینوکس (بهصورت خاص اوبونتو) نوشته شدهاند. اما تمام کدها روی تمام سیستمها قابل اجرا هستند. اگر در کدها از توابع و ویژگیهای خاص وابسته به سیستمعامل استفاده شده باشد، دركنار کد به آن اشارهخواهدشد. درصورتیکه شما از یکی از توزیعهای مشهور لینوکس استفاده میکنید، به احتمال زیاد پایتون از پیش روی سیستم شما نصب شده است. برای سیستمعاملهای ویندوز و مک میتوانید با مراجعه به سایت رسمی پایتون( برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید. ورود یا ثبت نام ) نسخه مناسب سیستمعامل خود را دانلود کرده و نصب كنيد. کار با زبان برنامهنویسی پایتون بههیچ ابزار یا امکانات خاصی احتیاج ندارد. تنها با داشتن یک ویرایشگر متن ساده نظیر Gedit در لینوکس یا Notepad در ویندوز میتوانید شروع به کدنویسی کنید. اما درصورتیکه ویرایشگر شما از رنگبندی کد (Syntax Highlight) و سیستم تورفتگی خودکار (Auto Indent) پشتیبانی کند، سرعت کدنویسی و تصحیح شما بسیار بالاتر خواهدرفت. غالب ویرایشگرهای متن لینوکس نظیر Kate (در محيط KDE) و (Gedit (GNOME از هر دوی این قابلیتها پشتیبانی میکنند. در ویندوز میتوانید از ++Notepad که نرمافزاری آزاد و رایگان است استفادهکنید. همچنین در ویندوز و مک نصب استاندارد پایتون محیط برنامهنویسی پیشفرض پایتون یا IDLE را نیز بههمراه خواهدداشت که بسیار فراتر از یک ویرایشگر متن ساده در نوشتن و تصحیح کد به شما کمک خواهدکرد. در تمام توزیعهای لینوکس، این برنامه از مخازن سیستم بهسادگی قابل نصب است. با مراجعه بهآدرس برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید. ورود یا ثبت نام میتوانید فهرست ویرایشگرها و محیطهای توسعه موجود را برای پایتون مشاهده کنید. مثال مقدماتی 5 دقیقهای نمونه کد پایتون فرض کنید میخواهیم حاصل عبارت (g(x)=x/(1-x را برای مقادیر x معادل 0.9 ، ...، 0.3 ، 0.2 ، 0.1 بیابیم. کافی است در یک فایل متنی مثلاً با نام fme.py کد موجود در فهرست 1 را نوشته و در خط فرمان با تایپ دستور زیر آن را اجرا کنید. python fme.py $ خروجی برنامه مانند فهرست 2 خواهد بود (میتوانید این عملیات را در IDLE نیز انجام دهید. کافی است پس از بازکردن برنامه از منوی File گزینه New Window را انتخاب كرده، کد موردنظر را تایپ كرده و پس از ذخیره کردن با F5 اجرا كنيد). for i in rage (10) : x=0.1*i print x print x/ (1-x*x) فهرست 1 >>> 0.0 0.0 0.1 0.10101010101 0.2 0.208333333333 0.3 0.32967032967 0.4 0.47619047619 0.5 0.666666666667 0.6 0.9375 0.7 1.37254901961 0.8 2.22222222222 0.9 4.73684210526 >>> فهرست 2 ليستها در پایتون این برنامه چگونه کار میکند؟ در ابتدا تابع ()range پایتون نمونهای از استفاده ليستها را در این زبان نشان میدهد. در زبان پایتون ليست چیزی شبیه آرایه است. ليستها یکی از انواع بنیادی پایتون هستند. تابع ()range درواقع یک ليست را برمیگرداند که در اینجا عبارت است از [0,1,2,3,4,5,6,7,8,9] . به علامتهای [] توجه کنید. این روش رسمی پایتون برای نشان دادن یک ليست است. ليست درواقع ردیفی از اشیاي مختلف (هر تعداد شيء با هر ترتیب و هر نوعی) است که داخل [] قرار دارند و با کاما از یکدیگر جدا شدهاند. پس دستور اول کد ما در واقع معادل عبارت زیر است: :[for i in [0,1,2,3,4,5,6,7,8,9 همانطور که حدس میزنید این کد باعث ده بار گردش حلقه میشود که در بار نخست i برابر صفر و در بار دهم برابر9 است. پایتون یک ساختار while هم دارد (البته بدون until). همچنین مانند C++/C دستور break برای خروج کامل از حلقه دردسترس است (فهرست3). >>> x=5 >>> while 1: x += 1 if x == 8: print x break 8 >>> فهرست 3 تعریف بلوک در پایتون حال به علامت دونقطه انتهای دستور for توجه کنید که شروع یک بلوک کد را اعلام میکند. برخلاف زبانهایی نظیر C++/C یا حتی Perl ، که از {} برای تعریف بلوک استفاده میکنند، پایتون از ترکیب دونقطه و تورفتگی برای تعریف بلوکها استفاده میکند. ما با دونقطه به پایتون میگوییم که قصد داریم یک بلوک کد را آغاز کنیم و با تورفتگی ابتدای خطوط دستورات آن بلوک را تعریف میکنیم. برای تورفتگی میتوانیم از 3 یا 4 یا 10 فضای خالی استفاده کنیم. میزان این فضای خالی تا زمانی که در تمام کد رعایت شود، اهمیتی ندارد. بنابراین، درصورت وارد کردن کد (فهرست4) با خطای دستوری پایتون مواجه میشویم، زیرا تنها در صورتی میتوانیم در یک بلوک از تورفتگی استفاده کنیم که بخواهیم بلوک دیگری در دل آن ایجادکنیم (فهرست5). >>> for i in range (10) : print 0.1*i print g(0.1*i) File “”, line 3 print g(0.1*i) IndentationError: unexpected indent >>> فهرست 4 >>> for i in range (10) : if i%2 == 1 : print 0.1*i 0.1 0.3 0.5 0.7 0.9 >>> فهرست 5 در این حالت فقط زمانی که متغیر i یک عدد فرد است ما دستور چاپ را اجرا ميكنيم. عملكرد % یا mod همانند C++/C باقیماندهتقسیم را بازمیگرداند. دوباره به علامت دونقطه در انتهای دستور if و فاصلهگذاری ابتدای دستور print دقت کنید. همینطور دقت داشته باشید که مانند C++/C/perl احتیاجی به علامت نقطه کاما در انتهای دستورات نیست. هر خط جدید بهمعنای دستوری جدید خواهد بود. درصورتیکه خطی طولانی دارید میتوانید برای شکستن آن از علامت"\" استفاده کنید (فهرست 6). >>> y=7 >>> z=12.5 >>> x = y + \ z >>> >>> x 19.5 فهرست 6 پوسته تعاملی (خط فرمان پایتون) یکی از قابلیتهای جذاب پایتون خط فرمان تعاملی آن است. شما بهصورت معمول زیاد از این قابلیت استفاده نمیکنید، اما برای بررسی برخی امکانات و آزمايش سریع دستورات بسیار مفید خواهد بود. هرگاه بهعملکرد درست قسمتی شک دارید باید از سیستم آزمایش و خطا استفاده کنید و بهترین و سریعترین روش آزمودن استفاده از خط فرمان تعاملی پایتون است. بهجای نوشتن کد در فایل متنی و اجرای آن ما کد را در پوسته پایتون نوشته و اجرا میکنیم. با تایپ دستور Python بهتنهایی یا اجرای IDLE به پوسته پایتون دسترسی خواهیم داشت (شکل زير). در اینجا با اجرای پایتون اعلان حالت تعاملی یعنی >>> بهنمایش درمیآید. سپس شروع به تایپ خط به خط کد میکنیم. هر زمان که داخل یک بلوک کد باشیم اعلان ویژه " ..." بهنمایش درمیآید. وقتی درانتهای کد یک خط خالی را وارد کنیم، پایتون متوجه اتمام کد شده و آن را اجرا میكند. درباره پوسته تعاملی توجه داشته باشید که بین پلتفرمهای مختلف تفاوتهای کمی وجود دارد. بهعنوانمثال، ممکن است فاصلهگذاری بهصورت خودکار انجام نشود یا در ویندوز شما با تایپ CTRL + Z از پوسته خارج میشوید، اما در لینوکس باید از CTRL + D استفاده کنید. همچنین توجه کنید که در IDLE اعلان " . . ." بهنمایش درنمیآید. در حالت تعاملی ارجاع به یک شیء یا ساخت یک شیء یا نوشتن یک عبارت بدون نسبت دادن آن به یک متغیر باعث چاپ شدن مقدار آن میشود (فهرست7). >>>for i in range (4) : 3*i 0 3 6 9 >>> open (“x.txt”) >>> فهرست 7 در مثال دوم ما فایل x.txt را باز کردهایم که نتیجه حاصل یک شیء فایل است و چون آن را بهمتغیری (معمولاً f) نسبت ندادهایم، شیء فایل چاپ شده است (فایل x.txt باید در مسیر جستوجوی پایتون موجود باشد).پایتون بهعنوان یک ماشین حساب یکی از قابلیتهای دیگر پوسته تعاملی امکان استفاده از آن بهعنوان یک ماشین حساب سریع است. بهعنوانمثال، برای محاسبه مقدار 88.88 بهعلاوه پنج درصد کافی است، عبارت اول را تایپ کنیم (فهرست8 ) یا برای تبدیل اعداد بین مبنای 10 و 16 از دستورات قسمت دوم استفاده کنیم. >>> 1.05*88.88 93.323999999999998 >>> >>> >>> 0x12 18 >>> hex (18) '0x12' >>> فهرست 8 اگر به محاسبههاي ریاضی خاصی احتیاج داشته باشیم باید ابتدا کتابخانه math را از مجموعه کتابخانههای استاندارد پایتون import کنیم. دقیقاً همانند سیستمی که در سييا سيشارپ با دستور include# پیادهمیشود، سپس میتوانیم با سیستم نشانهگذاری نقطهای از توابع تعریف شده در کتابخانه math استفاده کنیم. در شكل زير استفاده از توابع ()sin و ()sqrt نشاندادهشدهاست. همچنین توجه کنید که در محیط IDLE با تایپ math و علامت نقطه و مکثی کوتاه فهرست توابع موجود کتابخانه ظاهرمیشود. شما اکنون تا حدودی با زبان پایتون آشنا شدهاید و کموبیش تواناییها و قابلیتهای آن را میشناسید. اگر در قسمتهای بعدی این مجموعه با ما همراه باشید، در هر قسمت با جنبهای تازه و کاربردی از این زبان آشنا خواهیدشد. قسمتهای بعدی درعینسادگی و کاربردی بودن مستقل از یکدیگر بوده و برای مطالعه و استفاده از آنها به مهارت خاصی نياز ندارید و حتی لازم نیست به پایتون چندان مسلط باشید، زیرا در هر قسمت مطالب پایهای مرتبط آورده خواهندشد. اما درصورتیکه زیبایی پایتون توجه شما را جلب کرده و مشتاق یادگیری بهتر این زبان هستید، بهترتیب دو منبع زیر را به شما پیشنهاد میکنیم: 1- A Byte of Python (Swaroop C H) برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید. ورود یا ثبت نام 2- Dive into Python (Mark Pilgrim) برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید. ورود یا ثبت نام متأسفانه زبان هر دو منبع انگلیسی است و هنوز مرجعی مناسب و رایگان به زبان فارسی وجود ندارد. درپایان بهخاطر داشتهباشید که دنیای نرمافزار دنیایی است که در آن تنها محدودیت، خلاقیت و دانش شما از برنامهنویسی است. 2 لینک به دیدگاه
Fahim 9563 مالک اشتراک گذاری ارسال شده در 13 شهریور، ۱۳۹۰ تقسیم و غلبه (Divide & Conquer) یکی از روشهای بسیار پرکاربرد در حل مسئله و طراحی الگوریتم، روش تقسیم و غلبه است. در این روش هر مسئله به مسائلی ریزتر تقسیم میشود و این روند آنقدر ادامه مییابد تا به مسائلی بسیار ساده با راهحل آسان برسیم. حل هر مسئله ریز، به صورت جداگانه پیادهسازی شده و سپس از جمع آنها راهحل نهایی به دست میآید. در برنامهنویسی پایتون این تقسیمبندیها در مرحله نخست شامل تفکیک کل برنامه به تعدادی ماجول و سپس تفکیک ماجولها به تعدادی شیء (Object) يا تابع (Function) است. ما مسئله بازی Tic-Tac-Toe را به صورتی مانند شکل زير تفکیک میکنیم. برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید. ورود یا ثبت نام تفكيك بازي به قسمتهاي مختلف ابتدا کل مسئله به سه بخش اساسی تقسیم میشود که عبارتند از: حلقه اصلی روند اجرای بازی، بخشی جهت تعامل با بازیکن (کاربر) و در نهایت بخشی برای كنترل و مديريت صفحه بازی. هر یک از این بخشها در فایل جداگانهای به نام ماجول نوشته میشوند و وظایف مربوط به خود را از طریق تعدادی تابع به انجام میرسانند. فعلاً نگران این اصطلاحات نباشید. در پایتون همه چیز سادهتر از آن است که به نظر میرسد. ماجول مربوط به بازیکن کد فهرست 1 را در IDLE یا هر ویرایشگر متن دلخواهی نوشته و آن را با نام player.py ذخیره کنید. شمارههای خطوط را وارد نکنید. ما از آنها برای توضیحات بعدی استفاده کردهایم.خط 1، یک توضیح یا Comment است. علامت # در هر کجای خط قرار بگیرد، پایتون عبارات بعد از آن را نادیده میگیرد. از توضیحات به طور معمول برای تقسیمکردن کد به بخشهای قابل فهم برای انسان و شرح روند اجرای برنامه استفاده میشود تا مطالعه کد و ویرایشهای بعدی آن سادهتر شود. ######### Getting Player›s Name ########## def Get_Player_Name(): name = raw_input(“Enter your name plaese: “) print “Hi %s , you will play against computer. \ \nyour mark is ‹X›” %name return name ######### Play One Turn ################## def Play_One_Turn(b,player): while 1: # Player Turn place=input(“Your Turn %s.Enter Location:\n\ (Enter comma seperated values like 2,3): “ %player) x,y = place[0] , place[1] if x 3: print “Error . . . \nX is invalid” continue if y 3: print “Error . . . \nY is invalid” continue if b[x-1][y-1] == “ “: b[x-1][y-1] = “X” break else: print “This point is aquired by: %s” %b[x][y] return فهرست 1- ماجول مربوط به بازيكن خط 2 یک تابع را تعریف میکند. تابع یا function یکی از عناصر اساسی هر زبان برنامهنویسی است. حتی در زبانهای برنامهنویسی شیءگرای کنونی نیز توابع یا روالها (subroutine) وظیفه اصلی تقسیمبندی و تفکیک کد را انجام میدهند. تابع قسمتی از کد است که با گرفتن ورودیهای مشخص، خروجی مشخصی را تولید میکند یا کاری را به انجام میرساند. تابع به خودی خود اجرا نمیشود. برای استفاده از یک تابع باید آن را صدا زد یا به اصطلاح فراخواند. در پایتون تعریف تابع (که دارای مقدار برگشتی است) با تعریف روال (که فاقد مقدار برگشتی است) تفاوتی ندارد. بهطور کلی تعریف تابع در پایتون به شکل زیر انجام میشود: def ( ): function body return به تورفتگی بدنه تابع، اختیاری بودن آرگومانهای ورودی و مقادیر خروجی توجه کنید1. توجه داشته باشید که نام توابع و متغیرها نباید از بین کلمات کلیدی پایتون (فهرست 2) انتخاب شود. همچنین استفاده از علامتهای _ و __ (زیر خط تکی و زیرخط دوتایی) در ابتدای نام تابع یا متغیر، ویژگیهای خاصی را به آنها نسبت خواهد داد که بررسي آن در اين مقاله نميگنجد. and assert break class continue def del elif else except exec finally for from global if import in is lambda not or pass print raise return try while فهرست 2- كلمات كليدي پايتون همانگونه که از پرانتز خالی جلوی نام تابع Get_Player_Name مشخص است، این تابع آرگومان ورودی ندارد. ما از این تابع برای دریافت نام بازیکن و نمایش پیغام خوشامد استفاده خواهیم کرد.در خط 3 از فرمان raw_input برای گرفتن یک رشته یعنی نام کاربر استفاده شده است. در سری 2.x پایتون برای گرفتن اعداد از input() و برای گرفتن رشتهها از raw_input() استفاده میشود. اما در سری 3.x پایتون دستور raw_input حذف شده و تنها از دستور input استفاده میشود که در هر صورت یک رشته را برمیگرداند و تبدیل نوع داده ورودی به عدد یا سایر انواع باید توسط برنامهنویس صورت بگیرد. دستورات input و raw_input هر دو از توابع درونی پایتون هستند. این توابع یک آرگومان ورودی دارند که یک رشته است. این رشته بهعنوان پیام برای کاربر نمایش داده شده و جواب کاربر مقدار برگشتی تابع است. در این جا مقدار برگشتی (یا همان پاسخ کاربر) به متغیر name نسبت داده میشود. پایتون تعداد زیادی تابع توکار یا درونی دارد که گستره وسیعی از عملیات پرکاربرد را به انجام میرسانند. در پایتون لازم نیست پیش از استفاده از متغیر آن را تعریف کرد. با نخستين دستور انتساب، متغیر تعریف شده و نوع آن براساس مقدار نسبت داده شده تعیین میشود. در اینجا متغیر name خود به خود از نوع رشته خواهد بود. در خط 4 از دستور print برای چاپ پیام خوشامد استفاده شده است. به علامت ‘\’ در انتهای خط توجه کنید. همانطور که در شماره گذشته اشاره شد، از این علامت برای شکستن خطوط طولانی به تعدادی خط منطقی استفاده میشود. همچنین توجه داشته باشید که انتقال خروجی دستور چاپ به سطر بعد، در حین اجرا با عبارت ‘\n’ انجام میشود. نکته آخر در این دستور علامت ‘%s’ است. برای جای دادن دادههای خاص نظیر اعداد و رشتههای ذخیره شده در یک متغیر، در دل یک رشته (به عنوان مثال، رشتهای که قرار است چاپ شود) از این گونه علامتها استفاده میشود. از ‘%d’ و ‘%f’ نیز برای جایگذاری اعداد صحیح و اعشاری استفاده میشود. سیستم این جایگذاری به فرم زیر است: “ string % string “ % ( [,variable , variable, . . .] ) يعني هر عبارت بعد از علامت % بيرون رشته، به ترتیب جایگزین یکی از علامتهای موجود در رشته خواهد شد. اگر مجموعه دستورات زیر را در نظر بگیریم: score = 86 field = “mathematic” print “I got %d in %s” % (score , field) خروجی آن برابر «I got 86 in mathematic» خواهد بود.در نهايت، در خط 6 توسط کلمه کلیدی return، مقدار متغیر name به صدا زننده تابع بازگردانده میشود.خط 8 تعریف یک تابع جدید است و همانگونه که از نام آن بر میآید، تعامل با بازیکن برای انجام یک نوبت از بازی را به عهده دارد. پرانتز پس از نام تابع نشان میدهد که این تابع دو مقدار ورودی دارد. ما این دو مقدار را به ترتیب صفحه بازی b و نام بازیکن player در نظر گرفتهایم. مقدار b به اصطلاح به تابع پاس شده است تا از روی آن، نقطه مورد نظر بازیکن با نقاط خالی صفحه مقایسه شود. نام بازیکن هم برای نمایش پیغامها مورد استفاده قرار خواهد گرفت. در خط 9 حلقه تعامل با کاربر آغاز میشود. این حلقه تا زمانی که کاربر یک نقطه مناسب (آزاد و در محدوده صفحه بازی) را انتخاب نکرده باشد، ادامه خواهد یافت. همانگونه که در قسمت قبل دیدهاید یکی از راههای خروج از حلقه دستور break است که کنترل عملیات را به خط بعد از حلقه منتقل میکند. در خط 11 محل مورد نظر کاربر پرسیده میشود. بازیکن باید محل را به صورت یک جفت عدد که با کاما (،) از یکدیگر جدا شدهاند وارد کند. متغیر حاصل یعنی place از دید پایتون یک توپل (tuple) است. توپل در زبان پایتون بسیار شبیه ليست است، اما تفاوت آن با ليست غیر قابل تغییر بودن آن است؛ يعني عناصر یک ليست را میتوان ویرایش کرد، اما عناصر موجود در توپل را نمیتوان تغییر داد. بعدها درباره توپل بیشتر صحبت خواهیم کرد. تنها نکته مهم این است که برای ارجاع به عناصر ليست یا توپل از علامت [] در جلوی نام ليست یا توپل استفاده میشود. توجه کنید که مانند غالب زبانهای برنامهنویسی اندیس توپلها و ليستها از عدد صفر آغاز میشود.بنابراین، در خط 13، place[0] عضو نخست توپل را بهعنوان x و place[1] عضو دوم آن را بهعنوان y جدا میکند. در خطوط 14 تا 19، مقادیر x و y کنترل میشوند تا در محدوده صفحه باشند. اگر اعداد در محدوده صفحه بازی (3×3) نباشد یک پیغام خطا چاپ شده و به کمک دستور continue حلقه گردش بعدی را انجام میدهد. در هر حلقه، چه از نوع for و چه از نوع while، دستور continue باعث میشود که روند فعلی حلقه قطع شده و کنترل دوباره به ابتدای بدنه حلقه بازگردد. در خط 20 کنترل میشود که آیا محل انتخاب شده (که اکنون مطمئن هستیم در محدوده صفحه بازی است) قبلاً اشغال شده یا خير؟ اگر اشغال نشده باشد، علامت مختص بازیکن در آن ثبت شده و با دستور break از حلقه خارج میشویم. چون اندیس ليستها و توپلها از صفر شروع میشود برای کنترل صفحه بازی از x و y یک واحد کم کردهایم. خط 23 استفاده از دستور else را نشان میدهد. در صورتیکه شرط if آخر درست نباشد، کنترل به دستور else منتقل میشود. در این حالت پیامی مبنی بر اشغال بودن نقطه مورد نظر چاپ شده و حلقه دوباره از ابتدا اجرا میشود. همانطور که در خط 25 مشاهده میکنید، این تابع مقدار برگشتی ندارد. نکته مهمی که همیشه باید به خاطر داشته باشید این است که در پايتون ليستهاي پاس شده به تابع نظیر b، بهصورت «ارجاع به محل» یا By Reference مورد استفاده قرار خواهند گرفت و بنابراین هر تغییری در آن به طور مستقيم به متغیر اصلی (اینجا یعنی صفحه اصلی بازی board) اعمال خواهد شد و در نتیجه به مقدار بازگشتی نیازی نخواهد بود. ماجول مربوط به صفحه بازی در فهرست 3، ماجول دوم که سازنده و کنترل کننده صفحه بازی است، نمایش داده شده است. این ماجول را تایپ کرده و با نام board.py ذخیره کنید. با یک نگاه کلی و با توجه به توضیحاتی که تاکنون دادهایم، مشخص میشود که این ماجول سه تابع برای ساخت صفحه نمایش، چاپ آن و کنترل برنده بازی تعریف میکند. ######### Creating the Board ############# def Create_Board(): b=[] for i in range(3): b.append([]) for j in range(3): b.append(“ “) return b ######### Printing the Board ############# def Print_Board(b): s=”” for j in range(2,-1,-1): s=s+”\n-------------\n|” for i in range(3): s= s+ “ “ + b[j]+ “ |” s=s+”\n-------------\n” print s return ########## Checking for Winner ########### def Check_Winner(b): for sign in [“X” , “O”]: #check rows for i in range(3): score=0 for j in range(3): if b[j] == sign : score += 1 if score == 3 : return sign #check columns for j in range(3): score=0 for i in range(3): if b[j] == sign : score += 1 if score == 3 : return sign #check diameters score1=score2 =0 for i in range(3): if b== sign: score1 +=1 if b[2-i] == sign: score2 += 1 if score1 == 3 or score2 == 3: return sign #check if board is full empty = 0 for i in range(3): for j in range(3): if b[j] == « «: empty += 1 if empty == 0: return “No one” return None فهرست 3- ماجول مربوط به صفحه بازي در خط 3 متغیری به نام b از نوع ليست تعریف میشود. این متغیر در این مرحله هیچ عضوی ندارد.در خط 4 با یک دستور for حلقهای با سه بار تکرار تعریف میشود که در خط 5 به کمک متد append یک ليست تهی دیگر را به ليست b اضافه میکند. در دو خط بعدی با یک حلقه for دیگر، به این ليست داخلی، سه رشته با مقدار “ “ افزوده میشود. در نهایت متغیر b به فرم زیر درخواهد آمد: b= [[“ “,“ “,“ “],[“ “,“ “,“ “],[“ “,“ “,“ “]] همانطور که پیشتر توضیح دادیم برای دسترسی به عناصر داخل ليست از اندیسها و علامت [] استفاده میکنیم. بنابراین، b[0] نخستين عضو b است که خود یک ليست دیگر است و b[1][2] به سومین عضو در دومین عضو b اشاره میکند. ما از این تجرید برای شبیهسازی مختصات یا همان x و y صفحه بازی استفاده کردهایم. به عبارت دیگر، عنصر نخست b نماینده ستون نخست یا x=1 و به عنوان مثال، عنصر دوم نماینده ستون دوم خواهد بود. به همین شکل مقدار b[2][1] نماینده محتویات نقطهای با مختصات (3،2) خواهد بود. ليستها که از قسمت قبل با تعریف آنها آشنا شدهاید، از پرکاربردترین انواع بنیادی پایتون هستند. ليست در واقع چیزی شبیه آرایه در سایر زبانها است، با این تفاوت که لازم نیست از ابتدا اندازه آن را مشخص کنید یا نوع داده آن را تعریف كنيد و همچنین هنگام اجرای برنامه ميتوانيد هم خود ليست و هم عناصر آن را تغییر دهید. همانگونه که دیدید با متد append میتوان هر چیزی را به ليست اضافه کرد.در خط 10 تابع دیگری برای چاپ صفحه نمایش تعریف میشود. در خط 11 متغیر s از نوع رشته و با مقدار تهی تعریف شده است. خط 12 نمونه دیگری از کاربرد range() را نشان میدهد. همانطور که بهاحتمال حدس زدهاید، range() هم یکی از توابع داخلی پایتون است. در این خط، تابع range() سه آرگومان گرفته است که به ترتیب عدد شروع، عدد پایان و میزان تغییر در هر مرحله است. فرم کلی دستور range() مانند زیر است: range ( [start ,] [,step] ) اکنون میدانید که عبارت فوق يعني آرگومان stop یا پایان ليست تولیدی الزامی ولي آرگومان شروع و مقدار افزایش در هر مرحله اختیاری است. نتیجه خروجی range(2,-1,-1) در اینجا ليستي با مقدار [ 2 , 1 , 0 ] است. دلیل استفاده از این ليست معکوس این است که هنگام چاپ، ليست از بالا به پایین یعنی از خانههايي به مختصات (1,3)، (2,3) و (3,3) چاپ میشود در حالیکه مقادیر موجود در متغیر b به ترتیب از (1,1)، (1,2) و الی آخر شروع میشوند. مجموعه خطوط 13 تا 16 با ترکیب عناصر b و کاراکترهای “-“ و “|” جدولهايي شبیه شکل 2 را برای بازی به وجود آورده و چاپ میکنند. برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید. ورود یا ثبت نام شكل 2- شبيهسازي صفحه بازي به دلیل طولانی بودن تابع سوم ما از توضیح خط به خط آن صرف نظر میکنیم. این تابع به رغم ظاهر طولانی، منطقی بسیار ساده دارد. به طور خلاصه اینکه در خط 21 حلقهای تعریف میشود که تنها دوبار یک بار با مقدار X (نماینده بازیکن) و بار دیگر با مقدار O (نماینده کامپیوتر) اجرا خواهد شد. در خطوط 22 تا 29، با یک سری حلقه for امتیاز X یا O در همه سطرها محاسبه میشود که اگر تنها در یک سطر برابر 3 بود، علامت X یا O با دستور return به عنوان برنده به صدا زننده تابع بازگردانده شده و عملکرد تابع تمام میشود. در خطوط 31 تا 37 همین کار برای ستونها انجام میشود. در نهایت در خطوط 39 تا 46، قطرهای صفحه بازی کنترل ميشود. رسیدن کنترل اجرا به خط 48، به این معنی خواهد بود که بازی تاکنون هیچ برندهای نداشته است. در اینجا کل صفحه برای وجود خانههای خالی بررسي میشود که درصورت عدم، وجود بازی مساوی اعلام خواهد شد. درصورتیکه صفحه بازی هنوز جای خالی داشته باشد، مقدار None یا هیچ، که از مقادیر از پیش تعریف شده پایتون است، برگشت داده میشود. ماجول اصلی فهرست 4 ماجول اصلی یا کنترل کننده برنامه را نشان میدهد. این مجموعه کد را تایپکرده و با نام main.py در کنار سایر فایلها ذخیره کنید. به خط 1 که با علامت #! شروع شده است، به اصطلاح شیبنگ یا shebang گفته میشود. این خط در محیطهای لینوکسی به سیستم عامل اعلام میکند که برای اجرای این اسکریپت (در صورتیکه به آن مجوز اجرا داده شده باشد) از چه مفسر یا مترجمی استفاده کند. در سیستم ویندوز یا سایر موارد این خط همانند یک توضیح یا comment دیده میشود. #! /usr/bin/env python ######### importing required modules ##### import random from board import Create_Board , Print_Board , Check_Winner from player import Get_Player_Name , Play_One_Turn ########## Main Section ##################### player=Get_Player_Name() board = Create_Board() Print_Board(board) while 1: Play_One_Turn(board,player) Print_Board(board) winner = Check_Winner(board) if winner None: print “Game Over \n%s won the game . . . “ %winner break while 1: # Computer Turn x = random.randint(1,3) y = random.randint(1,3) if board[x-1][y-1] == “ “: board[x-1][y-1] = “O” print “Computer Turn . . .” break Print_Board(board) winner = Check_Winner(board) if winner None: print “Game Over \n%s won the game . . . “ %winner break فهرست 4- ماجول اصلي خطوط 4 و 5 و6 ماجولها و توابع مورد نظر را بارگذاری ميكنند. دستور import برای استفاده از ماجولها به کار میرود. این دستور برای یافتن ماجول مورد نظر نواحی خاصی از سیستم را جستوجو میکند. یکی از این نواحی پوشه یا فولدری است که فایل import کننده در آن قرار دارد. ناحیه دیگر کتابخانه استاندارد یا Standard Library است. دستور import به دو صورت قابل اجرا است. روش اول به شكل زير است: import [,module ,module , . . .] روش دوم نيز مطابق نمونه زير است: from import [,function|variable|class, . . .] تفاوت این دو حالت در این است که روش نخست خود ماجول را به صورت یک موجوديت وارد اسکریپت فعلی میکند و برای استفاده از اجزای آن باید از سیستم نقطهگذاری استفاده کرد. نظیر آنچه در خط 21 و دستور random.randint() دیده میشود. اما در حالت دوم بخش مورد نظر به طور مستقيم وارد اسکریپت فعلی شده و بدون نام بردن ماجول مادر آن قابل استفاده است. همانند خط 11 که در آن Print_Board() که از ماجول board وارد شده بود، به طور مستقيم مورد استفاده قرار گرفته است. در خط 4، random که یکی از کتابخانههای استاندارد پایتون است، بارگذاری میشود. همانطور که قبلاً گفته شد، کتابخانه استاندارد پایتون طیف وسیعی از کاربردها را بهسادگی برای کاربر فراهم ميكند. کتابخانه random توابعی در زمینه کار با اعداد تصادفی فراهم کرده است. سه خط نخست بخش اصلی، نام بازیکن را پرسیده و پس از خوشامدگویی، صفحه بازی را ایجاد و چاپ میکند. پس از آن حلقه بازی شروع میشود. این حلقه در خطوط 15 تا 18 و خطوط 28 تا 31 درصورت برنده شدن یک بازیکن یا پرشدن صفحه شکسته میشود. در این حلقه به ترتیب در خط 13 بازیکن از طریق تابع Play_One_Turn() یک نوبت بازی میکند. سپس در خطبعدی صفحه بازی چاپ شده و وجود یا عدم وجود برنده بررسي میشود. سپس نوبت به کامپیوتر میرسد که با یک حلقه while و استفاده از اعداد تصادفی سعی میکند، یک خانه صفحه را انتخاب کند. تابع randint() که در کتابخانه random تعریف شده است، با گرفتن دو عدد صحیح، یک عدد صحیح تصادفی بین آن دو (یا مساوی یکی از آنها) تولید خواهد کرد. پس از خروج از این حلقه، صفحه بازی دوباره چاپ شده، برنده کنترل میشود و حلقه اصلی از نو شروع به کار خواهد کرد. اگرچه این برنامه چندان کاربردی نبود و در بسیاری از قسمتها میتوان آن را به گونهای بهتر پیاده سازی کرد، اما حاوی نكتههاي بسیار مهمی درباره کار با زبان پایتون است. اگرچه کل کدهای این مقاله از سایت مجله قابل دریافت است، اما توصیه میکنيم دستكم یک بار آنها را تایپ کنید تا با خطاهای احتمالی حین تایپ و رفع اشکال برنامه نیز آشنا شوید. در قسمت بعدی با بخشهایی پرکاربرد از کتابخانه استاندارد پایتون آشنا خواهید شد و برنامه قسمت بعد، استفاده مفیدتر و جالبتری از چرخههای پردازنده شما خواهد کرد. پی نوشت: 1- در نوشتن فرم کلی دستورات علامت به معنای اجباری، [ ] به معنای اختیاری و علامت | به معنای یا است. 3 لینک به دیدگاه
ارسال های توصیه شده