در بخش قبلی این سری مقالات آموزش زبان برنامهنویسی سوئیفت با کاربرد ژنریکها به همراه بستار و Enum آشنا شدیم. در این بخش قصد داریم از همه این مباحث جدا شویم و در مورد چند موضوع صحبت کنیم که موجب میشوند کد سوئیفت کارایی بیشتری پیدا کند. بدین ترتیب قصد آشنایی با Getter و Setter ،inout و lazy را داریم. برای مطالعه بخش قبلی این مجموعه مطلب آموزشی به لینک زیر رجوع کنید:
Inout کلیدواژهای است که وقتی استفاده میشود که پارامترهایی به تابعها ارسال میشوند. در واقع inout زمانی مورد استفاده قرار میگیرد که بخواهیم یک متغیر را به یک تابع ارسال کنیم و مقدار آن متغیر را بدون ایجاد متغیر جدید تغییر دهیم. در کد زیر با روش تغییر یک مقدار با و بدون inout آشنا میشویم:
هنگامی که یک تابع استاندارد بدون استفاده inout ایجاد شود، متغیر ارسالی «تغییرناپذیر» (immutable) است و امکان اصلاح آن وجود نخواهد داشت. به بیان دیگر به صورت یک ثابت ارسال میشود. کلیدواژه inout امکان تغییر دادن متغیر ارسالی را میدهد، زیرا با ارجاع ارسال شده است و نه با مقدار، چرا که در این صورت باید یک & در ابتدای آن وجود میداشت. اگر میخواهید در این رابطه بیشتر بدانید به مطلب زیر رجوع کنید:
در مثال فوق هنگامی که از یک تابع بدون inout استفاده کنیم، از آنجا که number به (:multiply(number:by ارسال شده است، در واقع به صورت number ارسال نشده است بلکه مقدار کنونی number که 10 است ارسال شده است. آن را میتوان به صورت زیر فراخوانی کرد:
اگر به تابعی که از inout استفاده میکند نگاه کنیم، میبینیم که سه تغییر رخ داده است، نخستین تغییر این است که هیچ نوع بازگشتی وجود ندارد. دوم این که از کلیدواژه در کنار نوع پارامتر استفاده کردهایم (inout Int). تغییر سوم این است که هیچ گزاره return در بدنه تابع ما وجود ندارد.
زمانی که تابع inout را فراخوانی میکنیم مجبور نیستیم که یک مقدار بازگشتی انتساب دهیم، زیرا هیچ مقداری بازگشت نمییابد. به جای آن زمانی که تابع inout را فراخوانی میکنیم، در واقع مکان متغیر را در حافظه ارسال میکنیم. برای این که موضوع روشنتر شود، باید بگوییم که وقتی از &secondNumber استفاده میکنیم، secondNumber به آدرس حافظه 0x01 انتساب مییابد. این وضعیت در عمل به صورت زیر ترجمه میشود:
البته نباید سردرگم شوید، چون وقتی به آدرس 0x01 نگاه میکنیم تا مقدار مورد نظر را ببینیم، همچنان مقدار «عدد دوم» (secondNumber) را میبینیم که 5 است.
درون تابع inout همه چیز به طرز متفاوتی عمل میکند. ما از number *= multiplier برای تغییر مقدار ذخیره شده در آدرس secondNumber استفاده میکنیم، زیرا مقدار را مستقیماً تغییر میدهیم و مقدار تغییر یافته در هر جایی در برنامه که ارجاعی به secondNumber صورت گرفته باشد، اعمال خواهد شد. جنبه مثبت این وضعیت آن است که مصرف حافظه کمی دارد و باید صرفاً نگران این متغیر که شامل مقدار number است نگران باشید.
جنبه منفی این رویکرد برای استفاده از inout آن است که همه انواع ارجاع را ناممکن میسازد. اگر secondNumber را در جایی از برنامه که ارجاع یافته تغییر دهید، ممکن است نخواهید در همه جاهای دیگر مقدار آن تغییر پیدا کند.
به عنوان مثال عملیتر، اگر بخواهیم یک مقدار را در userData فوقالذکر ارسال کنیم که از نوع Data است و شامل برخی اطلاعات باشد که لازم باشد در جای دیگری در اپلیکیشن به آن ارجاع دهیم، آن را به صورت یک پارامتر inout به یک تابع ارسال میکنیم و بدین ترتیب دادهها تغییر مییابند و دادههای اولیه نیز همچنان در موارد نیاز در دسترس خواهند بود. اگر بعدها به userData مراجعه کنیم و انتظار داشته باشیم که همان مقدار را داشته باشد ممکن است متوجه شویم که تغییر یافته است. بهترین حالت این است که اپلیکیشن تغییر را مدیریت کند و موارد مقتضی را بر همین مبنا اجرا کند. بدترین حالت این است که اپلیکیشن به دلیل تهی بودن یک مقدار یا این که نوع داده ذخیره شده در مکان حافظه تغییر یافته است، از کار بیفتد.
استفاده کردن یا نکردن از inout تصمیم شخصی شما است. هر چند این پارامتر گزینه کاملاً امنی محسوب نمیشود، اما بدان معنی نیست که هرگز نباید از آن استفاده کرد. این پارامتر در مواردی که محاسباتی را اجرا میکنید و نمیخواهید به طور پیوسته نتیجه برخی تابعها را هر بار که یک تابع را در محاسبات خود اجرا میکنید به currentResult انتساب دهید، عالی خواهد بود.
هنگامی که یک کلاس را ایجاد میکنیم، تقریباً همواره مشخصههایی میسازیم که از سوی آن کلاس استفاده میشود. این مشخصهها میتوانند صرفاً یک فلگ باشند که روشن یا خاموش میشوند تا حالت کنونی کلاس را تعیین کنند و یا میتوانند چیزی بزرگتر مانند یک کلاس دیگر باشند که این کلاس برای اجرای برخی کارها از آن بهره میگیرد. به مثال زیر توجه کنید:
این مثال چیز بزرگی به نظر نمیرسد، با استفاده از این کلاس در واقع از یک CLLocationCoordinate2d برای نمایش مکانی روی نقشه استفاده میکنیم.
اگر بخواهید بدانید CLLocationCoordinate2d چیست، باید بگوییم که یک struct شامل طول و عرض جغرافیایی مکان به همراه برخی متدهای ساده است. هم طول و هم عرض جغرافیایی به صورت CLLocationDegrees هستند که صرفاً یک «نوع مستعار» (typealias) برای این نوع Double محسوب میشود. به بیان سادهتر CLLocationCoordinate2d یک روش برای ارائه دو مقدار Double است که مکانی را روی نقشه تعیین میکنند و در مجموع بسیار سبک است.
در سوی دیگر MKMapView، حافظه زیادی اشغال میکند. فقط بارگذاری یک نقشه و بزرگنمایی به یک مختصات باعث مصرف چندین مگابایت از حافظه میشود. زمانی که از یک نقشه در برنامههای خود استفاده میکنیم، تقریباً 2000 annotation بارگذاری میشود و هنگامی که کمی در نقشه بگردیم مصرف حافظه تا 430 مگابایت افزایش پیدا میکند. پس چنان که میبینید نماهای نقشه تا حدودی پرهزینه هستند. همان طور که حدس میزنید این نمای نقشه همان نمایی است که هنگام باز کردن اپلیکیشن Maps در گوشی خود مشاهده میکنید.
خبر خوب این است که iPhone-ها و iPad-ها امروزه چندین گیگابایت حافظه دارند و لذا این مسئله چندان بزرگ به حساب نمیآید، اما با این حال همچنان میتوان این وضعیت را بهینهسازی کرد. این همان جایی است که مشخصههای با ذخیرهسازی Lazy به کار میآیند.
سناریویی را تصور کنید که یک «نما» (view) در اپلیکیشن خود داریم و این نما میتواند یک نقشه را نمایش دهد یا ندهد. اگر نقشه را نمایش ندهد قطعاً دوست نداریم صدها مگابایت داده را در حافظه بارگذاری کنیم، اما همچنان میخواهیم که بتوانیم در صورت نیاز نقشه را در اپلیکیشن خود و همچنین در تابعهایی دیگری که نما را مالکیت میکنند داشته باشیم. در مثال زیر طرز کار این رویکرد را میتوانید ملاحظه کنید:
کلیدواژه lazy در ابتدای ()var mapView = MKMapView جایی است که بخش اصلی داستان اتفاق میافتند. این کلیدواژه به برنامه اعلام میکند که آماده شود چون ممکن است mapView در این نما استفاده شود. زمانی که زمان استفاده از نمای نقشه فرا برسد، کد ایجاد آن به صورت فوق خواهد بود.
در ادامه کد میبینیم که وقتی کاربر روی یک دکمه برای نمایش نقشه ضربه بزند، ()createView را فراخوانی میکنیم. این متد شامل منطقی است که در پشت صحنه نوشتهایم تا نمایی را که نقشه را نمایش میدهد به نمای جاری اضافه کنیم. زمانی که از (view.addSubview(mapView استفاده میکنیم، کد mapView فراخوانی میشود که mapView را ایجاد میکند و در صورت نیاز میتوانیم تابعها را روی mapView فراخوانی کنیم.
اگر این نما ایجاد نشده باشد و یک تابع را روی mapView فراخوانی کنیم، mapView در آن زمان ایجاد خواهد شد. بنابراین Lazy اساساً ایجاد mapView را تا زمانی که واقعاً ضروری باشد به تعویق میاندازد. مشخصههای Lazy میتوانند به صورت «بستار» (closure) ها نیز باشند. در واقع این حالتی است که عموماً مورد استفاده قرار میگیرند و بدین ترتیب از محاسبات اضافی تا زمانی که واقعاً ضروری نباشد جلوگیری میکنند. این حالت را در پشته Core Data به طور مکرر مشاهده میکنید. با این حال اگر از چیزی سر در نیاوردید لازم نیست، نگران باشید، چون فعلاً روی lazy تمرکز داریم.
کانتینرهای دائمی ممکن است لازم باشند یا نباشند؛ اما لازم نیست آنها را از همان ابتدا مستقیماً ایجاد کنیم. به جای آن صبر میکنیم تا زمانی فرا رسد که قبل از ایجاد کردن آن، عملاً لازم باشد که دادهها را در پایگاه داده ذخیره یا از آن بارگذاری کنیم. بدین منظور از یک closure استفاده میکنیم که کانتینر دائمی را با کمترین مراحل مورد نیاز برای ایجاد کانتینر ایجاد کند.
استفاده از Lazy زیبا است و غالباً باید در جاهایی استفاده شود که مفید باشد. نباید نگران باشید که رویههای ساده با استفاده از Lazy پیچیده میشوند، چون در هر صورت امکان Lazy ساختن ثابتها وجود ندارد. اگر تلاش کنید یک ثابت را به صورت Lazy تعریف کنید، Xcode شما را مأیوس خواهد کرد.
Getter-ها و Setter-ها بخشی از «مشخصههای محاسبه شده» (Computed Properties) هستند. آنها خویشاوند نزدیک مشاهدهگرهای مشخصه به نام didSet و willSet محسوب میشوند. چنان که احتمالاً به خاطر دارید didSet و willSet جهت اجرای وظایف اضافی در زمان تغییر یافتن یک مشخصه محاسبه شده استفاده میشوند. Getter-ها و Setter-ها منطقی در اختیار ما قرار میدهند که میتوانیم برای تعیین یک مقدار یا بازیابی آن مورد استفاده قرار دهیم. به مثال زیر توجه کنید:
در مثال فوق، number پیادهسازی پیشفرض get و set را ارائه میکند که در صورت عدم اضافه شدن { get set } به انتها میتوانستیم داشته باشیم. تنها دلیل استفاده از آنها روشنتر شدن موضوع بوده است. حفظ انسجام کد همواره خوب است و اگر مشخصهای دارید که تنها get دارد، در این صورت بهتر است { get set } را روی مشخصههایی اضافه کنید که قابلیت get و set داشته باشند.
زمانی که تنها از { get } استفاده میکنیم در واقع صرفاً امکان بازیابی مقدار را داریم و نمیتوانیم مقدار را تعیین کنیم. این وضعیت مشابه یک ثابت است، گرچه عموماً محاسبه مشخصههای دیگر را نیز بازگشت میدهد. در ادامه چند مثال را میبینید که در آنها میتوان از { get } استفاده کرد.
در مثال فوق ما یک نرخ ساعتی و همچنین تعداد ساعتهای کارکرد را داریم که با استفاده از دستورهای زیر قابل تعیین هستند:
سپس میتوانیم دریافتی کارمند را با استفاده از دستور زیر به دست آوریم:
در ادامه مثالی پیچیدهتر را بررسی میکنیم.
در کد فوق چند فاصله اضافی درج کردهایم تا خوانایی بهتری داشته باشد. در این مثال یک setter خصوصی در ابتدای (private(set داریم. بدین ترتیب مطمئن میشویم که مقدار صحیحی تعیین شده است. ما هرگز یک «دریافتی» (earnings) منفی یا 0 نخواهیم داشت، بنابراین میتوانیم مطمئن باشیم که earnings مقدار مثبتی دارد و این که قبل از تعیین مقدار واقعی earnings و hoursWorked مقداری کارکرد داشتهایم. سپس از setter مربوط به earnings برای بهروزرسانی مقدار hourlyRate استفاده میکنیم.
این کد برای بهروزرسانی دریافتیها از کارمندان و تعداد ساعتهای کارکرد استفاده میشود، اما اگر یک کارمند اضافهکاری داشته باشد چطور؟ در این حالت میتوانیم یک مورد دیگر به صورت زیر بسازیم:
اما این بدان معنی است که باید به خاطر بسپاریم آیا hoursWorked یا hourlyRate را تنظیم کردهایم یا نه و بنابراین میتوانیم بررسی کنیم که کدام مورد نیازمند بهروزرسانی است.
اگر در موقعیتی مانند این قرار گرفتید، احتمالاً استفاده از getter و setter ایده بدی خواهد بود و به جای آن میتوانید از مشاهدهگر مشخصه به نام didset برای هر دو متغیر hoursWorked و hourlyRate استفاده کنید. در این حالت همچنان میتوان دریافتیها را در یک setter خصوصی نگهداری کرد، اما استفاده نکردن از setter خصوصی برای بهروزرسانی مقادیر در عمل آسانتر است.
از کد فوق استفاده کنید و ببینید آیا میتوانید آن را به نحوی بازسازی و اصلاح کنید که بتوان از دو تابع برای بهروزرسانی دریافتیها و ساعتهای کاری یا نرخ دستمزد استفاده کرد. به این ترتیب struct کارمند قابلیت استفاده بیشتری مییابد. حتی میتوان از آن برای محاسبه تغییرها برای پرداختهای شخصی نیز استفاده کرد. برای نمونه با افزودن یک فلگ isPaidHourly میتوان ساعتها را در صورت false بودن به صورت خودکار روی 40 تنظیم کرد و متدی برای بهروزرسانی کارگران مزدبگیر داشت.
نکته: با این که میتوان از optional-ها و اعلان متدی مانند زیر استفاده کرد:
اما بهتر است آن را به چند بخش تقسیم کنید تا بهروزرسانی هدفمندتری در مورد مقدار و یا ساعتهای کاری یا نرخ دستمزد داشته باشید و اجازه دهید مشاهدهگرهای مشخصه به جای شما عمل بهروزرسانی را اجرا کنند.
روش دیگر این است که از setter-های خصوصی از طریق مشخصههای محاسبه شده استفاده کنید. بدین ترتیب برای مثال زمانی که لازم میشود مجذور عددی محاسبه شود با تعیین عدد، به صورت خودکار مربع آن محاسبه خواهد شد.
ما در این مقاله با مفاهیم inout ،lazy و get و set آشنا شدیم. همچنین روش استفاده از آنها و بهترین کاربردشان را دیدیدم. Inout زمانی استفاده میشود که بخواهیم یک مقدار را با ارجاع ارسال کنیم. اپل در مستندات خود (+) یک راهنما در مورد این موضوع منتشر کرده است.
Lazy زمانی استفاده میشود که بخواهیم یک مقداردهی با تأخیر برای هر چیزی داشته باشیم که شاید همیشه در زمان بارگذاری یک کلاس یا struct مورد استفاده قرار نمیگیرد. برای کسب اطلاعات بیشتر در این خصوص میتوانید به این صفحه از مستندات اپل (+) مراجعه کنید.
از مشخصههای محاسبه شده زمانی استفاده میشود که بخواهید نوعی از کار را پس از بازیابی یا تعیین یک مقدار اجرا کنید. همچنین کاربرد دیگر آن زمانی است که بخواهید تعیین یک متغیر را به صورت عمومی رد کنید و مطمئن شوید که مقدار آن برای کاربردی که طراحی شده مناسب است. برای کسب اطلاعات بیشتر در این مورد نیز میتوانید به این صفحه (+) از مستندات مراجعه کنید. بدین ترتیب به پایان بخش شانزدهم از این سری مقالات آموزشی میرسیم. تنها دو بخش از این سری باقی مانده و یک خبر خوب و یک خبر بد برای شما داریم.
ابتدا خبر خوب را میگوییم، شما اینک با همه مبانی مقدماتی ایجاد یک اپلیکیشن و انتشار آن در اپاستور آشنا شدهاید. اما خبر بد این است که نباید تلاش کنید تا یک اپلیکیشن را در اپاستور منتشر کنید، چون شما جنبه بسیار مهمی از انتشار اپلیکیشن را هنوز نیاموختهاید. در مطلب ابتدایی این سری در مورد مراحل مختلف و چرخه عمر توسعه یک اپلیکیشن صحبت کردیم. درست پس از توسعه اپلیکیشن وارد سه فاز میشویم که هدف همه آنها آزمودن کارکرد اپلیکیشن است.
در مراحل بعدی در مورد تست کردن اپلیکیشن صحبت خواهیم کرد. تست کردن با اختلاف زیادی مهمترین کاری است که باید در اپلیکیشن انجام دهید. البته نوشتن کد نیز مهم است؛ اما اگر اپلیکیشن شما طراحی شده باشد تا کاری را انجام دهد و نتواند آن کار را انجام دهد، همه تلاشهای شما بیثمر خواهد بود. بنابراین انتشار بیدرنگ اپلیکیشن کار اشتباهی است و ابتدا باید آن را تست کرد. برای مطالعه بخش بعدی به لینک زیر مراجعه کنید:
منبع: فرادرس
بازی مار و پله (Snakes and Ladders)، یک بازی باستانی هندی است که اکنون یک بازی کلاسیک جهانی محبوب محسوب میشود. این بازی قابل انجام بین دو یا تعداد بیشتری بازیکن است. صفحه بازی مار و پله، شطرنجی است؛ در این بازی، در برخی از خانهها نردبانهایی وجود دارد که فرد را به خانههای بالاتر میرساند و در بعضی از خانهها، مارهایی وجود دارد که فرد را اصطلاحا نیش میزنند و به خانههای پایینتری انتقال میدهند (جایی که دم مار در آن قرار دارد). بازی به این صورت انجام میشود که هر بازیکن تاس میاندازد و با توجه به عددی که میآید، تعداد خانههایی را به جلو حرکت میکند. بسته به عدد تاس، ممکن است فرد در یک خانه عادی، دارای نربان و یا دارای مار قرار بگیرد. در «مساله مار و پله» (Snake and Ladder Problem)، هدف پیدا کردن کمترین تعداد دفعات پرتاب تاس لازم برای رسیدن به مقصد (آخرین خانه در صفحه شطرنجی) از مبدا (اولین خانه) است. این مساله کمی با بازی تختهای متداول مار و پله که افراد بازی میکنند متفاوت است و در آن، بازیکن بر عددی که در پرتاب تاس به دست میآید کنترل دارد و باید اعدادی را پیدا کند که با کمترین تعداد پرتاب تاس به خانه نهایی برسد. در ادامه، الگوریتم بازی مار و پله (در واقع الگوریتم لازم برای حل این مساله) ارائه و پیادهسازی آن در زبانهای برنامهنویسی «پایتون» (Python)، «جاوا» (Java)، «سیپلاسپلاس» (++C) و «سیشارپ» (#C) انجام شده است.
برای مثال، در صفحه بازی موجود در تصویر بالا، تعداد پرتابهای تاس لازم برای رسیدن از خانه ۱ به خانه ۳۰ برابر با سه است. گامهای زیر برای آنکه بازیکن با سه پرتاب تاس به نتیجه برسد انجام میشود.
برخی از دیگر راهکارهای موجود برای حل مساله مار و پله (با کمترین تعداد پرتاب تاس) عبارتند از: (2, 2, 6)، (2, 4, 4) و (2, 3, 5).
ایده موجود برای حل این مساله در حالت کلی آن است که صفحه بازی به صورت یک گراف جهتدار در نظر گرفته شود. اکنون، مساله یافتن کوتاهترین مسیر در گراف است. هر «راس» (Vertex) از گراف، دارای «یالی» (Edge) به شش راس بعدی است؛ اگر راسهای بعدی دارای نردبان یا مار نباشند. اگر هر یک از شش راس دارای مار یا نردبان باشند، یال از راس کنونی به راس بالای نردبان یا دم مار متصل میشود. با توجه به اینکه همه یالها دارای وزنهای برابری هستند، میتوان کوتاهترین مسیر را با استفاده از «جستجوی اول عمق» (Breadth First Search) کشف کرد. در ادامه، پیادهسازی ایده بالا با استفاده از زبانهای برنامهنویسی گوناگون انجام شده است. ورودی با دو چیز نمایش داده شده است: N که تعداد خانههای صفحه بازی است و آرایه [move[0…N-1 با اندازه N. یک ورودی [move[i برابر با ۱- است اگر هیچ مار یا نردبانی از i وجود نداشته باشد؛ در غیر این صورت، [move[i حاوی اندیس سلول مقصد برای مار یا نردبان در i است.
خروجی:
Min Dice throws required is 3
پیچیدگی زمانی راهکار بالا از درجه (O(N است؛ زیرا هر سلول تنها یکبار به «صف» (Queue) اضافه و کم میشود و یک فرایند معمول افزودن به صف یا حذف کردن از آن از درجه زمانی (O(1 است.
منبع: فرادرس
پایتون یک زبان برنامهنویسی سطح بالا و نسبتاً جدید محسوب میشود؛ عمده شهرت و محبوبیت این زبان برنامهنویسی به دلیل ساختار سادهاش است که موجب شده هم یادگیری آسانی داشته باشد و هم در میان حوزههای مختلفی از علوم که نیاز به محاسبات و برنامهنویسی دارند نفوذ گستردهای پیدا کند. در این مطلب به جمعبندی سری مقالات آموزش پایتون مجله فرادرس پرداختهایم.
چنان که پیشتر در مقاله «برترین و محبوبترین زبانهای برنامهنویسی در سال 2۰1۸» در مجله فرادرس دیدیم، زبان پایتون با در نظر گرفتن شاخصهای مختلف در رتبه سومین زبان محبوب در طی سال گذشته قرار گرفته است.
کاربردهای این زبان برنامهنویسی چندمنظوره چنان متنوع هستند که امروزه در هر جایی از علوم داده تا برنامهنویسی بکاند اپلیکیشنها میتوان آن را مشاهده کرد. بسیاری از افراد حتی آن را به عنوان جایگزینی برای پکیجهای نرمافزاری از قبیل matlab مورد استفاده قرار میدهند. در هر حال قدر مسلم این است که پایتون با سرعت بالایی در حال رشد و نفوذ در حوزههای مختلف برنامهنویسی است و انتظار میرود در سالهای آتی حتی بر این محبوبیت گسترده نیز افزوده شود.
ما در مجله فرادرس در طی ماههای اخیر 9 مطلب پروژه محور در زمینه معرفی کاربردهای مختلف زبان برنامهنویسی پایتون منتشر کردهایم که در آنها با طرح یک مسئله و حل کردن آن، طرز استفاده عملی از این زبان برنامهنویسی را نشان دادهایم. در ادامه فهرستی از این مطالب و خلاصهای از شرح کار هر کدام را ملاحظه میکنید.
نخستین اپلیکیشن پایتون که توسعه دادیم یک اپلیکیشن دیکشنری است. در این آموزش با روش کار با دادهها در قالب JSON و همچنین طرز تبدیل آنها به رشته و تابعهای مختلف پایتون برای کار با رشتهها آشنا شدیم. ما در این آموزش موفق شدیم امکانات پیشرفتهای برای تصحیح خطاهای کاربر در هنگام وارد کردن کلمه و جستجوی آن طراحی کنیم.
بخش دوم آموزش پروژه محور پایتون اختصاص به طراحی یک وب اپلیکیشن برای نمایش نقشه دارد. مهمترین نقطه قوت پایتون این است که برای هر کاری دهها کتابخانه آماده وجود دارد که میتوانید از آنها استفاده کنید. ما در این آموزش برای نمایش نقشه از کتابخانه Folium کمک میگیریم. بدین ترتیب یا مراحل نصب کتابخانه، افزودن نشانگر منفرد و چندگانه، تغییر رنگ نشانگرها و آیکونها و بارگذاری نقشه بسته به موقعیت آشنا میشویم.
در بخش سوم مجموعه مقالات آموزش پروژه محور پایتون در مجله فرادرس با روش ساخت یک مسدودکننده وبسایت آشنا میشویم. این مسدودکنندها در محیطهای سازمانی و یا مدارس بسیار مفید هستند و از دسترسی کاربران به برخی وبسایتها جلوگیری میکنند. بدین منظور با مفهوم فایل hosts در سیستمهای عامل مختلف آشنا میشویم. همچنین مقداری کدنویسی میکنیم تا بتوانیم قواعد خاصی را روی شبکه محلی کاربر پیادهسازی کنیم.
در بخش چهارم مجموعه مقالات آموزش پایتون از کتابخانه Flask در این زبان برنامهنویسی به منظور طراحی یک وبسایت استفاده میکنیم. این کتابخانه در واقع یک میکرو فریمورک برای طراحی فرانتاند است. این کتابخانه به طور عمده به همراه پایگاه داده MongoDB استفاده میشود که کنترل بیشتری روی پایگاه داده و سابقه کارها ایجاد میکند. پس از طراحی وبسایت آن را روی پلتفرم Heroku منتشر میکنیم. به این منظور نیاز به برخی پیکربندیهای خاص داریم که آنها نیز به طور کامل توضیح داده شدهاند. در نهایت ما با چند گام ساده موفق خواهیم شد یک وبسایت ابتدایی را به صورت آنلاین داشته باشیم.
در ادامه سری مطالب آموزش پایتون با ساخت اپلیکیشن های واقعی در مجله فرادرس در بخش پنجم آن یک اسکریپت پایتون مینویسیم که برای تحلیل احساسات توییتر افراد مختلف در مورد یک موضوع خاص استفاده میشود. بدین منظور از یک کتابخانه «پردازش زبان طبیعی» (Natural Language Processing) به نام TextBlob استفاده شده است. سادگی کار با کتابخانههای پایتون حیرتانگیز است به طوری که در این راهنما صرفاً با نوشتن 15 خط کد موفق شدهایم، یک اپلیکیشن تحلیل احساسات در پایتون بنویسیم.
وب اسکرپینگ یکی از حوزههای بسیار مهم در رشته علوم داده محسوب میشود. اهمیت این حوزه از آن جهت است که در اغلب موارد دادههایی که ما نیاز داریم به طور آماده و تمیز در اختیار ما قرار ندارند، بلکه باید آنها را گردآوری و پاکسازی کنیم. در این مقاله با روش گشتن در میان صفحههای وب و گردآوری و استخراج دادههای مطلوب آشنا میشویم. به این منظور از کتابخانه BeautifulSoup پایتون استفاده شده است.
در بخش هفتم این سری مقالات آموزش پایتون با ساخت اپلیکیشنهای واقعی با روش طراحی فرانتاند یک وبسایت ساده و انتشار آن روی Heroku آشنا شدیم. در این مطلب میخواهیم روی بکاند وبسایت و طراحی پایگاه داده آن متمرکز شویم. بدین منظور از Flask استفاده میکنیم. Flask یک میکرو فریمورک برای توسعه وب است و در اغلب موارد در زمان کار با پایگاه داده نیز استفاده میشود. ما در این مقاله یک صفحه وب ایجاد میکنیم که با استفاده از آن میتوانیم ورودی کاربر را بگیریم و آن را در پایگاه داده ذخیره کنیم.
در بخش هشتم از این سری مقالات آموزش پروژه محور پایتون به معرفی کتابخانه OpenCV میپردازیم. این کتابخانه مشهور پایتون به منظور پیادهسازی الگوریتمهای بینایی ماشین طراحی شده است. با استفاده از OpenCV میتوانید اپلیکیشنهای مختلفی برای تشخیص چهره و موارد دیگر بنویسید. در این بخش با روشهای بارگذاری تصاویر، تغییر اندازه تصاویر و تشخیص چهره در تصاویر و ویدئوهای زنده آشنا خواهیم شد.
اپلیکیشنهای مالی بخش بزرگی از حجم اپلیکیشنهای تولیدشده در دنیا را تشکیل میدهند. پایتون نیز به عنوان یک زبان برنامهنویسی چندمنظوره از این بازار بینصیب نمانده است در این مقاله با کتابخانه Bokeh آشنا میشویم که به منظور طراحی و رسم نمودارهای مالی مورد استفاده قرار میگیرد. این راهنما به توضیح انواع گوناگون نمودارهای مالی و اصطلاحهای مربوطه پرداخته است.
زبان برنامهنویسی پایتون چنان که اشاره شد به عنوان یک زبان سطح بالا و چندمنظوره در عرصههای مختلف محبوبیت زیادی کسب کرده است. شما با مطالعه سری مقالات فوق تقریباً با اکثر این حوزهها آشنا میشوید. یکی از بزرگترین دلایل رشد روزافزون محبوبیت پایتون ابتدا سادگی ساختار و دستور زبان آن و در وهله دوم وجود جامعه کاربری بسیار پویا و کتابخانههای مختلف است. همانگونه که در سری مقالات فوق مشاهده کردید، برای بسیاری از امور در پایتون لازم نیست از صفر شروع به کدنویسی بکنید، چون حتماً یک کتابخانه آماده وجود دارد که بخش زیادی از دشواری کار را از روی دوش شما بر دارد.
منبع: فرادرس
بسیاری از افراد هنگام برنامهنویسی و یا کار با نرمافزارهای گوناگون با خطاها و مشکلاتی مواجه میشوند. رفع این خطاها و مشکلات، به دغدغه مهمی برای فرد مبدل میشود؛ اما بعضا از راهکار مناسب برای درک چرایی مشکل و رفع آن آگاه نیستند و استفاده نمیکنند. دکتر «سید مصطفی کلامی هریس»، در پادکستی که در ادامه آمده، به موضوع خطایابی نرم افزار پرداختهاند. نسخه متنی این پادکست نیز در همین مطلب قرار دارد. البته، منبع اصلی همچنان فایل صوتی محسوب میشود.
ذخیره کردن این فایل صوتی: لینک دانلود
یکی از موضوعات مهمی که من همیشه در دورههای آموزشی برنامهنویسی، در آموزشهای گوناگون، در هر کلاس درسی و به طور کلی در هر جایی که فرصت بوده به آن اشاره میکنم این است که کاربر با هر نرمافزاری که کار میکند – مثلا «متلب» (MATLAB) یا هر کامپایلری – ممکن است در هر جا خطایی به کاربر نمایش داده میشود. این متن خطا مهمترین چیزی است که فرد باید در آن لحظه بخواند. خیلی وقتها پاسخ کاربر و پاسخ اشکال موجود، در همانجا است. یعنی مثلا در متن خطا گفته شده این کار را باید انجام دهید و واقعا با انجام همان کار مشکل حل میشود.
مواقعی نیز وجود دارد که در متن پیام خطا کار خاصی توصیه نشده، ولی با مطالعه همان متن و جستجوی آن در گوگل میتوان به نتیجه رسید؛ زیرا افراد زیادی با خطای مشابهی مواجه شدهاند و پرسش خود پیرامون آن را مطرح کردهاند و یک عده از افراد نیز به این پرسشها پاسخ دادهاند و یا بلاخره در سایت سازنده همان نرمافزار یا زبان برنامهنویسی این موضوع به بحث گذاشته شده که چطور میتوان این خطا را رفع کرد. به همین دلیل، این موضوع بسیار حائز اهمیت است. اولا، کاربر یک سری چیزهایی یاد میگیرد، زیرا متن خطا ممکن است حاوی مطلب مهمی باشد و اغلب با رنگ قرمز و علامت هشداری نمایش داده میشود تا توجه فرد را به طور کامل به خود جلب کند. ولی متاسفانه بسیاری از افراد و شاید بیش از نود درصد افراد اصلا این پیغام را نمیخوانند و مشکلات نیز از همین امر نشات میگیرد. این افراد معمولا میگویند برنامه ما به مشکل بر خورده است. برای مثال در طول یک هفته بیش از بیست نفر به من پیام دادهاند و گفتهاند که برنامه آنها به مشکل برخورد کرده است. اما متن خطا را نمیخوانند؛ در حالیکه بسیاری از مواقع، جواب سوال و راهکار مشکل آنها همانجا است.
این یک مشکل خیلی شایع است و فکر میکنم لازم است این روحیه ایجاد شود که اول خطا را بخوانیم و خودمان سعی کنیم مشکل را حل کنیم و اگر نشد، متن خطا را در گوگل جستجو کنیم. به این شکل، اولا فرد چیزهایی میآموزد که در هیچ کتاب و کلاس درسی به او یاد نمیدهند. دوما، همین تعامل با نرمافزار و جستجوها است که موجب عمیق شدن دانش فرد میشود. این را اگر مد نظر داشته باشیم، خیلی چیزها بهتر و سریعتر حل میشوند و یک موضوع دیگر هم این است که بدین شکل سرعت کار فرد بالا میرود و ضمنا بعد از مدتی مهارتی در فرد ایجاد میشود که نه تنها مشکلات او را حل میکند، بلکه موجب میشود تا بتواند به دیگران نیر کمک کند. این موضوع بسیار مهمی است و به طور کل، موضوع ارزشمندی است که دانش خیلی ارزشمندی را فرد با بهرهگیری از آن به دست میآورد.
یعنی بحث ماهیگیری که در ضرب مثلها میگویند همین است. بدین شکل فرد واقعا ماهیگیری را یاد میگیرد. واقعا این روحیه به افراد چیزهای زیادی را میآموزد. سعی کنید این ویژگی را حتما پرورش بدهید. فکر میکنم برای افرادی که کار برنامهنویسی انجام میدهند، شروع آن با خواندن متن خطا است. همین مورد اگر رعایت شود، فکر میکنم خیلی از مشکلات برای بسیاری از افراد حل خواهد شد.
برای دانلود کردن و شنیدن دیگر پادکستهای دکتر سید مصطفی کلامی هریس در مجله فرادرس، روی این لینک [+] کلیک کنید.
منبع: فرادرس
در این مقاله با معنی آرگومان های پیش فرض و روش استفاده از آنها و اعلانهای ضروری برای کاربردشان آشنا میشوید. در برنامهنویسی ++C میتوانید مقادیر پیشفرض را برای پارامترهای تابع ارائه کنید.
ایده تشکیلدهنده آرگومان پیشفرض ساده است. اگر تابعی به وسیله آرگومان(های) ارسالی فراخوانی شود آن آرگومانها از سوی تابع استفاده میشوند. اما اگر آرگومان(ها) در زمان فراخوانی یک تابع ارسال نشوند، در این صورت مقادیر پیشفرض مورد استفاده قرار میگیرند. مقادیر پیشفرض در پروتوتایپ تابع به آرگومانها ارسال میشوند. برای مطالعه بخش قبلی این مجموعه مطلب آموزشی روی لینک زیر کلیک کنید:
در ادامه به یک مثال در همین رابطه میپردازیم.
آرگومان پیشفرض
خروجی
No argument passed: * First argument passed: # Both argument passed: $$$$$
در برنامه فوق، میتوانید مقدار پیشفرض انتساب یافته به آرگومانها را ببینید:
در ابتدا، تابع ()display بدون ارسال هیچ پارامتری فراخوانی میشود. در این حالت، تابع ()display از هر دو آرگومان c = * و n = 1 استفاده میکند.
سپس در دفعه دوم تنها آرگومان نخست با استفاده از تابع ارسال میشود. در این حالت، تابع از مقدار پیشفرض نخست ارسالی استفاده نمیکند. بدین ترتیب از پارامتر واقعی ارسالی به عنوان آرگومان نخست # = c استفاده میکنیم و مقدار پیشفرض n=1 به عنوان آرگومان دوم میگیرد.
زمانی که ()display برای بار سوم فراخوانی میشود، هر دو آرگومان ارسال میشوند، آرگومانهای پیشفرض مورد استفاده قرار نمیگیرند. بنابراین مقدار $ = c و n=5 استفاده میشوند.
در این حالت، c و d نیز باید مقادیر پیشفرض بگیرند. اگر میخواهید یک آرگومان پیشفرض منفرد داشته باشد، باید مطمئن شوید که آرگومان به عنوان آخرین مورد است.
مهم نیست که از آرگومانهای پیشفرض چگونه استفاده میکنید، چون یک تابع باید همواره طوری نوشته شود که تنها یک منظور را اجرا کند.
اگر تابع شما با بیش از یک چیز یا منطق پیوند دارد، بیش از حد پیچیده محسوب میشود و بهتر است که از overload کردن تابع برای جداسازی منطق بهره بگیرید.
منبع: فرادرس