Gnu Tips

وبلاگ شخصی وحید معانی

خطای KeyError در پایتون

در پایتون و هنگام کار با نوع داده‌ی دیکشنری (dictionary) اگر کلیدی که مقدار اون رو در‌خواست دادیم وجود نداشته باشه خطای KeyError دریافت می‌کنیم:

Post Qr Code

طبیعی هست که این خطا باعث می‌شه که اجرای برنامه با مشکل مواجه بشه. حالا سؤالی که پیش میاد این هست که: I) برای جلوگیری از این مشکل چی کار کنیم؟
اگه روال برنامه به نوعی باشه که لازم داشته باشیم مقدار کلید‌هایی که توی دیکشنری پیش‌بینی نشدن رو یه مقدار پیش‌فرض برگردونه II) باید چی کار بکنیم؟

جواب سؤالات بالا رو می‌تونیم با متد try…except بدیم. به این صورت که دستور print یا هر دستوری که به مقدار یه کلید توی دیکشنری می‌خواد دست پیدا کنه رو توی قسمت try می‌نویسیم و در قسمت except وقوع خطا رو بررسی می‌کنیم و اگه خطایی رخ داد (I) برای حل سؤال اوّل یه پیغام برمی‌گردونیم و کاربر رو مطلع می‌کنیم و متناسب با اون کنترل رو به قسمت صحیح برنامه منتقل می‌کنیم یا (II) برای حل سؤال دوّم یه مقدار پیش‌فرض برمی‌گردونیم و بدون اینکه کاربر بدونه برنامه به کارش ادامه می‌ده :)

امّا آیا این تنها راهیه که داریم، طبیعی هست که جواب نه باشه. نوع داده دیکشنری یه صفت به اسم get داره که کارش همینه:

یعنی هر دو سؤال بالا رو توی یه خط هم می‌شه جواب داد:

نکته: به syntax این صفت و تفاوتش با syntax دیکشنری خالی توجه کنید!

«منبع»

مشکل کاراکتر EOL در سیستم‌عامل‌های مختلف!

postاگر تا حالا یه فایل متنی ساده(txt) رو داخل یه سیستم‌عامل نوشته و سعی کرده باشین داخل یه سیستم‌عامل دیگه بازش کنین، حتماً متوجه شدین که کاراکتر EOLء(End Of Line) درون سیستم‌عامل‌های مختلف متفاوته. من این مشکل رو بین دو سیستم‌عامل گنو/لینوکس و ویندوز تجربه کردم. برای مثال فایلی که emacs نوشتین و شامل چند خط مجزا هست توی Notepad ویندوز فقط یه خط داره و فایل به شکل خیلی بدی دیده می‌شه برای حل این مشکل موقع ذخیره فایل باید به ویرایشگرتون بگید که مقصد کدوم نوع استایل هست. توی emacs این کار با دستور set-buffer-file-coding-system انجام می‌شه و باید نوع استایلتون رو با استفاده از سه مقدار mac, unix و dos مشخص کنید.

تابع print و پایتون۳

print in python3

post qr-code

در نسخه‌ی ۳ زبان پایتون دستور print به تابع ()print تغییر پیدا کرده و برای استفاده از اون باید آرگومان‌ها رو همانند بقیه توابع داخل پرانتز براش ارسال کنیم. امّا این همه‌ی تغییرات نیست، اگر با زبان C و اقوام ایشون کد زده باشید حتماً می‌دونید که می‌شه با دستور printf مکان‌نما رو انتهای خط نگه‌داشت تا دستور بعدی print از ادامه‌ی همون خط بتونه عمل چاپ رو انجام بده. ولی ما توی پایتون همچین دستوری نداریم، به قطعه کد زیر توجه کنید:

اگر شما هم می‌خواین مکان‌نما رو روی همون خط نگه دارین لازم نیست کار خاصی انجام بدین، از جمله مزایای تابع print اینه که یه آرگومان اختیاری داره که می‌شه باهاش تعیین کرد در انتهای کار چاپ چه کاراکتر/عبارتی چاپ بشه که مقدار پیش‌فرض این آرگومان برابر “‎\n” هست. خب پس باید الان بتونید حدس بزنید چرا در قطعه کد بالا هر مقدار متغیر i در یک خط چاپ شده؟! :)
برای استفاده از این آرگومان هم لازم نیست کار خاصی انجام بدیم، فقط کافیه مثه بقیه آرگومان‌ها بهش مقدار بدیم. قطعه کد زیر همون قطعه کد بالاست که بهینه شده:

یه سؤال دیگه :)‌
حتماً می‌دونید که هنگام چاپ چندین مقدار با یک دستور print، بین مقادیر کاراکتر ” “(space) چاپ می‌شه، آیا تا حا لازم داشتین که این کارکتر رو عوض کنید؟
اگر آره،‌ خب الان کارتون راحت شده چون تابع print برای این گزینه هم یه آرگومان اختیاری دیگه داره. اسمش sep هست که می‌شه حدس زد از کلمه‌ی separator میاد یعنی همون «جدا کننده». خب با این تفاسیر فهمیدنش آسونه که مقدار پیش‌فرض این آرگومان هم کاراکتر ” ” هست. فکر نمی‌کنم نحوه‌ی استفاده ازش نیازی به توضیح داشته باشه، مثال زیر کاملاً گویا هست:

تغییرات تابع به این دو مورد ختم نمی‌شه و می‌تونید برای دیدن بقیه تغییرات از دستور help در محیط مفسر python3 استفاده کنید:

 

Q/A: تبادل حجم زیادی اطلاعات بین دو ماشین لینوکسی و ویندوزی

post QR-Code

Post QR-Code

خلاصه‌ی سؤال: چطوری می‌شه حجم زیادی اطلاعات رو بین یک ماشین لینوکسی و ویندوزی تبادل کرد؟

شرح سؤال: من حدود ۲۰ گیگ اطلاعات دارم که باید بین دو لپتاپ (یکی گنو/لینوکسی/لپتاپ خودم و یکی ویندوزی/لپتاپ دوستم) رد و بدل بشن البته بهتره بگم رد بشن چون لپتاپ من منبع هست! سریع‌ترین، بهترین و مقرون به صرفه‌ترین راه کدومه؟!

جواب: خب راه‌های زیادی برای این کار داریم از اون قدیمیا گرفته تا جدیدا! یه دور مرور می‌کنم:

استفاده از دیسک‌های نوری که خب سرعت و نرخ تبادل اطلاعات کمی دارن و تقریباً استفاده دیگه‌ای نمی‌شه ازشون کرد مگر نگه داشتن به عنوان پشتیبان اطلاعات  که من لازمش ندارم پس میزارمش کنار!

 استفاده از حافظه‌های جانبی مانند کول‌دیسک‌ها و فلاش درایو‌های USB، این روش هم نرخ انتقال چندان مناسبی برای حجم زیاد اطلاعات ندارن مخصوصاً اگر حجم اطلاعات از ظرفیت خود دیوایس بیشتر باشه! هرچند می‌شه چندین بار ازش استفاده کرد ولی واقعاً برای اطلاعاتی در حد ۲۰ گیگ واقعاً زمان‌گیر می‌شه!

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

پس من همین راه رو انتخاب می‌کنم! هر دو لپتاپ دارای کارت‌های شبکه و کارت‌های وایرلس هستن ولی من ترجیح می‌دم از کارت‌های شبکه استفاده کنم تا حداکثر نرخ اطلاعات رو داشته باشم. برای شبکه کردن هم لازم نیست حتماً روتر/سوئیچی داشته باشم فقط به یک کابل شبکه نیاز دارم که الان همه جا پیدا می‌شه! بعد از وصل کردن این دو لپتاپ از نظر سخت‌افزاری میریم سراغ اتصال نرم‌افزاری، روی ماشین گنو/لینوکسی اوّل کارت شبکه رو فعال می‌کنم و سپس یه IP در رنج همون *.۱۹۲.۱۶۸.۱ بهش می‌دم:

 روی ماشین ویندوزی هم همین کار رو می‌کنم امّا یه خورده سخت‌تر برای همین این قسمتش رو می‌تونید از منابع خود شرکت معظم مایکروسافت از طریق لینک Change TCP/IP Setting پیگیری کنید. IP ماشین ویندوزی رو هم ۱۹۲.۱۶۸.۱.۱۰۱ در نظر می‌گیرم که راحت باشم. خب پس اگه تا اینجای کار همه چی رو درست انجام داده باشم باید بتونم ماشین مقابل رو پینگ کنم که بله به راحتی این کار انجام می‌شه! :) نتیجه می‌شه این:

net2

دو لپتاپ شبکه شده‌ی گنو/لینوکسی و ویندوزی

خب الان می‌رسیم سر انتقال اطلاعات، حتماً می‌دونید که راحتترین راه در ماشین‌های گنو/لینوکسی استفاده از دستور scp هست ولی متأسفانه استفاده از این دستور در ماشین ویندوزی به همین راحتی نیست و باید کلاینت winscp رو داشته باشیم، این برنامه در حجم مناسب روی سایت خودش به آدرس winscp.net قرار داره. بعد از اجرای برنامه از قسمت file protocol نوع scp رو انتخاب می‌کنم و قسمت‌های hostname, username و password رو با مقادیر صحیح پر می‌کنم که به ترتیب می‌شن نام‌کاربری که می‌خوام باهاش وارد ماشین ‌گنو/لینوکسی بشم، IP آدرس یا نام ماشین (در اینجا ۱۹۲.۱۶۸.۱.۱۰۰) و رمزعبور کاربر مورد نظر. خب بعد از ورود من به راحتی می‌تونم بین فایل‌های هر دو ماشین بچرخم و هر چی رو که خواستم بین اونها رد و بدل کنم اونم با حداکثر سرعت. لازمه بدونید که خیلیا فک میکنن نمی‌شه به این نرخ انتقال اطلاعات با امکانات موجود دست پیدا کرد و معمولاً سریع‌ترین راه رو استفاده از کول دیسک‌ها می‌دونن که البته از تفکر غیر گیکی‌شون ناشی می‌شه ;)

winscp data trasnfer rate

winscp data trasnfer rate 11MB/s