زبان برنامه نويسي پایتون
مقدمه
زبان پایتون اواخر سال ۱۹۸۰(میلادی) توسط گیدو ون روسوم در موسسه ملی تحقیقات ریاضی و رایانه ( CVVI ) در شهر هلند ایجاد شد. پایتون یک زبان شیگراست و از ویژگیهای پیشرفتهایی چون وراثت، چند شکلی، سربار گزاری عملگر و ... پشتیبانی می کند.
در این مقاله مطابق با سرفصل و عناوین گفته شده در درس طراحی و پیاده سازی زبانها و طبق کتاب ویژگیهای این زبان را بررسی می کنیم.1
فصل یک
1-1 چرا از پایتون استفاده کنیم2
پایتون شی گراست :
پایتون ذاتا یک زبان شیگراست و از ویژگیهای پیشرفته شیگرایی چون وراثت، چند شکلی، سربار گزاری عملگر و ... پشتیبانی می کند. نکته جالب و یک ویژگی منحصر به فرد پایتون که لقب چسب را برای پایتون به ارمغان آورده امکان استفاده از کدها و کلاسهای نوشته شده در زبانهای دیگری چون ++ C و Java هستش و یه جورایی کار چسباندن قطعات کد جدا و فقط نوشتن بدنه اصلی به عهده پایتون است .
پایتون رایگان است:
پایتون یک زبان رایگان و باز متن است.
پایتون یک زبان پورتابل یا قابل انتقال می باشد:
چون پایتون با زبان پورتابل C نوشته شده می تواند به صورت مجازی بر روی هر سیستمی کامپایل و اجرا شود.گفتیم این یک زبان اسکریپتی است، یعنی در حالت معمول به فایل اجرایی تبدیل نمی شود بلکه یک ماشین مجازی فایل کد را می خواند و همزمان آنها را تفسیر کرده و اجرا می کند. پس می توان یک برنامه را در ویندوز نوشت و سپس آن را بدون تغییر روی لینوکس یا مکینتاش یا هر سیستم عامل و سخت افزار دیگری که پایتون روی آن نصب باشد اجرا کرد.
پایتون قدرتمند است :
پایتون یک زبان چند رگه هست. پایتون از زبانهای اسکریپتی برای مثال (Tcl , Scheme , Perl) زبانهای سیستمی (برای مثال ( C++ , C مشتق شده. بنابراین تمام سادگی و راحتی کار زبانهای اسکریپتی و ویژگیها و قدرت زباهای سطح پایین را داراست .
پایتون قابلیت استفاده از کدهای نوشته شده با سایر زبان ها را دارد :
این ویژگی یکی از پرکاربردترین و قویترین ویژگیهای پایتون میباشد. میتوان قطعهای از کد را در زبانی چون C , C++ و Java نوشت آنرا تبدیل به فایل اجرایی کرد و سپس از آن در برنامه نوشته شده با پایتون استفاده کرد. و یا از توابع کتابخانه و کامپوننت هایی چون COM API استفاده کرد.
یادگیری و استفاده از پایتون بسیار راحت می باشد :
بی شک و حداقل از نظر بسیاری از برنامه نویسان پایتون این زبان یکی از آسان ترین زبان ها برای یادگیری و استفاده میباشد و از آن به عنوان یک زبان سریع برنامه نویسی یاد می کنند. این زبان نیازی به کامپایل ندارد و شما مستقما میتوانید پس از نوشتن کد و با یک دستور آن را اجرا کنید. دستورات این زبان بسیار نزدیک به زبان انسان میباشد. برای مثال برنامه Hello World را که اولین برنامه ساده میباشد را در دو زبان C و Python مقایسه کنید :
#include
int main()
{
printf("Hello World ");
return 0;
}
ابتدا باید این برنامه را بنویسید و آن را با دستوری چون cc helloworld.c -o hello کامپایل و سپس با دستور hello/. اونو اجرا کنید . اما بوسیله پایتون در یک فایل متنی بنویسید :
print "Hello World !!"
و با دستور python hi.py اونو اجرا کنید .
با کم شدن حجم کد برنامه نویسی راحت تر و رفع اشکال و توسعه آن آسان تر می شود .
امنیت اطلاعات:
پایتون همچنین استفاده وسیعی از صنعت ایمنی اطلاعات میکند. مثلا در چندین ابزار پیشنهاد شده توسط تأمین امنیت و امنیت مرکزی و اسکنر امنیت کاربردی وب واپیتی. پایتون معمولاً در توسعه کاربرد مورد استفاده قرار میگیرد.
1-2 تاریخچه
پایتون اواخر سال ۱۹۸۰(میلادی) توسط گیدو ون روسوم در موسسه ملی تحقیقات ریاضی و رایانه ( CVVI ) در شهر هلند ایجاد شد. هدف گیدو ایجاد جانشینی برای زبان برنامه نویسی «ایبیسی» بود که قابلیت پردازش استثنا را داشته باشد. گیدو طراح اصلی پایتون است و نقش مداوم او در تصمیم گیری پیرامون اهداف پایتون، باعث شد که انجمن پایتون به او لقب دیکتاتور خیراندیش زندگی (به انگلیسی: Benevolent Dictator For Life) را بدهد.
نسخههای اولیه1
در سال ۱۹۹۱ ون روسوم کدی با برچسب نسخهی۰.۹.۰ را منتشر کرد. البته در این مرحله از پیشرفت کلاس هایی با خاصیت ارث بری ، پردازش استثنا ، توابع و نوع داده list , dict , str وجود داشت. همچنین در این نسخه ابتدایی یک سیستم ماژول با اقتباس از ماژول-3 وجود داشت. که ون روسوم این ماژول را به عنوان «یکی از واحد های عمده برنامه نویسی پایتون» توصیف کرد. مدل استثناء پایتون نیز شباهت هایی به ماژول-3 داشت ، به علاوه شرط else . در سال ۱۹۹۴ اولین مجمع مباحثه پیرامون پایتون شکل گرفت که مرحله برجستهای در پیشرفت کاربری پایتون بود.
باز بودن
در سال ۲۰۰۰ تیم توسعه دهنده پایتون به BeOpen.com منتقل شد و بدین صورت تیم کتابخانه باز پایتون شکل گرفت. به پیشنهاد CNRI ورژن ۱.۶ساخته شد، بدین ترتیب برنامههای تولید شده برای ۱.۶و ۲.۰اشتراکهای قابل توجهی داشتند. فقط پایتون ۲.۰ توسط BeOpen.com طراحی شده بود. بعد از تولید پایتون ۲.۰ توسط BeOpen.com ، گیدو و دیگر توسعه دهندگان کتابخانه پایتون به ایجاد دیجیتال روی آوردند. تولید پایتون ۱.۶ شامل جواز جدید CNRI بود که به طور قابل توجهی طولانی تر از جواز CWI ( که برای تولیدات قبلی استفاده شده بود) بود. موسسه مستقل از نرم افزار توضیح داد که انتخاب شرط قانون با GNU GPL ناسازگار بود., BeOpen CNRI و FSF تغییراتی را در جواز پایتون مستقل از نرم افزار ایجاد کردند که با GPL سازگار باشد. پایتون ۱.۶.۱ عمدتاً مشابه پایتون ۱.۶ است فقط با کمی اشکال، و با جواز سازگار با GPL .
فلسفه
پایتون 3.0 با همان فلسفه ورژن های قبل، در حال توسعه یافتن است، بنابراین هر منبعی در فلسفه پایتون ، در پایتون 3.0 به خوبی ظاهر خواهد شد. اگر چه ، همانطور که پایتون روش های جدید در برنامه ریزی را جمع آوری کرده، پایتون 3.0 تأکید زیادی بر از بین بردن ساختار ها و ماژول های تکراری دارد: " باید یک – و ترجیحاًً فقط یک – روش بدیهی برای انجام آن وجود داشته باشد." با این وجود پایتون 3.0 به ساختار زبان چند نمونهای ادامه خواهد داد. کد نویس ها همچنان اختیارات شیء گرایی ، برنامه نویسی ساخت یافته ، برنامه نویسی تابعی و دیگر نمونهها را دارند، اما در انتخاب های وسیع، جزئیات در پایتون 3.0 آشکارتر از پایتون سری 2.x هستند.
1-3 توسعه زبان پایتون
نسخه ۱.۰
پایتون در ژانویه ۱۹۹۴ به ورژن ۱.۰ رسید. خصوصیات عمده جدید این نسخه شامل ابزار های برنامه نویسی تابعی lambda , map , filter , reduce بود. ورژن پایتون ۱.۲ در سال ۱۹۹۵ ، زمانیکه گیدو در CVVI بود ٬ بدست آمد. گیدو به فعالیت های خود روی پایتون در موسسه ملی تحقیقات و ابتکارات (CNRI) در رستون ادامه داد و در همانجا چندین نسخه جدید انتشار یافت. در نسخه ۱.۴ به پایتون چندین ویژگی جدید اضافه شد. از ویژگیهای جالب توجه در میان این اضافات میتوان بهالهام گرفتن از آرگومان های کلیدی ماژول-3 (که خود از آرگومان های کلیدی لیسپ الهام گرفته بود) و همچنین پیشتیبانی اعداد مختلط اشاره کرد. در مدت فعالیت ون روسوم در CNRI ، او پروژه «برنامه نویسی کامپیوتر برای هر کس» (CP4E) را ایجاد کرد تا برنامه نویسی را در دسترس افراد بیشتری که اطلاعات پایهای برای برنامه نویسی (برای مثال توانایی در زبان انگلیسی و مهارتهای اولیهء ریاضی) را دارند، قرار دهد. زبان برنامهنویسی پایتون به دلیل تمرکزش بر روی پاکسازی فرم دستوراتش، نقش مرکزی را ایفا کرد. این پروژه توسط دارپا سرمایه گذاری شد واز سال ۲۰۰۷ غیر فعال شد.2
نسخه ۲.۰
پایتون ۲.۰ لیستی از ویژگی هایی را که از زبان های برنامه نویسی تابعی ستل و هاسکل اقتباس شده بود، معرفی کرد. نحو پایتون برای این ساختار ( جدا از برتری هاسکل برای کاراکتر های نقطه گذاری و کلمات الفبا ) بسیار مشابه هاسکل بود. پایتون ۲.۰ همچنین یک سیستم بازیافت حافظه با قابلیت جمع آوری منابع معرفی کرد. پایتون ۲.۱ به پایتون ۱.۶.۱ و ۲.۰ نزدیک بود. جواز آن به جواز مؤسسه نرم افزار پایتون تغییر نام یافت. همه کد ها، اسناد و مشخصات اضافه شده را از زمان تولید الفبای پایتون ۲.۱ توسط مؤسسه نرم افزار پایتون ( PFS ) دارا شد. یک سازمان غیر انتفاعی در سال ۲۰۰۱ تشکیل شد که از مؤسسه نرم افزار آپاچی مدل گرفته بود. تولیدات شامل تغییراتی در خصوصیات زبان در پوشش حوزههای تو در تو بود، مشابه دیگر زبان های حوزهای ایستا. ( این خصوصیات دوباره از بین رفتند و به پایتون 2.2 منتقل نشدند.) یک تغییر بزرگ در پایتون ۲.۲ یکسانسازی انواع دادهای پایتون و کلاسها به یک سلسله مراتب بود. این یکسان سازی اشیاء پایتون را کاملاً شیء گرا کرد.
پایتون 3000
پایتون 3.0(که پایتون3000 ویاPy3k نیز خوانده میشود) به منظور شکستن backward compatibility یا به عبارتی قطع سازگاری با گذشته پایتون .2 و بهبود خطاها و رخنهها در ورژن 2. وهمچنین حذف روشهای قدیمی طراحی شد.به عبارتی دیگر لازم نیست که پایتون3 بتواند کدی که با پایتون .2 نوشته شده را تفسیر کند.که البته این مشکل توسط نرم افزار 2to3 حل میشود.
فلسفه
پایتون 3.0 با همان فلسفه ورژن های قبل، در حال توسعه یافتن است، بنابراین هر منبعی در فلسفه پایتون ، در پایتون 3.0 به خوبی ظاهر خواهد شد. اگر چه ، همانطور که پایتون روش های جدید در برنامه ریزی را جمع آوری کرده، پایتون 3.0 تأکید زیادی بر از بین بردن ساختار ها و ماژول های تکراری دارد: " باید یک – و ترجیحاًً فقط یک – روش بدیهی برای انجام آن وجود داشته باشد." با این وجود پایتون 3.0 به ساختار زبان چند نمونهای ادامه خواهد داد. کد نویس ها همچنان اختیارات شیء گرایی ، برنامه نویسی ساخت یافته ، برنامه نویسی تابعی و دیگر نمونهها را دارند، اما در انتخاب های وسیع، جزئیات در پایتون 3.0 آشکارتر از پایتون سری 2.x هستند
نسخههای اولیه
در سال ۱۹۹۱ ون روسوم کدی با برچسب نسخهی۰.۹.۰ را منتشر کرد. البته در این مرحله از پیشرفت کلاس هایی با خاصیت ارث بری ، پردازش استثنا ، توابع و نوع داده list , dict , str وجود داشت. همچنین در این نسخه ابتدایی یک سیستم ماژول با اقتباس از ماژول-3 وجود داشت. که ون روسوم این ماژول را به عنوان «یکی از واحد های عمده برنامه نویسی پایتون» توصیف کرد. مدل استثناء پایتون نیز شباهت هایی به ماژول-3 داشت ، به علاوه شرط else . در سال ۱۹۹۴ اولین مجمع مباحثه پیرامون پایتون شکل گرفت که مرحله برجستهای در پیشرفت کاربری پایتون بود.
1-4 نقش زبان پایتون
پایتون یک زبان سکریپتی و بسیار قدرتمند و گسترده است و امروزه می توان آثاری از نفوذش را تقریبا همه جا مشاهده کرد. از پروژههای ساده و بسیار کوچک تا پروژههای عظیم چون برخی از نرم افزارهای NASA. میدانیم هر زبانی برای یک استفاده بخصوص طراحی شده است. زبانی مثل Pascal برای آموزش برنامه نویسی، زبانهایی چون C و اسمبلی برای برنامههای سیستمی و سیتم عامل و زبانی چون php برای طراحی سایت. و استفاده از هر یک به جای دیگری امکان پذیر ولی نا صحیح می باشد. علاوه بر اینکه Python زبانی عملی برای برنامه های کاربردی میباشد میتوان از آن در زمینه های دیگری مثلا برنامه نویسی سیستمی – رابط کاربری (gui) – کامپوننت – برنامه نویسی اینترنت – برنامه های عددی و محاسباتی – برنامه های پایگاه داده – پردازش تصویر – هوش مصنوعی – اشیا توضیع شده – شبیه سازی – روباتیک – برنامه نویسی موبایل – امنیت و شبکه و ... استفاده کرد.2 بیتتورنت (BitTorrent) : نرم افزاری برای جستجوی فایلهای به اشتراک گذاشته شده(p۲p) و ... بلندر (Blender) : یک نرم افزار ۳ بعدی و اپن سورس بسیار معروف چندلر (Chandler) : مدیر اطلاعات شخصی شامل تقویم ، میل ، کارهای روزلنه ، یادداشتها و ... Civilization IV : یک گیم کامپیوتری بر مبنای پایتون که از boost.python استفاده میکند میلمن (Mailman) : یکی از معروفترین نرم افزارهای مرتبط با ایمیل کمبیلوKombilo : مدیر پایگاه داده و مرورگرگیمهای go موینموین (MoinMoin) : یکی از قدرتمندترین و معروفتریم ویکیهای موجود پلون (Plone) : یک ابزار مدیریتی محتوایی اپن سورس ، قدرتمند و کاربر پسند پورتاژ (Portage) : قلب توزیع جنتو . یک مدیر بستهای سیستم لینوکس زوپ (zope) : یک پلاتفورم شی گرای مبتنی بر وب . زوپ شامل یک سرور نرم افزار به همراه پایگاه داده شی گرا و یک رابط مدیریتی درونی مبتنی بر وب میباشد اس پی ای (SPE) : یک IDE رایگان ، اپن سورس برای سیستم عاملهای ویندوز ، لینوکس ، مک که از wxGlade(طراحی رابط کاربر),PyChecker (دکتر کد) Blender(۳D) پشتیبانی میکند .3
1-5 ویژگیهای زبان پایتون
خوانایی
پایتون در نظر دارد که زبانی بسیار قابل خواندن باشد. بنابراین به سمت یک طرح بندی ویژوال بدون پارازیت میرود، و اغلب از کلمات کلیدی انگلیسی استفاده میکند، در صورتیکه دیگر زبانها از نقطه گذاری استفاده میکنند. پایتون نسبت به زبان های ساخت یافته سنتی، مثل C و پاسکال، نیاز به تکیه کلام های کمتر و همچنین استثناء های نحوی و موارد خاص کمتری دارد.
پایتون یک زبان برنامه نویسی چند الگویی است. به این معنی که بیشتر برنامه نویس های قدرتمند وقتی یک مدل برنامه نویسی را انتخاب میکنند، مجاز به چندین مدل هستند: شیء گرایی و برنامه نویسی ساخت یافته کاملاً تحت پوشش هستند، و تعدادی از خصوصیات زبان های برنامه نویسی هستند که برنامه نویسی تابعی و ظاهر سازی را پشتیبانی میکنند. پایتون از تایپ پویا و یک ترکیبی از شمارش مرجع و یک حلقه کشف و بازیافت قسمت های هدر رفته حافظه برای مدیریت حافظه، استفاده میکند. یک ویژگی مهم پایتون تحلیل نام پویا است، که روش ها و نام متغیر ها را در طول اجرای برنامه به هم ملحق میکند.
آسان کردن توسعه پذیری
هدف دیگر طراحی زبان آسان کردن توسعه پذیری است. ماژول هایی که تازه ساخته شده اند ، به سادگی در C و C++ نوشته میشوند. پایتون همچنین میتواند به عنوان زبان توسعه برای ماژول ها و کاربرد های موجود که به برنامه واسط قابل برنامه ریزی نیاز دارد ، استفاده شود. این طرح که یک زبان هسته کوچک با یک کتابخانه استاندارد بزرگ و یک مفسر آسان توسعه پذیر همراه باشد، توسط Van Rossum بیان شد.
طرح پایتون به پشتیبانی محدود برای برنامه نویسی تابعی به شیوه لیسپ ، ارائه شد. اگر چه پ، تشابههای عمدهای بین پایتون و زبان خانواده لیسپ وجود دارد. این کتابخانه دو ماژول دارد ( تکرار و تابعی ) که ابزار های تابعی را با اقتباس از هاسکل و ام ال استاندارد پیاده سازی میکند.
ساختار زیبا، آشکار و ساده
وقتی انتخاب هایی در روش شناسی کد ها ارائه شد، پایتون نحو های فراوان را کنار گذاشت. همچنان که با پرل، توسعه دهندگان پایتون فوراً یک فرهنگ یا ایدئولوژی را بر مبنای آنچه از یک زبان می خواهند، ترقی دادند، ساختار زبانها زیبا، آشکار و ساده شد. Alex Martelli این مطلب را در کتاب خود قرار داد: “برای توضیح برخی مسائل ، در فرهنگ پایتون تعریفی مطرح نشده است." پایتون روش پرل را (بیش از یک روش در انجام آن وجود دارد) در طراحی زبان در حمایت از " باید یک راه – و ترجیحاً فقط یک راه – آشکار برای انجام آن وجود دارد." رد کرد.
پایتون از بهینه سازی بی موقع اجتناب کرد، و بعلاوه به هم جور کردن قسمتهای غیر ضروری سی پایتون را که افزایش سرعت نهایی در هزینه را ارائه میکرد، رد کرد. آن گاهی اوقات با نام ' slow ' شناخته میشود. اگر چه ، بیشتر مسائل چندان بحرانی نیستند، و همین طور سرعت سخت افزار کامپیوتر با سرعت نمائی رو به رشد است. وقتی سرعت یک مسأله باشد، برنامه نویسان پایتون بیشتر تلاش میکنند تا عملیات محدود را با بهبود الگوریتم یا تغییر ساختار داده، بهینه کنند.4
1-6 مدل زبان پایتون
پایتون شی گراست :
پایتون ذاتا یک زبان شیگراست و از ویژگیهای پیشرفته شیگرایی چون وراثت، چند شکلی، سربار گزاری عملگر و ... پشتیبانی می کند. یک ویژگی منحصر به فرد پایتون امکان استفاده از کدها و کلاسهای نوشته شده در زبانهای دیگری چون ++ C و Java است .1
فصل دو
2-1 پیاده سازی
مسیر اصلی پیاده سازی پایتون ، که با عنوان سی پایتون نیز شناخته میشود ، در نشست C در استاندارد C89 نوشته شد. سی پایتون برنامههای پایتون را به کد بایت تبدیل میکند، که سپس توسط ماشین مجازی اجرا میشود. سی پایتون با یک کتابخانه استاندارد بزرگ که به صورت مخلوطی از C و پایتون نوشته شده، توزیع شده است. سی پایتون در ورژنهای مختلف برای پایگاههای زیادی کار میکند، شامل مایکروسافت ویندوز و بیشتر سیستمهای پیشرفته یونیکس. استفاده و توسعه آن روی پایگاههای محرمانه مانند Amoeba، در کنار پایگاههای متداول مانند یونیکس یا مکینتاش، به طور عمده در این نظر کمک شده است.
پایتون بدون پشته، انشعابی از سی پایتون است که ریز برنامهها را اجرا میکند؛ و از پشته حافظه استفاده نمیکند. سی پایتون از GIL استفاده میکند تا وقتی برنامه پایتون بدون پشته ، وابسته به OS است و میتواند به صورت همزمان اجرا شود، در هر لحظه فقط به یک زیر برنامه اجازه اجرا داده شود. پایتون برای استفاده در میکرو کنترلر ها یا وظایف محدود دیگر پایگاههای مرجع، متناسب تر است. پیش بینی میشود که پایتون بدون پشته بتواند تقریباً روی همان پایگاهی که سی پایتون اجرا میشود، اجرا شود.
جی تون برنامههای پایتون را به کد بایت جاوا کامپایل میکند، که بدین ترتیب میتواند با هر ماشین مجازی جاوا اجرا شود. و همچنین این امکان فراهم میشود که توابع کتابخانهای کلاس جاوا از برنامه پایتون به کار گرفته شود. آی رون پایتون از همین شیوه برای اجرای برنامههای پایتون روی زبان.NET استفاده میکند.
پای پای یک پیاده سازی تجربی از پایتون است که میتواند چندین تایپ از کد بایت را تولید نماید.
چندین برنامه در بسته مفسر پایتون با برنامههای کاربردی ( یا آغازگر ) وجود دارد که مستقلاً اجرا میشوند مانند یونیکس ، لینوکس ، ویندوز ، AmigaOS 4 یا Mac OS X . بسیاری از کتابخانههای سه قسمتی (و حتی بعضی از یک قسمتی ها) فقط روی ویندوز، لینوکس ، BSD و Mac OS X موجود هستند.
در نوکیا 2005 یک مفسر پایتون برای موبایل های سری 60 با نام PyS60 تولید شد که شامل بسیاری از ماژول ها از سی پایتون بود، و همچنین برخی ماژولهای اضافه شده برای یکپارچه شدن با سیستم عامل. این پروژه به منظور اجرا روی همه پایگاههای مختلف S60 ، به روز نگاه داشته میشود.
همچنین مفسری به نام پایتون سی ای برای ابزار ویندوز CE ( شامل بسته PC ) وجود دارد. که در آن ابزار هایی برای اجرای آسان و توسعه GUI اضافه شده است.5
پایتون چینی زبان برنامه نویسی پایتونی است که از لغت نامه زبان چینی استفاده میکند. در کنار کلمات رزرو شده و نام متغیر ها ، بیشتر عمل گر های تایپ داده، در چینی میتوانند به خوبی کد دهی شوند.
تفسیر معنایی
بیشتر پیاده سازیهای پایتون ( شامل سی پایتون، اولین پیاده سازی ) میتوانند به عنوان یک مفسر خط فرمان عمل کنند، برای زمانی که کاربر رشته شرط را وارد میکند و فوراً نتیجه را میپذیرد. خلاصه پایتون به عنوان یک برنامه واسط عمل میکند. وقتی صرف دیگر شیوههای اجرا ( کامپایل کد بایت یا کامپایل کد محلی ) به صورت یک رشته صرف ذخیره میشود، یک افزایش سرعت در هزینههای متقابل به وجود میآید، بنابراین آنها معمولاً فقط خارج از مفسر خط فرمان استفاده میشوند. ( وقتی یک ماژول وارد میشود. )
برنامههای واسط دیگر، امکانات تحت آن را در مفسر بیسیک افزایش میدهند، شامل IDLE و I Python. وقتی عموماً از برنامه واسط پایتون پیروی میشود، خصوصیاتی مشابه تکمیل خودکار، نگه داشتن زمان اجرای برنامه، و نشان دادن صرف پیاده سازی میشود.
برخی از پیاده سازیها نه تنها به صورت کد بایت میتوانند کامپایل شوند، بلکه میتوانند کد پایتون را به کد ماشین تبدیل کنند. تا کنون، این عمل فقط برای زیر مجموعههای انحصاری پایتون انجام شده است. پای پای این روش را پذیرفته و ورژن های قابل کامپایل انحصاری پایتون را RPython نامید.
Psyco یک کامپایلر اختصاصی در زمان است که کد بایت را به کد ماشین، در زمان اجرا تبدیل میکند. کد تولید شده، اختصاصی برای تایپهای داده خاصی است و از کدهای استاندارد پایتون سریعتر است. Psyco با همه کد های پایتون سازگار است، نه فقط یک زیر مجموعه.2
2-2 انقیاد
یکی از مهمترین و اساسیترین جنبه و مزیت زبانهای برنامهنویسی داشتن توانایی کار با متغیرها میباشد. در اکثر زبانها برای استفاده از متغیرها باید ابتدا آنها را تعریف یا ایجاد کنیم. و نیز معمولا هنگام تعریف هر متغییر نوع آن را که تا آخرعمر متغییر ثابت خواهد ماند را مشخص کنیم. در زبان پایتون برای تعریف یک متغیر کافی است آن را مقداردهی کنیم. یعنی نیازی به تعریف جداگانه نمی باشد. نکته بعدی اینکه در زبان پایتون ابزاری مدیریتی داینامیک و بسیار قوی برای متغیر پیادهسازی شده است که امکانات بسیاری را فراهم میکند. برای مثال نوع متغیر در پایتون میتواند در طول عمر آن متغیر یا در طول اجرای برنامه به تعداد دلخواه تغییر یابد.
>>> message = "Be Linux !"
>>> n = 17
>>> pi = 3.14159
در مثال بالا ۳ متغیر را با عمل مقداری دهی تعریف کردهایم. اکنون برای مشاهده مقدار هر متغیر می توان از دستور print استفاده کرد. این دستور مقدار هر متغیر را در خروجی چاپ می کند .
>>> print message
Be Linux !
>>> print pi
3.14159
در پایتون نوع داده در زمان اجرا مشخص می شود و نیازی به اعلان آن قبل از اجرا نیست.در پایتون تمامی داده ها شی (object)می باشند .برای مثال عدد 3 در پایتون یک شیء را در حافظه مشخص می کند و متغیرها نیز نامهایی هستند که به اشیا داخل حافظه اشاره میکنند. شاید این سوال پیش بیاید که چگونه مفسر پایتون می تواند نوع داده ها را بدون اعلان اولیه تشخیص دهد!. پاسخ:
name1='saeed afshari'
name2='saeed afshari'
وقتی در پایتون انتسابهایی به صورت بالا صورت می گیرند مراحل زیر به تر تیب انجام می شوند
1.شیءsaeed afshari که مقداری از نوع رشته است به وجود می آید.
2.متغیرهای name1 ,name2 درست می شود.(اگر قبلا درست نشده باشد)
3.متغیر name1,name2 به شیء مورد نظر اشاره می کند.
شیء موردنظر باید نوع خود را بداند، برای همین منظور هر object در پایتون دارای دو فیلد هدر(header field)به نامهای طراح نوع(type designator)وشمارنده ی مراجعات(reference counter)می باشد، که طراح نوع، نوع داده را در خود ذخیره می کند و شمارندهی مراجعات تعداد رجوعهای متغیرهای متفاوت به شیء را مشخص میکند.
برای مثال بالا type designator=str و reference counter=2
با داشتن این فیلد ها در زمان اجرا مفسر می تواند نوع داده را تشخیص دهد.
مدیریت حافظه ی خودکار
reference counter کار زباله روبی (garbage collection) را بسیار آسان می سازد.به این صورت که وقتی reference counter مساوی صفر میشود زباله روب متوجه میشود که هیچ ارجاعی به شیء مورد نظر وجود ندارد، بنابراین شی ء را از حافظه پاک میکند.3
فصل سه
3-1 اشیای داده، متغیرها و ثوابت
یکی از مهمترین و اساسیترین جنبه و مزیت زبانهای برنامهنویسی داشتن توانایی کار با متغیرها میباشد. در اکثر زبانها برای استفاده از متغیرها باید ابتدا آنها را تعریف یا ایجاد کنیم. و نیز معمولا هنگام تعریف هر متغییر نوع آن را که تا آخرعمر متغییر ثابت خواهد ماند را مشخص کنیم. در زبان پایتون برای تعریف یک متغیر کافی است آن را مقداردهی کنیم. یعنی نیازی به تعریف جداگانه نمی باشد.
معمولا برنامه نویسان برای نام گذاری متغیرها از اسامی استفاده میکنند که نشاندهنده کاربرد و حتی نوع متغییر میباشد. اسامی متغییرها میتواند با طول دلخواه باشد. در نامگذاری متغییرها استفاده از حرف و عدد مجاز است. بیاد داشته باشید که در برخی از زبانها از جمله پایتون حروف برزگ با کوچک یکسان نیستند. بنابراین متغییری با نام Joker با متغییر joker یکسان نیست و این دو ممکن است مقادیر و حتی نوعهای مختلفی داشته باشند. در نام گذاری متغییر ها می توان از کاراکتر زیر خط (_) نیز استفاده کرد و معمولا در اسامی که از بیش از یک کلمه تشکیل شده باشند به کار می رود.
همچون تمام زبانهای برنامه نویسی پایتون هم قوانینی برای نام گذاری متغییر ها دارد که باید هنگام نام گذاری به آنها دقت کنید. برخی از این قوانین شامل موارد زیر است : اسم متغییر باید با یک حرف شروع شود. در نام گذاری مجاز به استفاده از کاراکتر های خاص چون $%^#/ و ... نیستید. در نام گذاری متغییرها نباید از اسامی رزرو شده زبان برنامه نویسی استفاده کرد. برای مثال استفاده از اسامی چون class , for , if و ... مجاز نمیباشد.
استفاده از اسامی رزور شده در پایتون مجاز نمیباشد. در صورت استفاده از این اسامی یا هر یک از موارد بالا برنامه از روند عادی خود خارج شده و متوقف میگردد و در اصطلاح یک خطای نحوی(مربوط به نحوه نوشتن و یا املای دستورات برنامه ) (syntax error) رخ میدهد. ممکن است اسمی که برای یک متغیر انتخاب میشود تکراری نیز باشد! در این حالت خطایی دریافت خواهد شد اما برنامه نتایجی اشتباه محاسبه خواهد کرد یا روند اجرای آن به مشکل بر خواهد خورد .
زبان پایتون دارای ۲۸ اسم رزرو شده می باشد . این اسامی یا keyword ها تشکیل دهنده ساختار کلی هر زبان برنامه نویسی میباشند.
اسامی رزرو شده در پایتون
raise
not
import
for
else
continue
and
return
or
in
from
except
def
assert
try
pass
is
global
exec
del
break
while
print
lambda
if
finally
elif
class
عبارات
یک عبارت در حقیقت یک دستور برنامه نویسی می باشد که مفسر پایتون قدرت اجرای آن را دارد. معمولا در زبان پایتون هر عبارت در یک سطر مجزا نوشته می شود و مفسر پس از اجرای هر سطر یا عبارت سراغ سطر بعدی میرود.
برنامه یا یک اسکریپت شامل تعدادی از عبارتها یا دستورات اجرایی پشت سرهم میباشند.
عبارات محاسباتی
هر عبارت ترکیبی از مقادیر، متغییرها و عملگرها میباشد. اگر یک عبارت محاسباتی را به عنوان یک دستور وارد کنید مفسر مقدار آن را محاسبه و چاپ خواهد کرد.
>>> 1 + 1
2
عملگر و عملوند
عملگر در حقیقت یک سمبل یا نماد قراردادی برای نمایش اتفاق افتادن عملی خاص چون جمع یا تفریق می باشد . بدین ترتیب هر عملگر بر روی تعدادی عملوند عمل کرده و نتیجه ای را حاصل می دهد . 3
3-2 انواع داده
مقدار یا داده یکی از تعاریف پایهای و بنیادی بوده و همانند عدد یا حرف تعاریف متعدد و وسیعی را دارا میباشد. متغییرها را به صورت ظرف فرض کنید تا در خطایابی مشکلی نداشته باشید هر برنامه کامپیوتری در روند اجرای خود با مجموعه ای از داده ها و اطلاعات سروکار دارد و آنها را مورد پردازش قرار داده و نتایجی را تولید می کند. یک مقدار در علم برنامه نویسی میتواند برای مثال عددی چون "۱" یا مقداری رشته ای مانند "سلام دنیا !" باشد.
دو نوع داده ذکر شده دارای انواع مختلفی میباشند. یکی از آنها از نوع عدد صحیح یا integer و دیگری رشته یا در اصطلاح برنامه نویسی string میباشد . اگر قادر به تشخیص نوع یک داده نیستید مفسر پایتون می تواند این کار را انجام دهد .
>>> type("Hello, World!")
>>> type(17)
پایتون دارای نوع های پیش فرض integers,long numbers,floating-point(float), imaginary numbers می باشد. برای اطلاع از نوع یک متغییر در هر لحظه می توان از دستور type استفاده کرد:
>>>
x=2000
>>>
type(x)
‘int’>
>>>
type(999999999999)
‘long’>
>>>
type(1.0)
3-3 کنترل نوع و تبدیل نوع
در پایتون نوع داده در زمان اجرا مشخص می شود و نیازی به اعلان آن قبل از اجرا نیست.در پایتون تمامی داده ها شی (object)می باشند .برای مثال عدد 3 در پایتون یک شیء را در حافظه مشخص می کند و متغیرها نیز نامهایی هستند که به اشیا داخل حافظه اشاره میکنند. شاید این سوال پیش بیاید که چگونه مفسر پایتون می تواند نوع داده ها را بدون اعلان اولیه تشخیص دهد!. پاسخ:
name1='saeed afshari'
name2='saeed afshari'
وقتی در پایتون انتسابهایی به صورت بالا صورت می گیرند مراحل زیر به تر تیب انجام می شوند
1.شیءsaeed afshari که مقداری از نوع رشته است به وجود می آید.
2.متغیرهای name1 ,name2 درست می شود.(اگر قبلا درست نشده باشد)
3.متغیر name1,name2 به شیء مورد نظر اشاره می کند.
شیء موردنظر باید نوع خود را بداند، برای همین منظور هر object در پایتون دارای دو فیلد هدر(header field)به نامهای طراح نوع(type designator)وشمارنده ی مراجعات(reference counter)می باشد، که طراح نوع، نوع داده را در خود ذخیره می کند و شمارندهی مراجعات تعداد رجوعهای متغیرهای متفاوت به شیء را مشخص میکند.
برای مثال بالا type designator=str و reference counter=2
با داشتن این فیلد ها در زمان اجرا مفسر می تواند نوع داده را تشخیص دهد.5
converts integer operand to floating point:
>>> 3 * 3.75 / 1.5
7.5
>>> 7.0 / 2
3.5
3-4 انتساب و مقدار دهي اولیه
نوع متغيير ها به صورت ديناميكي تعيين مي شود و در طول اجراي برنامه ممكن است تغيير يابد
متغيير ها تنها اسمي براي يك شي مي باشند و همانند زبان C به يك نقطه از حافظه اشاره نمي كنند.
>>>a=4
>>>b=a*4.5
>>>c=(a+b)/2.5
>>>a="HelloWorld"
>>> x = y = z = 0 # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
همانطور كه مشاهده مي كنيد تعريف يك متغيير به وسيله مقدار دهي آن انجام مي شود و اين نظريه درست نيست كه در پايتون نيازي به تعريف متغيير نمي باشد براي مثال استفاده از كدي مثل :
>>>printxTracebac(mostrecentcalllast):
File"",line1,in?
NameError:name'x'isnotdefined
باعث نمايش يك پيغام خطا خواهد شد چون متغيير x قبلا تعريف (مقداردهي) نشده است .
نكته ديگر اينكه ما در پايتون نيازي به تعيين نوع يك متغيير نداريم براي نمونه در مثال بالا متغيير a ابتدا مقدار صحيح (int) مي باشد و سپس از آن براي نشان دادن يك رشته استفاده شده است.5
3-5 اعداد موهومی
Complex numbers with a nonzero real component are written as (real+imagj), or can be created with the complex (real,imag) function.
>>> 1j * 1J
(-1+0j)
>>> 1j * complex(0,1)
(-1+0j)
>>> 3+1j*3
(3+3j)
>>> (3+1j)*3
(9+3j)
>>> (1+2j)/(1+1j)
(1.5+0.5j)
Complex numbers are always represented as two floating point numbers, the real and imaginary part. To extract
these parts from a complex number z, use z.real and z.imag.
>>> a=1.5+0.5j
>>> a.real
1.5
>>> a.imag
0.5
3-6 عملگرهای منطقی7
متغیرهای منطقی logicalVariable می توانند حامل یکی از دو مقدار درست یا غلط باشند.تصمیم گیری نیز بر همین اساس صورت می گیرد یعنی اگر این متغیر حامل مقدار درست باشد شرط قطعه کد مربوطه را به اجرا در می آورد. از دید دیگر این متغیر ساده ترین نوع یک عبارت منطقی است. عبارتهای منطقی را بطور مختصر می توان به دو دسته ساده و پیچیده تقسیم کرد. همه عبارت های منطقی به یکی از مقادیر درست یا غلط ختم می شوند. این عبارات با مقادیر و عملگر های منطقی ساخته می شوند که همگی دودویی هستند یعنی برای انجام عمل به دو عملوند احتیاج دارند.مقدماتی ترین این عملگرها از این قرارند:
عملگر های منطقی
عملگر
توضیح
==
برابری دو عملوند
=!
عدم برابر دو عملوند
بزرگتر
>
کوچکتر
=
بزرگتر یا مساوی
=>
کوچکتر یا مساوی
and
و منطقی
or
یا منطقی
not
متمم (not)
ساخت عبارات منطقی
در اصل مقادیر منطقی اولیه با عملگرهای منطقی که در متن فوق بصورت کمرنگ نوشته شده اند بوجود آمده و با دو عملگر پررنگتر یعنی and و or ترکیب خواهند شد.
مقایسه برابری (==)
عمل مقایسه دو شی (متغیر ، عدد ، رشته یا ... ) توسط دو علامت مساوی بهم چسبیده صورت میگیرد. حاصل نتیجه تست برابر بودن دو مقدار مقدار های درست (True) یا نادرست (False) خواهد بود .
>>> 1 == 1
True
>>> 1 == 2
False
زمانی که شما از عملگر مقایسه برابری دو عبارت (==) استفاده می کنید مفسر پایتون مقدار دو طرف عملگر (عملوند) را با یکدیگر مقایسه می کند . اگر دو مقدار برابر نباشند مقدار نادرست یا False و در صورت برابری مقدار درست یا True برگشت داده می شود . در صورتی که شما از انواع مختلف اعداد استفاده کنید عمل تبدیل خودکار نوع نیز انجام می پذیرد .
>>> 1.23 == 1
False
>>> 1.0 == 1
True
از عملگر مقایسه می توان برای مقایسه اکثر انواع داده پایتون استفاده کرد . در درس های آینده با نحوه سربارگزاری عملگر ها و در نتیجه ایجاد روش های مقایسه منحصربفرد برای هر شی یا کلاس آشنا خواهید شد . برای مقایسه لیست مفسر پایتون تک تک عناصر لیست را از نظر مقدار و محل با یکدیگر بررسی می کند . اگر دو لیست اعضایی یکسان ولی با ترتیب غیر یکسان داشته باشند با یکدیگر برابر نمی باشند .
>>> city = ["Tabriz", "Tehran", "Shiraz", "Yazd"]
>>> city2 = ["Yazd", "Shiraz", "Tabriz", "Tehran"]
>>> city == city2
False
>>> city2 = ["Tabriz", "Tehran", "Shiraz", "Yazd"]
>>> city == city2
True
مقایسه داده هایی از نوع دیکشنری نیز امکان پذیر می باشد . در اینصورت محل داده ها در نتیجه مقایسه تاثیری نخواهد داشت و فقط به ازای هر کلید و مقدار باید دقیقا همان داده ها در دیکشنری دیگر موجود باشد .
مقایسه نابرابری (=!)
عمل مقایسه نابرابری در حقیقت متمم یا منفی شده (not) مقایسه برابری می باشد. به این ترتیب که اگر طرفین عملگر نابرابری، برابر باشند مقدار نادرست و در غیر اینصورت مقدار درست برگشت داده می شود.
>>> 3 == 3
True
>>> 3 != 3
False
>>> 5 != 4
True
فاصله گذاري بين نماد =! و يا برعكس نوشتن آن (يعني آن را به صورت != بنويسيم) يك خطاي منطقي محسوب خواهد شد كه در زمان اجرا تاثير گذار خواهد بود.
مقایسه بزرگتری و کوچکتری ()
پایتون برای مقایسه دو عبارت ار لحاظ مقدار از علامت های برگرفته شده از ریاضیات استفاده می کند.
>>> 5
False
>>> 10 > 2
True
با استفاده از عملگرهای مقایسهای امکان مقایسه دو رشته نیز وجود دارد. مقایسه و ارزش کاراکترها بر حسب توالی و ترتیب کاراکترها میباشد. کم ارزش ترین کاراکتر حرف بزرگ "A" می باشد. و بقیه کاراکتر های حروف بزرگ از حرف "A" بزرگتر هستند و "Z" از بقیه حروف بزرگ زبان انگلیسی ارزش بیشتری دارد. حروف کوچک انگلیسی ارزش بیشتری نسبت به حروف بزرگ دارند. یعنی کاراکتر "a" از همه کاراکتر های بزرگ با ارزش تر می باشد. دلیل این امر کد های اسکی و بیشتر بودن کد اسکی حروف کوچک می باشد . پس "z" پر ارزش ترین و "A" کم ارزش ترین کاراکتر موجود می باشد .
>>> “a” > “b”
False
>>> “A” > “b”
False
>>> “A” > “a”
False
>>> “b” > “A”
True
>>> “Z” > “a”
False
هنگامی بررسی دو رشته پایتون تک تک کاراکتر های معادل را بررسی می کند تا به اولین اختلاف برسد و سپس رشته ای را که کاراکتر باارزش تری داشته باشد به عنوان رشته بزرگتر بر می گرداند .
عملگر متمم (not)
زمانی که شما حاصل منطقی یک عبارت را محاسبه میکنید قصد دارید برای مثال از درست بودن آن مطلع شوید. امکان دارد بسته به شرایط برنامه هدف شما تشخیص عدم درست بودن یا متمم آن یعنی not True باشد. عملگر یکتایی not فقط بر روی یک عملوند اجرا شده و نتیجه مخالف ارزش منطقی آن را برگشت می دهد.
>>> not True
False
>>> not 5
False
>>> not 0
True
>>> not 5 > 2
False
عملگر and
ممکن است در برنامه ای قصد برنامه نویس اطلاع از ترکیب چندین عبارت منطقی باشد تا بدین ترتیب برنامه بتواند مقایسه هایی بسیار پیچیده را انجام داده و در نتیجه تصمیمات درست تری اتخاذ کند. برای این منظور دو عملگر بسیار پرکاربرد موجود میباشد. اولین عملگر موجود، عملگر and (و منطقی) میباشد. این عملگر تنها در حالتی به مقدار درست منجر میشود که هر دو عملوند آن حامل مقادیر درست باشند. عملکرد این عملگر در عبارت p and q در جدول زیر مشاهده می شود:
چگونگی عملکرد and
and
q
p
F
F
F
F
F
T
F
T
F
T
T
T
عملگر or
این عملگر تقریباً عکس and نتیجه می دهد یعنی در همه حالات بجز حالتی که هر دو عملوند آن مقدار غلط داشته باشند منتج به مقدار درست خواهد شد. مقدار نهایی عبارت p or q را در زیر می بینید:
چگونگی عملکرد or
or
q
p
F
F
F
T
F
T
T
T
F
T
T
T
3-7 رشتههایکاراکتری
فرق رشته در پایتون با اکثر زبان های برنامه نویسی این ایت که یک کاراکتر به عنوان یک رشته با طول یک می باشد. توضیح دیگر علامت نقل قول دوگانه و منفرد تقریبا کار یکسانی انجام می دهند البته فرقهایی دارند. از ۳ علامت نقل گول هم برای وارد کردن رشته هایی دارای علامت های خاص استفاده می شود.
>>> ’spam eggs’
’spam eggs’
>>> ’doesn\’t’
"doesn’t"
>>> "doesn’t"
"doesn’t"
>>> ’"Yes," he said.’
’"Yes," he said.’
>>> "\"Yes,\" he said."
’"Yes," he said.’
>>> ’"Isn\’t," she said.’
’"Isn\’t," she said.’
عملگر های رشته 7
در حالت عادی و منطقی قادر به اعمال عملگر های محاسباتی بر روی رشتهها نیستیم. برای مثال دستورات زیر همگی اشتباه بوده و باعث بروز خطای منطقی می گردند .
>>> "Hello" / 123
>>> "15" + 2
>>> ""Hello" * "World !"
نمونه خروجی :
>>> "15" + 2
Traceback (most recent call last):
File "", line 1, in ?
TypeError: cannot concatenate 'str' and 'int' objects
در پایتون 3.0
>>> "15" + 2
Traceback (most recent call last):
File "
", line 1, in
"15" + 2
TypeError: Can't convert 'int' object to str implicitly
اما برخی از عملگر های دارای معانی خاصی در مورد رشته میباشند.
اتصال دو رشته با استفاده از عملگر جمع
عملگر ترکیب دو رشته که با سمبل مربوط به عمل جمع ریاضی یا "+" نشان داده میشود دو عملوند از نوع رشته را دریافت و رشته سمت راست خود را به انتهای رشته سمت چپی خود می چسباند .
>>> word = ’Help’ + ’A’
>>> word
’HelpA’
تکرار یک رشته با استفاده از عملگر ضرب
عملگر ضرب با سنبل "*" نیز معنی خاصی برای رشته دارد. این عملگر دو عملوند یکی از نوع رشته و دیگری از نوع عدد صحیح را دریافت و رشته را به تعداد عدد دریافت شده تکرار کرده و در قالب یک رشته واحد بر می گرداند.
>>> "Python ! " * 3
'Python ! Python ! Python ! '
عملگر ضرب در مورد رشته ها منطقی شبیه به نوع ریاضی آن دارد. ضرب دو عدد در ریاضیات را می توان بصورت جمع نشان داد. برای مثال ۴×۳ را میتوان بصورت ۴+۴+۴ نمایش داد. در مورد رشته ها نیز در حقیقت برای محاسبه ضرب یک عدد در رشته، همان رشته با تعداد عدد وارد شده باهم جمع می شود.
>>> ’’
’’
فصل چهار
4-1 انواع ساختمان داده در پایتون یکی از مهمترین و پرکاربرد ترین این ساختمان های داده رشته های کاراکتری می باشند که در واقع یک زنجیره (Sequence) از بایت ها می باشند که در کار با ورودی ها، خروجی ها و ارتباطات گوناگون نقش مهمی ایفا می کنند، زیرا یکی از راههای محدود فهم انسان از دنیای کامپیوتر ارتباط متنی با این جهان می باشد. دیگر ساختمان داده ای مهم در این زبان لیست ها (آرایه ها) هستند. در واقع این نوع داده یک نوع بسیار پیشرفته از آرایه های زبانهای سطح پایین است که علاوه بر خاصیت اندیس پذیری ، خاصیت تغییر اندازه و نگهداری انواع داده را بطور هم زمان دارا می باشد. چند تایی های مرتب (Tuple)در پایتون نوعی از داده با شباهت هایی به لیست می باشد که در بخش مربوطه به تفاوت ها و شباهت های این دو نوع خواهیم پرداخت. یک نوع دیگر داده در پایتون چرخنده(Iterator)است که به عنوان یک فریم یا واحد چرخنده در طول لیست ها ، چند تایی ها و رشته ها محسوب می شود.
ساختمان داده های دیگر
این ساختمانهای داده سنگ بنای چندین ساختمان داده دیگر هستند که هر کدام کاربرد و پیچیدگیهای خاص خود را دارند از آنجمله می توان موارد زیر را نام برد: 5 لیست های پیوندی یکطرفه دوطرفه حلقوی صف ها صف های دو طرفه صفهای با اولویت درختها دودویی دودویی جستجو heap Deap MinMax Heap
4-2 Tuple
Tuple یا توالی غیر قابل تغییری از داده همانند آرایه می باشد با این تفاوت که پس از تعریف و مقدار دهی اولیه قابل هیچ گونه تغییری نمی باشد . علامت مشخصه آن در هنگام تعریف پرانتز می باشد .
>>>filler=(“string”,“filled”,“bya”,“tuple”)
>>>print“A%s%s%s%s”%iller
Astringfilledbyatuple
>>>print“Thesecondelementofthetupleis‘%s’”%filter[1]
Thesecondelementofthetupleis‘filled’
اندیس همانند C از صفر شروع می شود. برای پیدا کردن طول (تعداد اعضا) یک تاپل از دستور len استفاده میشود هرگونه تلاش برای تغییر یا دسترسی به اندیس بیشتر از طول تاپل باعث نمایش خطا میشود:
>>>print“%d”%len(filter)
3
>>>printa[len(filter)-1]
tuple
تاپل ها با کاما (,) از هم جدا میشوند. شکل ظاهری تاپلها همانند این است که چند داده را به یک متغیر انتساب بدهید اما باید بدانید که نوع دادهی نگهداری شده از نوع تاپل است. مثالی برای درک بهتر :
در این مثال دو متغیر از نظر نوع داده ها و مقدار داده ها با هم تفاوتی ندارند. ( اما از نظر مکان ذخیره سازی داده ها با هم متفاوت هستند )
a = 1, 2, 3, 4
b = (1, 2, 3, 4)
نکته1: به این نکته توجه داشته باشید که داده های چند قسمتی می توانند داده های چند قسمتی دیگر را در خود نگه دارند.
نکته2: برای تاپل های تک عضوی باید به صورت زیر عمل کنید.
این یک متغیر ساده است # a = 33
این یک داده از نوع تاپل است # b = 33,
اپراتورها در تاپل
اپراتورهایی که برای تاپل ها تعریف شده اند + ( بین دو تاپل ) و * ( بین یک عدد و تاپل )هستند .
>>>1, 2, 3 + 4, 5, 6
(1, 2, 7, 5, 6)
>>>(1, 2, 3) + (4, 5, 6)
(1, 2, 3, 4, 5, 6)
دسترسی به داده های درون تاپل همانند لیست هاست.
یک مثال ساده...
>>> T = (1, 2, 3)
>>> T[0]
1
4-3 List
Listیا توالی قابل تغییری از داده همانند تاپل میباشد با این تفاوت که قابلت تغییر و گسترش را دارا میباشد. علامت مشخصه آن براکت می باشد .
>>>breakfast=[“coffee”,“tea”,“toast”,“egg”]
>>>count=1
>>>print“Todaysbreakfastis%s”%breakfast[count]
Todaysbreakfastistea
لیست امکان تغییر را دارا می باشد.
>>>breakfast[2]="milk"
>>>breakfast
['coffee','tea','milk','egg']
ممکن است یک لیست درون لیست دیگری قرار داشته باشد. برای دستیابی به داده ی لیست درونی تر باید از روش پیچیده تری استفاده نمایید:
>>>L=[ 'mahdy' , 20 , [ 'ali' , 99 ] , 1.2]
>>>L[2][0]
'ali'
در مثال بالا میبینیم که اندیس اول([2]L) به دادهای اشاره دارد که خود یک لیست می باشد([ ali' , 99' ]) و اندیس دوم ([0][2]L)به دادهی درون این لیست اشاره دارد('ali'). این روش قابل تعمیم به لیست هایی با پیچیدگی بیشتر است.
نکته 1: اگر درون [] عبارت محاسبه ای قرار بگیرد ابتدا عبارت محاسبه می شود و سپس بقیه عملیات طبق روال توضیح داده شده در بالا انجام می پذیرند.
نکته 2: اگر اندیس قرار گرفته در [] در محدوده شماره ی اندیس ها نباشد پیغام خطا ظاهر می شود.
نکته 3: از خواص لیست ها انتساب هر یک از داده های درون لیست به متغیرهایی است که همگی تشکیل یک لیست می دهند.
نکته 4: در شماره گزاری اندیس ها درلیست برنامه نویس دخیل نیست بدین ترتیب که می توان از راست به چپ هم به داده ها درون لیست دسترسی داشت. در این صورت اندیس از -1 شروع شده و به صورت نزولی اندیسها شماره گزاری میشوند.البته انتخاب هر روش به دلخواه برنامه نویس است.
نکته 5: فقط اپراتورهای + و * بر روی لیست ها تعریف شده اند که اپراتور + بین یک لیست و لیستی دیگر تعریف شده و اپراتور * بین یک لیست و یک عدد تعریف شده است که نیازی به توضیح بیشتر نیست.
دسترسی به مجموعه ای از داده های درون لیست
برای دسترسی به چندتا از دادههای درون لیست به جای [] از [:] استفاده می کنیم:
>>>L=[ 'mahdy' , 'ali' , 100 , 99 , 'reza' , 20 ]
>>>L[1:5]
['ali', 100, 99, 'reza']
نکته1:اگر در سمت راست علامت : عددی بیشتر از محدوده قرار بگیرد یا عددی نوشته نشود پیغام خطایی ظاهر نمی شود بلکه تا آخرین خانه ی لیست در نظر گرفته می شود و برعکس.
نکته2:اگر شماره طوری باشند که از چپ به راست آخرین داده برابر یا قبل از داده ی اولی باشد حاصل یک لیست تهی است . 5
>>>L=[ 'mahdy' , 'ali' , 100 , 99 , 'reza' , 20 ]
>>>L[1:]
[ 'ali' , 100 , 99 , 'reza' , 20 ]
>>>L[1:1]
[]
اضافه کردن داده در لیست
بدون استفاده از عملیات محاسباتی می توان داده ای را به لیست اضافه کرد
>>>L=[ 1 , 2 , 3 ]
>>>L[3:3] = [4]
>>>L
[ 1 , 2 , 3 , 4 ]
حذف داده از لیست
برای حذف داده می توانیم از عمل انتساب استفاده کنیم بدین ترتیب که داده را به [] انتساب بدهیم
>>>L=[ 1 , 2 , 3 , 4 ]
>>>L[1:2] = []
>>>L
[ 1 , 3 , 4 ]
با استفاده از دستور del می توان هر داده یا کل لیست را حذف کرد
متدهای مهم لیست (با فرض اینکه L لیست باشد)
۱
L.append(x)
داده ی x را به انتهای لیست L اضافه کن
۲
L.remove(x)
داده ی x را از لیست L حذف کن
۳
L.index(x)
اندیس x در لیست L را برمی گرداند
۴
L.count(x)
تعداد دفعات تکرار x را در لیست L را برمی گرداند
۵
L.extend(x)
لیست x را با لیست L الحاق می کند
۶
L.insert(I,x)
داده ی x را درشماره اندیس I به لیست اضافه می کند
برای اضافه کردن عناصر و داده های جدید از دستور append استفاده میکنیم.
>>> breakfast.append(“waffle”)
>>> breakfast
['coffee', 'tea', 'milk', 'egg', 'waffle']
اگر بخواهیم تعداد بیشتری از دادهها را در قالب لیست یا تاپل به لیست موجود اضافه کنیم بدین منظور از دستور extend استفاده می کنیم.5
>>> breakfast.extend([“juice”, “decaf”, “oatmeal”])
>>> breakfast
[‘coffee’, ‘tea’, ‘milk’, ‘egg’, ‘waffle’, ‘juice’, ‘decaf’, ‘oatmeal’]
4-4 Dictionary5
Dictionary ها نیز از جمله داده های چند قسمتی هستند آغاز Dictionary ها با } و پایان آنها با { مشخص میشود و داده های آن با علامت، از هم جدا میشوند در هر خانه و هر قسمت Dictionary علاوه بر داده، اندیس مربوط به آن نیز آمده است بر خلاف رشته ها، لیست ها، Tuple ها اندیس دادهها در Dictionary به دلخوه برنامه نویس مشخص میشود و اندیس دادهها علاوه بر عدد، رشته، tuple و هر داده غیر قابل تغییر نیز میتواند باشد. به کمک علامت: اندیس هر داده را مشخص میکنیم بدین ترتیب که داده در سمت راست علامت: و اندیس آن در سمت چپ علامت: نوشته میشود. قابل ذکر است که اندیس ها در Dictionary نمیتواند یک داده ی تغییر پذیر لیست، یا Dictionary باشد. دادههای درون Dictionary از هر نوع می تواند باشد.
{ 'ali':20 , 'mahdy':'m' , 22:11 }
دسترسی به داده های درون Dictionary
جهت دسترسی به داده های درون Dictionary با قرار دادن اندیس داده ی مورد نظر درون [ ] در مقابل Dictionary این امر امکان پذیر است.
>>>D={ (1,2):11 , 'mahdy':'m' , 78:88 }
>>>D['mahdy']
'm'
>>>D[(1,2)]
11
باید توجه داشت که ممکن است در اندیس دادههای Dictionary اندیسهای مثل هم وجود داشته باشد که در این صورت تنها مقدار اولین داده از سمت راست با همان اندیس نشان داده میشود و در حقیقت دیگر دادههای موجود با آن اندیس از Dictionary حذف میشوند.
>>>d={ 'mahdy':'m' , 'python':'c' , 'mahdy':55 }
>>>d['mahdy']
55
>>>d
{'python': 'c', 'mahdy': 55}
اگر در مقابل Dictionary اندیسی قرار دهیم که در Dictionary وجود نداشته باشد پیغام خطا ظاهر میشود البته در این مورد استثنا نیز وجود دارد که به آن اشاره خواهیم کرد.
تغییر و افزودن داده به Dictionary
Dictionary ها از دادههای تغییرپذیرند و میتوان با علامت انتساب دادههای هر اندیس را تغییر داد همچنین میتوان دادهی جدیدی به همراه اندیس آن به Dictionary اضافه نمود:
>>>d={'mahdy':'m' , 2:'ali' }
>>>d['reza']= 66
>>>d
{ 'mahdy':'m' , 2:'ali' , 'reza':66 }
اپراتور + و * برای Dictionary ها تعریف نشده است .
دستور del
با استفاده از این دستور می توان هر یک از داده های درون Dictionary و یا حتی کل متغیر را حذف کرد
>>>d={'mahdy':'m' , 2:'ali' }
>>>del d[2]
>>>d
{ 'mahdy':'m' }
تابع len()
این تابع یک داده ی چند قسمتی به عنوان پارامتر گرفته و تعداد خانه های این داده ی چند قسمتی را برمی گرداند یعنی حاصل تابع عدد صحیح است.
دستور for برای Dictionary
اگر در مقابل in در دستور for داده ی چند قسمتی Dictionary قرار گیرد for در هر بار چرخش اندیس های تعریف شده در Dictionary را در متغیر قبل از in قرار داده و وارد حلقه می شود. توجه داشته باشید که مسآله ترتیب داده ها در Dictionary مطرح نیست چرا که اندیس هر داده از سوی ما تعیین می شود. نکته مهم اینجاست که اگر داده ی چند قسمتی قرار گرفته در دستور Dictionary , for باشد نباید تعداد داده های درون آن در حلقه for تغییر کند در غیر این صورت پیغام خطا ظاهر می شود
متدهای مربوط به Dictionary
نحوه ی فراخوانی متد : نام متد + . + Dictionary
اگر d را یک Dictionary در نظر بگیریم
۱
d.clear( )
تمام داده های درون d حذف می شود
۲
d.copy( )
یک کپی از d برمی گرداند
۳
d.has_key(m)
اگر اندیس m در d باشد 1 در غیر این صورت صفر برمی گرداند
۴
d.keys( )
لیستی از تمام اندیسها برگردانده می شود
۵
d.values( )
لیستی از تمام داده ها برمی گرداند
Dictionary شبیه به لیست و تاپل میباشد با این تفاوت که ایندکس دیکشنری عددی نمیباشد و میتواند شامل رشته یا در اصطلاح هر اسم دیگری باشد.
>>>dic={}
>>>dic["name"]="mehdi"
>>>dic["family"]="bayazee"
>>>printdic
{'name':'mehdi','family':'bayazee'}
نام ایندکس در دیکشنری keys یا کلید و مقدار هر کلید value نامیده می شود. که برای بدست آوردن کلیدها و مقادیر می توان از توابع ()keys و ()values استفاده کرد.
>>>dic.keys()
['name','family']
>>>dic.values()
['mehdi','bayazee']
نکات :
می توان در پایتون از اندیسدهی معکوس استفاده کرد. به این صورت که اندیس 1- آخرین عضو آرایه می باشد.
تکه تکه کردن (Slicing) آرایه و رشته از طریق ترکیب اندیس آغازین و پایانی صورت می گیرد.
>>>last_names=[“Douglass”,“Jefferson”,“Williams”,“Frank”,“Thomas”]
>>>last_names[-1]
'Thomas'
>>>last_names[-5]
'Douglass'
>>>s[1:4]
['Jefferson','Williams','Frank']
>>>s[0][0:6]
'Dougla'
برای مشاهده اعضا هر کلاس (متغییر ها و توابع) می توانید از دستور dir استفاده کنید.
>>> s=[]
>>> dir(s)
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__delslice__', '__doc__', '__eq__', '__ge__', '__getattribute__', '__getitem__', '__getslice__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__setslice__', '__str__', 'append', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
4-5 set
ماژول جدید sets شامل یک پیادهساز از طرف یک مجموعه Datatype. مجموعه کلاسی است برای مجموعه های تغییر پذیر. مجموعههایی که میتواند عضو اضافه شده یا کم شده داشته باشد:
>>> import sets
>>> S = sets.Set([1,2,3])
>>> S
Set([1, 2, 3])
>>> 1 in S
True
>>> 0 in S
False
>>> S.add(5)
>>> S.remove(3)
>>> S
Set([1, 2, 5])
>>>
اجتماع و اشتراک را در این ماژول میتوان با استفاده از متد union() و intersection()بدست آورد. و راه ساده تر استفاده از نمادهای & و | است.
>>> S1 = sets.Set([1,2,3])
>>> S2 = sets.Set([4,5,6])
>>> S1.union(S2)
Set([1, 2, 3, 4, 5, 6])
>>> S1 | S2 # نماد دیگر
Set([1, 2, 3, 4, 5, 6])
>>> S1.intersection(S2)
Set([])
>>> S1 & S2 # نماد دیگر
Set([])
>>> S1.union_update(S2)
>>> S1
Set([1, 2, 3, 4, 5, 6])
همچنین ممکن است تفاوت وشباهت میان دو مجموعه را نشان داد.این مجموعه همهی عناصر در اجتماع و اشتراکها نیستند و ممکن است با هم تفاوت داشته باشند.برای این کار ما می توانیم از متد symmetric_difference() و یا نماد ^ استفاده کنیم.
>>> S1 = sets.Set([1,2,3,4])
>>> S2 = sets.Set([3,4,5,6])
>>> S1.symmetric_difference(S2)
Set([1, 2, 5, 6])
>>> S1 ^ S2
Set([1, 2, 5, 6])
>>>
همچنین متدهای issubset() و issuperset()برای چک کردن اینکه آیا یک مجموعه زیر مجموعه یا مجوعه مرجع دیگری است یا نه . 5
>>> S1 = sets.Set([1,2,3])
>>> S2 = sets.Set([2,3])
>>> S2.issubset(S1)
True
>>> S1.issubset(S2)
False
>>> S1.issuperset(S2)
True
>>> فصل پنج
5-1 انواع داده انتزاعی7
برای ایجاد یک کلاس از عبارت کلاس باضافه نام کلاس استفاده میشود و همانند سایر قطعههای کد آن را با دو نقطه پایان میدهیم.و سپس شروع به نوشتن کد کنیم. در مرحله بعدی می توانید یک نمونه از این کلاس (شی) را ایجاد. اسم خاصی را به آن نسبت دهیم سپس از طریق این اسم می توانید به عناصر (متغییر و متد) داخل آن شی (کلاس) دسترسی داشته باشید.
در مثال زیر ساده ترین کلاس ممکنه را می بینیم که فقط شامل توضیحات میباشد .
کد:
Class Fridge:
"""This class implements a fridge where ingredients can be added and removed individually, or in groups."""
توضیح اینکه هر متنی پس از تعریف کلاس نوشته شود به عنوان مستندات آن کلاس بوده و تاثیری بر اجرای آن ندارد و میتوانید به این مستندات از طریق متغیر __doc__ آن کلاس دسترسی داشته باشد .
ایجاد یک شی از کلاس تعریف شده
کد کلاس Fridge را در یک فایل نوشته و آن را بوسیله دستور python -i اجرا کنید . شما اکنون می توانید یک نمونه از کلاس تعریف شده را به همراه اسم آن و پارانتز بازو بسته ایجاد کنید :
کد:
>>> f = Fridge()
فعلا این کلاس خالی می باشد . البته به این معنی نیست که بی کاربرد است. در ثانی استفاده از کلاس ها در مبحث استثنا ها کاربرد دارد. و اما استفاده از شی خالی f و مشاهده مستندات آن :
کد:
>>> f.items = {}
>>> f.items["milk"] = 2
>>> f.items["milk"]
2
>>> f.__doc__
'This class implements a fridge where ingredients can be added and removed individually, or in groups.'
class Fridge:
"""This class implements a fridge where ingredients can be added and re moved individually, or in groups. The fridge will retain a count of every ingredient added or removed, and will raise an error if a sufficient quan tity of an ingredient isn't present.
Methods:
has(food_name[, quantity])-checks if the string food_name is in the fridge.
Quantity will be set to 1 if you don't specify a number.
has_various(foods)-checks if enough of every food in the dictionary is in the fridge
add_one(food_name) - adds a single food_name to the fridge
add_many(food_dict) - adds a whole dictionary filled with food
get_one(food_name) - takes out a single food_name from the fridge
get_many(food_dict) - takes out a whole dictionary worth of food.
get_ingredients(food) - If passed an object that has the __ingredients__
method, get_many will invoke this to get the list of ingredients.
"""
def __init__(self, items={}):
"""Optionally pass in an initial dictionary of items"""
if type(items) != type({}):
raise TypeError,"Fridge requires a dictionary not %s"% type(items)
self.items = items
return
فصل شش
6-1 ترتیب اجرا در عبارات محاسباتی5
زمانی که یک عبارت محاسباتی شامل چندین عملگر باشد تقدم و ترتیب اجرا عملگر ها مهم بوده و در نتیجه کلی عبارت تاثیر گذار می باشد . بنابراین برای بدست آوردن نتیجه ای یکسان و استاندارد از قوانینی برای ترتیب اجرای عملگر ها استفاده می شود . قوانین اولویت عملگر در پایتون دقیقا با قوانین علم ریاضیات یکسان می باشد . پرانتز دارای بیشترین اولویت میباشد. و می توان از آن برای تغییر اجرای عملگرها استفاده کرد. مفسر پایتون ابتدا مقدایر داخل پرانتز را با شروع از درونی ترین پرانتز اجرا کرده و نتیجه محاسبه شده را در محاسبات بعدی بکار میگیرد. به جز توان، عملگرهایی که اولویت یکسانی دارند به ترتیب و از سمت چپ به راست اجرا میگردند.
>>> 3 ** 2 ** 2
81
در مثال فوق ابتدا عدد ۲ به توان ۲ رسیده و نتیجه یعنی ۴ محاسبه می شود. سپس عدد پایه و اصلی ۳ به توان ۴ می رسد. دقت کنید که این قانون نیز برگرفته از ریاضیات می باشد.
تقدم عملگر در زبان پایتون
۱
() [] .
گروهبندی و دسترسی
۲
! - +
عملگر های یکتایی
۳
**
توان
۴
* / %
ضرب ، تقسیم ، باقیمانده
۵
+ -
جمع و تفریق
۶
>
عملگر های شیفت به چپ و راست باینری
۷
=>
عملگرهای مقایسه ای : بزرگتر ، کوچکتر و ...
۸
== =!
عملگرهای مقایسه : مساوی ، نا برابر
۹
&
و منطقی باینری
۱۰
^
یا انحصاری (XOR) باینری
۱۱
|
یا منطقی باینری
۱۲
and
و منطقی
۱۳
or
یا منطقی
۱۴
= =+ =- =* =/ =%
عملگر های مقدار دهی
6-2 دستورات شرطی
if ساده
پایتون با استفاده از روش بسیار ساده ای امکان تصمیم گیری در برنامه را فراهم می کند. برای این کار ابتدا از یک کلمه رزرو شده بنام if استفاده می گردد. پس از این عبارت عبارت شرطی ظاهر می گردد که این عبارت هنگام اجرا تست شده و در صورت صحت نتیجه کلی آن قطعه کد مربوط به شرط به اجرا در می آید. این خط شروع کننده قطعه شرطی با کاراکتر دو نقطه (:) با اتمام می رسد.
برای شروع برنامهای مینویسیم که مقداری را از ورودی گرفته سپس علامت آنرا اعلام می کند؛
Val = raw_input("enter a number: ")
Val = int(Val)
if Val > 0 :
print "Entered value is positive!"
if Val
print "Entered value is negative!"
خروجی:
enter a number: -32
Entered value is negative!
enter a number: 24
Entered value is positive!
>>>
این برنامه چگونه عمل می کند؟ در این برنامه مفسر هر شرط را چک می کند. و در صورت درست بودن هر یک قطعه کد مربوطه را اجرا می کند. در صورت درست بودن شرط اول دیگر نیاز به تست کردن شروط دیگر نداریم و سایر تست ها کاری بیهوده به حساب می آیند. برای جلوگیری از این مشکل در ادامه با ساختار جدیدی آشنا خواهیم شد.
ترکیب if و elif
اگر ما if را معادل اگر بگیریم elif هم معنی واژهای مثل و اگر نه خواهد بود. این ترکیب با if شروع شده و با elif ها ادامه مییابد. در این حالت ابتدا شرط if اصلی تست میگردد. در صورت درست بودن شرط قطعه کد مربوطه اجرا شده و برنامه بدون تست شرط سایر elif ها به روند عادی اجرا ادامه میدهد و در صورتی که شرط نادرست باشد elif بعدی مورد پردازش قرار خواهد گرفت. تا زمانی که یکی از مقادیر شرطی elif معادل True باشد. ناگفته نماند که این دستور (elif) یک عضو از دستور if می باشد و خود بطور جداگانه کاربردی ندارد.
if :
Code Block 1
elif :
Code Block 2
elif :
Code Block 3
....
تفاوت اینگونه شرط ها این است که مفسر به محض درست شدن یکی از سلسله شرطها از مابقی سلسله صرفنظر می کند. این خود یک عامل سرعت دهنده می باشد . البته این روش تنها در مواردی خاص کاربرد دارد که باید توسط نویسنده برنامه تشخیص داده شود و آن حالتی است که :
حد اکثر یکی از این شرطها در یک زمان برقرار باشد.
اکنون مثال قبلی را که مثالی ساده بود توسط این روش باز نویسی می کنیم:
Val = raw_input("enter a number: ")
Val = int(Val)
if Val > 0 :
print "Entered value is positive!"
elif Val
print "Entered value is negative!"
البته این امر در این برنامه تقریباً تاثیری ندارد اما در مثالهای بزرگت و پیچیده تر آخر فصل با این امر بهتر مواجه خواهیم شد .
عبارت else3
این عبارت نیز نوعی شرط است اما به تنهایی کاربرد ندارد و باید بعد از if یا elif آورده شود. در واقع کاربرد تنهای آن یک خطا محسوب می شود. else این امکان را به ما میدهد که اگر در زنجیره شرطهای ما هیچ شرطی درست نبود قطعه کدی را که در خود دارد اجرا کند. همانطور در مثالها و مطالب قبلی مشخص می باشد، وجود این عبارت در شرطها الزامی نیست و وجود آن باز هم به برنامه و کاری که برنامه نویس قصد انجام آنرا دارد وابسته می باشد. حال با این عبارت برنامه خود را گسترش داده و قابلیت تشخیص صفر را به آن می دهیم:
Val = raw_input("enter a number: ")
Val = int(Val)
if Val > 0 :
print "Entered value is positive!"
elif Val
print "Entered value is negative!"
else :
print "Entered value is zero"
خروجی:
enter a number: 0
Entered value is zero
مثال عملی
تبدیل شماره روز به تاریخ
برنامه ای که شماره یک روز از سال را بگیرد و اگر آن روز در سال گنجید. تاریخ معادل شمسی آن را چاپ کند؟
1 # The program taking day number and returns which day it is in jalali calendar!
2
3 day = input("Enter day number: ")
4
5 yLen = 365
6
7 mDay = 0
8 month = 0
9 #if the day is in first half of the year
10 if 0
11 month = day / 31 + (day % 31 > 0)
12 mDay = day % 31
13
14 #if the day in the second half of the year
15 elif 186
16 day -= 186
17 month = day / 30 + (day % 30 >0) + 6
18 mDay = day % 30
19 #day out of year
20 else:
21 print "Bad day number entered"
22
23 print "in jalali calendar ---->" ,month, ".", mDay
در خطوط 11 و 17 چون از تقسیم صحیح استفاده شده است باقیمانده و اعشار در نظر گرفته نمی شود؛ پایتون خودبخود برای این عمل مثل جزء صحیح عمل کرده و حاصل را به طرف پایین گرد می کند. من با جمع بستن عبارت منطقی کاری شبیه به تابع Ceiling ریاضی انجام دادم و تقسیم را به طرف بالا گرد کردم. عبارات داخل پرانتز مقدار منطقی است که در صورت وجود باقیمانده در تقسیم مقدار 1 و در غیر این صورت صفر خواهد بود.
خروجی برنامه:
>>>
Enter day number: 366
Bad day number entered
in jalali calendar ----> 0 . 0
>>>
Enter day number: 56
in jalali calendar ----> 2 . 25
>>>
Enter day number: 323
in jalali calendar ----> 11 . 17
>>>
6-3 دستورات تکرار
حلقه while
اولین دستور تکرار یا حلقه while می باشد . به مثال زیر توجه کنید :
کد:
>>> omelet={“egg”:2,“mushroom”:5,“pepper”:1,“cheese”:1, “milk”:1}
>>> ingredients = omelet.keys()
>>> ingredients
[‘cheese’, ‘pepper’, ‘egg’, ‘milk’, ‘mushroom’]
>>> while len(ingredients) > 0:
... current = ingredients.pop()
... print “Adding %d %s to the mix” % (omelet[current],current)
...
Adding 5 mushroom to the mix
Adding 1 milk to the mix
Adding 2 egg to the mix
Adding 1 pepper to the mix
Adding 1 cheese to the mix
در این مثال ابتدا یک دیکشنری را تعریف می کنیم. سپس از طریق دستور ()keys کلید (اندیس) های دیکشنری را در متغییر دیگری به نام ingredients می ریزیم. و با وارد کردن نام آن محتویات متغیر را مشاهده می کنیم. (این نوع نمایش فقط در حالت محاوره ای عمل می کند ) سپس با استفاده از دستور while و تا زمانی که تعداد اعضای متغییر ingredients بزرگتر از صفر است وارد حلقه می شویم با دستور ()pop که یک عنصر را از لیست جدا کرده (حذف کرده) و بر می گرداند یکی یکی اعضا لیست ingredients که همان کلید های دیکشنری omelet هستند را در داخل متغییر current ریخته و در سطر بعدی چاپ می کنیم.
... for ... in
دستور بعدی برای حلقه ... for ... in می باشد. که شبیه به دستور while می باشد با این تفاوت که در این حالت نیازی به تعیین شرط پایان حلقه نبوده و در ضمن متغییری که به تک تک عناصر لیست اشاره می کند ایجاد می گردد که می توانید از آن در داخل حلقه استفاده کنید . معادل مثال بالا را با for به صورت زیر می باشد :
کد:
>>> for ingredient in omelet.keys():
... print “adding %d %s to the mix” % (omelet[ingredient],ingredient)
همانطور که مشاهده می کنید کد نوشته شده با for بسیار بهینه تر و کوتاهتر می باشد . منطق for در پایتون کمی متفاوت می باشد. که شما متغییر ( ingredient ) و یک لیست از عناصر ( ()omelet.keys ) می باشد که با عبارت کلیدی in از هم جدا شده اند. روند حلقه به این صورت است که متغییر تعریف شده به تک تک عناصر لیست اشاره خواهد کرد.
break
همانند زبانهای دیگر حلقه دارای دستوراتی برای جلوگیری از اجرای حلقه بدون تست شرط و نیز جلوگیری از اجرای بخشی از دستورات و تست دوباره شرط میباشد.
با استفاده از break می توانید بدون تست شرط حلقه را ترک کنید . و دستور continue از اجرای دستورات جلوگیری کردی مقدار متغیر را تغییر داده و شرط را بررسی میکند.
6-4 کنترل ترتیب ساختیافته4
برخلاف زبانهای دیگری چون C و Pascal که از علایم و عباراتی چون {} و begin,end و ... برای نمایش شروع و پایان یک قطعه کد استفده می کنند پایتون دارای علامت یا عبارت خاصی برای این منظور نمی باشد! و برای مشخص کردن محدوده یک قطعه کد (مثلا تابع ، دستورات شرطی ، حلقه ، کلاس و ... ) از فاصله گزاری اول دستورات استفاده میگردد. به این صورت که پس از خطی که بقیه دستورات زیر مجموعه آن میباشند به اندازه دلخواه فاصله یا تورفتگی داده میشود این فاصله های یکسان تا زمانی ادامه مییابد که محدوده دستور پایان یابد. که این روش باعث کاهش مقدار برنامه و خوانایی برنامه میشود.
از این روش در حالت معمول و برای خوانایی در زبانهای دیگر نیز استفاده میگردد و اکثر برنامه نویسان از تورفتگی کد برای افزایش خوانایی برنامه استفاده میکنند. پایتون با استفاده از این قابلیت هم مشکل خود را رفع کرده و هم الزامی برای رعایت این نظم و روند خاص برنامه نویسی بهره برده. به این ترتیب کد ها و برنامه های پایتون تقریبا استاندارد و ظاهر یکسانی را دارا می باشند. برای مثال به کد زیر دقت کنید. این کد شکل و منطق کلی دستور شرطی If در پایتون می باشد .
>>> name = 'python'
>>> lang = 'python'
>>> if lang == 'python':
... print 'You Are in right way !'
...
You Are in right way !
این یک مثال درست از قطعه کد می باشد . دستور چاپ دارای تورفتگی نسبت به دستور شرط می باشد . پس این دستور زیر مجموعه ای از شرط میباشد و در صورت درست بودن آن اجرا میگردد. اگر عبارت شرط حاوی دستورات بیشتری بود همه آن درست زیر دستور چاپ نوشته میشدند. در غیر اینصورت برنامه اجرا نشده و پیغام خطایی ظاهر میگردد. پس از تمام شدن قطعه کد باید دقیقا به زیر محل شروع شدن قطعه کد (در اینجا if) برگردید و ادامه برنامه رو دقیقا از زیر دستور اصلی قطعه کد ادامه بدهید.
در مثال بعدی یکی از دستورات داخل قطعه شرط (خط سوم) با دستور قبلی خود به اندازه یک فضای خالی فاصله دارد. برنامه اجرا نشده و با نمایش پیغامی محل وقوع خطا و نوع آن نمایش داده میشود.
>>> if lang == 'python':
... print 'You Are in right way !'
... print 'go on'
File "", line 3
print 'go on'
^
IndentationError: unindent does not match any outer indentation level
پس اگر حتی دستور سادهای چون دستور چاپ (print) را با فاصله (حتی یک فضای خالی) از سمت چپ بنویسید برنامه اجرا نخواهد شد. شاید این نوع خاص و منحصر به فرد در دفعات اول کمی سخت و تا حدودي مضحك بنظر آید اما یکی از مهمترین جنبه های پایتون می باشد که زیبایی خاصی به کد های نوشته شده میدهد و برنامه نویسی را لذت بخش و راحت میکند.
فصل هفت
7-1 حوزه ایستا و پویا5
منطق توابع در پایتون شبیه به دیگر زبانهای برنامه نویسی می باشد. برای تعریف یک تابع از کلمه کلیدی def استفاده میکنیم و سپس نام تابع را نوشته و نام پارامترها را در داخل پرانتز وارد میکنیم و با قرار دادن دو نقطه روی هم شروع به تایپ متن تابع میکنیم. در صورتی که اولین سطر بعدی یک رشته باشد این رشته به عنوان توضیحات کنار گذاشته میشود و شما میتوانید با متغیر __doc__ عضو کلاس تابع آن را مشاهده کنید .
کد:
def in_fridge ():
“””This is a function to see if the fridge has a food.
fridge has to be a dictionary defined outside of the function.
the food to be searched for is in the string wanted_food”””
try:
count = fridge[wanted_food]
except KeyError:
count = 0
return count
استفاده از اسامی یکسان در جاهای مختلف:
همانطور که در تابع تعریف شده بالا مشاهده میکنید دیکشنری fridge و رشته wanted_food در داخل تابع تعریف نشدهاند و از متغیرهای هم اسمی که در خارج محدوده تابع تعریف شدهاند استفاده میکنند. پایتون متن برنامه را به محدودهای مجزایی به نام scope تقسیم میکند. اسامی و scope که در همه نواحی و در کل برنامه قابل دسترسی می باشد با نام global یا سراسری شناخته می شود. همه اسامی دیگر در داخل توابع در یک سطح پایین تر به نام ناحیه local یا محلی قرار دارند. توابع این ناحیه را با توابعی که در سطح یکسان هستند به اشتراک نمی گزارند. و هر کدام یک ناحیه کاری مجزا دارند. هر نامی در ناحیه بالاتر قابل استفاده در ناحیه پایین تر می باشد با این توضیح که این استفاده فقط مقداری می باشد (نه مرجعی ) یعنی دستورات ناحیه کاری پایین تر نمی توانند تغییری در آنها اعمال کنند و فقط به یک کپی از آنها دسترسی دارند. به مثال زیر توجه کنید .
کد:
>>> special_sauce = [‘ketchup’, ‘mayonnaise’, ‘french dressing’]
>>> def make_new_sauce():
... “””This function makes a new special sauce all its own”””
... special_sauce = [“mustard”, “yogurt”]
... return special_sauce
...
یک لیست با نام special_sauce در ناحیه کاری بالا (top level) ایجاد گردیده است . و تابعی تعریف می شود که ناحیه کاری آن زیر مجموعه ناحیه کاریی می باشد که متغیر مورد نظر در آن تعریف شده است.
پس می توان از درون تابع make_new_sauce به یک کپی از متغییر special_sauce دسترسی داشت. در داخل این تابع متغییری هم اسم با متغیر تعریف شده در سطح بالاتر (global) را تعریف می کنیم و مقداری متفاوت با آنچه قبلا تعریف شده را به آن میدهیم. و آن را با دستور return بر می گردانیم. زمانی که این دستورات اجرا شوند مشاهده خواهیم کرد که مقدار متغیر تعریف شده در ناحیه سراسری بدون تغییر می ماند .
کد:
>>> print “%s” % special_sauce
[‘ketchup’, ‘mayonnaise’, ‘french dressing’]
>>> new_sauce = make_new_sauce()
>>> print special_sauce
[‘ketchup’, ‘mayonnaise’, ‘french dressing’]
>>> print new_sauce
[‘mustard’, ‘yogurt’]
ابتدا مقدار متغییر special_sauce چاپ کرده و سپس یک متغییر جدید و با استفده از تابع تعریف شده ایجاد می کنیم سپس دوباره محتویات متغییر اصلی را نمایش می دهیم (بدون تغییر می باشد ) و در نهایت متغییر جدید را چاپ می کنیم.
7-2 پارامترها و انتقال پارامترها3
می توان متغیرها را به تابع ارسال کنیم.
کد:
def in_fridge(some_fridge, desired_item):
try:
count = some_fridge[desired_item]
except KeyError:
count = 0
return count
این تابع را در فایلی با نام func1.py ذخیره کرده و با دستور python -i func1.py اجرا کرده و وارد حالت محاوره ای شوید .
کد:
>>> fridge = {‘apples’:10, ‘oranges’:3, ‘milk’:2}
>>> wanted_food = “oranges”
>>> in_fridge(fridge, wanted_food)
3
مقدار دهی پیش فرض پارامتر ها:
در هنگام فراخوانی تابع باید به هر پارامتر آن یک مقدار نسبت داد (فرستاد). و در صورتی که مقداری به یک پارامتر فرستاده نشود باعث بروز خطای برنامه نویسی خواهد شد. برای جلوگیری از این حالت پایتون شما را قادر میسازد تا برای پارمترها تابع خود مقدار پیش فرض نسبت دهید. این کار را میتوان در هنگام تعریف تابع و با نسبت دادن مقدار پیش فرض بوسیله علامت تساوی به نام پارامتر انجام داد.
کد:
def make_omelet2(omelet_type = “cheese”):
حال می توان این تابع را با ورودی یا بدون ورودی فراخوانی کرد.
تابع در داخل تابع:
می توان تابعی را درون تابع تعریف کرد. زمانی که می خواهیم تابعی بزگتر و پیچیده را به بخشهایی کوچکتر تقسیم کنیم می توان هر یک از این بخشها را به عنوان یک تابع درون تابع اصلی تعریف کرد. که در این حالت نحوه تعریف همانند تعریف تابع معمولی میباشد. با این تفاوت که از بیرون تابع اصلی نمی توان به توابع عضو دسترسی داشت.
منابع
1 - T. W. Pratt, Programming languages and Implementation, 4th Edition, Prentice
Hall, 2001
2- سایت رسمی پایتون
3- سایت فارسی آموزش زبان پایتون
4- http://www.pylearn.com
5- نسخهی برخط کتاب شیرجه داخل پایتون (Dive into Python)
6- an open source license(PEP 8 - Style Guide for Python Code)
7- http://www.tux-world.com
8- Official Python Website
زبان پایتون اواخر سال ۱۹۸۰(میلادی) توسط گیدو ون روسوم در موسسه ملی تحقیقات ریاضی و رایانه ( CVVI ) در شهر هلند ایجاد شد. پایتون یک زبان شیگراست و از ویژگیهای پیشرفتهایی چون وراثت، چند شکلی، سربار گزاری عملگر و ... پشتیبانی می کند.
در این مقاله مطابق با سرفصل و عناوین گفته شده در درس طراحی و پیاده سازی زبانها و طبق کتاب ویژگیهای این زبان را بررسی می کنیم.1
فصل یک
1-1 چرا از پایتون استفاده کنیم2
پایتون شی گراست :
پایتون ذاتا یک زبان شیگراست و از ویژگیهای پیشرفته شیگرایی چون وراثت، چند شکلی، سربار گزاری عملگر و ... پشتیبانی می کند. نکته جالب و یک ویژگی منحصر به فرد پایتون که لقب چسب را برای پایتون به ارمغان آورده امکان استفاده از کدها و کلاسهای نوشته شده در زبانهای دیگری چون ++ C و Java هستش و یه جورایی کار چسباندن قطعات کد جدا و فقط نوشتن بدنه اصلی به عهده پایتون است .
پایتون رایگان است:
پایتون یک زبان رایگان و باز متن است.
پایتون یک زبان پورتابل یا قابل انتقال می باشد:
چون پایتون با زبان پورتابل C نوشته شده می تواند به صورت مجازی بر روی هر سیستمی کامپایل و اجرا شود.گفتیم این یک زبان اسکریپتی است، یعنی در حالت معمول به فایل اجرایی تبدیل نمی شود بلکه یک ماشین مجازی فایل کد را می خواند و همزمان آنها را تفسیر کرده و اجرا می کند. پس می توان یک برنامه را در ویندوز نوشت و سپس آن را بدون تغییر روی لینوکس یا مکینتاش یا هر سیستم عامل و سخت افزار دیگری که پایتون روی آن نصب باشد اجرا کرد.
پایتون قدرتمند است :
پایتون یک زبان چند رگه هست. پایتون از زبانهای اسکریپتی برای مثال (Tcl , Scheme , Perl) زبانهای سیستمی (برای مثال ( C++ , C مشتق شده. بنابراین تمام سادگی و راحتی کار زبانهای اسکریپتی و ویژگیها و قدرت زباهای سطح پایین را داراست .
پایتون قابلیت استفاده از کدهای نوشته شده با سایر زبان ها را دارد :
این ویژگی یکی از پرکاربردترین و قویترین ویژگیهای پایتون میباشد. میتوان قطعهای از کد را در زبانی چون C , C++ و Java نوشت آنرا تبدیل به فایل اجرایی کرد و سپس از آن در برنامه نوشته شده با پایتون استفاده کرد. و یا از توابع کتابخانه و کامپوننت هایی چون COM API استفاده کرد.
یادگیری و استفاده از پایتون بسیار راحت می باشد :
بی شک و حداقل از نظر بسیاری از برنامه نویسان پایتون این زبان یکی از آسان ترین زبان ها برای یادگیری و استفاده میباشد و از آن به عنوان یک زبان سریع برنامه نویسی یاد می کنند. این زبان نیازی به کامپایل ندارد و شما مستقما میتوانید پس از نوشتن کد و با یک دستور آن را اجرا کنید. دستورات این زبان بسیار نزدیک به زبان انسان میباشد. برای مثال برنامه Hello World را که اولین برنامه ساده میباشد را در دو زبان C و Python مقایسه کنید :
#include
int main()
{
printf("Hello World ");
return 0;
}
ابتدا باید این برنامه را بنویسید و آن را با دستوری چون cc helloworld.c -o hello کامپایل و سپس با دستور hello/. اونو اجرا کنید . اما بوسیله پایتون در یک فایل متنی بنویسید :
print "Hello World !!"
و با دستور python hi.py اونو اجرا کنید .
با کم شدن حجم کد برنامه نویسی راحت تر و رفع اشکال و توسعه آن آسان تر می شود .
امنیت اطلاعات:
پایتون همچنین استفاده وسیعی از صنعت ایمنی اطلاعات میکند. مثلا در چندین ابزار پیشنهاد شده توسط تأمین امنیت و امنیت مرکزی و اسکنر امنیت کاربردی وب واپیتی. پایتون معمولاً در توسعه کاربرد مورد استفاده قرار میگیرد.
1-2 تاریخچه
پایتون اواخر سال ۱۹۸۰(میلادی) توسط گیدو ون روسوم در موسسه ملی تحقیقات ریاضی و رایانه ( CVVI ) در شهر هلند ایجاد شد. هدف گیدو ایجاد جانشینی برای زبان برنامه نویسی «ایبیسی» بود که قابلیت پردازش استثنا را داشته باشد. گیدو طراح اصلی پایتون است و نقش مداوم او در تصمیم گیری پیرامون اهداف پایتون، باعث شد که انجمن پایتون به او لقب دیکتاتور خیراندیش زندگی (به انگلیسی: Benevolent Dictator For Life) را بدهد.
نسخههای اولیه1
در سال ۱۹۹۱ ون روسوم کدی با برچسب نسخهی۰.۹.۰ را منتشر کرد. البته در این مرحله از پیشرفت کلاس هایی با خاصیت ارث بری ، پردازش استثنا ، توابع و نوع داده list , dict , str وجود داشت. همچنین در این نسخه ابتدایی یک سیستم ماژول با اقتباس از ماژول-3 وجود داشت. که ون روسوم این ماژول را به عنوان «یکی از واحد های عمده برنامه نویسی پایتون» توصیف کرد. مدل استثناء پایتون نیز شباهت هایی به ماژول-3 داشت ، به علاوه شرط else . در سال ۱۹۹۴ اولین مجمع مباحثه پیرامون پایتون شکل گرفت که مرحله برجستهای در پیشرفت کاربری پایتون بود.
باز بودن
در سال ۲۰۰۰ تیم توسعه دهنده پایتون به BeOpen.com منتقل شد و بدین صورت تیم کتابخانه باز پایتون شکل گرفت. به پیشنهاد CNRI ورژن ۱.۶ساخته شد، بدین ترتیب برنامههای تولید شده برای ۱.۶و ۲.۰اشتراکهای قابل توجهی داشتند. فقط پایتون ۲.۰ توسط BeOpen.com طراحی شده بود. بعد از تولید پایتون ۲.۰ توسط BeOpen.com ، گیدو و دیگر توسعه دهندگان کتابخانه پایتون به ایجاد دیجیتال روی آوردند. تولید پایتون ۱.۶ شامل جواز جدید CNRI بود که به طور قابل توجهی طولانی تر از جواز CWI ( که برای تولیدات قبلی استفاده شده بود) بود. موسسه مستقل از نرم افزار توضیح داد که انتخاب شرط قانون با GNU GPL ناسازگار بود., BeOpen CNRI و FSF تغییراتی را در جواز پایتون مستقل از نرم افزار ایجاد کردند که با GPL سازگار باشد. پایتون ۱.۶.۱ عمدتاً مشابه پایتون ۱.۶ است فقط با کمی اشکال، و با جواز سازگار با GPL .
فلسفه
پایتون 3.0 با همان فلسفه ورژن های قبل، در حال توسعه یافتن است، بنابراین هر منبعی در فلسفه پایتون ، در پایتون 3.0 به خوبی ظاهر خواهد شد. اگر چه ، همانطور که پایتون روش های جدید در برنامه ریزی را جمع آوری کرده، پایتون 3.0 تأکید زیادی بر از بین بردن ساختار ها و ماژول های تکراری دارد: " باید یک – و ترجیحاًً فقط یک – روش بدیهی برای انجام آن وجود داشته باشد." با این وجود پایتون 3.0 به ساختار زبان چند نمونهای ادامه خواهد داد. کد نویس ها همچنان اختیارات شیء گرایی ، برنامه نویسی ساخت یافته ، برنامه نویسی تابعی و دیگر نمونهها را دارند، اما در انتخاب های وسیع، جزئیات در پایتون 3.0 آشکارتر از پایتون سری 2.x هستند.
1-3 توسعه زبان پایتون
نسخه ۱.۰
پایتون در ژانویه ۱۹۹۴ به ورژن ۱.۰ رسید. خصوصیات عمده جدید این نسخه شامل ابزار های برنامه نویسی تابعی lambda , map , filter , reduce بود. ورژن پایتون ۱.۲ در سال ۱۹۹۵ ، زمانیکه گیدو در CVVI بود ٬ بدست آمد. گیدو به فعالیت های خود روی پایتون در موسسه ملی تحقیقات و ابتکارات (CNRI) در رستون ادامه داد و در همانجا چندین نسخه جدید انتشار یافت. در نسخه ۱.۴ به پایتون چندین ویژگی جدید اضافه شد. از ویژگیهای جالب توجه در میان این اضافات میتوان بهالهام گرفتن از آرگومان های کلیدی ماژول-3 (که خود از آرگومان های کلیدی لیسپ الهام گرفته بود) و همچنین پیشتیبانی اعداد مختلط اشاره کرد. در مدت فعالیت ون روسوم در CNRI ، او پروژه «برنامه نویسی کامپیوتر برای هر کس» (CP4E) را ایجاد کرد تا برنامه نویسی را در دسترس افراد بیشتری که اطلاعات پایهای برای برنامه نویسی (برای مثال توانایی در زبان انگلیسی و مهارتهای اولیهء ریاضی) را دارند، قرار دهد. زبان برنامهنویسی پایتون به دلیل تمرکزش بر روی پاکسازی فرم دستوراتش، نقش مرکزی را ایفا کرد. این پروژه توسط دارپا سرمایه گذاری شد واز سال ۲۰۰۷ غیر فعال شد.2
نسخه ۲.۰
پایتون ۲.۰ لیستی از ویژگی هایی را که از زبان های برنامه نویسی تابعی ستل و هاسکل اقتباس شده بود، معرفی کرد. نحو پایتون برای این ساختار ( جدا از برتری هاسکل برای کاراکتر های نقطه گذاری و کلمات الفبا ) بسیار مشابه هاسکل بود. پایتون ۲.۰ همچنین یک سیستم بازیافت حافظه با قابلیت جمع آوری منابع معرفی کرد. پایتون ۲.۱ به پایتون ۱.۶.۱ و ۲.۰ نزدیک بود. جواز آن به جواز مؤسسه نرم افزار پایتون تغییر نام یافت. همه کد ها، اسناد و مشخصات اضافه شده را از زمان تولید الفبای پایتون ۲.۱ توسط مؤسسه نرم افزار پایتون ( PFS ) دارا شد. یک سازمان غیر انتفاعی در سال ۲۰۰۱ تشکیل شد که از مؤسسه نرم افزار آپاچی مدل گرفته بود. تولیدات شامل تغییراتی در خصوصیات زبان در پوشش حوزههای تو در تو بود، مشابه دیگر زبان های حوزهای ایستا. ( این خصوصیات دوباره از بین رفتند و به پایتون 2.2 منتقل نشدند.) یک تغییر بزرگ در پایتون ۲.۲ یکسانسازی انواع دادهای پایتون و کلاسها به یک سلسله مراتب بود. این یکسان سازی اشیاء پایتون را کاملاً شیء گرا کرد.
پایتون 3000
پایتون 3.0(که پایتون3000 ویاPy3k نیز خوانده میشود) به منظور شکستن backward compatibility یا به عبارتی قطع سازگاری با گذشته پایتون .2 و بهبود خطاها و رخنهها در ورژن 2. وهمچنین حذف روشهای قدیمی طراحی شد.به عبارتی دیگر لازم نیست که پایتون3 بتواند کدی که با پایتون .2 نوشته شده را تفسیر کند.که البته این مشکل توسط نرم افزار 2to3 حل میشود.
فلسفه
پایتون 3.0 با همان فلسفه ورژن های قبل، در حال توسعه یافتن است، بنابراین هر منبعی در فلسفه پایتون ، در پایتون 3.0 به خوبی ظاهر خواهد شد. اگر چه ، همانطور که پایتون روش های جدید در برنامه ریزی را جمع آوری کرده، پایتون 3.0 تأکید زیادی بر از بین بردن ساختار ها و ماژول های تکراری دارد: " باید یک – و ترجیحاًً فقط یک – روش بدیهی برای انجام آن وجود داشته باشد." با این وجود پایتون 3.0 به ساختار زبان چند نمونهای ادامه خواهد داد. کد نویس ها همچنان اختیارات شیء گرایی ، برنامه نویسی ساخت یافته ، برنامه نویسی تابعی و دیگر نمونهها را دارند، اما در انتخاب های وسیع، جزئیات در پایتون 3.0 آشکارتر از پایتون سری 2.x هستند
نسخههای اولیه
در سال ۱۹۹۱ ون روسوم کدی با برچسب نسخهی۰.۹.۰ را منتشر کرد. البته در این مرحله از پیشرفت کلاس هایی با خاصیت ارث بری ، پردازش استثنا ، توابع و نوع داده list , dict , str وجود داشت. همچنین در این نسخه ابتدایی یک سیستم ماژول با اقتباس از ماژول-3 وجود داشت. که ون روسوم این ماژول را به عنوان «یکی از واحد های عمده برنامه نویسی پایتون» توصیف کرد. مدل استثناء پایتون نیز شباهت هایی به ماژول-3 داشت ، به علاوه شرط else . در سال ۱۹۹۴ اولین مجمع مباحثه پیرامون پایتون شکل گرفت که مرحله برجستهای در پیشرفت کاربری پایتون بود.
1-4 نقش زبان پایتون
پایتون یک زبان سکریپتی و بسیار قدرتمند و گسترده است و امروزه می توان آثاری از نفوذش را تقریبا همه جا مشاهده کرد. از پروژههای ساده و بسیار کوچک تا پروژههای عظیم چون برخی از نرم افزارهای NASA. میدانیم هر زبانی برای یک استفاده بخصوص طراحی شده است. زبانی مثل Pascal برای آموزش برنامه نویسی، زبانهایی چون C و اسمبلی برای برنامههای سیستمی و سیتم عامل و زبانی چون php برای طراحی سایت. و استفاده از هر یک به جای دیگری امکان پذیر ولی نا صحیح می باشد. علاوه بر اینکه Python زبانی عملی برای برنامه های کاربردی میباشد میتوان از آن در زمینه های دیگری مثلا برنامه نویسی سیستمی – رابط کاربری (gui) – کامپوننت – برنامه نویسی اینترنت – برنامه های عددی و محاسباتی – برنامه های پایگاه داده – پردازش تصویر – هوش مصنوعی – اشیا توضیع شده – شبیه سازی – روباتیک – برنامه نویسی موبایل – امنیت و شبکه و ... استفاده کرد.2 بیتتورنت (BitTorrent) : نرم افزاری برای جستجوی فایلهای به اشتراک گذاشته شده(p۲p) و ... بلندر (Blender) : یک نرم افزار ۳ بعدی و اپن سورس بسیار معروف چندلر (Chandler) : مدیر اطلاعات شخصی شامل تقویم ، میل ، کارهای روزلنه ، یادداشتها و ... Civilization IV : یک گیم کامپیوتری بر مبنای پایتون که از boost.python استفاده میکند میلمن (Mailman) : یکی از معروفترین نرم افزارهای مرتبط با ایمیل کمبیلوKombilo : مدیر پایگاه داده و مرورگرگیمهای go موینموین (MoinMoin) : یکی از قدرتمندترین و معروفتریم ویکیهای موجود پلون (Plone) : یک ابزار مدیریتی محتوایی اپن سورس ، قدرتمند و کاربر پسند پورتاژ (Portage) : قلب توزیع جنتو . یک مدیر بستهای سیستم لینوکس زوپ (zope) : یک پلاتفورم شی گرای مبتنی بر وب . زوپ شامل یک سرور نرم افزار به همراه پایگاه داده شی گرا و یک رابط مدیریتی درونی مبتنی بر وب میباشد اس پی ای (SPE) : یک IDE رایگان ، اپن سورس برای سیستم عاملهای ویندوز ، لینوکس ، مک که از wxGlade(طراحی رابط کاربر),PyChecker (دکتر کد) Blender(۳D) پشتیبانی میکند .3
1-5 ویژگیهای زبان پایتون
خوانایی
پایتون در نظر دارد که زبانی بسیار قابل خواندن باشد. بنابراین به سمت یک طرح بندی ویژوال بدون پارازیت میرود، و اغلب از کلمات کلیدی انگلیسی استفاده میکند، در صورتیکه دیگر زبانها از نقطه گذاری استفاده میکنند. پایتون نسبت به زبان های ساخت یافته سنتی، مثل C و پاسکال، نیاز به تکیه کلام های کمتر و همچنین استثناء های نحوی و موارد خاص کمتری دارد.
پایتون یک زبان برنامه نویسی چند الگویی است. به این معنی که بیشتر برنامه نویس های قدرتمند وقتی یک مدل برنامه نویسی را انتخاب میکنند، مجاز به چندین مدل هستند: شیء گرایی و برنامه نویسی ساخت یافته کاملاً تحت پوشش هستند، و تعدادی از خصوصیات زبان های برنامه نویسی هستند که برنامه نویسی تابعی و ظاهر سازی را پشتیبانی میکنند. پایتون از تایپ پویا و یک ترکیبی از شمارش مرجع و یک حلقه کشف و بازیافت قسمت های هدر رفته حافظه برای مدیریت حافظه، استفاده میکند. یک ویژگی مهم پایتون تحلیل نام پویا است، که روش ها و نام متغیر ها را در طول اجرای برنامه به هم ملحق میکند.
آسان کردن توسعه پذیری
هدف دیگر طراحی زبان آسان کردن توسعه پذیری است. ماژول هایی که تازه ساخته شده اند ، به سادگی در C و C++ نوشته میشوند. پایتون همچنین میتواند به عنوان زبان توسعه برای ماژول ها و کاربرد های موجود که به برنامه واسط قابل برنامه ریزی نیاز دارد ، استفاده شود. این طرح که یک زبان هسته کوچک با یک کتابخانه استاندارد بزرگ و یک مفسر آسان توسعه پذیر همراه باشد، توسط Van Rossum بیان شد.
طرح پایتون به پشتیبانی محدود برای برنامه نویسی تابعی به شیوه لیسپ ، ارائه شد. اگر چه پ، تشابههای عمدهای بین پایتون و زبان خانواده لیسپ وجود دارد. این کتابخانه دو ماژول دارد ( تکرار و تابعی ) که ابزار های تابعی را با اقتباس از هاسکل و ام ال استاندارد پیاده سازی میکند.
ساختار زیبا، آشکار و ساده
وقتی انتخاب هایی در روش شناسی کد ها ارائه شد، پایتون نحو های فراوان را کنار گذاشت. همچنان که با پرل، توسعه دهندگان پایتون فوراً یک فرهنگ یا ایدئولوژی را بر مبنای آنچه از یک زبان می خواهند، ترقی دادند، ساختار زبانها زیبا، آشکار و ساده شد. Alex Martelli این مطلب را در کتاب خود قرار داد: “برای توضیح برخی مسائل ، در فرهنگ پایتون تعریفی مطرح نشده است." پایتون روش پرل را (بیش از یک روش در انجام آن وجود دارد) در طراحی زبان در حمایت از " باید یک راه – و ترجیحاً فقط یک راه – آشکار برای انجام آن وجود دارد." رد کرد.
پایتون از بهینه سازی بی موقع اجتناب کرد، و بعلاوه به هم جور کردن قسمتهای غیر ضروری سی پایتون را که افزایش سرعت نهایی در هزینه را ارائه میکرد، رد کرد. آن گاهی اوقات با نام ' slow ' شناخته میشود. اگر چه ، بیشتر مسائل چندان بحرانی نیستند، و همین طور سرعت سخت افزار کامپیوتر با سرعت نمائی رو به رشد است. وقتی سرعت یک مسأله باشد، برنامه نویسان پایتون بیشتر تلاش میکنند تا عملیات محدود را با بهبود الگوریتم یا تغییر ساختار داده، بهینه کنند.4
1-6 مدل زبان پایتون
پایتون شی گراست :
پایتون ذاتا یک زبان شیگراست و از ویژگیهای پیشرفته شیگرایی چون وراثت، چند شکلی، سربار گزاری عملگر و ... پشتیبانی می کند. یک ویژگی منحصر به فرد پایتون امکان استفاده از کدها و کلاسهای نوشته شده در زبانهای دیگری چون ++ C و Java است .1
فصل دو
2-1 پیاده سازی
مسیر اصلی پیاده سازی پایتون ، که با عنوان سی پایتون نیز شناخته میشود ، در نشست C در استاندارد C89 نوشته شد. سی پایتون برنامههای پایتون را به کد بایت تبدیل میکند، که سپس توسط ماشین مجازی اجرا میشود. سی پایتون با یک کتابخانه استاندارد بزرگ که به صورت مخلوطی از C و پایتون نوشته شده، توزیع شده است. سی پایتون در ورژنهای مختلف برای پایگاههای زیادی کار میکند، شامل مایکروسافت ویندوز و بیشتر سیستمهای پیشرفته یونیکس. استفاده و توسعه آن روی پایگاههای محرمانه مانند Amoeba، در کنار پایگاههای متداول مانند یونیکس یا مکینتاش، به طور عمده در این نظر کمک شده است.
پایتون بدون پشته، انشعابی از سی پایتون است که ریز برنامهها را اجرا میکند؛ و از پشته حافظه استفاده نمیکند. سی پایتون از GIL استفاده میکند تا وقتی برنامه پایتون بدون پشته ، وابسته به OS است و میتواند به صورت همزمان اجرا شود، در هر لحظه فقط به یک زیر برنامه اجازه اجرا داده شود. پایتون برای استفاده در میکرو کنترلر ها یا وظایف محدود دیگر پایگاههای مرجع، متناسب تر است. پیش بینی میشود که پایتون بدون پشته بتواند تقریباً روی همان پایگاهی که سی پایتون اجرا میشود، اجرا شود.
جی تون برنامههای پایتون را به کد بایت جاوا کامپایل میکند، که بدین ترتیب میتواند با هر ماشین مجازی جاوا اجرا شود. و همچنین این امکان فراهم میشود که توابع کتابخانهای کلاس جاوا از برنامه پایتون به کار گرفته شود. آی رون پایتون از همین شیوه برای اجرای برنامههای پایتون روی زبان.NET استفاده میکند.
پای پای یک پیاده سازی تجربی از پایتون است که میتواند چندین تایپ از کد بایت را تولید نماید.
چندین برنامه در بسته مفسر پایتون با برنامههای کاربردی ( یا آغازگر ) وجود دارد که مستقلاً اجرا میشوند مانند یونیکس ، لینوکس ، ویندوز ، AmigaOS 4 یا Mac OS X . بسیاری از کتابخانههای سه قسمتی (و حتی بعضی از یک قسمتی ها) فقط روی ویندوز، لینوکس ، BSD و Mac OS X موجود هستند.
در نوکیا 2005 یک مفسر پایتون برای موبایل های سری 60 با نام PyS60 تولید شد که شامل بسیاری از ماژول ها از سی پایتون بود، و همچنین برخی ماژولهای اضافه شده برای یکپارچه شدن با سیستم عامل. این پروژه به منظور اجرا روی همه پایگاههای مختلف S60 ، به روز نگاه داشته میشود.
همچنین مفسری به نام پایتون سی ای برای ابزار ویندوز CE ( شامل بسته PC ) وجود دارد. که در آن ابزار هایی برای اجرای آسان و توسعه GUI اضافه شده است.5
پایتون چینی زبان برنامه نویسی پایتونی است که از لغت نامه زبان چینی استفاده میکند. در کنار کلمات رزرو شده و نام متغیر ها ، بیشتر عمل گر های تایپ داده، در چینی میتوانند به خوبی کد دهی شوند.
تفسیر معنایی
بیشتر پیاده سازیهای پایتون ( شامل سی پایتون، اولین پیاده سازی ) میتوانند به عنوان یک مفسر خط فرمان عمل کنند، برای زمانی که کاربر رشته شرط را وارد میکند و فوراً نتیجه را میپذیرد. خلاصه پایتون به عنوان یک برنامه واسط عمل میکند. وقتی صرف دیگر شیوههای اجرا ( کامپایل کد بایت یا کامپایل کد محلی ) به صورت یک رشته صرف ذخیره میشود، یک افزایش سرعت در هزینههای متقابل به وجود میآید، بنابراین آنها معمولاً فقط خارج از مفسر خط فرمان استفاده میشوند. ( وقتی یک ماژول وارد میشود. )
برنامههای واسط دیگر، امکانات تحت آن را در مفسر بیسیک افزایش میدهند، شامل IDLE و I Python. وقتی عموماً از برنامه واسط پایتون پیروی میشود، خصوصیاتی مشابه تکمیل خودکار، نگه داشتن زمان اجرای برنامه، و نشان دادن صرف پیاده سازی میشود.
برخی از پیاده سازیها نه تنها به صورت کد بایت میتوانند کامپایل شوند، بلکه میتوانند کد پایتون را به کد ماشین تبدیل کنند. تا کنون، این عمل فقط برای زیر مجموعههای انحصاری پایتون انجام شده است. پای پای این روش را پذیرفته و ورژن های قابل کامپایل انحصاری پایتون را RPython نامید.
Psyco یک کامپایلر اختصاصی در زمان است که کد بایت را به کد ماشین، در زمان اجرا تبدیل میکند. کد تولید شده، اختصاصی برای تایپهای داده خاصی است و از کدهای استاندارد پایتون سریعتر است. Psyco با همه کد های پایتون سازگار است، نه فقط یک زیر مجموعه.2
2-2 انقیاد
یکی از مهمترین و اساسیترین جنبه و مزیت زبانهای برنامهنویسی داشتن توانایی کار با متغیرها میباشد. در اکثر زبانها برای استفاده از متغیرها باید ابتدا آنها را تعریف یا ایجاد کنیم. و نیز معمولا هنگام تعریف هر متغییر نوع آن را که تا آخرعمر متغییر ثابت خواهد ماند را مشخص کنیم. در زبان پایتون برای تعریف یک متغیر کافی است آن را مقداردهی کنیم. یعنی نیازی به تعریف جداگانه نمی باشد. نکته بعدی اینکه در زبان پایتون ابزاری مدیریتی داینامیک و بسیار قوی برای متغیر پیادهسازی شده است که امکانات بسیاری را فراهم میکند. برای مثال نوع متغیر در پایتون میتواند در طول عمر آن متغیر یا در طول اجرای برنامه به تعداد دلخواه تغییر یابد.
>>> message = "Be Linux !"
>>> n = 17
>>> pi = 3.14159
در مثال بالا ۳ متغیر را با عمل مقداری دهی تعریف کردهایم. اکنون برای مشاهده مقدار هر متغیر می توان از دستور print استفاده کرد. این دستور مقدار هر متغیر را در خروجی چاپ می کند .
>>> print message
Be Linux !
>>> print pi
3.14159
در پایتون نوع داده در زمان اجرا مشخص می شود و نیازی به اعلان آن قبل از اجرا نیست.در پایتون تمامی داده ها شی (object)می باشند .برای مثال عدد 3 در پایتون یک شیء را در حافظه مشخص می کند و متغیرها نیز نامهایی هستند که به اشیا داخل حافظه اشاره میکنند. شاید این سوال پیش بیاید که چگونه مفسر پایتون می تواند نوع داده ها را بدون اعلان اولیه تشخیص دهد!. پاسخ:
name1='saeed afshari'
name2='saeed afshari'
وقتی در پایتون انتسابهایی به صورت بالا صورت می گیرند مراحل زیر به تر تیب انجام می شوند
1.شیءsaeed afshari که مقداری از نوع رشته است به وجود می آید.
2.متغیرهای name1 ,name2 درست می شود.(اگر قبلا درست نشده باشد)
3.متغیر name1,name2 به شیء مورد نظر اشاره می کند.
شیء موردنظر باید نوع خود را بداند، برای همین منظور هر object در پایتون دارای دو فیلد هدر(header field)به نامهای طراح نوع(type designator)وشمارنده ی مراجعات(reference counter)می باشد، که طراح نوع، نوع داده را در خود ذخیره می کند و شمارندهی مراجعات تعداد رجوعهای متغیرهای متفاوت به شیء را مشخص میکند.
برای مثال بالا type designator=str و reference counter=2
با داشتن این فیلد ها در زمان اجرا مفسر می تواند نوع داده را تشخیص دهد.
مدیریت حافظه ی خودکار
reference counter کار زباله روبی (garbage collection) را بسیار آسان می سازد.به این صورت که وقتی reference counter مساوی صفر میشود زباله روب متوجه میشود که هیچ ارجاعی به شیء مورد نظر وجود ندارد، بنابراین شی ء را از حافظه پاک میکند.3
فصل سه
3-1 اشیای داده، متغیرها و ثوابت
یکی از مهمترین و اساسیترین جنبه و مزیت زبانهای برنامهنویسی داشتن توانایی کار با متغیرها میباشد. در اکثر زبانها برای استفاده از متغیرها باید ابتدا آنها را تعریف یا ایجاد کنیم. و نیز معمولا هنگام تعریف هر متغییر نوع آن را که تا آخرعمر متغییر ثابت خواهد ماند را مشخص کنیم. در زبان پایتون برای تعریف یک متغیر کافی است آن را مقداردهی کنیم. یعنی نیازی به تعریف جداگانه نمی باشد.
معمولا برنامه نویسان برای نام گذاری متغیرها از اسامی استفاده میکنند که نشاندهنده کاربرد و حتی نوع متغییر میباشد. اسامی متغییرها میتواند با طول دلخواه باشد. در نامگذاری متغییرها استفاده از حرف و عدد مجاز است. بیاد داشته باشید که در برخی از زبانها از جمله پایتون حروف برزگ با کوچک یکسان نیستند. بنابراین متغییری با نام Joker با متغییر joker یکسان نیست و این دو ممکن است مقادیر و حتی نوعهای مختلفی داشته باشند. در نام گذاری متغییر ها می توان از کاراکتر زیر خط (_) نیز استفاده کرد و معمولا در اسامی که از بیش از یک کلمه تشکیل شده باشند به کار می رود.
همچون تمام زبانهای برنامه نویسی پایتون هم قوانینی برای نام گذاری متغییر ها دارد که باید هنگام نام گذاری به آنها دقت کنید. برخی از این قوانین شامل موارد زیر است : اسم متغییر باید با یک حرف شروع شود. در نام گذاری مجاز به استفاده از کاراکتر های خاص چون $%^#/ و ... نیستید. در نام گذاری متغییرها نباید از اسامی رزرو شده زبان برنامه نویسی استفاده کرد. برای مثال استفاده از اسامی چون class , for , if و ... مجاز نمیباشد.
استفاده از اسامی رزور شده در پایتون مجاز نمیباشد. در صورت استفاده از این اسامی یا هر یک از موارد بالا برنامه از روند عادی خود خارج شده و متوقف میگردد و در اصطلاح یک خطای نحوی(مربوط به نحوه نوشتن و یا املای دستورات برنامه ) (syntax error) رخ میدهد. ممکن است اسمی که برای یک متغیر انتخاب میشود تکراری نیز باشد! در این حالت خطایی دریافت خواهد شد اما برنامه نتایجی اشتباه محاسبه خواهد کرد یا روند اجرای آن به مشکل بر خواهد خورد .
زبان پایتون دارای ۲۸ اسم رزرو شده می باشد . این اسامی یا keyword ها تشکیل دهنده ساختار کلی هر زبان برنامه نویسی میباشند.
اسامی رزرو شده در پایتون
raise
not
import
for
else
continue
and
return
or
in
from
except
def
assert
try
pass
is
global
exec
del
break
while
lambda
if
finally
elif
class
عبارات
یک عبارت در حقیقت یک دستور برنامه نویسی می باشد که مفسر پایتون قدرت اجرای آن را دارد. معمولا در زبان پایتون هر عبارت در یک سطر مجزا نوشته می شود و مفسر پس از اجرای هر سطر یا عبارت سراغ سطر بعدی میرود.
برنامه یا یک اسکریپت شامل تعدادی از عبارتها یا دستورات اجرایی پشت سرهم میباشند.
عبارات محاسباتی
هر عبارت ترکیبی از مقادیر، متغییرها و عملگرها میباشد. اگر یک عبارت محاسباتی را به عنوان یک دستور وارد کنید مفسر مقدار آن را محاسبه و چاپ خواهد کرد.
>>> 1 + 1
2
عملگر و عملوند
عملگر در حقیقت یک سمبل یا نماد قراردادی برای نمایش اتفاق افتادن عملی خاص چون جمع یا تفریق می باشد . بدین ترتیب هر عملگر بر روی تعدادی عملوند عمل کرده و نتیجه ای را حاصل می دهد . 3
3-2 انواع داده
مقدار یا داده یکی از تعاریف پایهای و بنیادی بوده و همانند عدد یا حرف تعاریف متعدد و وسیعی را دارا میباشد. متغییرها را به صورت ظرف فرض کنید تا در خطایابی مشکلی نداشته باشید هر برنامه کامپیوتری در روند اجرای خود با مجموعه ای از داده ها و اطلاعات سروکار دارد و آنها را مورد پردازش قرار داده و نتایجی را تولید می کند. یک مقدار در علم برنامه نویسی میتواند برای مثال عددی چون "۱" یا مقداری رشته ای مانند "سلام دنیا !" باشد.
دو نوع داده ذکر شده دارای انواع مختلفی میباشند. یکی از آنها از نوع عدد صحیح یا integer و دیگری رشته یا در اصطلاح برنامه نویسی string میباشد . اگر قادر به تشخیص نوع یک داده نیستید مفسر پایتون می تواند این کار را انجام دهد .
>>> type("Hello, World!")
>>> type(17)
پایتون دارای نوع های پیش فرض integers,long numbers,floating-point(float), imaginary numbers می باشد. برای اطلاع از نوع یک متغییر در هر لحظه می توان از دستور type استفاده کرد:
>>>
x=2000
>>>
type(x)
‘int’>
>>>
type(999999999999)
‘long’>
>>>
type(1.0)
3-3 کنترل نوع و تبدیل نوع
در پایتون نوع داده در زمان اجرا مشخص می شود و نیازی به اعلان آن قبل از اجرا نیست.در پایتون تمامی داده ها شی (object)می باشند .برای مثال عدد 3 در پایتون یک شیء را در حافظه مشخص می کند و متغیرها نیز نامهایی هستند که به اشیا داخل حافظه اشاره میکنند. شاید این سوال پیش بیاید که چگونه مفسر پایتون می تواند نوع داده ها را بدون اعلان اولیه تشخیص دهد!. پاسخ:
name1='saeed afshari'
name2='saeed afshari'
وقتی در پایتون انتسابهایی به صورت بالا صورت می گیرند مراحل زیر به تر تیب انجام می شوند
1.شیءsaeed afshari که مقداری از نوع رشته است به وجود می آید.
2.متغیرهای name1 ,name2 درست می شود.(اگر قبلا درست نشده باشد)
3.متغیر name1,name2 به شیء مورد نظر اشاره می کند.
شیء موردنظر باید نوع خود را بداند، برای همین منظور هر object در پایتون دارای دو فیلد هدر(header field)به نامهای طراح نوع(type designator)وشمارنده ی مراجعات(reference counter)می باشد، که طراح نوع، نوع داده را در خود ذخیره می کند و شمارندهی مراجعات تعداد رجوعهای متغیرهای متفاوت به شیء را مشخص میکند.
برای مثال بالا type designator=str و reference counter=2
با داشتن این فیلد ها در زمان اجرا مفسر می تواند نوع داده را تشخیص دهد.5
converts integer operand to floating point:
>>> 3 * 3.75 / 1.5
7.5
>>> 7.0 / 2
3.5
3-4 انتساب و مقدار دهي اولیه
نوع متغيير ها به صورت ديناميكي تعيين مي شود و در طول اجراي برنامه ممكن است تغيير يابد
متغيير ها تنها اسمي براي يك شي مي باشند و همانند زبان C به يك نقطه از حافظه اشاره نمي كنند.
>>>a=4
>>>b=a*4.5
>>>c=(a+b)/2.5
>>>a="HelloWorld"
>>> x = y = z = 0 # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
همانطور كه مشاهده مي كنيد تعريف يك متغيير به وسيله مقدار دهي آن انجام مي شود و اين نظريه درست نيست كه در پايتون نيازي به تعريف متغيير نمي باشد براي مثال استفاده از كدي مثل :
>>>printxTracebac(mostrecentcalllast):
File"",line1,in?
NameError:name'x'isnotdefined
باعث نمايش يك پيغام خطا خواهد شد چون متغيير x قبلا تعريف (مقداردهي) نشده است .
نكته ديگر اينكه ما در پايتون نيازي به تعيين نوع يك متغيير نداريم براي نمونه در مثال بالا متغيير a ابتدا مقدار صحيح (int) مي باشد و سپس از آن براي نشان دادن يك رشته استفاده شده است.5
3-5 اعداد موهومی
Complex numbers with a nonzero real component are written as (real+imagj), or can be created with the complex (real,imag) function.
>>> 1j * 1J
(-1+0j)
>>> 1j * complex(0,1)
(-1+0j)
>>> 3+1j*3
(3+3j)
>>> (3+1j)*3
(9+3j)
>>> (1+2j)/(1+1j)
(1.5+0.5j)
Complex numbers are always represented as two floating point numbers, the real and imaginary part. To extract
these parts from a complex number z, use z.real and z.imag.
>>> a=1.5+0.5j
>>> a.real
1.5
>>> a.imag
0.5
3-6 عملگرهای منطقی7
متغیرهای منطقی logicalVariable می توانند حامل یکی از دو مقدار درست یا غلط باشند.تصمیم گیری نیز بر همین اساس صورت می گیرد یعنی اگر این متغیر حامل مقدار درست باشد شرط قطعه کد مربوطه را به اجرا در می آورد. از دید دیگر این متغیر ساده ترین نوع یک عبارت منطقی است. عبارتهای منطقی را بطور مختصر می توان به دو دسته ساده و پیچیده تقسیم کرد. همه عبارت های منطقی به یکی از مقادیر درست یا غلط ختم می شوند. این عبارات با مقادیر و عملگر های منطقی ساخته می شوند که همگی دودویی هستند یعنی برای انجام عمل به دو عملوند احتیاج دارند.مقدماتی ترین این عملگرها از این قرارند:
عملگر های منطقی
عملگر
توضیح
==
برابری دو عملوند
=!
عدم برابر دو عملوند
بزرگتر
>
کوچکتر
=
بزرگتر یا مساوی
=>
کوچکتر یا مساوی
and
و منطقی
or
یا منطقی
not
متمم (not)
ساخت عبارات منطقی
در اصل مقادیر منطقی اولیه با عملگرهای منطقی که در متن فوق بصورت کمرنگ نوشته شده اند بوجود آمده و با دو عملگر پررنگتر یعنی and و or ترکیب خواهند شد.
مقایسه برابری (==)
عمل مقایسه دو شی (متغیر ، عدد ، رشته یا ... ) توسط دو علامت مساوی بهم چسبیده صورت میگیرد. حاصل نتیجه تست برابر بودن دو مقدار مقدار های درست (True) یا نادرست (False) خواهد بود .
>>> 1 == 1
True
>>> 1 == 2
False
زمانی که شما از عملگر مقایسه برابری دو عبارت (==) استفاده می کنید مفسر پایتون مقدار دو طرف عملگر (عملوند) را با یکدیگر مقایسه می کند . اگر دو مقدار برابر نباشند مقدار نادرست یا False و در صورت برابری مقدار درست یا True برگشت داده می شود . در صورتی که شما از انواع مختلف اعداد استفاده کنید عمل تبدیل خودکار نوع نیز انجام می پذیرد .
>>> 1.23 == 1
False
>>> 1.0 == 1
True
از عملگر مقایسه می توان برای مقایسه اکثر انواع داده پایتون استفاده کرد . در درس های آینده با نحوه سربارگزاری عملگر ها و در نتیجه ایجاد روش های مقایسه منحصربفرد برای هر شی یا کلاس آشنا خواهید شد . برای مقایسه لیست مفسر پایتون تک تک عناصر لیست را از نظر مقدار و محل با یکدیگر بررسی می کند . اگر دو لیست اعضایی یکسان ولی با ترتیب غیر یکسان داشته باشند با یکدیگر برابر نمی باشند .
>>> city = ["Tabriz", "Tehran", "Shiraz", "Yazd"]
>>> city2 = ["Yazd", "Shiraz", "Tabriz", "Tehran"]
>>> city == city2
False
>>> city2 = ["Tabriz", "Tehran", "Shiraz", "Yazd"]
>>> city == city2
True
مقایسه داده هایی از نوع دیکشنری نیز امکان پذیر می باشد . در اینصورت محل داده ها در نتیجه مقایسه تاثیری نخواهد داشت و فقط به ازای هر کلید و مقدار باید دقیقا همان داده ها در دیکشنری دیگر موجود باشد .
مقایسه نابرابری (=!)
عمل مقایسه نابرابری در حقیقت متمم یا منفی شده (not) مقایسه برابری می باشد. به این ترتیب که اگر طرفین عملگر نابرابری، برابر باشند مقدار نادرست و در غیر اینصورت مقدار درست برگشت داده می شود.
>>> 3 == 3
True
>>> 3 != 3
False
>>> 5 != 4
True
فاصله گذاري بين نماد =! و يا برعكس نوشتن آن (يعني آن را به صورت != بنويسيم) يك خطاي منطقي محسوب خواهد شد كه در زمان اجرا تاثير گذار خواهد بود.
مقایسه بزرگتری و کوچکتری ()
پایتون برای مقایسه دو عبارت ار لحاظ مقدار از علامت های برگرفته شده از ریاضیات استفاده می کند.
>>> 5
False
>>> 10 > 2
True
با استفاده از عملگرهای مقایسهای امکان مقایسه دو رشته نیز وجود دارد. مقایسه و ارزش کاراکترها بر حسب توالی و ترتیب کاراکترها میباشد. کم ارزش ترین کاراکتر حرف بزرگ "A" می باشد. و بقیه کاراکتر های حروف بزرگ از حرف "A" بزرگتر هستند و "Z" از بقیه حروف بزرگ زبان انگلیسی ارزش بیشتری دارد. حروف کوچک انگلیسی ارزش بیشتری نسبت به حروف بزرگ دارند. یعنی کاراکتر "a" از همه کاراکتر های بزرگ با ارزش تر می باشد. دلیل این امر کد های اسکی و بیشتر بودن کد اسکی حروف کوچک می باشد . پس "z" پر ارزش ترین و "A" کم ارزش ترین کاراکتر موجود می باشد .
>>> “a” > “b”
False
>>> “A” > “b”
False
>>> “A” > “a”
False
>>> “b” > “A”
True
>>> “Z” > “a”
False
هنگامی بررسی دو رشته پایتون تک تک کاراکتر های معادل را بررسی می کند تا به اولین اختلاف برسد و سپس رشته ای را که کاراکتر باارزش تری داشته باشد به عنوان رشته بزرگتر بر می گرداند .
عملگر متمم (not)
زمانی که شما حاصل منطقی یک عبارت را محاسبه میکنید قصد دارید برای مثال از درست بودن آن مطلع شوید. امکان دارد بسته به شرایط برنامه هدف شما تشخیص عدم درست بودن یا متمم آن یعنی not True باشد. عملگر یکتایی not فقط بر روی یک عملوند اجرا شده و نتیجه مخالف ارزش منطقی آن را برگشت می دهد.
>>> not True
False
>>> not 5
False
>>> not 0
True
>>> not 5 > 2
False
عملگر and
ممکن است در برنامه ای قصد برنامه نویس اطلاع از ترکیب چندین عبارت منطقی باشد تا بدین ترتیب برنامه بتواند مقایسه هایی بسیار پیچیده را انجام داده و در نتیجه تصمیمات درست تری اتخاذ کند. برای این منظور دو عملگر بسیار پرکاربرد موجود میباشد. اولین عملگر موجود، عملگر and (و منطقی) میباشد. این عملگر تنها در حالتی به مقدار درست منجر میشود که هر دو عملوند آن حامل مقادیر درست باشند. عملکرد این عملگر در عبارت p and q در جدول زیر مشاهده می شود:
چگونگی عملکرد and
and
q
p
F
F
F
F
F
T
F
T
F
T
T
T
عملگر or
این عملگر تقریباً عکس and نتیجه می دهد یعنی در همه حالات بجز حالتی که هر دو عملوند آن مقدار غلط داشته باشند منتج به مقدار درست خواهد شد. مقدار نهایی عبارت p or q را در زیر می بینید:
چگونگی عملکرد or
or
q
p
F
F
F
T
F
T
T
T
F
T
T
T
3-7 رشتههایکاراکتری
فرق رشته در پایتون با اکثر زبان های برنامه نویسی این ایت که یک کاراکتر به عنوان یک رشته با طول یک می باشد. توضیح دیگر علامت نقل قول دوگانه و منفرد تقریبا کار یکسانی انجام می دهند البته فرقهایی دارند. از ۳ علامت نقل گول هم برای وارد کردن رشته هایی دارای علامت های خاص استفاده می شود.
>>> ’spam eggs’
’spam eggs’
>>> ’doesn\’t’
"doesn’t"
>>> "doesn’t"
"doesn’t"
>>> ’"Yes," he said.’
’"Yes," he said.’
>>> "\"Yes,\" he said."
’"Yes," he said.’
>>> ’"Isn\’t," she said.’
’"Isn\’t," she said.’
عملگر های رشته 7
در حالت عادی و منطقی قادر به اعمال عملگر های محاسباتی بر روی رشتهها نیستیم. برای مثال دستورات زیر همگی اشتباه بوده و باعث بروز خطای منطقی می گردند .
>>> "Hello" / 123
>>> "15" + 2
>>> ""Hello" * "World !"
نمونه خروجی :
>>> "15" + 2
Traceback (most recent call last):
File "", line 1, in ?
TypeError: cannot concatenate 'str' and 'int' objects
در پایتون 3.0
>>> "15" + 2
Traceback (most recent call last):
File "
", line 1, in
"15" + 2
TypeError: Can't convert 'int' object to str implicitly
اما برخی از عملگر های دارای معانی خاصی در مورد رشته میباشند.
اتصال دو رشته با استفاده از عملگر جمع
عملگر ترکیب دو رشته که با سمبل مربوط به عمل جمع ریاضی یا "+" نشان داده میشود دو عملوند از نوع رشته را دریافت و رشته سمت راست خود را به انتهای رشته سمت چپی خود می چسباند .
>>> word = ’Help’ + ’A’
>>> word
’HelpA’
تکرار یک رشته با استفاده از عملگر ضرب
عملگر ضرب با سنبل "*" نیز معنی خاصی برای رشته دارد. این عملگر دو عملوند یکی از نوع رشته و دیگری از نوع عدد صحیح را دریافت و رشته را به تعداد عدد دریافت شده تکرار کرده و در قالب یک رشته واحد بر می گرداند.
>>> "Python ! " * 3
'Python ! Python ! Python ! '
عملگر ضرب در مورد رشته ها منطقی شبیه به نوع ریاضی آن دارد. ضرب دو عدد در ریاضیات را می توان بصورت جمع نشان داد. برای مثال ۴×۳ را میتوان بصورت ۴+۴+۴ نمایش داد. در مورد رشته ها نیز در حقیقت برای محاسبه ضرب یک عدد در رشته، همان رشته با تعداد عدد وارد شده باهم جمع می شود.
>>> ’’
’’
فصل چهار
4-1 انواع ساختمان داده در پایتون یکی از مهمترین و پرکاربرد ترین این ساختمان های داده رشته های کاراکتری می باشند که در واقع یک زنجیره (Sequence) از بایت ها می باشند که در کار با ورودی ها، خروجی ها و ارتباطات گوناگون نقش مهمی ایفا می کنند، زیرا یکی از راههای محدود فهم انسان از دنیای کامپیوتر ارتباط متنی با این جهان می باشد. دیگر ساختمان داده ای مهم در این زبان لیست ها (آرایه ها) هستند. در واقع این نوع داده یک نوع بسیار پیشرفته از آرایه های زبانهای سطح پایین است که علاوه بر خاصیت اندیس پذیری ، خاصیت تغییر اندازه و نگهداری انواع داده را بطور هم زمان دارا می باشد. چند تایی های مرتب (Tuple)در پایتون نوعی از داده با شباهت هایی به لیست می باشد که در بخش مربوطه به تفاوت ها و شباهت های این دو نوع خواهیم پرداخت. یک نوع دیگر داده در پایتون چرخنده(Iterator)است که به عنوان یک فریم یا واحد چرخنده در طول لیست ها ، چند تایی ها و رشته ها محسوب می شود.
ساختمان داده های دیگر
این ساختمانهای داده سنگ بنای چندین ساختمان داده دیگر هستند که هر کدام کاربرد و پیچیدگیهای خاص خود را دارند از آنجمله می توان موارد زیر را نام برد: 5 لیست های پیوندی یکطرفه دوطرفه حلقوی صف ها صف های دو طرفه صفهای با اولویت درختها دودویی دودویی جستجو heap Deap MinMax Heap
4-2 Tuple
Tuple یا توالی غیر قابل تغییری از داده همانند آرایه می باشد با این تفاوت که پس از تعریف و مقدار دهی اولیه قابل هیچ گونه تغییری نمی باشد . علامت مشخصه آن در هنگام تعریف پرانتز می باشد .
>>>filler=(“string”,“filled”,“bya”,“tuple”)
>>>print“A%s%s%s%s”%iller
Astringfilledbyatuple
>>>print“Thesecondelementofthetupleis‘%s’”%filter[1]
Thesecondelementofthetupleis‘filled’
اندیس همانند C از صفر شروع می شود. برای پیدا کردن طول (تعداد اعضا) یک تاپل از دستور len استفاده میشود هرگونه تلاش برای تغییر یا دسترسی به اندیس بیشتر از طول تاپل باعث نمایش خطا میشود:
>>>print“%d”%len(filter)
3
>>>printa[len(filter)-1]
tuple
تاپل ها با کاما (,) از هم جدا میشوند. شکل ظاهری تاپلها همانند این است که چند داده را به یک متغیر انتساب بدهید اما باید بدانید که نوع دادهی نگهداری شده از نوع تاپل است. مثالی برای درک بهتر :
در این مثال دو متغیر از نظر نوع داده ها و مقدار داده ها با هم تفاوتی ندارند. ( اما از نظر مکان ذخیره سازی داده ها با هم متفاوت هستند )
a = 1, 2, 3, 4
b = (1, 2, 3, 4)
نکته1: به این نکته توجه داشته باشید که داده های چند قسمتی می توانند داده های چند قسمتی دیگر را در خود نگه دارند.
نکته2: برای تاپل های تک عضوی باید به صورت زیر عمل کنید.
این یک متغیر ساده است # a = 33
این یک داده از نوع تاپل است # b = 33,
اپراتورها در تاپل
اپراتورهایی که برای تاپل ها تعریف شده اند + ( بین دو تاپل ) و * ( بین یک عدد و تاپل )هستند .
>>>1, 2, 3 + 4, 5, 6
(1, 2, 7, 5, 6)
>>>(1, 2, 3) + (4, 5, 6)
(1, 2, 3, 4, 5, 6)
دسترسی به داده های درون تاپل همانند لیست هاست.
یک مثال ساده...
>>> T = (1, 2, 3)
>>> T[0]
1
4-3 List
Listیا توالی قابل تغییری از داده همانند تاپل میباشد با این تفاوت که قابلت تغییر و گسترش را دارا میباشد. علامت مشخصه آن براکت می باشد .
>>>breakfast=[“coffee”,“tea”,“toast”,“egg”]
>>>count=1
>>>print“Todaysbreakfastis%s”%breakfast[count]
Todaysbreakfastistea
لیست امکان تغییر را دارا می باشد.
>>>breakfast[2]="milk"
>>>breakfast
['coffee','tea','milk','egg']
ممکن است یک لیست درون لیست دیگری قرار داشته باشد. برای دستیابی به داده ی لیست درونی تر باید از روش پیچیده تری استفاده نمایید:
>>>L=[ 'mahdy' , 20 , [ 'ali' , 99 ] , 1.2]
>>>L[2][0]
'ali'
در مثال بالا میبینیم که اندیس اول([2]L) به دادهای اشاره دارد که خود یک لیست می باشد([ ali' , 99' ]) و اندیس دوم ([0][2]L)به دادهی درون این لیست اشاره دارد('ali'). این روش قابل تعمیم به لیست هایی با پیچیدگی بیشتر است.
نکته 1: اگر درون [] عبارت محاسبه ای قرار بگیرد ابتدا عبارت محاسبه می شود و سپس بقیه عملیات طبق روال توضیح داده شده در بالا انجام می پذیرند.
نکته 2: اگر اندیس قرار گرفته در [] در محدوده شماره ی اندیس ها نباشد پیغام خطا ظاهر می شود.
نکته 3: از خواص لیست ها انتساب هر یک از داده های درون لیست به متغیرهایی است که همگی تشکیل یک لیست می دهند.
نکته 4: در شماره گزاری اندیس ها درلیست برنامه نویس دخیل نیست بدین ترتیب که می توان از راست به چپ هم به داده ها درون لیست دسترسی داشت. در این صورت اندیس از -1 شروع شده و به صورت نزولی اندیسها شماره گزاری میشوند.البته انتخاب هر روش به دلخواه برنامه نویس است.
نکته 5: فقط اپراتورهای + و * بر روی لیست ها تعریف شده اند که اپراتور + بین یک لیست و لیستی دیگر تعریف شده و اپراتور * بین یک لیست و یک عدد تعریف شده است که نیازی به توضیح بیشتر نیست.
دسترسی به مجموعه ای از داده های درون لیست
برای دسترسی به چندتا از دادههای درون لیست به جای [] از [:] استفاده می کنیم:
>>>L=[ 'mahdy' , 'ali' , 100 , 99 , 'reza' , 20 ]
>>>L[1:5]
['ali', 100, 99, 'reza']
نکته1:اگر در سمت راست علامت : عددی بیشتر از محدوده قرار بگیرد یا عددی نوشته نشود پیغام خطایی ظاهر نمی شود بلکه تا آخرین خانه ی لیست در نظر گرفته می شود و برعکس.
نکته2:اگر شماره طوری باشند که از چپ به راست آخرین داده برابر یا قبل از داده ی اولی باشد حاصل یک لیست تهی است . 5
>>>L=[ 'mahdy' , 'ali' , 100 , 99 , 'reza' , 20 ]
>>>L[1:]
[ 'ali' , 100 , 99 , 'reza' , 20 ]
>>>L[1:1]
[]
اضافه کردن داده در لیست
بدون استفاده از عملیات محاسباتی می توان داده ای را به لیست اضافه کرد
>>>L=[ 1 , 2 , 3 ]
>>>L[3:3] = [4]
>>>L
[ 1 , 2 , 3 , 4 ]
حذف داده از لیست
برای حذف داده می توانیم از عمل انتساب استفاده کنیم بدین ترتیب که داده را به [] انتساب بدهیم
>>>L=[ 1 , 2 , 3 , 4 ]
>>>L[1:2] = []
>>>L
[ 1 , 3 , 4 ]
با استفاده از دستور del می توان هر داده یا کل لیست را حذف کرد
متدهای مهم لیست (با فرض اینکه L لیست باشد)
۱
L.append(x)
داده ی x را به انتهای لیست L اضافه کن
۲
L.remove(x)
داده ی x را از لیست L حذف کن
۳
L.index(x)
اندیس x در لیست L را برمی گرداند
۴
L.count(x)
تعداد دفعات تکرار x را در لیست L را برمی گرداند
۵
L.extend(x)
لیست x را با لیست L الحاق می کند
۶
L.insert(I,x)
داده ی x را درشماره اندیس I به لیست اضافه می کند
برای اضافه کردن عناصر و داده های جدید از دستور append استفاده میکنیم.
>>> breakfast.append(“waffle”)
>>> breakfast
['coffee', 'tea', 'milk', 'egg', 'waffle']
اگر بخواهیم تعداد بیشتری از دادهها را در قالب لیست یا تاپل به لیست موجود اضافه کنیم بدین منظور از دستور extend استفاده می کنیم.5
>>> breakfast.extend([“juice”, “decaf”, “oatmeal”])
>>> breakfast
[‘coffee’, ‘tea’, ‘milk’, ‘egg’, ‘waffle’, ‘juice’, ‘decaf’, ‘oatmeal’]
4-4 Dictionary5
Dictionary ها نیز از جمله داده های چند قسمتی هستند آغاز Dictionary ها با } و پایان آنها با { مشخص میشود و داده های آن با علامت، از هم جدا میشوند در هر خانه و هر قسمت Dictionary علاوه بر داده، اندیس مربوط به آن نیز آمده است بر خلاف رشته ها، لیست ها، Tuple ها اندیس دادهها در Dictionary به دلخوه برنامه نویس مشخص میشود و اندیس دادهها علاوه بر عدد، رشته، tuple و هر داده غیر قابل تغییر نیز میتواند باشد. به کمک علامت: اندیس هر داده را مشخص میکنیم بدین ترتیب که داده در سمت راست علامت: و اندیس آن در سمت چپ علامت: نوشته میشود. قابل ذکر است که اندیس ها در Dictionary نمیتواند یک داده ی تغییر پذیر لیست، یا Dictionary باشد. دادههای درون Dictionary از هر نوع می تواند باشد.
{ 'ali':20 , 'mahdy':'m' , 22:11 }
دسترسی به داده های درون Dictionary
جهت دسترسی به داده های درون Dictionary با قرار دادن اندیس داده ی مورد نظر درون [ ] در مقابل Dictionary این امر امکان پذیر است.
>>>D={ (1,2):11 , 'mahdy':'m' , 78:88 }
>>>D['mahdy']
'm'
>>>D[(1,2)]
11
باید توجه داشت که ممکن است در اندیس دادههای Dictionary اندیسهای مثل هم وجود داشته باشد که در این صورت تنها مقدار اولین داده از سمت راست با همان اندیس نشان داده میشود و در حقیقت دیگر دادههای موجود با آن اندیس از Dictionary حذف میشوند.
>>>d={ 'mahdy':'m' , 'python':'c' , 'mahdy':55 }
>>>d['mahdy']
55
>>>d
{'python': 'c', 'mahdy': 55}
اگر در مقابل Dictionary اندیسی قرار دهیم که در Dictionary وجود نداشته باشد پیغام خطا ظاهر میشود البته در این مورد استثنا نیز وجود دارد که به آن اشاره خواهیم کرد.
تغییر و افزودن داده به Dictionary
Dictionary ها از دادههای تغییرپذیرند و میتوان با علامت انتساب دادههای هر اندیس را تغییر داد همچنین میتوان دادهی جدیدی به همراه اندیس آن به Dictionary اضافه نمود:
>>>d={'mahdy':'m' , 2:'ali' }
>>>d['reza']= 66
>>>d
{ 'mahdy':'m' , 2:'ali' , 'reza':66 }
اپراتور + و * برای Dictionary ها تعریف نشده است .
دستور del
با استفاده از این دستور می توان هر یک از داده های درون Dictionary و یا حتی کل متغیر را حذف کرد
>>>d={'mahdy':'m' , 2:'ali' }
>>>del d[2]
>>>d
{ 'mahdy':'m' }
تابع len()
این تابع یک داده ی چند قسمتی به عنوان پارامتر گرفته و تعداد خانه های این داده ی چند قسمتی را برمی گرداند یعنی حاصل تابع عدد صحیح است.
دستور for برای Dictionary
اگر در مقابل in در دستور for داده ی چند قسمتی Dictionary قرار گیرد for در هر بار چرخش اندیس های تعریف شده در Dictionary را در متغیر قبل از in قرار داده و وارد حلقه می شود. توجه داشته باشید که مسآله ترتیب داده ها در Dictionary مطرح نیست چرا که اندیس هر داده از سوی ما تعیین می شود. نکته مهم اینجاست که اگر داده ی چند قسمتی قرار گرفته در دستور Dictionary , for باشد نباید تعداد داده های درون آن در حلقه for تغییر کند در غیر این صورت پیغام خطا ظاهر می شود
متدهای مربوط به Dictionary
نحوه ی فراخوانی متد : نام متد + . + Dictionary
اگر d را یک Dictionary در نظر بگیریم
۱
d.clear( )
تمام داده های درون d حذف می شود
۲
d.copy( )
یک کپی از d برمی گرداند
۳
d.has_key(m)
اگر اندیس m در d باشد 1 در غیر این صورت صفر برمی گرداند
۴
d.keys( )
لیستی از تمام اندیسها برگردانده می شود
۵
d.values( )
لیستی از تمام داده ها برمی گرداند
Dictionary شبیه به لیست و تاپل میباشد با این تفاوت که ایندکس دیکشنری عددی نمیباشد و میتواند شامل رشته یا در اصطلاح هر اسم دیگری باشد.
>>>dic={}
>>>dic["name"]="mehdi"
>>>dic["family"]="bayazee"
>>>printdic
{'name':'mehdi','family':'bayazee'}
نام ایندکس در دیکشنری keys یا کلید و مقدار هر کلید value نامیده می شود. که برای بدست آوردن کلیدها و مقادیر می توان از توابع ()keys و ()values استفاده کرد.
>>>dic.keys()
['name','family']
>>>dic.values()
['mehdi','bayazee']
نکات :
می توان در پایتون از اندیسدهی معکوس استفاده کرد. به این صورت که اندیس 1- آخرین عضو آرایه می باشد.
تکه تکه کردن (Slicing) آرایه و رشته از طریق ترکیب اندیس آغازین و پایانی صورت می گیرد.
>>>last_names=[“Douglass”,“Jefferson”,“Williams”,“Frank”,“Thomas”]
>>>last_names[-1]
'Thomas'
>>>last_names[-5]
'Douglass'
>>>s[1:4]
['Jefferson','Williams','Frank']
>>>s[0][0:6]
'Dougla'
برای مشاهده اعضا هر کلاس (متغییر ها و توابع) می توانید از دستور dir استفاده کنید.
>>> s=[]
>>> dir(s)
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__delslice__', '__doc__', '__eq__', '__ge__', '__getattribute__', '__getitem__', '__getslice__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__setslice__', '__str__', 'append', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
4-5 set
ماژول جدید sets شامل یک پیادهساز از طرف یک مجموعه Datatype. مجموعه کلاسی است برای مجموعه های تغییر پذیر. مجموعههایی که میتواند عضو اضافه شده یا کم شده داشته باشد:
>>> import sets
>>> S = sets.Set([1,2,3])
>>> S
Set([1, 2, 3])
>>> 1 in S
True
>>> 0 in S
False
>>> S.add(5)
>>> S.remove(3)
>>> S
Set([1, 2, 5])
>>>
اجتماع و اشتراک را در این ماژول میتوان با استفاده از متد union() و intersection()بدست آورد. و راه ساده تر استفاده از نمادهای & و | است.
>>> S1 = sets.Set([1,2,3])
>>> S2 = sets.Set([4,5,6])
>>> S1.union(S2)
Set([1, 2, 3, 4, 5, 6])
>>> S1 | S2 # نماد دیگر
Set([1, 2, 3, 4, 5, 6])
>>> S1.intersection(S2)
Set([])
>>> S1 & S2 # نماد دیگر
Set([])
>>> S1.union_update(S2)
>>> S1
Set([1, 2, 3, 4, 5, 6])
همچنین ممکن است تفاوت وشباهت میان دو مجموعه را نشان داد.این مجموعه همهی عناصر در اجتماع و اشتراکها نیستند و ممکن است با هم تفاوت داشته باشند.برای این کار ما می توانیم از متد symmetric_difference() و یا نماد ^ استفاده کنیم.
>>> S1 = sets.Set([1,2,3,4])
>>> S2 = sets.Set([3,4,5,6])
>>> S1.symmetric_difference(S2)
Set([1, 2, 5, 6])
>>> S1 ^ S2
Set([1, 2, 5, 6])
>>>
همچنین متدهای issubset() و issuperset()برای چک کردن اینکه آیا یک مجموعه زیر مجموعه یا مجوعه مرجع دیگری است یا نه . 5
>>> S1 = sets.Set([1,2,3])
>>> S2 = sets.Set([2,3])
>>> S2.issubset(S1)
True
>>> S1.issubset(S2)
False
>>> S1.issuperset(S2)
True
>>> فصل پنج
5-1 انواع داده انتزاعی7
برای ایجاد یک کلاس از عبارت کلاس باضافه نام کلاس استفاده میشود و همانند سایر قطعههای کد آن را با دو نقطه پایان میدهیم.و سپس شروع به نوشتن کد کنیم. در مرحله بعدی می توانید یک نمونه از این کلاس (شی) را ایجاد. اسم خاصی را به آن نسبت دهیم سپس از طریق این اسم می توانید به عناصر (متغییر و متد) داخل آن شی (کلاس) دسترسی داشته باشید.
در مثال زیر ساده ترین کلاس ممکنه را می بینیم که فقط شامل توضیحات میباشد .
کد:
Class Fridge:
"""This class implements a fridge where ingredients can be added and removed individually, or in groups."""
توضیح اینکه هر متنی پس از تعریف کلاس نوشته شود به عنوان مستندات آن کلاس بوده و تاثیری بر اجرای آن ندارد و میتوانید به این مستندات از طریق متغیر __doc__ آن کلاس دسترسی داشته باشد .
ایجاد یک شی از کلاس تعریف شده
کد کلاس Fridge را در یک فایل نوشته و آن را بوسیله دستور python -i اجرا کنید . شما اکنون می توانید یک نمونه از کلاس تعریف شده را به همراه اسم آن و پارانتز بازو بسته ایجاد کنید :
کد:
>>> f = Fridge()
فعلا این کلاس خالی می باشد . البته به این معنی نیست که بی کاربرد است. در ثانی استفاده از کلاس ها در مبحث استثنا ها کاربرد دارد. و اما استفاده از شی خالی f و مشاهده مستندات آن :
کد:
>>> f.items = {}
>>> f.items["milk"] = 2
>>> f.items["milk"]
2
>>> f.__doc__
'This class implements a fridge where ingredients can be added and removed individually, or in groups.'
class Fridge:
"""This class implements a fridge where ingredients can be added and re moved individually, or in groups. The fridge will retain a count of every ingredient added or removed, and will raise an error if a sufficient quan tity of an ingredient isn't present.
Methods:
has(food_name[, quantity])-checks if the string food_name is in the fridge.
Quantity will be set to 1 if you don't specify a number.
has_various(foods)-checks if enough of every food in the dictionary is in the fridge
add_one(food_name) - adds a single food_name to the fridge
add_many(food_dict) - adds a whole dictionary filled with food
get_one(food_name) - takes out a single food_name from the fridge
get_many(food_dict) - takes out a whole dictionary worth of food.
get_ingredients(food) - If passed an object that has the __ingredients__
method, get_many will invoke this to get the list of ingredients.
"""
def __init__(self, items={}):
"""Optionally pass in an initial dictionary of items"""
if type(items) != type({}):
raise TypeError,"Fridge requires a dictionary not %s"% type(items)
self.items = items
return
فصل شش
6-1 ترتیب اجرا در عبارات محاسباتی5
زمانی که یک عبارت محاسباتی شامل چندین عملگر باشد تقدم و ترتیب اجرا عملگر ها مهم بوده و در نتیجه کلی عبارت تاثیر گذار می باشد . بنابراین برای بدست آوردن نتیجه ای یکسان و استاندارد از قوانینی برای ترتیب اجرای عملگر ها استفاده می شود . قوانین اولویت عملگر در پایتون دقیقا با قوانین علم ریاضیات یکسان می باشد . پرانتز دارای بیشترین اولویت میباشد. و می توان از آن برای تغییر اجرای عملگرها استفاده کرد. مفسر پایتون ابتدا مقدایر داخل پرانتز را با شروع از درونی ترین پرانتز اجرا کرده و نتیجه محاسبه شده را در محاسبات بعدی بکار میگیرد. به جز توان، عملگرهایی که اولویت یکسانی دارند به ترتیب و از سمت چپ به راست اجرا میگردند.
>>> 3 ** 2 ** 2
81
در مثال فوق ابتدا عدد ۲ به توان ۲ رسیده و نتیجه یعنی ۴ محاسبه می شود. سپس عدد پایه و اصلی ۳ به توان ۴ می رسد. دقت کنید که این قانون نیز برگرفته از ریاضیات می باشد.
تقدم عملگر در زبان پایتون
۱
() [] .
گروهبندی و دسترسی
۲
! - +
عملگر های یکتایی
۳
**
توان
۴
* / %
ضرب ، تقسیم ، باقیمانده
۵
+ -
جمع و تفریق
۶
>
عملگر های شیفت به چپ و راست باینری
۷
=>
عملگرهای مقایسه ای : بزرگتر ، کوچکتر و ...
۸
== =!
عملگرهای مقایسه : مساوی ، نا برابر
۹
&
و منطقی باینری
۱۰
^
یا انحصاری (XOR) باینری
۱۱
|
یا منطقی باینری
۱۲
and
و منطقی
۱۳
or
یا منطقی
۱۴
= =+ =- =* =/ =%
عملگر های مقدار دهی
6-2 دستورات شرطی
if ساده
پایتون با استفاده از روش بسیار ساده ای امکان تصمیم گیری در برنامه را فراهم می کند. برای این کار ابتدا از یک کلمه رزرو شده بنام if استفاده می گردد. پس از این عبارت عبارت شرطی ظاهر می گردد که این عبارت هنگام اجرا تست شده و در صورت صحت نتیجه کلی آن قطعه کد مربوط به شرط به اجرا در می آید. این خط شروع کننده قطعه شرطی با کاراکتر دو نقطه (:) با اتمام می رسد.
برای شروع برنامهای مینویسیم که مقداری را از ورودی گرفته سپس علامت آنرا اعلام می کند؛
Val = raw_input("enter a number: ")
Val = int(Val)
if Val > 0 :
print "Entered value is positive!"
if Val
print "Entered value is negative!"
خروجی:
enter a number: -32
Entered value is negative!
enter a number: 24
Entered value is positive!
>>>
این برنامه چگونه عمل می کند؟ در این برنامه مفسر هر شرط را چک می کند. و در صورت درست بودن هر یک قطعه کد مربوطه را اجرا می کند. در صورت درست بودن شرط اول دیگر نیاز به تست کردن شروط دیگر نداریم و سایر تست ها کاری بیهوده به حساب می آیند. برای جلوگیری از این مشکل در ادامه با ساختار جدیدی آشنا خواهیم شد.
ترکیب if و elif
اگر ما if را معادل اگر بگیریم elif هم معنی واژهای مثل و اگر نه خواهد بود. این ترکیب با if شروع شده و با elif ها ادامه مییابد. در این حالت ابتدا شرط if اصلی تست میگردد. در صورت درست بودن شرط قطعه کد مربوطه اجرا شده و برنامه بدون تست شرط سایر elif ها به روند عادی اجرا ادامه میدهد و در صورتی که شرط نادرست باشد elif بعدی مورد پردازش قرار خواهد گرفت. تا زمانی که یکی از مقادیر شرطی elif معادل True باشد. ناگفته نماند که این دستور (elif) یک عضو از دستور if می باشد و خود بطور جداگانه کاربردی ندارد.
if :
Code Block 1
elif :
Code Block 2
elif :
Code Block 3
....
تفاوت اینگونه شرط ها این است که مفسر به محض درست شدن یکی از سلسله شرطها از مابقی سلسله صرفنظر می کند. این خود یک عامل سرعت دهنده می باشد . البته این روش تنها در مواردی خاص کاربرد دارد که باید توسط نویسنده برنامه تشخیص داده شود و آن حالتی است که :
حد اکثر یکی از این شرطها در یک زمان برقرار باشد.
اکنون مثال قبلی را که مثالی ساده بود توسط این روش باز نویسی می کنیم:
Val = raw_input("enter a number: ")
Val = int(Val)
if Val > 0 :
print "Entered value is positive!"
elif Val
print "Entered value is negative!"
البته این امر در این برنامه تقریباً تاثیری ندارد اما در مثالهای بزرگت و پیچیده تر آخر فصل با این امر بهتر مواجه خواهیم شد .
عبارت else3
این عبارت نیز نوعی شرط است اما به تنهایی کاربرد ندارد و باید بعد از if یا elif آورده شود. در واقع کاربرد تنهای آن یک خطا محسوب می شود. else این امکان را به ما میدهد که اگر در زنجیره شرطهای ما هیچ شرطی درست نبود قطعه کدی را که در خود دارد اجرا کند. همانطور در مثالها و مطالب قبلی مشخص می باشد، وجود این عبارت در شرطها الزامی نیست و وجود آن باز هم به برنامه و کاری که برنامه نویس قصد انجام آنرا دارد وابسته می باشد. حال با این عبارت برنامه خود را گسترش داده و قابلیت تشخیص صفر را به آن می دهیم:
Val = raw_input("enter a number: ")
Val = int(Val)
if Val > 0 :
print "Entered value is positive!"
elif Val
print "Entered value is negative!"
else :
print "Entered value is zero"
خروجی:
enter a number: 0
Entered value is zero
مثال عملی
تبدیل شماره روز به تاریخ
برنامه ای که شماره یک روز از سال را بگیرد و اگر آن روز در سال گنجید. تاریخ معادل شمسی آن را چاپ کند؟
1 # The program taking day number and returns which day it is in jalali calendar!
2
3 day = input("Enter day number: ")
4
5 yLen = 365
6
7 mDay = 0
8 month = 0
9 #if the day is in first half of the year
10 if 0
11 month = day / 31 + (day % 31 > 0)
12 mDay = day % 31
13
14 #if the day in the second half of the year
15 elif 186
16 day -= 186
17 month = day / 30 + (day % 30 >0) + 6
18 mDay = day % 30
19 #day out of year
20 else:
21 print "Bad day number entered"
22
23 print "in jalali calendar ---->" ,month, ".", mDay
در خطوط 11 و 17 چون از تقسیم صحیح استفاده شده است باقیمانده و اعشار در نظر گرفته نمی شود؛ پایتون خودبخود برای این عمل مثل جزء صحیح عمل کرده و حاصل را به طرف پایین گرد می کند. من با جمع بستن عبارت منطقی کاری شبیه به تابع Ceiling ریاضی انجام دادم و تقسیم را به طرف بالا گرد کردم. عبارات داخل پرانتز مقدار منطقی است که در صورت وجود باقیمانده در تقسیم مقدار 1 و در غیر این صورت صفر خواهد بود.
خروجی برنامه:
>>>
Enter day number: 366
Bad day number entered
in jalali calendar ----> 0 . 0
>>>
Enter day number: 56
in jalali calendar ----> 2 . 25
>>>
Enter day number: 323
in jalali calendar ----> 11 . 17
>>>
6-3 دستورات تکرار
حلقه while
اولین دستور تکرار یا حلقه while می باشد . به مثال زیر توجه کنید :
کد:
>>> omelet={“egg”:2,“mushroom”:5,“pepper”:1,“cheese”:1, “milk”:1}
>>> ingredients = omelet.keys()
>>> ingredients
[‘cheese’, ‘pepper’, ‘egg’, ‘milk’, ‘mushroom’]
>>> while len(ingredients) > 0:
... current = ingredients.pop()
... print “Adding %d %s to the mix” % (omelet[current],current)
...
Adding 5 mushroom to the mix
Adding 1 milk to the mix
Adding 2 egg to the mix
Adding 1 pepper to the mix
Adding 1 cheese to the mix
در این مثال ابتدا یک دیکشنری را تعریف می کنیم. سپس از طریق دستور ()keys کلید (اندیس) های دیکشنری را در متغییر دیگری به نام ingredients می ریزیم. و با وارد کردن نام آن محتویات متغیر را مشاهده می کنیم. (این نوع نمایش فقط در حالت محاوره ای عمل می کند ) سپس با استفاده از دستور while و تا زمانی که تعداد اعضای متغییر ingredients بزرگتر از صفر است وارد حلقه می شویم با دستور ()pop که یک عنصر را از لیست جدا کرده (حذف کرده) و بر می گرداند یکی یکی اعضا لیست ingredients که همان کلید های دیکشنری omelet هستند را در داخل متغییر current ریخته و در سطر بعدی چاپ می کنیم.
... for ... in
دستور بعدی برای حلقه ... for ... in می باشد. که شبیه به دستور while می باشد با این تفاوت که در این حالت نیازی به تعیین شرط پایان حلقه نبوده و در ضمن متغییری که به تک تک عناصر لیست اشاره می کند ایجاد می گردد که می توانید از آن در داخل حلقه استفاده کنید . معادل مثال بالا را با for به صورت زیر می باشد :
کد:
>>> for ingredient in omelet.keys():
... print “adding %d %s to the mix” % (omelet[ingredient],ingredient)
همانطور که مشاهده می کنید کد نوشته شده با for بسیار بهینه تر و کوتاهتر می باشد . منطق for در پایتون کمی متفاوت می باشد. که شما متغییر ( ingredient ) و یک لیست از عناصر ( ()omelet.keys ) می باشد که با عبارت کلیدی in از هم جدا شده اند. روند حلقه به این صورت است که متغییر تعریف شده به تک تک عناصر لیست اشاره خواهد کرد.
break
همانند زبانهای دیگر حلقه دارای دستوراتی برای جلوگیری از اجرای حلقه بدون تست شرط و نیز جلوگیری از اجرای بخشی از دستورات و تست دوباره شرط میباشد.
با استفاده از break می توانید بدون تست شرط حلقه را ترک کنید . و دستور continue از اجرای دستورات جلوگیری کردی مقدار متغیر را تغییر داده و شرط را بررسی میکند.
6-4 کنترل ترتیب ساختیافته4
برخلاف زبانهای دیگری چون C و Pascal که از علایم و عباراتی چون {} و begin,end و ... برای نمایش شروع و پایان یک قطعه کد استفده می کنند پایتون دارای علامت یا عبارت خاصی برای این منظور نمی باشد! و برای مشخص کردن محدوده یک قطعه کد (مثلا تابع ، دستورات شرطی ، حلقه ، کلاس و ... ) از فاصله گزاری اول دستورات استفاده میگردد. به این صورت که پس از خطی که بقیه دستورات زیر مجموعه آن میباشند به اندازه دلخواه فاصله یا تورفتگی داده میشود این فاصله های یکسان تا زمانی ادامه مییابد که محدوده دستور پایان یابد. که این روش باعث کاهش مقدار برنامه و خوانایی برنامه میشود.
از این روش در حالت معمول و برای خوانایی در زبانهای دیگر نیز استفاده میگردد و اکثر برنامه نویسان از تورفتگی کد برای افزایش خوانایی برنامه استفاده میکنند. پایتون با استفاده از این قابلیت هم مشکل خود را رفع کرده و هم الزامی برای رعایت این نظم و روند خاص برنامه نویسی بهره برده. به این ترتیب کد ها و برنامه های پایتون تقریبا استاندارد و ظاهر یکسانی را دارا می باشند. برای مثال به کد زیر دقت کنید. این کد شکل و منطق کلی دستور شرطی If در پایتون می باشد .
>>> name = 'python'
>>> lang = 'python'
>>> if lang == 'python':
... print 'You Are in right way !'
...
You Are in right way !
این یک مثال درست از قطعه کد می باشد . دستور چاپ دارای تورفتگی نسبت به دستور شرط می باشد . پس این دستور زیر مجموعه ای از شرط میباشد و در صورت درست بودن آن اجرا میگردد. اگر عبارت شرط حاوی دستورات بیشتری بود همه آن درست زیر دستور چاپ نوشته میشدند. در غیر اینصورت برنامه اجرا نشده و پیغام خطایی ظاهر میگردد. پس از تمام شدن قطعه کد باید دقیقا به زیر محل شروع شدن قطعه کد (در اینجا if) برگردید و ادامه برنامه رو دقیقا از زیر دستور اصلی قطعه کد ادامه بدهید.
در مثال بعدی یکی از دستورات داخل قطعه شرط (خط سوم) با دستور قبلی خود به اندازه یک فضای خالی فاصله دارد. برنامه اجرا نشده و با نمایش پیغامی محل وقوع خطا و نوع آن نمایش داده میشود.
>>> if lang == 'python':
... print 'You Are in right way !'
... print 'go on'
File "", line 3
print 'go on'
^
IndentationError: unindent does not match any outer indentation level
پس اگر حتی دستور سادهای چون دستور چاپ (print) را با فاصله (حتی یک فضای خالی) از سمت چپ بنویسید برنامه اجرا نخواهد شد. شاید این نوع خاص و منحصر به فرد در دفعات اول کمی سخت و تا حدودي مضحك بنظر آید اما یکی از مهمترین جنبه های پایتون می باشد که زیبایی خاصی به کد های نوشته شده میدهد و برنامه نویسی را لذت بخش و راحت میکند.
فصل هفت
7-1 حوزه ایستا و پویا5
منطق توابع در پایتون شبیه به دیگر زبانهای برنامه نویسی می باشد. برای تعریف یک تابع از کلمه کلیدی def استفاده میکنیم و سپس نام تابع را نوشته و نام پارامترها را در داخل پرانتز وارد میکنیم و با قرار دادن دو نقطه روی هم شروع به تایپ متن تابع میکنیم. در صورتی که اولین سطر بعدی یک رشته باشد این رشته به عنوان توضیحات کنار گذاشته میشود و شما میتوانید با متغیر __doc__ عضو کلاس تابع آن را مشاهده کنید .
کد:
def in_fridge ():
“””This is a function to see if the fridge has a food.
fridge has to be a dictionary defined outside of the function.
the food to be searched for is in the string wanted_food”””
try:
count = fridge[wanted_food]
except KeyError:
count = 0
return count
استفاده از اسامی یکسان در جاهای مختلف:
همانطور که در تابع تعریف شده بالا مشاهده میکنید دیکشنری fridge و رشته wanted_food در داخل تابع تعریف نشدهاند و از متغیرهای هم اسمی که در خارج محدوده تابع تعریف شدهاند استفاده میکنند. پایتون متن برنامه را به محدودهای مجزایی به نام scope تقسیم میکند. اسامی و scope که در همه نواحی و در کل برنامه قابل دسترسی می باشد با نام global یا سراسری شناخته می شود. همه اسامی دیگر در داخل توابع در یک سطح پایین تر به نام ناحیه local یا محلی قرار دارند. توابع این ناحیه را با توابعی که در سطح یکسان هستند به اشتراک نمی گزارند. و هر کدام یک ناحیه کاری مجزا دارند. هر نامی در ناحیه بالاتر قابل استفاده در ناحیه پایین تر می باشد با این توضیح که این استفاده فقط مقداری می باشد (نه مرجعی ) یعنی دستورات ناحیه کاری پایین تر نمی توانند تغییری در آنها اعمال کنند و فقط به یک کپی از آنها دسترسی دارند. به مثال زیر توجه کنید .
کد:
>>> special_sauce = [‘ketchup’, ‘mayonnaise’, ‘french dressing’]
>>> def make_new_sauce():
... “””This function makes a new special sauce all its own”””
... special_sauce = [“mustard”, “yogurt”]
... return special_sauce
...
یک لیست با نام special_sauce در ناحیه کاری بالا (top level) ایجاد گردیده است . و تابعی تعریف می شود که ناحیه کاری آن زیر مجموعه ناحیه کاریی می باشد که متغیر مورد نظر در آن تعریف شده است.
پس می توان از درون تابع make_new_sauce به یک کپی از متغییر special_sauce دسترسی داشت. در داخل این تابع متغییری هم اسم با متغیر تعریف شده در سطح بالاتر (global) را تعریف می کنیم و مقداری متفاوت با آنچه قبلا تعریف شده را به آن میدهیم. و آن را با دستور return بر می گردانیم. زمانی که این دستورات اجرا شوند مشاهده خواهیم کرد که مقدار متغیر تعریف شده در ناحیه سراسری بدون تغییر می ماند .
کد:
>>> print “%s” % special_sauce
[‘ketchup’, ‘mayonnaise’, ‘french dressing’]
>>> new_sauce = make_new_sauce()
>>> print special_sauce
[‘ketchup’, ‘mayonnaise’, ‘french dressing’]
>>> print new_sauce
[‘mustard’, ‘yogurt’]
ابتدا مقدار متغییر special_sauce چاپ کرده و سپس یک متغییر جدید و با استفده از تابع تعریف شده ایجاد می کنیم سپس دوباره محتویات متغییر اصلی را نمایش می دهیم (بدون تغییر می باشد ) و در نهایت متغییر جدید را چاپ می کنیم.
7-2 پارامترها و انتقال پارامترها3
می توان متغیرها را به تابع ارسال کنیم.
کد:
def in_fridge(some_fridge, desired_item):
try:
count = some_fridge[desired_item]
except KeyError:
count = 0
return count
این تابع را در فایلی با نام func1.py ذخیره کرده و با دستور python -i func1.py اجرا کرده و وارد حالت محاوره ای شوید .
کد:
>>> fridge = {‘apples’:10, ‘oranges’:3, ‘milk’:2}
>>> wanted_food = “oranges”
>>> in_fridge(fridge, wanted_food)
3
مقدار دهی پیش فرض پارامتر ها:
در هنگام فراخوانی تابع باید به هر پارامتر آن یک مقدار نسبت داد (فرستاد). و در صورتی که مقداری به یک پارامتر فرستاده نشود باعث بروز خطای برنامه نویسی خواهد شد. برای جلوگیری از این حالت پایتون شما را قادر میسازد تا برای پارمترها تابع خود مقدار پیش فرض نسبت دهید. این کار را میتوان در هنگام تعریف تابع و با نسبت دادن مقدار پیش فرض بوسیله علامت تساوی به نام پارامتر انجام داد.
کد:
def make_omelet2(omelet_type = “cheese”):
حال می توان این تابع را با ورودی یا بدون ورودی فراخوانی کرد.
تابع در داخل تابع:
می توان تابعی را درون تابع تعریف کرد. زمانی که می خواهیم تابعی بزگتر و پیچیده را به بخشهایی کوچکتر تقسیم کنیم می توان هر یک از این بخشها را به عنوان یک تابع درون تابع اصلی تعریف کرد. که در این حالت نحوه تعریف همانند تعریف تابع معمولی میباشد. با این تفاوت که از بیرون تابع اصلی نمی توان به توابع عضو دسترسی داشت.
منابع
1 - T. W. Pratt, Programming languages and Implementation, 4th Edition, Prentice
Hall, 2001
2- سایت رسمی پایتون
3- سایت فارسی آموزش زبان پایتون
4- http://www.pylearn.com
5- نسخهی برخط کتاب شیرجه داخل پایتون (Dive into Python)
6- an open source license(PEP 8 - Style Guide for Python Code)
7- http://www.tux-world.com
8- Official Python Website
+ نوشته شده در دوشنبه بیست و پنجم آذر ۱۳۹۲ ساعت 14:8 توسط
|