خیلی ها میگن پایتون زبان سادهای هست، میشه اون رو زود یاد گرفت، بخاطر تعیین نوع پویا(dynamic typing) دیگه نیازی نیست که برنامهنویس با type ها درگیر باشه و …
ولی آیا واقعا همینطوره؟! توی این مطلب قصد دارم کمی زبان پایتون رو به عنوان یه برنامهنویس پایتون بررسی کنم.
۱. پایتون زبان سادهای هست
منظور از سادگی زبان میتونه خوانا بودن اون و نزدیکی اون به زبان انگلیسی (زبان انسان) باشه. برای مثال دو تکه کد زیر رو ببینید:
زبان پایتون:
if not 2 in lst:
for x in lst:
print(x);
زبان سیشارپ:
if ( ! lst.contains(2) )
foreach ( int x in lst )
Console.WriteLine(x);
خب انصافاً زبان پایتون بین این دو نمونه کد هم خواناتر بود و هم اینکه به نسبتاً تعداد کارکتر های کمتری استفاده کرد. ولی آیا این باعث شده که تازه وارد ها راحتتر این زبان رو یاد بگیرن؟! کد زیر که به زبان پایتون هست رو ببینید:
if 2 is in lst1 and ls2:
print("2 is in both lists")
خب این کد یک اشتباه رایج برنامهنویسان تازهکاری هست که فکر میکنن پایتون خونه خالهست و با زبان انگلیسی فرقی نمیکنه! نکته اینه زبان برنامهنویسی به هر شکلی که نوشته باشه باز هم قواعد و اصولی داره که برنامهنویس باید اون ها رو یاد بگیره، شاید در مقایسه کلمه not
با علامت !
بگیم اولی خواناتره و قابل فهمه ولی از نگاه یک برنامهنویس حرفهای این دوتا فرقی با هم ندارن!
پس میتونم بگم خوانایی زبان پایتون برای تازهکار ها شبیه یک شمشیر دو لبه هست که هم میتونه هم باعث سردرگمی بشه و هم باعث ساده فهمی! خودتون رو بذارید جای یه شخصی که هیچ ایدهای از برنامهنویسی نداره و با زبانی روبهرو میشه که هم انگلیسی هم و هم نیست!
۲. پایتون سادهست چون داینامیک تایپه!
میدونم خیلی از خواننده های ما و حتی نویسندگان وبلاگ کرمهایکامپیوتر (مثلاً فاروق 😁) هم با این مورد مشکل دارن!
بله شکی نیست که پایتون داینامیک تایپه، یعنی متغیری که ابتدا توش مثلاً متن ذخیره شده رو میشه بعداً توش عدد هم ذخیره کرد. ولی این به این معنی نیست که توی پایتون خبری از نوع ها نیست! این مورد از نظر من علاوه بر این که باعث سادگی نمیشه بلکه در خیلی از موارد باعث اشتباه هم میشه
اولاً با این که نوع متغیر پویا هست ولی باز هم برنامهنویس باید نوع های موجود در پایتون رو یاد بگیره، ثانیاً بسیاری از مشکلات از چک نشدن نوع داده یک متغیر هست و چه بسیار خطا های متنوعی که منشاء همه آن ها استفاده از نوع اشتباه هست که این تشخیص رو برای یک تازه وارد به مراتب سختتر میکنه تا مثلا نوشتن یک کلمه int
قبل از اسم متغیر!
فرض کنید یک سرور رو با پایتون مینویسید و کاربران بسیاری در حال استفاده از اون هستن. سرور بار ها ویرایش شده و آپدیت های جدیدی دادید تا اینکه یهو کلی استثنای TypeError یا AttributeError یا … رخ میده و همه چی میریزه بهم! بعد باید مدت ها وقت بگذارید تا تمام این TypeError ها و … رو Trace (دنبال) کنید و ببینید یک داده با نوع ناخواسته از کجا اومده! چرا اومده! و کجا میخواسته بره!
در حالی که در زبان های static typed و strongly typed اولاً که بیشتر این ایراد ها همان ابتدا قبل از انتشار به برنامهنویس هشدار داده میشن و ثانیاً برنامهنویس با اطلاع از تمام موارد میتونه بعضی از متغیر ها رو با تکنیک هایی خاصیت dynamic type بده! مثلا زبان سیشارپ یک زبان strongly typed هست، یعنی برای تعریف یک متغیر باید نوع اون رو هم اعلام کنید:
int a = 2;
string s = "Hello world";
حالا خاصیتی که این زیان و خیلی از زبان های دیگه دارن اینه که تمام نوع ها از نوع object ارث بردن و این باعث میشه که اگر متغیری رو از نوع object تعریف کنم پس میتونم هر نوع دادهای رو توش ذخیره کنم. از طرفی این زبان ها امکان دیگری به نام cast دارن، به معنی این که متغیری که قرار است خوانده شود باید مطابق نوع اعلام شده یا cast شده تفصیر شود پس میشه توی سیشارپ هم چنین کدی نوشت:
object a = 2;
int x = (int) a;
a = "two";
Console.WriteLine($"x={x}, a={a}"); // output: x=2, a=two
البته برای این مشکل توی پایتون چیزی به نام type hint هست، یعنی برنامهنویس میتونه به نحوی نوع متغیر رو یادداشت کنه. خود پایتون فعلاً در این مورد سختگیری نمیکنه یعنی نوشتن نوع متغیر با ننتوشتنش عملاً فرقی نمیکنه ولی بعضی از ویرایشگر ها و (لینت / lint) ها هستن که حساسیت نشون میدن ولی باز هم میشه گفت به اندازه زبانهای static/strongly typed مؤثر نیست!
حالا پایتون به درد نمیخوره؟!
زبان پایتون به همراه ماژول های متنوعی که داره واقعا کار ها رو ساده میکنه، سرعت توسعه پروژه های ساده با پایتون بالاست و کدِ خوانایی هم داره (این نکته رو بگم که از نظر من پایتون برای پروژه های سنگین و گسترده زبان مناسبی نیست). از اونجا که یک زبان اسکریپتی هست پس عموماً متن کد قبل از اجرا شدن نیازی به تبدیل شدن به فایل باینری نداره و باعث میشه کار ویرایش و اجرا هم سادهتر باشه. اجرا کردن یک برنامه به زبان پایتون روی سیستمعاملهای مختلف سادهست و جالبه که بدونید برای نوشتن اپلیکیشن اندروید با پایتون هم کار های خوبی انجام شده(مثلا کیوی رو ببینید).
در کل پایتون هم مثل بقیه زبانها نقاط ضعف و قدرتی داره در مورد هیچ زبانی نمیشه نظر قطعی داد که خوبه یا بد! به هر حال این برنامهنویس هست که با در نظر گرفتن همه جوانب زبان برنامهنویسیش رو انتخاب میکنه.
سخنی با برنامهنویسان تازهکار
خلاصه اگر به دنبال یک زبان ساده میگردید که بتونید خیلی سریع اولین برنامه خودتون رو بسازید خب پایتون میتونه گزینه خوبی باشه ولی این به این معنی نیست که اولین برنامه شما کامل و بینقص هست! به عنوان شخصی که حداقل ۱۰ سال داره برنامه مینویسه پیشنهاد میکنم با دید باز جلو برید و دست از تحقیق و یادگیری بر ندارید. با زبان پایتون بیشتر آشنا بشید و ببینید اجزای اون چطور کار میکنن. در مورد کامپیوتر اطلاعاتتون رو ببرید بالا، کد های دیگران رو بخونید و ببینید برنامهنویسان دیگه چیکار کردن. هر چه بیشتر اطلاعات داشته باشید برنامه بهتری مینویسید. گول سادگی پایتون رو نخورید و تنبل نشید!
سلام
چرا پایتون برای پروژه های سنگین مناسب نیست؟
سلام علی جان، ماجرا اینه که اولا پایتون یک زبان مفسری هست، یعنی کامپیوتر ها برای اجرای برنامه فقط زبان ماشین یا صفر و یک رو میفهمن و پایتون باید قبل از اجرا هر بار به زبان ماشین ترجمه بشه که این مسئله یکی از دلایل کند شدنه، دلیل بعدی هم اینه که پایتون اصولا پایتون از بیخ یکسری ضعف ها داره، مثلا پایتون رو جون به جونش کنی رو یک هسته پردازنده اجرا میشه و با وجود این که multi-threading داره اما حقیقتا رو چند هسته اجرا نمیشه، و کلی مسئله دیگه که همشون بخاطر این هستن که پایتون برای اجرا روی سیستم با پردازنده و حافظه بالا طراحی شده.
در کل برای پروژه های سنگین که هدف اینه که حجم بالایی از داده باید هزینه مکانی و زمانی مناسبی (هزینه مکانی یعنی میزان حافظه مصرفی و زمانی یعنی میزان پردازش لازم) پردازش بشن پایتون زبان مناسبی نیست و اگر از زبان های دیگهای مثل Rust, Lisp, C, Cpp استفاده بشه راندمان خیلی بهتری میگیری. این مسئله رو آمار ها و آزمایش ها میگن، حتی توی آمار ها این زبان ها از CPython و Pypy که نسخه هایی از مفصر با هدف سریع تر کردن پایتون هستن هم راندمان بهتری دارن
البته زبانهای مفسریای هستن که استفاده میشن و معایب پایتون توی نابهینگی رو ندارن. مثلا من شنیدم لوآ(Lua) واقعا خیلی خوب هست. نود رو هم اطلاع ندارم ولی همینکه میشه از تایپاسکریپت استفاده کرد نسبت به پایتون یه مزیته بنظر من.