آموزش برنامه نویسی

به روز ترین مطالب آموزشی و متدلوژی های برنامه نویسی

آموزش برنامه نویسی

به روز ترین مطالب آموزشی و متدلوژی های برنامه نویسی

آموزشگاه تحلیل داده فعالیت رسمی خود را از سال 1380 در قالب آموزشگاه تخصصی نرم افزار آغاز نموده. این موسسه از همان ابتدای تأسیس با بهره مندی از استاید حرفه ای رشته های نرم افزار و بانک های اطلاعاتی ، فعالیت تخصصی خود را در زمینه آموزش برنامه نویسی و بانک های اطلاعاتی آغاز نمود و پس از گذشت اندک زمانی توانست در زمینه نرم افزار و شبکه بعنوان یکی از حرفه ای ترین موسسات ایران ظاهر شود. با توجه به اینکه مدیریت آموزشگاه شخصاً در رشته نرم افزار تحصیل کرده و سابقه طولانی در تحلیل و طراحی و پیاده سازی نرم افزار و بانک های اطلاعاتی دارند ، خط مشی کلی موسسه بر مبنای آموزش پایه ای ، کاربردی ، عملی و تخصصی نرم افزار بنا شده است.


آدرس : خیابان شریعتی بالاتر از ملک جنب بانک صادرات طبقه دوم واحد 7
همراه: 09123840871 تلفن: 88146323 - 88146330

۲۷ مطلب با موضوع «آموزش پایتون» ثبت شده است

  • ۰
  • ۰

 

آموزش سی شارپ
آموزش سی شارپ

 

آیا زبان برنامه نویسی سی شارپ ارزش یادگیری در سال 2022 را دارد؟ زبان C# در هر پلتفرمی از جمله دسکتاپ، آنلاین، فناوری های آینده، بازی ها و خدمات ادغام شده است. بنابراین، قطعاً باید همین الان سی شارپ را مطالعه کنید، زیرا بهترین شانس ورود به بازار کار را به شما می دهد و همچنان که در حرفه خود پیشرفت می کنید، شما را فعال نگه می دارد.

زبان C# در سال 2022 ارزش یادگیری را دارد زیرا این زبان برنامه نویسی اصلی است که به هر زبان برنامه نویسی سطح بالاتر کمک می کند. نه تنها از سی شارپ می توان برای ساخت برنامه های کاربردی ویندوز استفاده کرد، بلکه می توانیم برنامه هایی بسازیم که سیستم عامل های لینوکس، MacOS، iOS و Android را هدف قرار دهند.

اگر قبلاً در زمینه برنامه نویسی پیشینه دارید، می توانید انتظار داشته باشید که بین 2 تا 3 ماه زمان برای یادگیری اصول برنامه نویسی سی شارپ داشته باشید. از سوی دیگر، ایجاد مهارت ها و دانش مورد نیاز برای به دست آوردن شغل به عنوان یک توسعه دهنده، حدود 1 تا 2 سال تمرین نیاز خواهد داشت.

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

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

بر اساس شاخص TIOBE، تا زمان نگارش این مقاله، سی شارپ به عنوان پنجمین زبان برنامه نویسی محبوب جهان در رتبه بندی قرار گرفته است. این میزان فقط کمی کمتر از پسرعمویش C++ است که C# تا حدی از آن مشتق شده است. جاوا که شباهت های زیادی به سی شارپ دارد، در جایگاه سوم قرار دارد، درست پس از قدرتمندترین پایتون و سی.

زبان های برنامه نویسی سی شارپ

C#- تلفظ سی شارپ - یک زبان برنامه نویسی همه منظوره، سطح متوسط و شی گرا است که در سال 2000 توسط مایکروسافت ایجاد شد. C# توسط Anders Hejilsbergطراحی شده است تا بخشی از ابتکار .Netباشد. نسخه فعلی آن 9.0 است که به عنوان بخشی از .NET 5.0 در سال 2020 منتشر شد. در ابتدا قرار بود این زبان Cool نامیده شود که مخفف زبان شی گرا شبیه به C است. این زبان شباهت هایی با زبان های دیگر از جمله C، C++، و شاید بحث برانگیزترین، جاوا دارد.

سی شارپ به نحوی مشابه سایر زبان‌های نوع Cمتکی است و از قوانین نحوی آشنا مانند استفاده از نقطه ویرگول برای عبارات پایانی، پرانتزهای فرفری برای عبارات گروهی، براکت‌های مربع برای اعلام (و دریافت داده‌ها از) آرایه‌ها و استفاده از علامت تساوی (=) استفاده می‌کند.

چه نرم افزاری می توانید با آن بسازید؟

سی شارپ یک زبان برنامه نویسی انعطاف پذیر است که توسعه دهندگان می توانند تقریباً برای هر نوع نرم افزار یا برنامه ای که می توانید تصور کنید از آن استفاده کنند. این زبان، مانند همه زبان‌های کدنویسی، مزایا و معایب خود را دارد و به همین دلیل، بخش‌های خاصی وجود دارد که C# در آنها پیشرفت می‌کند و نقاط ضعف خود را نشان می‌دهد.

یکی از کاربردهای بسیار محبوب سی شارپ در توسعه بازی های ویدیویی هم برای رایانه های شخصی و هم برای کنسول های بازی ویدیویی است. در واقع این زبان انتخابی واقعی برای توسعه دهندگان بازی است. بخشی از جذابیت در این عرصه به این موضوع مربوط می شود که موتور بازی یونیتی بر روی C++ و C# ساخته شده است. به همین دلیل، سی شارپ کاملاً با موتور بازی ادغام می‌شود، موتوری که برای ساخت بسیاری از برترین بازی‌های ویدیویی در جهان امروز استفاده می‌شود.

از آنجایی که سی شارپ بسیار شبیه به C++ است، آموزش C++ را برای برنامه نویسان بازیهای کامپیوتری آسان‌تر می‌کند، زبان دیگری که در جامعه گیمرها بزرگ است. بازی‌هایی که می‌توانید در سی شارپ ایجاد کنید، از پلتفرم‌ها، اسکرول‌های جانبی، بازی‌های RPG، واقعیت تغییریافته (AR)، واقعیت مجازی (VR) و همچنین بازی‌های موبایل. البته، تا حد زیادی به لطف چارچوب دات نت، برنامه های کاربردی وب حوزه دیگری هستند که C# در آن برتری دارد. در صورت تمایل می توانید از چارچوب دات نت یا از یک پلت فرم منبع باز استفاده کنید.

نوشتن برنامه های دسکتاپ یکی دیگر از نقاط قوت زبان برنامه نویسی سی شارپ هستند. به لطف کد کارآمد، مقیاس پذیری و این واقعیت که نگهداری از آن بسیار آسان است، سی شارپ یک انتخاب عالی برای ایجاد برنامه های کاربردی در آن است. در واقع، برخی از بزرگترین نام های فناوری با استفاده از این زبان ایجاد شده اند، از جمله Adobe Photoshop. Mozilla Firefox، MySQL Server و Thunderbird.

معایب برنامه نویسی سی شارپ

مانند هر زبان برنامه نویسی، سی شارپ هم خالی از اشکال نیست. بسیاری از مشکلاتی که مهندسان نرم‌افزار با سی شارپ دارند، مربوط به اولویت‌های شخصی است، مانند مشکلاتی که در مورد شی گرا بودن آن بسیار زیاد است. برخی دیگر C# را از نظر استانداردهای کدنویسی و بهترین شیوه‌ها کمی سنگین و سخت‌گیرانه می‌دانند.

سی شارپ نیز در گذشته تا حد زیادی به چارچوب دات نت متکی بود و برنامه های ساخته شده با زبان برنامه نویسی واقعاً برای آن پلتفرم یا برای اجرا در محیط ویندوز در نظر گرفته شده بودند. این امر باعث می‌شود از برخی جهات دسترسی به بازارتان را کمی محدود کنید. سی شارپ اکنون روی مک و لینوکس نیز اجرا می‌شود، بنابراین دیگر چنین مشکلی وجود ندارد. شکایت دیگر در مورد سی شارپ این است که بارگذاری آن کند است؛ هر تغییری در کد سی شارپ شما نیاز به کامپایل مجدد دارد که ممکن است کمی دردسرساز باشد.

آینده زبان برنامه نویسی سی شارپ

در حالی که سی شارپ پرکاربردترین زبان روی کره زمین نیست، اما همچنان از طرفداران زیادی برخوردار است که به طور مداوم در 20 سال گذشته افزایش یافته است. نشانه هایی وجود دارد که نشان می دهد رشد این زبان تا حدودی متوقف شده است، اما کاهش واقعی نشان نداده است.

به لطف آن، محبوبیت آن در محافل بازی، و سرمایه گذاری آن در توسعه موبایل و برنامه های وب، C# بعید است به این زودی ها به جایی برسد. چه زبان C# را به عنوان زبان اصلی خود یاد بگیرید یا به عنوان زبان دوم (یا سوم) توسعه دهنده، واقعاً اشتباه نکرده اید.

  • افشین رفوآ
  • ۰
  • ۰

 

آموزش ماشین لرنینگ
آموزش ماشین لرنینگ

 

سیستم‌های محاسباتی که به نظر می‌رسد فعالیت‌هایی شبیه مغز ایجاد می‌کنند، ممکن است نتیجه هدایت محققان به سمت یک نتیجه خاص باشد. شبکه‌های عصبی، نوعی از سیستم محاسباتی که بر اساس سازمان‌دهی مغز انسان مدل‌سازی شده‌اند، اساس بسیاری از سیستم‌های هوش مصنوعی را برای کاربردهایی مانند تشخیص گفتار، بینایی رایانه و تجزیه و تحلیل تصویر پزشکی تشکیل می‌دهند.

در زمینه علوم اعصاب، محققان اغلب از شبکه‌های عصبی استفاده می‌کنند تا سعی کنند همان نوع وظایفی را که مغز انجام می‌دهد مدل‌سازی کنند، به این امید که مدل‌ها بتوانند فرضیه‌های جدیدی را در رابطه با نحوه انجام آن وظایف توسط مغز ارائه دهند. با این حال، گروهی از محققان MITتاکید می کنند که در تفسیر این مدل ها باید احتیاط بیشتری کرد. شما باید بدانید که پیش از هر چیز نیاز به داشتن دانش اصولی در زمینه ماشین لرنینگ ، زبان پایتون و کتابخانه هایی دارید مانند تنسرفلو که در زمینه هوش مصنوعی مورد استفاده قرار می گیرند.

در تجزیه و تحلیل بیش از 11000 شبکه عصبی که برای شبیه‌سازی عملکرد سلول‌های شبکه - اجزای کلیدی سیستم ناوبری مغز - آموزش دیده بودند، دریافتند که شبکه‌های عصبی تنها زمانی فعالیت سلول‌های شبکه‌ای تولید می‌کنند که محدودیت‌های بسیار خاصی به آنها داده شود که در سیستم های بیولوژیکی یافت نمی شوند. تیم MIT دریافت که تعداد بسیار کمی از شبکه‌های عصبی فعالیت‌های شبکه‌ای سلول‌مانند را ایجاد می‌کنند، که نشان می‌دهد این مدل‌ها لزوماً پیش‌بینی‌های مفیدی درباره نحوه عملکرد مغز ایجاد نمی‌کنند.

شفر، که اکنون دانشجوی کارشناسی ارشد علوم کامپیوتر در دانشگاه استنفورد است، نویسنده اصلی این مطالعه جدید است که در کنفرانس 2022 سیستم های پردازش اطلاعات عصبی ارائه خواهد شد. ایلا فیته، استاد علوم مغز و عصب شناسی و عضو موسسه تحقیقات مغز مک گاورن MIT، نویسنده ارشد این مقاله است. میکائیل خونا، دانشجوی کارشناسی ارشد MITدر رشته فیزیک، نیز عضو نویسندگان است.

مدل سازی سلول های شبکه

شبکه های عصبی، که محققان برای چندین دهه از آن برای انجام انواع وظایف محاسباتی استفاده می کنند، از هزاران یا میلیون ها واحد پردازشی متصل به یکدیگر تشکیل شده است. هر گره دارای اتصالاتی با نقاط قوت متفاوت با گره های دیگر در شبکه است. همانطور که شبکه مقادیر عظیمی از داده ها را تجزیه و تحلیل می کند، نقاط قوت آن اتصالات تغییر می کند زیرا شبکه انجام وظیفه مورد نظر را یاد می گیرد.

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

طبق تحقیقات نشان داده شده است که سلول‌های مکانی هر زمان که یک حیوان در یک مکان خاص باشد شلیک می‌کنند و هر سلول مکانی ممکن است به بیش از یک مکان پاسخ دهد. از طرف دیگر سلول های شبکه ای بسیار متفاوت عمل می نمایند. هنگامی که یک حیوان در فضایی مانند اتاق حرکت می کند، سلول های شبکه تنها زمانی شلیک می کنند که حیوان در یکی از رئوس یک شبکه مثلثی باشد.

گروه های مختلف سلول های شبکه؛ شبکه هایی با ابعاد کمی متفاوت ایجاد می کنند که روی یکدیگر همپوشانی دارند. این مسئله به سلول های شبکه اجازه می دهد تا با استفاده از تعداد نسبتاً کمی سلول، تعداد زیادی موقعیت منحصر به فرد را رمزگذاری کنند. این نوع رمزگذاری مکان همچنین امکان پیش بینی مکان بعدی حیوان را بر اساس یک نقطه شروع و یک سرعت مشخص می کند. در چندین مطالعه اخیر، محققان شبکه های عصبی را برای انجام همین کار، که به عنوان یکپارچه سازی مسیر شناخته می شود، آموزش داده اند.

برای آموزش شبکه های عصبی برای انجام این کار، محققان نقطه شروع و سرعتی را که در طول زمان تغییر می کند به آن وارد می کنند. این مدل اساساً فعالیت یک حیوان در حال پرسه زدن در یک فضا را تقلید می کند و موقعیت های به روز شده را هنگام حرکت محاسبه می کند. همانطور که مدل کار را انجام می دهد، الگوهای فعالیت واحدهای مختلف در شبکه قابل اندازه گیری است. فعالیت هر واحد را می توان به عنوان یک الگوی شلیک، شبیه به الگوهای شلیک سلول های عصبی در مغز نشان داد.

در چندین مطالعه قبلی، محققان گزارش کرده‌اند که مدل‌های آن‌ها واحدهایی با الگوهای فعالیت تولید می‌کنند که الگوهای شلیک سلول‌های شبکه‌ای را از نزدیک تقلید می‌کنند. این مطالعات به این نتیجه رسیدند که نمایش های شبکه مانند سلول به طور طبیعی در هر شبکه عصبی آموزش دیده برای انجام وظیفه یکپارچه سازی مسیر ظاهر می شوند.

با این حال، محققان MIT به نتایج بسیار متفاوتی دست یافتند. در تجزیه و تحلیل بیش از 11000 شبکه عصبی که در مورد یکپارچه سازی مسیر آموزش داده بودند، دریافتند که در حالی که تقریبا 90 درصد از آنها این کار را با موفقیت یاد گرفته اند، تنها حدود 10 درصد از آن شبکه ها الگوهای فعالیتی را تولید می کنند که می تواند به عنوان سلول-شبکه طبقه بندی شود. این مورد شامل شبکه‌هایی می‌شود که در آن‌ها حتی تنها یک واحد امتیاز شبکه بالایی را به دست آورده است.

به گفته تیم MIT، احتمالاً مطالعات قبلی تنها به دلیل محدودیت‌هایی که محققان در آن مدل‌ها ایجاد می‌کنند، فعالیت‌هایی شبیه سلول شبکه ایجاد می‌کنند.

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

مدل های بیولوژیکی بیشتر

یکی از محدودیت‌هایی که در مطالعات قبلی یافت شد این است که محققان از مدل خواسته بودند تا سرعت را به یک موقعیت منحصربه‌فرد تبدیل کند که توسط یک واحد شبکه که مربوط به یک سلول مکانی گزارش شده است. برای اینکه این اتفاق بیفتد، محققان همچنین نیاز داشتند که هر سلول مکانی فقط با یک مکان مطابقت داشته باشد، که نحوه عملکرد سلول های مکان بیولوژیکی نیست: مطالعات نشان داده اند که سلول های مکانی در هیپوکامپ می توانند به 20 مکان مختلف پاسخ دهند، نه فقط یک مکان.

وقتی تیم MIT مدل‌ها را طوری تنظیم کرد که سلول‌های مکانی بیشتر شبیه سلول‌های مکان بیولوژیکی باشند، مدل‌ها همچنان می‌توانستند وظیفه یکپارچه‌سازی مسیر را انجام دهند، اما دیگر فعالیت سلول‌های شبکه‌ای تولید نمی‌کردند. فعالیت شبه سلول‌های شبکه‌ای نیز زمانی ناپدید شد که محققان به مدل‌ها دستور دادند تا انواع مختلفی از خروجی مکان را تولید کنند، مانند موقعیت مکانی روی یک شبکه با محورهای Xو Y یا مکان به عنوان فاصله و زاویه نسبت به یک نقطه اصلی.

فیتی می‌گوید: «اگر تنها کاری که از این شبکه می‌خواهید انجام دهد یکپارچه‌سازی مسیر است، و مجموعه‌ای از الزامات بسیار خاص و نه فیزیولوژیکی را بر واحد بازخوانی تحمیل می‌کنید، در این صورت می‌توانید سلول‌های شبکه را به دست آورید. اما اگر هر یک از این جنبه‌های این واحد بازخوانی را آرام کنید، به شدت توانایی شبکه برای تولید سلول‌های شبکه را کاهش می‌دهد. در واقع، معمولاً این کار را نمی‌کنند، حتی اگر هنوز وظیفه یکپارچه‌سازی مسیر را حل می‌کنند.»

بنابراین، اگر محققان قبلاً از وجود سلول‌های شبکه‌ای اطلاع نداشتند و مدل را برای تولید آنها راهنمایی نمی‌کردند، بسیار بعید بود که آنها به عنوان یک پیامد طبیعی آموزش مدل ظاهر شوند. محققان می گویند که یافته های آنها نشان می دهد که هنگام تفسیر مدل های شبکه عصبی مغز، احتیاط بیشتری لازم است.

وقتی از مدل‌های یادگیری عمیق (deep learning) استفاده می کنید، آنها می‌توانند ابزار قدرتمندی باشند، اما باید در تفسیر آنها و تعیین اینکه آیا واقعاً پیش‌بینی‌های جدید انجام می‌دهند یا حتی به آنچه که مغز در حال بهینه‌سازی است، بسیار محتاط بود. کنت هریس، استاد علوم اعصاب کمی در دانشگاه کالج لندن، می‌گوید امیدوار است این مطالعه جدید دانشمندان علوم اعصاب را تشویق کند که در بیان آنچه می‌توانند با تشابهات بین شبکه‌های عصبی و مغز نشان دهند، مراقب باشند.

شبکه های عصبی می توانند منبع مفیدی برای پیش بینی ها باشند. اگر می‌خواهید یاد بگیرید که چگونه مغز یک محاسبات را حل می‌کند، می‌توانید شبکه‌ای را برای انجام آن آموزش دهید، سپس این فرضیه را آزمایش کنید که مغز به همان روش کار می‌کند. هریس که در این مطالعه شرکت نداشت، می‌گوید چه این فرضیه تأیید شود یا نه، چیزی یاد خواهید گرفت. این مقاله نشان می‌دهد که «پیش‌بینی» قدرت کمتری دارد: شبکه‌های عصبی پارامترهای زیادی دارند، بنابراین واداشتن آنها به تکرار یک نتیجه موجود چندان تعجب‌آور نیست.

به گفته محققان MIT، هنگام استفاده از این مدل‌ها برای پیش‌بینی نحوه عملکرد مغز، مهم است که هنگام ساخت مدل‌ها، محدودیت‌های بیولوژیکی واقعی و شناخته شده را در نظر بگیریم. آنها اکنون روی مدل‌هایی از سلول‌های شبکه کار می‌کنند که امیدوارند پیش‌بینی‌های دقیق‌تری از نحوه عملکرد سلول‌های شبکه‌ای در مغز ایجاد کنند.

Khona می‌گوید: «مدل‌های یادگیری عمیق به ما بینشی در مورد مغز می‌دهند، اما تنها زمانی که دانش بیولوژیکی زیادی را به مدل تزریق کنید. اگر از محدودیت‌های صحیح استفاده کنید، مدل‌ها می‌توانند راه‌حلی شبیه به مغز به شما ارائه دهند.»

این تحقیق توسط دفتر تحقیقات نیروی دریایی، بنیاد ملی علوم، بنیاد سیمونز از طریق همکاری سیمونز بر روی مغز جهانی، و موسسه پزشکی هوارد هیوز از طریق برنامه دانش پژوهان دانشکده تامین شد.

  • افشین رفوآ
  • ۰
  • ۰

اگر شما نیز تمایل به حضور در یک آموزشگاه برنامه نویسی معتبر دارید و چشم انداز شغلی خود را یک برنامه نویس حرفه ای تصور کرده اید، به شما تبریک می گوییم!

شغل برنامه نویسی یکی از پر درآمدترین مشاغل در ایران و جهان می باشد. شما به راحتی از طریق تسلط داشتن به یکی از زبانهای برنامه نویسی می توانید از طریق جاب آفر اقدام به مهاجرت نمایید.

در هر سنی که هستید شروع یادگیری برنامه نویسی را شروع کنید. بسیاری از افرادی که وارد این حرفه شده و به صورت تخصصی پیش رفته اند از سنین پایین و یا سنین بسیار بالا بوده اند. حتی یک فرد هفتاد ساله و یا یک نوجوان 14 ساله هم می تواند در دوره های آموزش برنامه نویسی شرکت نماید.

اگر می خواهید کسب و کار خود را نیز رونق ببخشید می توانید وارد حوزه طراحی سایت، سئو و دیجیتال مارکتینگ شوید. در که این مباحث آموزش داده میشود ثبت نام نمایید و از طریق آموزش تجارت الکترونیک جایگاه شغل و حرفه خود را تثبیت نمایید.

اگر می خواهید در این حوزه به موفقیت دست پیدا نمایید ، انگیزه و تلاش بالا را فراموش نکنید. شما برای پیشرفته شدن در هر حرفه ای نیاز به شوق و اشتیاق نسبت به یادگیری و پشتکار و تلاش منظم دارید.

آموزشگاه برنامه نویسی

 

مباحث مورد بحث در آموزشگاه برنامه نویسی

  • افشین رفوآ
  • ۰
  • ۰

 

(برای دریافت جاب آفر یا پیشنهاد کاری، کارفرما باید تاییدیهLMIA را دریافت کنه)

 

LMIA

ثابت می کنه که هیچ فرد کانادایی برای شغل مورد نظر تایید نشده و نیروی کار خارجی برای پوزیشن شغلی مورد نظر در دسترس هست.

 

حقوق و درامد برنامه نویسی در کانادا

 

 

زبان های برنامه نویسی محبوب در کشور کانادا

  • JavaScript

  • Swift

  • Python

  • Java

  • C#

  • Ruby

  • PhP

 

مدارک و شرایط لازم برای کار در کانادا به عنوان برنامه نویس

  • سابقه کاری مناسب در زمینه برنامه نویسی

  • تسلط به دو زبان انگلیسی یا فرانسه

  • سن مناسب

  • تحصیلات اکادمیک در این زمینه

  • پیشنهاد شغلی از کانادا

 

سایت های معتبر کانادا برای یافتن کار به عنوان برنامه نویس

  • CareerBuilder

  • Robert Half

  • LinkedIn

  • Eluta

برنامه نویسی یکی از مهارتهای مورد نیاز در کشورهای پیشرفته و صنعتی هست که به راحتی می تونید از طریق اون مهاجرت کاری داشته باشید.

  • افشین رفوآ
  • ۰
  • ۰

امروز با مقاله دیگری از سری مقاله های آموزش پایتون همراه شما هستیم، در این مقاله میخواهیم سینتکس پایه پایتون را مورد بررسی قرار دهیم..

 

ساختار نگارشی پایه پایتون (basic syntax)

زبان پایتون شباهت های زیادی به زبان های Perl، C و Java دارد. با این حال، تفاوت های اساسی هم بین این زبان ها وجود دارد.

 

اولین برنامه ی پایتون

برنامه نویسی خود را از روش های زیر انجام می دهیم.

 

برنامه نویسی با فراخوانی مفسر

آموزش پایتون : اگر مفسر را بدون ارسال یک فایل اسکریپت به آن به عنوان پارامتر، صدا بزنید با prompt (کادری حاوی دستورات) زیر مواجه خواهید شد:

$ python

Python 2.4.3 (#1, Nov 11 2010, 13:34:43)

[GCC 4.1.2 20080704 (Red Hat 4.1.2-48)] on linux2

Type "help", "copyright", "credits" or "license" for more information.

>>>

دستور زیر را وارد کنید و کلید Enter را فشار دهید:

print "Hello, Python!"

در صورت استفاده از نسخه ی جدید پایتون، می بایست همراه با دستور Print از () استفاده کنید، بدین صورت: print ("Hello, Python!");. در ویرایش این زبان، نتیجه ی زیر حاصل می شود:

"Hello, Python!"                                                                                          

 

شناسه ها در پایتون

شناسه یا identifier یک اسم است که به منظور شناسایی متغیر، تابع، کلاس، ماژول یا دیگر اشیا به آن ها تخصیص داده می شود. شناسه با یک حرف از A تا Z (یا a تا z) یا زیرخط (_) آغاز شده و به دنبال آن یک یا چند صفر، حرف، زیرخط و عدد قرار می گیرد. استفاده از علائم نگارشی همچون @، $ و % در شناسه مجاز نمی باشد. پایتون یک زبان حساس به کوچک و بزرگی حروف است. از این رو، دو واژه ی Manpower و manpower دو شناسه ی کاملا متفاوت از یکدیگر هستند. قوانین نام گذاری توابع، متغیرها و اشیا در زیر فهرست شده:

  1. اسم کلاس ها با حرف بزرگ آغاز می شود. دیگر شناسه ها با حرف کوچک شروع می شود.

  2. آغاز کردن یک شناسه با زیرخط (_)، بیانگر این است که آن شناسه private می باشد.

  3. آغاز کردن یک شناسه با دو زیرخط نشانگر strongly private بودن آن شناسه است.

  4. اگر شناسه ای با دو زیرخط پشت سرهم پایان یابد، در آن صورت شناسه ی مورد نظر اسم خاص language defined می باشد.

 

کلمات رزرو شده

لیست زیر کلمات رزرو شده ی زبان پایتون را نمایش می دهد. این کلمات را نمی توان به عنوان اسم متغیر، ثابت (constant) یا هر چیز دیگر استفاده کرد. لازم به ذکر است که تمامی کلیدواژه های پایتون تماما با حروف کوچک نوشته می شوند.

 

 

خطوط فاصله و تورفتگی

آموزش پایتون از {} برای مشخص کردن قطعه کدهای تعریف کلاس، تابع یا جریان کنترل داده (flow control در ارتباطات داده‌ای، کنترل جریان یک فرایند مدیریت نرخ انتقال بین دو گره برای جلوگیری از ارسال از طرف فرستنده سریع به دریافت کننده کند است. کنترل جریان مکانیزمی را برای دریافت کننده جهت کنترل سرعت انتقال فراهم می‌کند.) استفاده نمی کند. قطعه کدها با استفاده از تورفتگی مشخص می شوند. از این رو در استفاده از آن بایستی بسیار دقیق بود. مقدار فضای خالی در تورفتگی ها متغیر است، اما تمامی دستورات درون قطعه کد بایستی به یک اندازه توگذاشته شوند. مثال:

if True:

print "True"

else:

print "False"

اما قطعه کد زیر خطا می دهد:

if True:

print "Answer"

print "True"

else:

print "Answer"

print "False"

بنابراین، در زبان پایتون تمامی خطاهای متوالی که به یک اندازه توگذاشته شده اند، در کل یک قطعه کد را تشکیل می دهند. اگر با دقت به مثال زیر دقت کنید، می بینید که چندین قطعه کد در آن وجود دارد:

#!/usr/bin/python

import sys

try:

# open file stream

file = open(file_name, "w")

except IOError:

print "There was an error writing to", file_name

sys.exit()

print "Enter '", file_finish,

print "' When finished"

while file_text != file_finish:

file_text = raw_input("Enter text: ")

if file_text == file_finish:

# close the file

file.close

break

file.write(file_text)

file.write("\n")

file.close()

file_name = raw_input("Enter filename: ")

if len(file_name) == 0:

print "Next time please enter something"

sys.exit()

try:

file = open(file_name, "r")

except IOError:

print "There was an error reading file"

sys.exit()

file_text = file.read()

file.close()

print file_text

 

دستورهای چندخطی

آموزش پایتون : دستورات پایتون معمولا به خط جدید ختم می شوند (یک خط تمام شده و خط دیگری شروع می شود). کاراکتر (\) در انتهای خط نشانگر ادامه ی دستور مورد نظر در خط دیگر است. مثال:

total = item_one + \

item_two + \

item_three

دستوراتی که داخل {}، [] یا () قرار می گیرند نیازی به کاراکتر (\) برای نشان دادن اینکه ادامه دستور در خط بعدی قرار گرفته، ندارد.

days = ['Monday', 'Tuesday', 'Wednesday',

'Thursday', 'Friday']

 

علامت نقل قول یا کوتیشن در پایتون

می توان در پایتون از تک کوتیشن (')، دابل کوتیشن (") و سه کوتیشن با هم (''' یا " " ") استفاده کرد. مقداری که درون این علامت ها قرار می گیرد، یک رشته ی نوشتاری (string literal) را تشکیل می دهد. بایستی دقت داشت که یک رشته با یک نوع کوتیشن آغاز شده و با همان نوع نیز پایان می یابد. از ''' یا " " " برای محصور کردن یک رشته که در چندین خط ادامه دارد استفاده می شود. تمامی نمونه های زیر مجاز و صحیح هستند:

word = 'word'

sentence = "This is a sentence."

paragraph = """This is a paragraph. It is

made up of multiple lines and sentences."""

 

(توضیحات) Comment در پایتون

علامت # اگر داخل کوتیشن محصور نباشد، نشانگر شروع comment خواهد بود. تمام کاراکترهایی که پس از # قرار می گیرند تا پایان آن خط بخشی از توضیح محسوب می شوند و مفسر پایتون آن ها را نادیده گرفته و اجرا نمی کند.

#!/usr/bin/python

# First comment

print "Hello, Python!" # second comment

 

خروجی کد بالا:

Hello, Python!

می توانید یک comment را درست بعد از یک دستور یا عبارت شروع کرد، بدین نحو:

name = "Madisetti" # This is again comment

می توانید چند خط را به صورت comment دربیاورید، بدین شکل:

# This is a comment.

# This is a comment, too.

# This is a comment, too.

# I said that already.

 

استفاده از خطوط تهی

خطی که چیزی به جز فضای خالی در آن بکار نرفته و احیانا دارای یک comment می باشد، درواقع یک خط تهی (blank space) محسوب می شود و مفسر پایتون آن را کاملا نادیده می گیرد. در یک session که برنامه نویس مستقیما با مفسر تعامل دارد، می بایست بین این دستور و دستور بعدی یک خط خالی فاصله بیاندازید.

 

منتظر کاربر بودن

خط زیر یک پنجره ی prompt حاوی دستور “Press the enter key to exit” نمایش می دهد و منتظر کاربر می ماند تا اقدامات لازم را انجام دهد:

#!/usr/bin/python

raw_input("\n\nPress the enter key to exit.")

در اینجا، دستور "\n\n" دو خط جدید ایجاد کرده، سپس خود خط را نمایش می دهد. پس از اینکه کاربر کلید Enter را فشار می دهد، برنامه پایان می یابد. با این روش می توان پنجره ی console را تا زمانی که کاربر کارش با برنامه تمام نشده، باز نگه داشت.

 

چندین دستور در یک خط

آموزش پایتون : با استفاده از نقطه ویرگول (;) می توان چندین دستور را در یک خط واحد جای داد، لازم به ذکر است هیچ یک از دستورات مزبور یک قطعه کد مجزا را تشکیل نمی دهد. در زیر یک تکه کدی را مشاهده می کنید که از نقطه ویرگول در آن استفاده شده است:

import sys; x = 'foo'; sys.stdout.write(x + '\n')

 

مجموعه دستورات در پایتون

یک گروه از دستورات منفرد، که در مجموع یک قطعه کد مجزا را تشکیل می دهند در زبان پایتون به اصطلاح suite اطلاق می گردند. دستورات مرکب نظیر if، while، def و class نیازمند یک خط سرآیند (header line) و یک suiteهستند. خطوط سرآیند (header) با یک دستور (یک کلیدواژه) آغاز می شود و با یک دونقطه (:) به پایان می رسد، همچنین به دنبال آن یک یا چندین خط قرار می گیرد که suite (مجموعه دستور) را تشکیل می دهد. نمونه:

if expression :

suite

elif expression :

suite

else :

suite

 

آرگومان های خط فرمان (command-line arguments)

بسیاری از دستورات را می توان اجرا کرد تا اطلاعات ابتدایی دررابطه با نحوه ی اجرای برنامه در اختیار شما قرار دهد. پایتون با فراهم نمودن دستور –h، این امکان را به شما می دهد:

$ python -h

usage: python [option] ... [-c cmd | -m mod | file | -] [arg] ...

Options and arguments (and corresponding environment variables):

-c cmd : program passed in as string (terminates option list)

-d : debug output from parser (also PYTHONDEBUG=x)

-E : ignore environment variables (such as PYTHONPATH)

-h : print this help message and exit

[ etc. ]

آموزش پایتون ادامه دارد

  • افشین رفوآ
  • ۰
  • ۰

امروز با مقاله دیگری از سری مقاله های آموزش پایتون همراه شما هستیم، در این مقاله میخواهیم چگونگی افزونه نویسی در پایتون به کمک کدهای زبان C را مورد بررسی قرار دهیم..

به منظور نوشتن افزونه های اختصاصی جهت استفاده در اسکریپت های پایتون و اپلیکیشن های خود، لازم است به فایل های header پایتون دسترسی داشته باشید.در دستگاه هایی که سیستم عامل Unix بر روی آن نصب است، می بایست یک پکیج مختص توسعه دهنده (developer-specific) نظیر python2.5-dev را نصب نمایید.

کاربران ویندوز این فایل های header را به هنگام استفاده از binary Python installer به صورت یک پکیج دریافت می کنند. علاوه بر آن، برای درک مفاهیم این مبحث و نوشتن افزونه های اختصاصی خود جهت استفاده در اسکریپت های پایتون، لازم است آشنایی در سطح پیشرفته با زبان های C یا ++C داشته باشید.

 

آموزش Python : اولین نمونه از افزونه اختصاصی Python

کد ماژول و افزونه های پایتون، بایستی مانند زیر در چهار بخش سازمان دهی شود:

  • فایل header با اسم و پسوند Python.h.
  • توابع C که می خواهید به عنوان interface و الگوی پیاده سازی ماژول اختصاصی خود در اختیار توسعه دهنده قرار دهید.
  • یک جدول که اسم توابع اختصاصی شما را به توابع C داخل افزونه (کتابخانه یا ماژول) نگاشت می کند (method mapping table).
  • یک تابع سازنده جهت مقداردهی اولیه و نمونه سازی از کلاس (initialization function).

 

فایل Python.h

لازم است فایل Python.h را داخل فایلی که کدهای C شما را دربرمی گیرد (source file) قید نمایید. بدین وسیله شما به توابع کتابخانه ای درون ساخته ی پایتون (internal Python API) که برای ادغام و معرفی ماژول مورد نظر در interpreter (hook کردن کد ماژول شما در مفسر) بکار می رود، دسترسی خواهید داشت. لازم است Python.h را قبل از هر فایل header مورد نیاز دیگری لحاظ نمایید.

 

توابع C

اسم متد، نوع و تعداد پارامترهای ورودی (Signature) توابع اختصاصی شما و پیاده سازی آن، بایستی بر اساس یکی از الگوهای زیر انجام شود:

static PyObject *MyFunction( PyObject *self, PyObject *args );
static PyObject *MyFunctionWithKeywords(PyObject *self,
                                 PyObject *args,
                                 PyObject *kw);
static PyObject *MyFunctionWithNoArgs( PyObject *self );

هر یک از متدهای اعلان شده ی فوق، در خروجی خود یک آبجکت Python برمی گرداند. در پایتون مفهومی به نام تابع void (تابعی که خروجی ندارد یا مقداری را برنمی گرداند) وجود ندارد. اگر شما نمی خواهید که توابع مقدار خروجی داشته باشند، لازم است مقدار None را بازگردانی نمایید. header های پایتون یک macro (خط دستور) به نام Py_RETURN_NONE در خود به صورت از پیش تعریف شده دارند که این کار را انجام می دهند.

از آنجایی که اسم توابع C هیچگاه خارج از ماژول/افزونه قابل مشاهده و دسترسی نیستند، شما می توانید هر اسمی برای متدهای اختصاصی خود انتخاب کنید. لازم به ذکر است که این توابع با کلیدواژه ی static تعریف می شوند. اسم توابع C معمولا از ترکیبی از اسم ماژول و متد مورد نظر تشکیل می شود. در زیر نمونه ای را مشاهده می کنید:

static PyObject *module_func(PyObject *self, PyObject *args) {
   /* Do your stuff here. */
   Py_RETURN_NONE;
}

کد حاضر یک تابع Python به نام func را تعریف می کند که داخل افزونه ی module کپسوله سازی شده است. حال شما به این توابع C داخل جدول نگاشت متد (method table) Pointer و اشاره گر تعریف می کنید که در بخش بعدی کد برنامه ی شما انجام می شود.

 

آموزش برنامه نویسی پایتون : جدول نگاشت توابع

این جدول نگاشت متد (method table) یک آرایه ی ساده از structure های PyMethodDef است (PyMethodDef یک مدل برای تعریف متد است). این structure ساختاری مشابه زیر دارد:

struct PyMethodDef {
   char *ml_name;
   PyCFunction ml_meth;
   int ml_flags;
   char *ml_doc;
};

در زیر هر یک از اعضای این ساختار شرح داده اند:

  • فیلد ml_name : اسم تابع پایتون.
  • فیلد ml_meth : آدرس تابعی که هر یک از signature های نام برده در بخش قبلی را دارا می باشد.
  • فیلد ml_flags : این فیلد به مفسر پایتون اعلان می کند که فیلد دوم (ml_meth) کدام یک از signature های نام برده را اتخاذ می کند :
  1. این flag معمولا مقداری از METH_VARARGS دارد.
  2. اگر می خواهید آرگومان های کلیدواژه ای را در تابع تزریق نمایید، این flag می تواند OR بیتی با METH_KEYWORDS را شامل شود.
  3. این flag همچنین می تواند مقدار METH_NOARGS را داشته باشد، بدین معنی که هیچ پارامتری به تابع فرستاده نمی شود.
  • فیلد ml_doc : این docstring (رشته یا comment ای که توضیحی درباره ی کارایی تابع می دهد) تابع است. اگر برنامه نویس comment ای برای تابع تنظیم نکند، در آن صورت مقدار آن NULL خواهد بود.

این جدول بایستی با یک sentinel که از NULL و 0 برای اعضای مرتبط تشکیل شده، خاتمه یابد.

 

مثال :

برای متد اعلان شده در بالا، از جدول نگاشت تابع (method mapping table) زیر استفاده می کنیم:

static PyMethodDef module_methods[ ] = {
   { "func", (PyCFunction)module_func, METH_NOARGS, NULL },
   { NULL, NULL, 0, NULL }
};

 

آموزش زبان پایتون : تابع مقداردهی اولیه (initModule)

آخرین بخش ماژول یا افزونه ی اختصاصی شما بایستی تابع مقداردهنده ی اولیه (initialization function) را شامل شود. این تابع را مفسر پایتون زمانی که ماژول در حافظه بارگذاری می شود، فرامی خواند. لازم است اسم این تابع initModule انتخاب شود (Module اسم ماژول و init اسم خود تابع می باشد).

تابع مقداردهنده ی اولیه بایستی از کتابخانه که می نویسید export و خروجی گرفته شده باشد. header های Python با اعلان دستور PyMODINIT_FUNC امکان انجام این کار را در محیطی که اسکریپت ها در آن کامپایل می شوند را فراهم می آورد. کافی است به هنگام تعریف تابع مورد نظر از آن استفاده نمایید.

تابع مقداردهنده ی اولیه ی زبان C شما دارای ساختار کلی زیر می باشد:

PyMODINIT_FUNC initModule() {
   Py_InitModule3(func, module_methods, "docstring...");
}

در زیر شرح هر یک از پارامترهای تابع Py_InitModule3 را به تفصیل مشاهده می کنید:

  • پارامتر func : تابعی است که قرار است export و به اصطلاح خروجی گرفته شود.
  • پارامتر module_methods : اسم جدول نگاشت تابع (mapping table) که در بالا به آن اشاره شد.
  • پارامتر docstring : این پارامتر همان رشته ی متنی و comment ای است که جهت ارائه ی توضیح درباره ی قابلیت تابع در افزونه ی اختصاصی درج می شود.

در زیر تمامی بخش های تشکیل دهنده یک افزونه استاندارد را یکجا مشاهده می کنید:

#include < python.h>
static PyObject *module_func(PyObject *self, PyObject *args) {
   /* Do your stuff here. */
   Py_RETURN_NONE;
}
static PyMethodDef module_methods[ ] = {
   { "func", (PyCFunction)module_func, METH_NOARGS, NULL },
   { NULL, NULL, 0, NULL }
};
PyMODINIT_FUNC initModule() {
   Py_InitModule3(func, module_methods, "docstring...");
}
< /python.h>

 

مثال :

نمونه کاربردی که کلیه مفاهیم فوق را به صورت عملی بکار می برد را در زیر مشاهده می کنید:

#include < python.h>
static PyObject* helloworld(PyObject* self)
{
    return Py_BuildValue("s", "Hello, Python extensions!!");
}
static char helloworld_docs[ ] =
    "helloworld( ): Any message you want to put here!!\n"
static PyMethodDef helloworld_funcs[ ] = {
    {"helloworld", (PyCFunction)helloworld, 
     METH_NOARGS, helloworld_docs},
    {NULL}
};
void inithelloworld(void)
{
    Py_InitModule3("helloworld", helloworld_funcs,
                   "Extension module example!");
}
< /python.h>

دستور Py_BuildValue در مثال بالا، یک مقدار Python را build یا کامپایل می کند. کد مورد نظر را داخل فایل hello.c ذخیره نمایید. در زیر با نحوه ی کامپایل و نصب ماژول که از اسکریپت پایتون فراخوانی می شود، را خواهید آموخت.

 

کامپایل و نصب افزونه ها (build)

پکیج distutils توزیع و نصب ماژول های پایتون، خواه ماژول های اصلی و خالص خود پایوتن باشد خواه ماژول های اختصاصی و تنظیم شده توسط توسعه دهنده، را با روشی استاندارد بسیار آسان می سازد. ماژول ها در همان قالب اولیه (source form) توزیع شده و در اختیار برنامه نویس قرار می گیرد. برنامه نویس سپس ماژول مورد نظر را با فراخوانی اسکریپت نصب (setup script) به نام setup.py ، نصب می نماید.

جهت نصب ماژول ذکر شده در بالا، بایستی اسکریپت setup.py را آماده نموده و به روش زیر اجرا نمایید:

from distutils.core import setup, Extension
setup(name='helloworld', version='1.0',  \
      ext_modules=[Extension('helloworld', ['hello.c'])])

اکنون با فراخوانی دستور زیر، تمامی مراحل لازم نظیر کامپایل و آماده سازی (linking & compilation) کد را انجام دهید. کد زیر کلیه ی مراحل مورد نیاز کامپایل و لینک ماژول با کامپایلر، دستورات linker و flag های مناسب را انجام داده، متعاقبا خروجی (.dll) را در پوشه ی مربوطه جایگذاری (کپی) می کند.

$ python setup.py install

در سیستم های مبتنی بر Unix، لازم است این دستور را با حساب کاربری root اجرا نمایید تا امکان یا مجوز درج داده در پوشه ی site-packages را داشته باشید. در سیستم عامل ویندوز لازم به انجام این کار نیست.

 

آموزش Python : وارد کردن و استفاده از افزونه ها در پروژه

پس از نصب افزونه ی دلخواه خود، می توانید آن را در اسکرپیت پایتون خود با دستور import وارد کرده و فراخوانی نمایید:

#!/usr/bin/python
import helloworld
print helloworld.helloworld()

خروجی زیر را تولید می کند:

Hello, Python extensions!!

 

ارسال پارامتر به تابع

در طول توسعه پروژه، گاه می بایست توابعی را اعلان و فراخوانی نمایید که پارامترهایی را به عنوان ورودی می پذیرد. از اینرو بایستی signature (اسم تابع + نوع، تعداد پارامتر ورودی) مربوطه را برای توابع C ماژول اختصاصی خود انتخاب نمایید. به طور مثال، تابع ذیل را در نظر بگیرید که تعدادی پارامتر به عنوان ورودی پذیرفته و بدین صورت اعلان می شود:

static PyObject *module_func(PyObject *self, PyObject *args) {
   /* Parse args and do something interesting here. */
   Py_RETURN_NONE;
}

متد table که تابع جدید را در خود کپسوله می کند، به صورت زیر خواهد بود:

static PyMethodDef module_methods[ ] = {
   { "func", (PyCFunction)module_func, METH_NOARGS, NULL },
   { "func", module_func, METH_VARARGS, NULL },
   { NULL, NULL, 0, NULL }
};

می توانید با استفاده از تابع کتابخانه ای PyArg_ParseTuple آرگومان های مورد نیاز را از متغیر اشاره گر (pointer) به PyObject که به عنوان آرگومان به تابع C ارسال شده، استخراج نمایید.

اولین آرگومان ارسالی به PyArg_ParseTuple، آرگومان args می باشد. این آرگومان همان آبجکتی است که باید parse یا تحلیل نحوی شود. پارامتر دوم یک رشته ی فرمت دهی (format string) است که آرگومان ها را به آن شکلی که مورد انتظار شما است، به نمایش می گذارد. به تعداد آرگومان ها، یک یا چند کاراکتر در رشته ی فرمت دهی وجود دارد که نشانگر آرگومان های مزبور می باشند.

static PyObject *module_func(PyObject *self, PyObject *args) {
   int i;
   double d;
   char *s;
   if (!PyArg_ParseTuple(args, "ids", &i, &d, &s)) {
      return NULL;
   }
   /* Do something interesting here. */
   Py_RETURN_NONE;
}

با کامپایل نمودن ورژن جدید از ماژول خود و وارد کردن آن در متن پروژه، قادر خواهید بود تابع مورد نظر را با تعداد دلخواه و نوع مختلف از آرگومان ها فراخوانی نمایید:

module.func(1, s="three", d=2.0)
module.func(i=1, d=2.0, s="three")
module.func(s="three", d=2.0, i=1)

 

تابع PyArg_ParseTuple

در زیر تعداد و نوع ورودی های تابع را به شکل استاندارد (signature) PyArg_ParseTuple مشاهده می کنید:

int PyArg_ParseTuple(PyObject* tuple,char* format,...)

در صورتی که عملیات با موفقیت انجام شود، مقداری غیر صفر و چنانچه عملیات ناموفق بوده و خطا رخ داد، مقدار 0 در خروجی بازگردانی می شود. tuple، آبجکت PyObject* بوده که همان آرگومان دوم ارسال شده به تابع C می باشد. آرگومان سوم، format، یک رشته ی C می باشد که نشانگر آرگومان های الزامی و اختیاری می باشد.

در زیر لیستی از کدهای فرمت دهی که به تابع PyArg_ParseTuple ارسال می شود همراه با شرح هر یک مشاهده می کنید:

  • کد c در پایتون معادل char در زبان C : یک رشته پایتون با طول 1 (رشته ی حاوی یک کاراکتر) معادل char در C می شود.
  • کد d در پایتون معادل double در زبان C : یک مقدار عددی float (ممیز و اعشاری) که معادل double (اعشاری با دقت بیشتر) در C محسوب می شود.
  • کد f در پایتون معادل float در زبان C : یک float (مقدار عددی اعشاری از نوع float) در پایتون معادل float در C محسوب می شود.
  • کد i در پایتون معادل int در زبان C : یک int (نوع عدد صحیح) معادل long در زبان C درنظر گرفته می شود.
  • کد l در پایتون معادل long در زبان C : یک int در زبان پایتون معادل نوع داده ای long در زبان C در نظر گرفته می شود.
  • کد L در پایتون معادل long long در زبان C : یک int یا نوع داده ای عدد صحیح در زبان پایتون، معادل long long در زبان C محسوب می شود.
  • کد O در پایتون معادل PyObject* در زبان C : یک اشاره گر غیر NULL به آرگومان Python بازگردانی می کند.
  • کد s در پایتون معادل char* در زبان C : رشته پایتون بدون مقادیر null جاسازی شده (embedded) به char* در زبان C فرمت دهی / تبدیل می شود.
  • کد s# در پایتون معادل char*+int در زبان C : رشته Python را به آدرس و طول سازگار در C تبدیل می کند.
  • کد t# در پایتون معادل char*+int در زبان C : کاربردی مشابه s# دارد با این تفاوت که هر آبجکتی که اینترفیس read-only را پیاده سازی کند، می پذیرد.
  • کد u در پایتون معادل Py_UNICODE* در زبان C : کاراکترهای Unicode (null-terminated buffer) مستقر در بافر که انتهای آن به null ختم می شود را به آبجکت Unicode پایتون تبدیل می کند.
  • کد u# در پایتون معادل Py_UNICODE*+int در زبان C : نوع دیگر از u که در دو متغیر C ذخیره می شود، اولی یک اشاره گر به آدرس Unicode مستقر در بافر و دومی طول آن.
  • کد w# در پایتون معادل char*+int در زبان C : مشابه s#، اما هر آّبجکتی که اینترفیس read/write بافر را پیاده سازی می کند، پذیرفته و با آن سازگاری دارد.
  • کد z در پایتون معادل char* در زبان C : کاربری مشابه s دارد با این تفاوت که None نیز می پذیرد (char* زبان C را بر روی NULL تنظیم می کند).
  • کد z# در پایتون معادل char*+int در زبان C : کاربردی مشابه s# دارد اما None نیز می پذیرد (char* زبان C را روی NULL تنظیم می نماید).
  • کد (...) در پایتون معادل as per ... در زبان C : یک دنباله (sequence) پایتون که هر آیتم در آن یک آرگومان در نظر گرفته می شود.
  • کد | در پایتون معادل double در زبان C : آرگومان های زیر اختیاری می باشد.
  • کد : در پایتون معادل double در زبان C : قبل از اسم تابع در پیغام های خطا قرار می گیرد.
  • کد ; در پایتون معادل double در زبان C : قبل از درج کل متن پیغام خطا قرار می گیرد.

 

بازگردانی مقادیر در خروجی

تابع Py_BuildValue، درست مانند PyArg_ParseTuple ، یک رشته ی فرمت دهی (string format) به عنوان ورودی دریافت می کند. بجای ارسال آدرس مقادیری که کامپایل می کنید، بایستی خود مقادیر را به عنوان آرگومان به تابع مورد نظر بفرستید. در زیر مثالی از نحوه ی پیاده سازی یک تابع که عملیات جمع را انجام می دهد، تابع add، مشاهده می کنید:

static PyObject *foo_add(PyObject *self, PyObject *args) {
   int a;
   int b;
   if (!PyArg_ParseTuple(args, "ii", &a, &b)) {
      return NULL;
   }
   return Py_BuildValue("i", a + b);
}

معادل پیاده سازی آن در زبان پایتون به صورت زیر می باشد:

def add(a, b):
   return (a + b)

می توانید دو خروجی از این تابع بازگردانی نمایید. این عملیات در پایتون با یک لیست قابل پیاده سازی خواهد بود:

static PyObject *foo_add_subtract(PyObject *self, PyObject *args) {
   int a;
   int b;
   if (!PyArg_ParseTuple(args, "ii", &a, &b)) {
      return NULL;
   }
   return Py_BuildValue("ii", a + b, a - b);
}

معادل پیاده سازی آن در زبان پایتون به صورت خواهد بود:

def add_subtract(a, b):
   return (a + b, a - b)

 

تابع Py_BuildValue

در زیر روش استاندارد تنظیم اسم تابع، نوع و تعداد پارامترهای ورودی آن که signature خوانده می شود را ویژه ی تابع Py_BuildValue مشاهده می کنید:

PyObject* Py_BuildValue(char* format,...)

پارامتر format، یک رشته ی C بوده و نشانگر آبجکت Python است که پارامتر حاضر باید نهایتا به آن کامپایل شود. آرگومان های زیر مقادیر C هستند که خروجی از آن ها ساخته و کامپایل می شود. نتیجه ی PyObject* یک اشاره گر (reference) جدید می باشد.

جدول زیر code string های پرکاربرد را با ذکر کارایی هر یک در اختیار شما قرار می دهد:

  • کد c در پایتون معادل char در زبان C : یک char زبان C، به رشته ای با طول یک کاراکتر تبدیل می شود.
  • کد d در پایتون معادل double در زبان C : یک نوع عددی double زبان C، به float در پایتون تبدیل می شود.
  • کد f در پایتون معادل float در زبان C : یک float یا نوع عددی اعشاری زبان C، به همان float در پایتون تبدیل می شود.
  • کد i در پایتون معادل int در زبان C : یک Int زبان C به همان int (نوع عددی صحیح) در پایتون تبدیل می شود.
  • کد l در پایتون معادل long در زبان C : یک long در زبان C به int در پایتون تبدیل می شود.
  • کد N در پایتون معادل PyObject* در زبان C : یک آبجکت پایتون ارسال کرده ولی reference count (تعداد دفعاتی که آبجکت مورد نظر به آن دسترسی صورت می گیرد) آن را افزایش نمی دهد.
  • کد O در پایتون معادل PyObject* در زبان C : یک آبجکت پایتون ارسال کرده و reference count آن را طبق انتظار یک واحد افزایش می دهد.
  • کد O& در پایتون معادل convert+void* در زبان C : رشته پایتون بدون مقادیر null جاسازی شده (embedded) به char* در زبان C فرمت دهی / تبدیل می شود.
  • کد s در پایتون معادل char* در زبان C : یک char* که در انتهای خود 0 داشته را به رشته ی Python تبدیل می نماید یا NULL را به None.
  • کد s# در پایتون معادل char*+int در زبان C : یک رشته ی C و طول (length) آن را به یک آبجکت Python تبدیل می کند. اگر اشاره گر از نوع string (string pointer) برابر NULL باشد، طول یا length نادیده گرفته شده و None در خروجی بازگردانی می کند.
  • کد u در پایتون معادل Py_UNICODE* در زبان C : یک رشته که در سطح زبان C تعریف شده و انتهای آن مقدار NULL وجود دارد را به یونیکد پایتون تبدیل کرده و اگر NULL بود آن را به None تبدیل می کند. Buffer ای از داده های Unicode که انتهای آن null وجود دارد را به آبجکت پایتون تبدیل می کند. اگر Unicode buffer برابر NULL بود، در خروجی None بازیابی می شود.
  • کد u# در پایتون معادل Py_UNICODE*+int در زبان C : یک رشته ی تعریف شده در سطح C و طول آن را به آبجکت Unicode پایتون تبدیل می کند یا NULL را به None تبدیل می کند. به عبارت دیگر، یک Unicode (که استانداردهای USC-2 یا UCS-4) مستقر در buffer یا حافظه میانی و طول (length) آن را به آبجکت Unicode پایتون تبدیل می کند. اگر اشاره گر به Unicode موجود در buffer برابر NULL بود، طول آن نادیده گرفته شده و None را در خروجی برمی گرداند.
  • کد w# در پایتون معادل char*+int در زبان C : مشابه s#، با این تفاوت که هر آبجکتی که اینترفیس read-write را پیاده سازی می کند، می پذیرد. متغیر char * طوری تنظیم شده که به اولین بایت از buffer اشاره کند و Py_ssize_t را بر روی طول buffer تنظیم می کند.
  • کد z در پایتون معادل char* در زبان C : مشابه s، با این تفاوت که None نیز می پذیرد (char* در C را روی NULL تنظیم می کند).
  • کد z# در پایتون معادل char*+int در زبان C : کاربردی مشابه s# دارد (char* در C را بر روی NULL تنظیم می کند).
  • کد (...) در پایتون معادل as per ... در زبان C : از دنباله ای از مقادیر C، یک متغیر tuple در پایتون می سازد.
  • کد [...] در پایتون معادل as per ... در زبان C : از مقادیر C، یک لیست (list) در پایتون تولید می کند.
  • کد {...} در پایتون معادل as per ... در زبان C : از دنباله ای از مقادیر C، یک dictionary که المان های آن به صورت متناوب، کلید و مقدار، سازمان دهی شده، ایجاد می کند.

به طور مثال تابع Py_BuildValue("{issi}",23,"zig","zag",42) یک dictionary پایتون به صورت {23:'zig','zag':42} در خروجی تولید می کند.

با دیگر آموزش های ما در زمینه آموزش پایتون و دیگر زبان های برنامه نویسی همراه ما باشید...

  • افشین رفوآ
  • ۰
  • ۰

در این مقاله از مجموعه مقاله های آموزش پایتون به بررسی کار با XML در پایتون می پردازیم..

عبارت Extensible Markup Language یا به اختصار XML به معنی زبان نشانه گذاری گسترش پذیر است که یک زبان نشانه گذاری مشابه HTML یا SGML است. کنسرسیوم وب جهان گستر این زبان را به عنوان یک استاندارد سراسری توصیه می کند. چنانچه اپلیکیشنی که قصد طراحی آن را دارید، داده های حجیم و سنگینی برای نگهداری ندارد، در آن صورت می توانید بدون زحمت طراحی دیتابیس و استفاده از پشتوانه ی SQL، اطلاعات برنامه ی خود را در قالب XMLذخیره نمایید.

 

آموزش زبان پایتون : معماری ها و توابع کتابخانه ای تحلیل گر XML Parser

کتابخانه ی استاندارد python تعدادی interface (الگوی پیاده سازی) معدود اما کارا جهت کار با XML در اختیار برنامه نویس قرار می دهد که در زیر به شرح آن ها می پردازیم. دو API و توابع کتابخانه ای پرکاربرد و ساده ای که توصیه می شود عبارتند از :

  • تابع (SAX (Simple API for XML : در این API، توابع Callback ای برای رخدادهای مورد نظر معرفی (register) می کنید و سپس به parser اجازه می دهید به تحلیل باقی فایل بپردازد. ابزار جاری برای شرایطی مفید می باشد که فایل های اپلیکیشن حجیم بوده و شما با محدودیت حافظه مواجه هستید. در واقع API حاضر فایل را از روی دیسک تحلیل و تفسیر می کند و به همین جهت هیچگاه کل فایل در حافظه بارگذاری نشده و آن را اشغال نمی کند.
  • تابع DOM (Document Object Model) : API جاری را کنسرسیوم وب جهان گستر توصیه می کند. در این API کل محتوای فایل داخل حافظه بارگذاری و به صورت درختی یا سلسله مراتبی سازماندهی می شود و کلیه ی ویژگی های یک فایل XML را به نمایش می گذارد.

تابع SAX قادر نیست هنگام کار با فایل های حجیم، اطلاعات را به سرعت DOM پردازش کند. از طرف دیگر، اگر منحصرا از DOM استفاده کنید، به ویژه برای پردازش فایل های کوچک و کم حجم، قطعا میزان قابل توجهی از منابع شما هدر می رود. SAX فایل ها را با مجوز در سطح فقط خواندن باز می کند، در حالی که DOM امکان اعمال تغییرات در فایل XML را فراهم می آورد. از آنجایی که دو API مزبور مکمل یکدیگر هستند، دلیلی وجود ندارد که از هر دو در پروژه های بزرگ استفاده نکنید. نمونه کدهای XML که در مثال های زیر استفاده کرده و به عنوان ورودی توابع پردازش و parse مورد استفاده قرار می دهیم، فایل movies.xml با محتوای زیر خواهد بود :

< collection shelf="New Arrivals">
< movie title="Enemy Behind">
< type>War, Thriller< /type>
< format>DVD< /format>
< year>2003< /year>
< rating>PG< /rating>
< stars>10< /stars>
< description>Talk about a US-Japan war< /description>
< /movie>
< movie title="Transformers">
< type>Anime, Science Fiction< /type>
< format>DVD< /format>
< year>1989< /year>
< rating>R< /rating>
< stars>8< /stars>
< description>A schientific fiction< /description>
< /movie>
< movie title="Trigun">
< type>Anime, Action< /type>
< format>DVD< /format>
< episodes>4< /episodes>
< rating>PG< /rating>
< stars>10< /stars>
< description>Vash the Stampede!< /description>
< /movie>
< type>Comedy< /type>
< format>VHS< /format>
< rating>PG< /rating>
< stars>2< /stars>
< description>Viewable boredom< /description>
< /movie>
< /collection>

 

آموزش Python : پردازش و تفسیر XML به وسیله ی توابع SAX

تابع SAX یک interface حاوی مجموعه توابع استاندارد برای تحلیل و پردازش XML به روش رخداد محور (Event-driven) است. جهت استفاده از interface یاد شده برای پردازش و فایل های XML، لازم است با ارث بری (تعریف کلاس مشتق) از xml.sax.ContentHandler، کلاس ContentHandler اختصاصی خود را ایجاد نمایید.

کلاس ContentHandler اختصاصی شما در واقع می تواند تگ ها و attribute های نسخه یا نسخه های مختلف XML را مدیریت نماید. آبجکت ContentHandler تعدادی متد برای مدیریت رخدادهای مختلف parse (پردازش و تحلیل) ارائه می دهد که parser این متدها را به هنگام بارگذاری محتوای فایل XML در حافظه و پردازش آن ها، از ContentHandler فراخوانی می کند.

متدهای startDocument و endDocument هریک به ترتیب در ابتدا و انتهای فایل XML فراخوانی می شوند. اطلاعات و داده های مربوط به کاراکترهای فایل XML از طریق پارامتر text در اختیار متد (character(text قرار می گیرد.

متد ContentHandler در ابتدا و انتهای هر المان فراخوانی می شود. اگر parser در وضعیت namespace mode قرار داشته باشد، در آن صورت متدهای (startElement(tag, attributes و (endElement(tag صدا زده می شوند و در غیر این صورت متدهای مربوطه یعنی startElementNS و endElementNS فراخوانده می شوند. در اینجا منظور از tag در واقع المان tag و attributes، آبجکت Attributes است.

در زیر سایر متدهای مهم که فهم آن ها برای کار با SAX مهم می باشد را مشاهده می کنید :

 

آموزش برنامه نویسی پایتون : متد make_parser

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

xml.sax.make_parser( [parser_list] )

در زیر جزئیات پارامترها به تفصیل شرح داده است :

  • پارامتر parser_list : آرگومان اختیاری متشکل از یک لیست از parser ها برای استفاده که تمامی آن ها بایستی متد make_parser را پیاده سازی می کند.

متد زیر یک مفسر و تحلیل گر نحوی SAX تعریف کرده و با استفاده از آن محتوای فایل مورد نظر را parse (تفسیر و تبدیل) می کند.

xml.sax.parse( xmlfile, contenthandler[, errorhandler])

در زیر اطلاعات پارامترهای متد فوق به تفصیل شرح داده شده است :

  • پارامتر xmlfile : این اسم فایل XML است که محتوای آن قرار است خوانده و تفسیر شود.
  • پارامتر contenthandler : آبجکت ساخته شده از کلاس ContentHandler.
  • این پارامتر اختیاری بوده و در صورت استفاده از آن بایستی یک آبجکت ErrorHandler از SAX باشد.

 

آموزش زبان پایتون : متد parseString

متد دیگری که یک تحلیل گر و مفسر SAX ایجاد کرده و رشته ی XML ارسالی را parse می کند، parseString می باشد :

xml.sax.parseString(xmlstring, contenthandler[, errorhandler])

در زیر هریک از پارامتر ها به تفصیل شرح داده شده است :

  • پارامتر xmlstring : اسم رشته ی XML که محتوا از آن خوانده می شود.
  • پارامتر contenthandler : بایستی یک آبجکت ContentHandler باشد.
  • پارامتر errorhandler : پارامتر اختیاری که یک آبجکت ErrorHandler از SAX می باشد.

مثال :

#!/usr/bin/python
import xml.sax
class MovieHandler( xml.sax.ContentHandler ):
   def __init__(self):
      self.CurrentData = ""
      self.type = ""
      self.format = ""
      self.year = ""
      self.rating = ""
      self.stars = ""
      self.description = ""
   # Call when an element starts
   def startElement(self, tag, attributes):
      self.CurrentData = tag
      if tag == "movie":
         print "*****Movie*****"
         title = attributes["title"]
         print "Title:", title
   # Call when an elements ends
   def endElement(self, tag):
      if self.CurrentData == "type":
       print "Type:", self.type
      elif self.CurrentData == "format":
         print "Format:", self.format
      elif self.CurrentData == "year":
         print "Year:", self.year
      elif self.CurrentData == "rating":
         print "Rating:", self.rating
      elif self.CurrentData == "stars":
         print "Stars:", self.stars
      elif self.CurrentData == "description":
         print "Description:", self.description
      self.CurrentData = ""
   # Call when a character is read
   def characters(self, content):
      if self.CurrentData == "type":
         self.type = content
      elif self.CurrentData == "format":
         self.format = content
      elif self.CurrentData == "year":
         self.year = content
      elif self.CurrentData == "rating":
         self.rating = content
      elif self.CurrentData == "stars":
         self.stars = content
      elif self.CurrentData == "description":
         self.description = content
if ( __name__ == "__main__"):
   # create an XMLReader
   parser = xml.sax.make_parser()
   # turn off namepsaces
   parser.setFeature(xml.sax.handler.feature_namespaces, 0)
   # override the default ContextHandler
   Handler = MovieHandler()
   parser.setContentHandler( Handler )
   parser.parse("movies.xml")

خروجی :

*****Movie*****
Title: Enemy Behind
Type: War, Thriller
Format: DVD
Year: 2003
Rating: PG
Stars: 10
Description: Talk about a US-Japan war
*****Movie*****
Title: Transformers
Type: Anime, Science Fiction
Format: DVD
Year: 1989
Rating: R
Stars: 8
Description: A schientific fiction
*****Movie*****
Title: Trigun
Type: Anime, Action
Format: DVD
Rating: PG
Stars: 10
Description: Vash the Stampede!
*****Movie*****
Title: Ishtar
Type: Comedy
Format: VHS
Rating: PG
Stars: 2
Description: Viewable boredom

 

آموزش Python : پردازش و تفسیر فایل های XML با استفاده از توابع DOM

مدل شی گرای فایل (Document Object Model) یا به اختصار DOM یک API و مجموع توابع کتابخانه ای است که کنسرسیوم وب جهان گستر برای دسترسی و ویرایش محتوای فایل های XML، به توسعه دهندگان توصیه می کند. DOMبه ویژه برای اپلیکیشن هایی که لازم است به محتوای فایل XML آن به صورت رندوم دسترسی صورت گیرد، مفید می باشد. SAX به توسعه دهنده امکان دسترسی فقط به یک قسمت از فایل XML را در آن واحد می دهد. به طور مثال، هنگام دسترسی به یک المان از فایل XML، امکان دسترسی به سایر المان های فایل برای شما وجود ندارد.

ماژول xml.dom، به شما این امکان را می دهد تا یک آبجکت minidom ایجاد کرده و محتوای فایل XML را به سرعت در حافظه بارگذاری نمایید. آبجکت minidom متد کارا و ساده تری جهت ساخت درخت DOM از فایل XML در اختیار توسعه دهنده قرار می دهد.

نمونه کد زیر متد ([parse(file [,parser از آبجکت minidom را صدا زده و محتوای فایل XML را تجزیه و به آبجکت درخت DOM تبدیل می کند.

مثال :

#!/usr/bin/python
from xml.dom.minidom import parse
import xml.dom.minidom
# Open XML document using minidom parser
DOMTree = xml.dom.minidom.parse("movies.xml")
collection = DOMTree.documentElement
if collection.hasAttribute("shelf"):
   print "Root element : %s" % collection.getAttribute("shelf")
# Get all the movies in the collection
movies = collection.getElementsByTagName("movie")
# Print detail of each movie.
for movie in movies:
   print "*****Movie*****"
   if movie.hasAttribute("title"):
      print "Title: %s" % movie.getAttribute("title")
   type = movie.getElementsByTagName('type')[0]
   print "Type: %s" % type.childNodes[0].data
   format = movie.getElementsByTagName('format')[0]
   print "Format: %s" % format.childNodes[0].data
   rating = movie.getElementsByTagName('rating')[0]
   print "Rating: %s" % rating.childNodes[0].data
   description = movie.getElementsByTagName('description')[0]
   print "Description: %s" % description.childNodes[0].data

خروجی :

Root element : New Arrivals
*****Movie*****
Title: Enemy Behind
Type: War, Thriller
Format: DVD
Rating: PG
Description: Talk about a US-Japan war
*****Movie*****
Title: Transformers
Type: Anime, Science Fiction
Format: DVD
Rating: R
Description: A schientific fiction
*****Movie*****
Title: Trigun
Type: Anime, Action
Format: DVD
Rating: PG
Description: Vash the Stampede!
*****Movie*****
Title: Ishtar
Type: Comedy
Format: VHS
Rating: PG
Description: Viewable boredom

 

با دیگر مقالات آموزش پایتون همراه ما باشید..

  • افشین رفوآ
  • ۰
  • ۰

در این مقاله از سری مقاله های آموزش پایتون به معرفی multi threaded در پایتون می پردازیم :

اجرای همزمان چندین thread به منزله اجرای همزمان چندین برنامه در آن واحد است که مزایای زیر را به دنبال دارد :

  • چندین thread که در بستر یک پردازه یا فرایند (process) اجرا شده و data space یکسانی را دارند، می توانند داده ها را بهتر با یکدیگر به اشتراک گذاشته و بایکدیگر تعامل بهتری داشته باشند، نسبت به زمانی که این thread ها در فرایندهای مجزا قرار دارند.
  • گاهی thread ها را پردازه یا فرایندهای سبک می نامند که سربار و memory overhead کمتری نسبت به فرایندهای واقعی داشته و کم هزینه تر می باشند.

هر thread یک نقطه ی آغاز،یک ترتیب یا توالی اجرا و یک نقطه ی پایان دارد. علاوه بر آن، یک instruction pointer دارد که دقیقا مشخص می کند برنامه در کجای بستر (context) جاری در حال اجرا بود و به کدام مرحله و نقطه اجرای دستور رسیده است.

  • می توان thread را مختل یا متوقف (pre-empt) کرد.
  • می توان thread را در حالی که دیگر thread ها فعال هستند، به طور موقت به حالت تعلیق درآورد. از این کار تحت عنوان yielding نیز یاد می شود.

 

آموزش Python : راه اندازی و اجرای thread جدید

جهت آغاز یک thread جدید، بایستی متد زیر که داخل ماژول thread کپسوله شده را فراخوانی نمایید :

thread.start_new_thread ( function, args[, kwargs] )

به وسیله ی این متد می توانید به روش سریع و کارا در هر دو محیط ویندوز و لینوکس thread های جدید ایجاد نمایید.

متد مورد نظر بلافاصله بازگشته و thread فرزند آغاز می شود که متعاقبا function را با پارامتر args صدا می زند. زمانی که function به return می رسد، thread خاتمه می یابد.

در این تابع، پارامتر args مجموعه ی چندتایی از آرگومان ها (tuple) است. اگر می خواهید تابع را بدون آرگومان صدا بزنید، بایستی یک tuple خالی به عنوان پارامتر ارسال کنید. kwargs یک آرگومان از نوع dictionary تشکیل شده از کلیدواژه ها بوده و استفاده از آن اختیاری است.

مثال :

#!/usr/bin/python
import thread
import time
# Define a function for the thread
def print_time( threadName, delay):
   count = 0
   while count < 5:
      time.sleep(delay)
      count += 1
      print "%s: %s" % ( threadName, time.ctime(time.time()) )
# Create two threads as follows
try :
   thread.start_new_thread( print_time, ("Thread-1", 2, ) )
   thread.start_new_thread( print_time, ("Thread-2", 4, ) )
except:
   print "Error: unable to start thread"
while 1:
   pass

خروجی :

Thread-1: Thu Jan 22 15:42:17 2009
Thread-1: Thu Jan 22 15:42:19 2009
Thread-2: Thu Jan 22 15:42:19 2009
Thread-1: Thu Jan 22 15:42:21 2009
Thread-2: Thu Jan 22 15:42:23 2009
Thread-1: Thu Jan 22 15:42:23 2009
Thread-1: Thu Jan 22 15:42:25 2009
Thread-2: Thu Jan 22 15:42:27 2009
Thread-2: Thu Jan 22 15:42:31 2009
Thread-2: Thu Jan 22 15:42:35 2009

اگرچه توصیه می شود که برای پردازش موازی سطح پایین (low-level threading) از ماژول thread استفاده نمایید، با این وجود ماژول مزبور در مقایسه با ماژول جدید برنامه نویسی موازی (threading module) از قابلیت های بسیار کمتری برخوردار است.

 

آموزش برنامه نویسی پایتون : ماژول Threading

ماژول جدیدتری که برای برنامه نویسی موازی همراه با ویرایش 2.4 زبان Python ارائه شد، قابلیت های بسیار بیشتر و سطح بالاتری جهت بهره گیری از پردازش موازی و thread ها در اختیار برنامه نویس قرار داد.

ماژول threading علاوه بر تمامی توابع ماژول قبلی (thread)، تعدادی متد نوین و کارای دیگر جهت پیاده سازی مفهوم برنامه نویسی موازی ارائه می دهد.

  • متد threading.activeCount() : تعداد آبجکت های thread که فعال و در حال اجرا هستند را بازگردانی می نماید.
  • متد threading.currentThread() : همان thread جاری را به عنوان خروجی برمی گرداند.

علاوه بر متدها، ماژول نام برده کلاس Thread را شامل می شود که threading و پردازش موازی را پیاده سازی می کند. متدهایی که که کلاس Thread در اختیار توسعه دهنده قرار می دهد، به شرح زیر می باشد :

  • متد ()run : متد جاری در واقع entry point یا نقطه ی شروع اجرای thread می باشد.
  • متد start() : thread را با فراخوانی تابع run() راه اندازی و اجرا می کند.
  • متد ([Join ([time : متد join() منتظر می ماند تا thread ها خاتمه یابند.
  • متد ()isAlive : متد حاضر بررسی می کند آیا یک thread هنوز در حل اجرا است یا خیر.
  • متد ()getName : متد جاری اسم آبجکت thread را بازیابی می کند.
  • متد ()setName : این متد اسم thread را مقداردهی می کند.

 

دوره آموزش پایتون : ساخت آبجکت Thread از ماژول Threading

به منظور پیاده سازی یک thread جدید از ماژول threading، کافی است مراحل زیر را دنبال نمایید:

  • یک کلاس مشتق از کلاس Thread ایجاد نمایید (از آن ارث بری کنید).
  • متد _[(init_(self[,args را جهت تزریق آرگومان های بیشتر به کلاس، بازنویسی (override) نمایید.
  • در پایان، متد [(run(self[,args را پیاده سازی و در بدنه ی آن مشخص کنید که thread به هنگام اجرا چه عملیاتی را انجام دهد.

پس از ایجاد کلاس مشتق (ارث بری) از Thread، می توانید یک نمونه از آن ایجاد کرده و سپس با فراخوانی متد start() یک thread یا ریزپردازه ی دیگر آغاز نمایید که متعاقبا متد run() را صدا می زند.

مثال :

#!/usr/bin/python
import threading
import time
exitFlag = 0
class myThread (threading.Thread):
    def __init__(self, threadID, name, counter):
        threading.Thread.__init__(self)
        self.threadID = threadID
        self.name = name
        self.counter = counter
    def run(self):
        print "Starting " + self.name
        print_time(self.name, self.counter, 5)
        print "Exiting " + self.name
def print_time(threadName, delay, counter):
    while counter:
        if exitFlag:
            threadName.exit()
        time.sleep(delay)
        print "%s: %s" % (threadName, time.ctime(time.time()))
        counter -= 1
# Create new threads
thread1 = myThread(1, "Thread-1", 1)
thread2 = myThread(2, "Thread-2", 2)
# Start new Threads
thread1.start()
thread2.start()
print "Exiting Main Thread"

زمانی که کد فوق به اجرا گذاشته می شود، خروجی به صورت زیر خواهد بود :

Starting Thread-1
Starting Thread-2
Exiting Main Thread
Thread-1: Thu Mar 21 09:10:03 2013
Thread-1: Thu Mar 21 09:10:04 2013
Thread-2: Thu Mar 21 09:10:04 2013
Thread-1: Thu Mar 21 09:10:05 2013
Thread-1: Thu Mar 21 09:10:06 2013
Thread-2: Thu Mar 21 09:10:06 2013
Thread-1: Thu Mar 21 09:10:07 2013
Exiting Thread-1
Thread-2: Thu Mar 21 09:10:08 2013
Thread-2: Thu Mar 21 09:10:10 2013
Thread-2: Thu Mar 21 09:10:12 2013
Exiting Thread-2

 

آموزش Python : همزمان سازی thread ها

ماژول threading که در بالا به آن اشاره کردیم، یک مکانیزم اعمال قفل با قابلیت پیاده سازی آسان در اختیار توسعه دهنده قرار می دهد که به واسطه ی آن می توان به راحتی thread ها و اجرای آن ها را هماهنگ ساخت. جهت ساخت و اعمال قفل جدید کافی است متد Lock() فراخوانی شود که در خروجی نمونه ی جدید از آبجکت lock را بازگردانی می نماید.

متد acquire(blocking) از نمونه ی (آّبجکت) جدید lock، این قابلیت را دارد که با مدیریت thread ها آن ها را به طور همزمان (موازی) اجرا کند. به واسطه ی پارامتر اختیاری blocking توسعه دهنده قادر خواهد بود کنترل اینکه آیا قفل بر روی thread اعمال شود یا خیر را بدست گیرد.

زمانی که مقدار پارامتر blocking برابر 0 باشد، اگر قفل یا lock بر روی thread اعمال شد،متد با 1 و اگر نشد با 0 برمی گردد. هنگامی که blocking روی 1 تنظیم شده باشد، thread مسدود (block) شده و منتظر می ماند تا lock آزاد شود.

زمانی که متد release() از نمونه ی جدید lock صدا خورده می شود، lock یا قفل اعمال شده بر روی thread که دیگر کاربردی ندارد، آزاد می شود.

مثال :

#!/usr/bin/python
import threading
import time
exitFlag = 0
class myThread (threading.Thread):
    def __init__(self, threadID, name, counter):
        threading.Thread.__init__(self)
        self.threadID = threadID
        self.name = name
        self.counter = counter
    def run(self):
        print "Starting " + self.name
        print_time(self.name, self.counter, 5)
        print "Exiting " + self.name
def print_time(threadName, delay, counter):
    while counter:
        if exitFlag:
            threadName.exit()
        time.sleep(delay)
        print "%s: %s" % (threadName, time.ctime(time.time()))
        counter -= 1
# Create new threads
thread1 = myThread(1, "Thread-1", 1)
thread2 = myThread(2, "Thread-2", 2)
# Start new Threads
thread1.start()
thread2.start()
print "Exiting Main Thread"

خروجی :

Starting Thread-1
Starting Thread-2
Thread-1: Thu Mar 21 09:11:28 2013
Thread-1: Thu Mar 21 09:11:29 2013
Thread-1: Thu Mar 21 09:11:30 2013
Thread-2: Thu Mar 21 09:11:32 2013
Thread-2: Thu Mar 21 09:11:34 2013
Thread-2: Thu Mar 21 09:11:36 2013
Exiting Main Thread

 

آموزش پایتون : پیاده سازی queue بوسیله multi thread در پایتون

ماژول Queue به توسعه دهنده این امکان را می دهد تا یک آبجکت queue جدید ایجاد کند که همزمان چندین آیتم را به طور صف بندی شده در خود کپسوله می نماید. برای مدیریت Queue می توانید از توابع زیر استفاده نمایید :

  • تابع get() : متد جاری یک آیتم را حذف و از queue بازیابی می کند.
  • تابع put() : این متد یک آیتم جدید را به queue اضافه می کند.
  • تابع qsize() : تعداد آیتم هایی که در زمان حاضر داخل صف قرار دارند را به عنوان خروجی بازمی گرداند.
  • تابع empty() : چنانچه صف یا آبجکت queue خالی بود، مقدار بولی True و در غیر این صورت False را بازمی گرداند.
  • تابع full() : چنانچه آبجکت queue ظرفیت خالی نداشت، مقدار بولی True و در غیر این صورت False را بازگردانی می نماید.

مثال :

#!/usr/bin/python
import Queue
import threading
import time
exitFlag = 0
class myThread (threading.Thread):
    def __init__(self, threadID, name, q):
        threading.Thread.__init__(self)
        self.threadID = threadID
        self.name = name
        self.q = q
    def run(self):
        print "Starting " + self.name
        process_data(self.name, self.q)
        print "Exiting " + self.name
def process_data(threadName, q):
    while not exitFlag:
        queueLock.acquire()
        if not workQueue.empty():
            data = q.get()
            queueLock.release()
            print "%s processing %s" % (threadName, data)
        else:
            queueLock.release()
        time.sleep(1)
threadList = ["Thread-1", "Thread-2", "Thread-3"]
nameList = ["One", "Two", "Three", "Four", "Five"]
queueLock = threading.Lock()
workQueue = Queue.Queue(10)
threads = []
threadID = 1
# Create new threads
for tName in threadList:
    thread = myThread(threadID, tName, workQueue)
    thread.start()
    threads.append(thread)
    threadID += 1
# Fill the queue
queueLock.acquire()
for word in nameList:
    workQueue.put(word)
queueLock.release()
# Wait for queue to empty
while not workQueue.empty():
    pass
# Notify threads it's time to exit
exitFlag = 1
# Wait for all threads to complete
for t in threads:
    t.join()
print "Exiting Main Thread"

نتیجه :

Starting Thread-1
Starting Thread-2
Starting Thread-3
Thread-1 processing One
Thread-2 processing Two
Thread-3 processing Three
Thread-1 processing Four
Thread-2 processing Five
Exiting Thread-3
Exiting Thread-1
Exiting Thread-2
Exiting Main Thread

با دیگر مقالات آموزش پایتون همراه ما باشید...

  • افشین رفوآ
  • ۰
  • ۰

امروز با آموزش برنامه نویسی شبکه در پایتون (سوکت نویسی) همراه شما هستیم..

شرحی بر مفهوم Socket

سوکت ها (Sockets) در واقع endpoint های موجود در یک کانال ارتباطی دو طرفه هستند. سوکت ها می توانند در بستر یک فرایند یا بین دو فرایند در دستگاه واحد و یا حتی چندین فرایند در دستگاه های مستقر در قاره و نقاط جغرافیایی مختلف با یکدیگر تبادل داده داشته باشند. از دیدگاه kernel و هسته سیستم عامل، socket صرفا نقطه نهایی تبادل داده و ارتباط می باشد. از دیدگاه اپلیکیشن و برنامه تحت شبکه، socket یک توصیف گر و شناسه فایل که به آن امکان و مجوز درج و خواندن داده در / از شبکه را می دهد، قلمداد می شود. در واقع Socket ترکیبی از آدرس دستگاه (IP) و آدرس درگاه (port number) می باشد.

سوکت ها بر روی انواع کانال های ارتباطی قابل پیاده سازی می باشند که از جمله آن ها می توان به Unix domain socket، TCP، UDP و غیره ... اشاره کرد. کتابخانه socket کلاس های اختصاصی ارائه می دهد که علاوه بر انتقال داده های معمولی، Interface های از نوع generic که دیگر انواع عملیات انتقال و غیره را تحت پوشش قرار می دهد، مدیریت می نماید.

برای درک مفهوم سوکت و کار با آن، لازم است با واژگان زیر آشنا شوید :

  • عبارت domain :خانواده پروتکل هایی که به عنوان مکانیزم انتقال مورد استفاده قرار می گیرد (انتقال داده در بستر شبکه بر اساس آن ها صورت می گیرد). این مقادیر ثوابتی همچون AF_INET، PF_INET، PF_UNIX، PF_X25 و غیره .. هستند.
  • عبارت type :عبارت است از نوع ارتباطاتی که بین دو endpoint برقرار می شود. این عبارت معمولا SOCK_STREAM را برای پروتکل های connection-oriented (امن و تضمین دهنده ی تحویل اطلاعات) و SOCK_DGRAM را ویژه پروتکل های connectionless (غیر امن با سرعت بالا که تحویل داده ها را تضمین نمی کند) شامل می شود.
  • عبارت protocol : به طور پیش فرض بر روی 0 تنظیم می شود، این مفهوم غالبا جهت معرفی نوع دیگر از پروتکل داخل یک domain و type بکار می رود.
  • عبارت hostname : شناسه و اسم اینترفیس شبکه است:
    یک رشته که می تواند اسم سرویس دهنده (hostname)، آدرس IP نسخه ی 4، آدرس IPV6 (آدرس IP ورژن 6) با ساختار نگارشی دو نقطه باشد. یک رشته " " که آدرس INADDR_BROADCAST را تعریف می کند. یک رشته با طول صفر که INADDR_ANY را تعریف می کند یا یک عدد صحیح اختصاص داده شده به hostname که معرف یک سیستم در آن شبکه است.
  • عبارت port : هر سرویس دهنده به کلاینت هایی که یک یا چند پورت را صدا می زنند، گوش می دهد. پورت می تواند شماره ی پورت Fixnum باشد، یک رشته دربردارنده ی شماره ی پورت یا اسم سرویس باشد.

 

آموزش برنامه نویسی شبکه در پایتون : ماژول Socket

به منظور ایجاد یک Socket، لازم است تابع socket.socket() در ماژول socket را فراخوانی نمایید که سینتکس و دستور کلی آن به صورت زیر می باشد :

s = socket.socket (socket_family, socket_type, protocol=0)

در زیر شرح هر یک از این پارامترها را مشاهده می کنید :

  • پارامتر socket_family : این پارامتر، همان طور که در بالا توضیح داده شد، می تواند AF_UNIX یا AF_INET باشد.
  • پارامتر socket_type : این پارامتر می تواند یا SOCK_STREAM و یا SOCK_DGRAM باشد.
  • پارامتر protocol : این پارامتر اختیاری بوده و به صورت پیش فرض بر روی 0 تنظیم می شود.

پس از تعریف آبجکت socket، می توانید با استفاده از توابع لازم، برنامه های سمت سرویس دهنده و سمت سرویس گیرنده ی خود را تعریف نمایید. جداول زیر لیست توابع لازم برای این منظور را معرفی می کند :

 

متدهای Server Socket

  • متد s.bind() : این متد آدرس (hostname یا اسم سرویس دهنده، جفت آدرس پورت یاport number pair) را به socket به صورت دو طرفه وصل می کند.
  • متد s.listen() : این متد یک گوش فرادهنده (Listener) به TCP تنظیم و راه اندازی می کند.
  • متد s.accept() : این متد درخواست اتصال به سرویس دهنده را می پذیرد و به عبارتی ارتباط معلق را به سرور معرفی می کند.

 

متدهای Receiver Socket

  • متد s.connect() : این متد اتصال به سرویس دهنده ی را بر اساس TCP راه اندازی می کند.

 

متدهای کلی ماژول socket

  • متد s.recv() : این متد پیغام TCP را دریافت می کند.
  • متد s.send() : متد حاضر پیغام TCP را ارسال می کند.
  • متد s.recvfrom() : متد جاری پیغام UDP را دریافت می کند.
  • متد s.sendto() : این متد پیغام UDP را ارسال می کند.
  • متد s.close() : این متد socket را می بندد.
  • متد socket.gethostname() : اسم سرویس دهنده (hostname) را در خروجی برمی گرداند.

 

پیاده سازی بخش مربوط به سرویس دهنده

جهت پیاده سازی بخش مربوط به سمت سرور، تابع socket کپسوله سازی شده در ماژول socket را فراخوانی کرده و ابتدا یک آبجکت socket می سازیم. سپس به واسطه ی این آبجکت، دیگر توابع لازم را جهت تنظیم و راه اندازی سرویس دهنده ی socket صدا می زنیم.

حال متد bind(hostname, port) را جهت مشخص کردن یک port برای سرویس خود در دستگاه میزبان یا سرویس دهنده فراخوانی نمایید.

سپس، متد accept() را بر روی آبجکت s (آبجکت ساخته شده ی socket) جهت معرفی ارتباط معلق به ماشین سرور فراخوانی می کنید. این متد صبر می کند که سرویس گیرنده به port یا آدرس درگاه تعیین شده، متصل شود و متعاقبا آبجکت connection را که نشانگر اتصال آن سرویس گیرنده (کلاینت) است در خروجی برمی گرداند.

#!/usr/bin/python           # This is server.py file
import socket               # Import socket module
s = socket.socket()         # Create a socket object
host = socket.gethostname() # Get local machine name
port = 12345                # Reserve a port for your service.
s.bind((host, port))        # Bind to the port
s.listen(5)                 # Now wait for client connection.
while True:
c, addr = s.accept()     # Establish connection with client.
print 'Got connection from', addr
 c.send('Thank you for connecting')
c.close()                # Close the connection

 

پیاده سازی بخش مربوط به سرویس گیرنده

در این بخش از آموزش، یک اپلیکیشن ساده سمت سرویس گیرنده می نویسیم که اتصال به پورت معین 12345و دستگاه سرویس (سرویس دهنده) را فراهم می آورد. به راحتی می توانید یک کلاینت یا سرویس گیرنده ی socket به واسطه ی تابع مربوطه از ماژول socket ایجاد کرد.

متد socket.connect(hosname, port ) یک اتصال بر اساس پروتکل TCP به hostname (دستگاه سرویس دهنده ی مربوطه بر اساس شماره ی port) باز می کند. این متد بر اساس اسن ماشین سرور و آدرس پورت اتصال را جهت تبادل داده برقرار می نماید.

پس از باز کردن socket، می توانید اطلاعات آن را مانند سایر آبجکت های IO بخوانید. لازم است در پایان، سوکت را بسته و اتصال را خاتمه می دهید.کد زیر همان طور که مشاهده می کنید، بخش مربوط به سرویس گیرنده و در واقع یک کلاینت ساده است که به دستگاه سرویس دهنده و شماره درگاه مربوطه وصل شده، تمامی داده های مورد نیاز را از socket می خواند و در نهایت با فراخوانی تابع close() بر روی آبجکت s، سوکت را بسته و اتصال را خاتمه می دهد.

#!/usr/bin/python           # This is client.py file
import socket               # Import socket module
s = socket.socket()         # Create a socket object
host = socket.gethostname() # Get local machine name
port = 12345                # Reserve a port for your service.
s.connect((host, port))
print s.recv(1024)
s.close                     # Close the socket when done

 

حال جهت مشاهده ی خروجی، ابتدا فایل server.py زیر را در پس زمینه اجرا و سپس فایل client.py نام برده را اجرا کنید.

# Following would start a server in background.
$ python server.py & 
# Once server is started run client as follows:
$ python client.py

 

خروجی زیر را برمی گرداند :

Got connection from ('127.0.0.1', 48437)
Thank you for connecting

 

ماژول های برنامه نویسی تحت شبکه برای Python / Python Internet modules

در زیر لیستی از ماژول های مهم و پرکاربرد پایتون در زمینه ی برنامه نویسی تحت شبکه را مشاهده می کنید.

 

با آموزش های دیگر در زمینه آموزش پایتون همراه ما باشید...

  • افشین رفوآ
  • ۰
  • ۰
سلام دوستان...

 

با آموزش پایتون همراه ما باشید :

 

پایتون Python و دسترسی به دیتابیس MySQL
پایتون جهت دسترسی به دیتابیس از توابع کتابخانه ای DB-API استفاده کرده و interface هایی که برای اتصال به پایگاه داده و مدیریت داده های اپلیکیشن بایستی پیاده سازی شود، بر اساس همین استاندارد می باشد. در واقع بیشتر رابط های (interface) اتصال به دیتابیس از این استاندارد پیروی می کنند.
توسعه دهنده می تواند بر اساس نیاز اپلیکیشن خود، دیتابیس مناسب را انتخاب کند. توابع کتابخانه ای اتصال و استفاده از دیتابیس زبان پایتون (API) از database server های زیر پشتیبانی می کند:
  • GadFly
  • mSQL
  • MySQL
  • PostgreSQL
  • Microsoft SQL Server
  • Informix
  • Interbase
  • Oracle
  • Sybase
برای مشاهده لیست interface های اتصال به دیتابیس می توانید به این لینک مراجعه کنید: http://wiki.python.org/moin/DatabaseInterfaces. لازم به ذکر است که برای اتصال به هر دیتابیس مجزا و جهت دسترسی یا مدیریت داده های اپلیکیشن می بایست یک ماژول DB API جداگانه دانلود و نصب نمایید. به طور مثال، چنانچه توسعه دهنده می بایست علاوه بر MySQL به دیتابیس Oracle دسترسی پیدا کند، بدیهی است که باید ماژول های مجزا هریک را جداگانه از اینترنت بارگیری کرده و نصب نماید (ماژول های دیتابیس MySQL و Oracle).
ماژول DB API یک حداقل استاندارد برای مدیریت دیتابیس با استفاده از ساختار و دستور نحوی زبان برنامه نویسی پایتون در اختیار توسعه دهنده قرار می دهد. استفاده از این مجموعه توابع کتابخانه ای یا API مراحل زیر را شامل می شود:
  • وارد کردن ماژول این مجموعه توابع کتابخانه ای با استفاده از دستور import
  • برقراری اتصال به دیتابیس
  • صدور و فراخوانی دستورات و توابع (Store procedure) مورد نیاز SQL
  • بستن و قطع اتصال به دیتابیس
در آموزش حاضر تمامی این مباحث را با دیتابیس رابطه ای MySQL مدیریت می کنیم. به همین جهت ماژول MySQLdb را بارگیری نموده و نصب می کنیم.

 

آموزش پایتون : ماژول MySQLdb
ماژول MySQLdb یک رابط یا interface برای اتصال به سرویس دهنده دیتابیس MySQL (MySQL Database server) با زبان برنامه نویسی پایتون است که توسعه دهنده می بایست برای دسترسی و مدیریت داده های اپلیکیشن آن را پیاده سازی کند. این اینترفیس ویرایش 2.0 Database API پایتون را پیاده سازی کرده و بر پایه ی MySQL C API ساخته شده است.

 

نصب MySQLdb
جهت استفاده از توابع MySQLdb لازم است ماژول آن را بر روی دستگاه خود نصب نمایید. کافی است دستورات زیر را در اسکریپت پایتون لحاظ کرده و آن ها را اجرا نمایید:
#!/usr/bin/python
import MySQLdb
کد فوق یک پیغام خطا مبنی بر اینکه ماژول MySQLdb نصب نشده است تولید می کند:
Traceback (most recent call last):
File "test.py", line 3, in <module>
import MySQLdb
ImportError: No module named MySQLdb
</module>
به منظور نصب ماژول MySQLdb، کافی است دستورات زیر را تایپ نمایید:
For Ubuntu, use the following command -
$ sudo apt-get install python-pip python-dev libmysqlclient-dev
For Fedora, use the following command -
$ sudo dnf install python python-devel mysql-devel redhat-rpm-config gcc
For Python command prompt, use the following command -
pip install MySQL-python
نکته:
لازم است جهت نصب ماژول فوق، root privilege (مجوز در سطح دسترسی به فایل های ریشه) داشته باشید.

 

پیاده سازی اتصال به دیتابیس (Database connection) در آموزش پایتون
پیش از اتصال به دیتابیس MySQL، لازم است اقدامات زیر را کامل انجام داده باشید:
  • یک دیتابیس به نام TESTDB ایجاد نموده اید.
  • یک جدول به نام EMPLOYEE در دیتابیس مزبور تعریف کرده اید.
  • جدول مورد نظر فیلدهایی به نام FIRST_NAME، LAST_NAME، AGE، SEX و INCOME را دربرمی گیرد.
  • جهت دسترسی به دیتابیس User ID (شناسه ی کاربری) را بر روی "testuser" و گذرواژه را بر روی "test123" تنظیم کرده اید.
  • ماژول MySQLdb به طور کامل بر روی دستگاه مورد نظر نصب شده است.
  • با مفاهیم پایه و ابتدایی دیتابیس MySQL آشنایی کافی داشته باشید.

 

ماژول
ذیل مثالی را مشاهده می کنید که در آن توسعه دهنده با زبان پایتون به دیتابیس رابطه ای MySQL به نام "TESTDB" متصل می شود.
#!/usr/bin/python
import MySQLdb
# Open database connection
db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )
# prepare a cursor object using cursor() method
cursor = db.cursor()
# execute SQL query using execute() method.
cursor.execute("SELECT VERSION()")
# Fetch a single row using fetchone() method.
data = cursor.fetchone()
print "Database version : %s " % data
# disconnect from server
db.close()
خروجی اسکریپت فوق در دستگاه مبتنی بر Linux به صورت زیر می باشد.
Database version : 5.0.45
زمانی که اتصال به دیتابیس یا منبع داده ای مورد نظر با موفقیت انجام می شود، یک آبجکت Connection در خروجی بازگردانی شده و متعاقبا داخل آبجکت db جهت استفاده در آینده ذخیره می گردد. در غیر این صورت مقدار db برابر None قرار داده خواهد شد. آبجکت db سپس جهت اعلان و آماده سازی آبجکت cursor استفاده می شود. حال به منظور اجرای دستورهای درخواست داده و پرس و جو از دیتابیس، متد execute() بر روی آبجکت cursor فراخوانی می شود. در پایان، پیش از خروج از دیتابیس، اتصال به دیتابیس قطع شده و منابع مورد استفاده آزاد می شوند.

 

ایجاد جدول دیتابیس در آموزش پایتون
پس از اینکه اتصال به دیتابیس برقرار شد، توسعه دهنده می تواند اقدام به ساخت جدول و درج سطر در جداول دیتابیس نماید. برای این منظور لازم است متد execute را بر روی آبجکت cursor صدا بزند.
مثال
در زیر یک جدول به نام EMPLOYEE ایجاد می کنیم:
#!/usr/bin/python
import MySQLdb
# Open database connection
db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )
# prepare a cursor object using cursor() method
cursor = db.cursor()
# Drop table if it already exist using execute() method.
cursor.execute("DROP TABLE IF EXISTS EMPLOYEE")
# Create table as per requirement
sql = """CREATE TABLE EMPLOYEE (
FIRST_NAME CHAR(20) NOT NULL,
LAST_NAME CHAR(20),
AGE INT,
SEX CHAR(1),
INCOME FLOAT )"""
cursor.execute(sql)
# disconnect from server
db.close()

 

عملیات INSERT
این عملیات زمانی اجرا می شود که توسعه دهنده بخواهد سطر و رکورد جدید در جدول دیتابیس جاری درج نماید.
مثال
مثال زیر دستور INSERT زبان SQL را برای ایجاد رکورد جدید در جدول EMPLOYEE اجرا می کند:
#!/usr/bin/python
import MySQLdb
# Open database connection
db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )
# prepare a cursor object using cursor() method
cursor = db.cursor()
# Prepare SQL query to INSERT a record into the database.
sql = """INSERT INTO EMPLOYEE(FIRST_NAME,
LAST_NAME, AGE, SEX, INCOME)
VALUES ('Mac', 'Mohan', 20, 'M', 2000)"""
try:
# Execute the SQL command
cursor.execute(sql)
# Commit your changes in the database
db.commit()
except:
# Rollback in case there is any error
db.rollback()
# disconnect from server
db.close()
مثال فوق را می توان جهت تولید Query های SQL به صورت dynamic (در زمان اجرا) به صورت زیر نوشت:
#!/usr/bin/python
import MySQLdb
# Open database connection
db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )
# prepare a cursor object using cursor() method
cursor = db.cursor()
# Prepare SQL query to INSERT a record into the database.
sql = "INSERT INTO EMPLOYEE(FIRST_NAME, \
LAST_NAME, AGE, SEX, INCOME) \
VALUES ('%s', '%s', '%d', '%c', '%d' )" % \
('Mac', 'Mohan', 20, 'M', 2000)
try:
# Execute the SQL command
cursor.execute(sql)
# Commit your changes in the database
db.commit()
except:
# Rollback in case there is any error
db.rollback()
# disconnect from server
db.close()
مثال
تکه کد زیر روش دیگری از درج داده در سطر است که در آن شما می توانید پارامترها را به صورت مستقیم به متد execute ارسال کنید:
..................................
user_id = "test123"
password = "password"
con.execute('insert into Login values("%s", "%s")' % \
(user_id, password))
..................................

 

عملیات خواندن داده ها (READ)
عملیات READ منحصرا اطلاعات مفیدی را از دیتابیس واکشی می کند.
پس از برقرار اتصال به دیتابیس، می توان از آن جهت درخواست داده های مورد نظر Query گرفت. دو متد fetchone() و fetchall() نیز برای همین منظور تعبیه شده اند.
متد fetchone(): این متد همان طور که از اسم آن پیدا است، تنها یک رکورد یا سطر را در خروجی برمی گرداند. در واقع متد حاضر سطر بعدی از میان مجموعه سطرهای داده (result set خروجی کوئری) را بازگردانی می نماید. زمانی که توسعه دهنده با استفاده از cursor از دیتابیس کوئری می گیرد، خروجی یک آبجکت result set (مجموعه سطرهای داده) می باشد.
متد fetchall(): متد جاری قادر است همزمان چندین مقدار را ازدیتابیس واکشی کند. این متد تمامی سطرهای موجود در مجموعه سطرهای داده یا آبجکت result set را بازیابی می کند. اگر برخی از سطرها قبلا از دیتابیس استخراج شده باشد، در آن صورت باقی سطرها از آبجکت result set واکشی می شود.
متد rowcount: این المان یک attribute فقط خواندنی (read-only) است و تعدد سطرهایی که تحت تاثیر متد execute() قرار گرفتند را بازمی گرداند.
مثال
رویه procedure زیر تمامی سطرهای موجود در دیتابیس را از جدول EMPLOYEE که مقدار فیلد income آن بیشتر از 1000 می باشد را به عنوان خروجی کوئری بازمی گرداند:
#!/usr/bin/python
import MySQLdb
# Open database connection
db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )
# prepare a cursor object using cursor() method
cursor = db.cursor()
# Prepare SQL query to INSERT a record into the database.
sql = "SELECT * FROM EMPLOYEE \
WHERE INCOME > '%d'" % (1000)
try:
# Execute the SQL command
cursor.execute(sql)
# Fetch all the rows in a list of lists.
results = cursor.fetchall()
for row in results:
fname = row[0]
lname = row[1]
age = row[2]
sex = row[3]
income = row[4]
# Now print fetched result
print "fname=%s,lname=%s,age=%d,sex=%s,income=%d" % \
(fname, lname, age, sex, income )
except:
print "Error: unable to fecth data"
# disconnect from server
db.close()
خروجی زیر را برمی گرداند:
fname=Mac, lname=Mohan, age=20, sex=M, income=2000

 

عملیات UPDATE و بروز رسانی داده ها
زمانی که عملیات UPDATE بر روی دیتابیس اجرا می شود، یک یا چندین سطر موجود در این دیتابیس با داده های جدید بروز رسانی می شوند.
رویه procedure و قطعه کدی که در زیر مشاهده می کنید، تمامی رکوردهایی که مقدار فیلد SEX آن ها 'M' می باشد را بروز رسانی می کند.در مثال جاری، مقدار فیلد AGE تمامی مردها را به میزان یک سال افزایش می دهیم.
مثال
#!/usr/bin/python
import MySQLdb
# Open database connection
db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )
# prepare a cursor object using cursor() method
cursor = db.cursor()
# Prepare SQL query to UPDATE required records
sql = "UPDATE EMPLOYEE SET AGE = AGE + 1
WHERE SEX = '%c'" % ('M')
try:
# Execute the SQL command
cursor.execute(sql)
# Commit your changes in the database
db.commit()
except:
# Rollback in case there is any error
db.rollback()
# disconnect from server
db.close()

 

عملیات DELETE و حذف رکورد از دیتابیس
عملیات DELETE زمانی استفاده می شود که لازم باشد یک یا چند رکورد از دیتابیس مورد نظر پاک شوند. کد حاضر تمامی رکوردهای جدول EMPLOYEE که مقدار فیلد AGE آن ها بیش از 20 می باشد را حذف می نماید:
مثال
#!/usr/bin/python
import MySQLdb
# Open database connection
db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )
# prepare a cursor object using cursor() method
cursor = db.cursor()
# Prepare SQL query to DELETE required records
sql = "DELETE FROM EMPLOYEE WHERE AGE > '%d'" % (20)
try:
# Execute the SQL command
cursor.execute(sql)
# Commit your changes in the database
db.commit()
except:
# Rollback in case there is any error
db.rollback()
# disconnect from server
db.close()

 

اجرای تراکنش بر روی دیتابیس (Transactions)
تراکنش یک مکانیزم است که دیتابیس را از یک وضعیت پایدار به وضعیت سالم و پایدار دیگر انتقال می دهد. تراکنش مجموعه ای از دستورها است که یا همه ی آن ها با موفقیت اجرا می شوند یا هیچکدام انجام نمی شوند.
تراکنش دارای چهار ویژگی معروف می باشد:
(اصل یا همه یا هیچ) Atomicity : تراکنش یا کاملا و به صورت یک پکیج اجرا می شود یا هیچ اتفاقی نمی افتد.
(اصل یکپارچگی و پایداری) Consistency: یک تراکنش باید پایگاه داده را از وضعیت پایدار و مشخص به وضعیت سالم، مشخص و پایدار دیگری انتقال دهد.
(اصل انزوا) Isolation: اطمینان حاصل می کند که تراکنش هایی که به طور همزمان اجرا می شوند، بر روی یکدیگر و سلامت دیتابیس اثری نمی گذارد، گویا هر یک در انزوا و به طور جداگانه اجرا می شوند.
(اصل پایایی و ماندگاری) Durability : زمانی که یک تراکنش به صورت نهایی ثبت و به اجرا رسید (commit)، اثرشان ماندگار و پایا خواهد بود، حتی اگر سیستم دچار خرابی ناگهانی شود.
مثال
از قبل حتما با نحوه ی پیاده سازی تراکنش آشنایی دارید. در زیر مثالی مشابه را می بینید:
# Prepare SQL query to DELETE required records
sql = "DELETE FROM EMPLOYEE WHERE AGE > '%d'" % (20)
try:
# Execute the SQL command
cursor.execute(sql)
# Commit your changes in the database
db.commit()
except:
# Rollback in case there is any error
db.rollback()
عملیات Commit و ثبت نهایی
کمیت Commit عملیاتی است که به دیتابیس اعلان می کند که باید تمامی تغییرات خود را به صورت نهایی ثبت کرده و پس از انجام آن دیگر امکان بازگشت به وضعیت قبلی وجود ندارد.
در زیر تکه کد ساده ای را مشاهده می کنید که متد commit() را بر روی آبجکت db صدا می زند.
db.commit()

 

عملیات ROLLBACK و بازگشت به وضعیت قبلی
اگر از تغییرات ثبت شده رضایت کامل ندارید، می توانید دیتابیس را به وضعیت قبل از انجام تراکنش بازگردانید. برای این منظور کافی است متد rollback() را بر روی آبجکت db فراخوانی نمایید.
db.rollback()

 

قطع اتصال به دیتابیس (متد close())
جهت بستن اتصال به دیتابیس کافی است متد close() را به صورت زیر فراخوانی نمایید:
db.close()
اگر اتصال به دیتابیس با فراخوانی متد close() بسته شود، در آن صورت تمامی تراکنش های انجام نشده به صورت نهایی، توسط DB به وضعیت قبلی بازگردانی می شوند.

 

مدیریت خطاها
خطاها بر اثر عوامل مختلفی رخ می دهند. برخی از خطاها بر اثر خطا گرامری و اشکال در سینتکس دستور SQL اجرا شده، رخ می دهند. برخی دیگر بر اثر عدم موفقیت در اتصال (connection failure) و برخی هم به دلیل فراخوانی متد fetch بر روی دستوری که قبلا یا کاملا انجام شده و یا لغو گردیده، اتفاق می افتند.
با DB API تعدادی خطا اعلان می کند که باید در هر ماژولی تعریف شده باشد. این خطاها (exceptions) در جدول زیر لیست شده اند:
 
اسکریپت های پایتون اپلیکیشن شما می بایست تمامی این خطاها را مدیریت کند. اما لازم است قبل از بکار بردن هر کدام از این exception ها اطمینان حاصل نمایید که MySQLdb امکان پشتیبانی از آن ها را دارد.
آموزش پایتون ادامه دارد.
  • افشین رفوآ