۵ استدلال نادرست مبتدیان در رابطه با پایتون

آفلاین
user-avatar
ارسطو عباسی
27 شهریور 1400, خواندن در 7 دقیقه

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

در این مطلب از وبسایت راکت قصد دارم تا شما را با پنج استدلال نادرست در رابطه با ویژگی‌های پایتون آشنا کنم که هر کدام می‌تواند آسیب‌زا باشد.

مورد اول: عملگر انتساب روی لیست‌ها

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

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

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

زبان‌های برنامه‌نویسی سطح بالا مانند جاوا نیز این قابلیت را در خود دارند اما زبان‌های سطح پایین‌تر مانند C بدلیل داشتن سیاست‌های سخت‌گیرانه‌تر در ارتباط با مدیریت حافظه چنین قابلیتی ندارند.

مورد دوم: مقداردهی مجدد متغیرها

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

یکی از عواقب این مسئله آن است که زمانی متغیر شما در خط‌های بعدی دوباره مقداردهی می‌شود هیچ خطا یا پیام هشداری مبنی بر اینکه این متغیر پیش‌تر توسط یک نوع داده‌ای (مانند رشته یا عدد و...) تعریف شده است دریافت نخواهید کرد.

در این حالت می‌توانید که ببینید متغیر a سه بار با مقدارهای داده‌ای متفاوت (عدد، رشته و bool) مقداردهی شده و هر بار نیز در یک آدرس حافظه‌ای متفاوت ذخیره شده است. تابع id در قطعه‌ کدهای بالا مشخصات آدرس متغیر روی حافظه را به ما می‌دهد. شاید برخی از افراد به چشم یک نعمت به این ویژگی نگاه کنند اما اگر مواظب نباشید ممکن است برنامه شما بصورت دائم با خطاهای مختلف روبرو شود.

مورد سوم: انواع متغیرها

زمانی که شما یک متغیر را ایجاد می‌کنید، پایتون از سیستم عامل درخواست میزانی از فضای RAM را می‌کند. حال این فضا جدای از میزانی که قصد ورود را دارد باید یک نوع خاص از داده را نیز دریافت کند. پایتون از آنجایی که یک زبان پویاست و مستقیما به شما اجازه نمی‌دهد که نوع متغیر را قبل از مقداردهی مشخص کنید از یک روش مشخص برای نوع‌دهی به متغیرها استفاده می‌کند. Duck-Typing یا نوع‌دهی اردکی نام این روش است. در این روش نوع متغیر مانند قبل در همان زمان نسبت دادن مقدار داده‌ای تعیین می‌شود اما در زمانی که بخواهید از آن متغیر مجددا استفاده کنید هیچ درخواستی برای یک نوع داده‌ای خاص ارسال نخواهد شد. نکته جالب ماجرا این است که تمام این مراحل هر چند که عجیب و غریب پیش می‌رود اما کامل قانونی و بدون مشکل است. –اگر موجود مورد نظرتان صدای اردک را دارد و مانند اردک راه می‌رود پس حدس میزنم که با یک اردک سر و کار دارم!- این دقیقا روشی است که پایتون در زمان بازخوانی متغیرها استفاده می‌کند.

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

مورد چهارم: مدیریت حافظه

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

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

همانطور که مشاهده می‌کنید مقدار زمان لازم برای اجرای متغیر a ۱۴صدم ثانیه و مقدار زمان لازم برای اجرای متغیر b ٩٠صدم ثانیه است. این میزان تفاوت ناشی از مدیریت خودکار حافظه می‌شود. در متغیر a شیوه مدیریت خودکار حافظه بدین شکل است که کل میزان مورد نیاز یک جا تخصیص می‌یابد اما در متغیر b شما نیاز دارید که هزاران بار دستور range را از خود حافظه فراخوانی کنید و حافظه مدام در تصمیم‌گیری برای میزان مورد نیازش تجدید نظر کند. این موضوع باعث می‌شود تا حافظه زمان بسیار زیادی را اتلاف نماید.

مورد پنجم: حلقه‌ها

بدون در نظر گرفتن دستور yeld پایتون تنها دو حالت برای ایجاد حلقه را در اختیار دارد، While و for … in. البته هر چند که حلقه while مشابه با دیگر زبان‌های برنامه‌نویسی است اما دستور for در پایتون کمی تفاوت دارد. در زبان‌های برنامه‌نویسی مانند سی و جاوا حلقه for براساس یک شرط یک مقدار را افزایش یا کاهش می‌دهد اما در پایتون ما تنها روی یک مقدار تکرارپذیر یک فرایند تکرار را انجام می‌دهیم.

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

در پایان

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

منبع

چه امتیازی به این مقاله می دید؟
خیلی بد
بد
متوسط
خوب
عالی

دیدگاه‌ها و پرسش‌ها

برای ارسال دیدگاه لازم است، ابتدا وارد سایت شوید.

در حال دریافت نظرات از سرور، لطفا منتظر بمانید

در حال دریافت نظرات از سرور، لطفا منتظر بمانید

آفلاین
user-avatar
ارسطو عباسی @arastoo
برنامه‌نویس و مدیر بخش تولید محتوا وبسایت راکت - وبلاگ شخصی: https://arastoo.dev
دنبال کردن

گفتگو‌ برنامه نویسان

بخشی برای حل مشکلات برنامه‌نویسی و مباحث پیرامون آن وارد شو