چطور در Python قوی‌ شویم؟

سلام،

من محمد فاضلی‌ (Fazel)، مدیر تیم زیرساخت ویدیویی مکتب‌خونه هستم،

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

چطوری توی پایتون متخصص بشن؟

و اینکه، چقدر پایتون لازمه تا جنگو رو شروع کنن؟

و مهم تر از همه، کی بفهمم که به پایتون مسلطم؟

ما در شرکت ندای دانش همراه ایرانیان چون تقریبا تمام نرم افزارامون رو پایتون نوشتیم(مثلا maktabkhooneh.org، takhtesefid.org ، nimkateman.com ، زیرساخت ویدیوها و ...) ازین سوال‌ها زیاد ازمون پرسیده شد.

import this

شاید اسم The Zen of Python به گوشتون خورده باشه،

اگر نخورده همین الان یه shell پایتون باز کنید و بزنید `import this `

اگر هم دم دستتون نیست متن زیر که به یه جورایی فلسفه‌ی کد زدن با پایتون رو توی غالب شعر بیان می‌کنه هست:

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one—and preferably only one—obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea—let's do more of those!

این متن بین کاربرهای پایتون معروف هست و به قول بعضی‌ها فرق بین کد Pythonic و non-Pythonic مشخص ‌می‌کنه.

بین برنامه‌نویس‌های پایتون این اصطلاح Pythonic خیلی استفاده می‌شه، کدی Pythonic هست که از روش‌هایی استفاده کنه که توسط خود زبون و Community پایتون تشویق می‌شه.

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

foos = [1, 2, 3, 4, &quotALi&quot]
i = 0
while i < len(foos):
    print(foos[i])
    i += 1
...
for i in range(len(foos)):
    print(foos[i])
...
map(print, numbers)

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

for i in foos:
    print(i)

اگر می‌خواین با The Zen of Python بیشتر آشنا شید می‌تونید اینجا رو بخونید.

یه بِیْتش هست که می‌گه:

There should be one-- and preferably only one --obvious way to do it.

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

ما یه کاری توی تیممون کردیم که به این بِیْت نزدیک‌تر بشیم.

با حل کردن مسله‌های جالب و مقایسه‌ی تکنیک‌ها و روش حل مسله مون با بقیه کسایی که اون مسله رو حل کردن.

دو سال پیش تصمیم گرفتیم که یه استانداردی بگذاریم که به کی بگیم به پایتون مسلطه. اون استاندارد حل حداقل ۸۰ تا سوال از اموزش داخل سایت https://www.hackerrank.com/domains/python/py-introduction حل کرده باشه.

خودم سه سال پیش تا۸۰ از سوال‌های پایتون رو حل کردم، با این که چند سالی بود حرفه‌ای از پایتون استفاده میکردم کلی نکته‌ ها و تکنیک‌های جالبی رو یاد گرفتم که بعدا باعث شد، بهتر بتونم کد بزنم و اعتماد به نفسم توی پایتون که یه زبان با Dynamic typing بود بیشتر شد، چون قبلا فقط با زبان‌های Static typing کار می‌کردم.

# برای تازه کار ها:

اگر اونقدر زبان انگلیسی می‌دونید بتونید با کمک دیکشنری و … یه متن ساده رو بخونید،

من برای شروع این tutorial رو توصیه میکنم( اگر نمی‌تونید پیشنهاد من این هست اول انگلیسی تمرین کنید)،

سایت hackerrank.com یه Online Judge هست که یه سری مسله برنامه نویسی داره، شما صورت سوال رو میخونید، و باید یه برنامه بنویسید که ورودی رو بگیره و خروجی مورد نظر سوال رو بده.

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

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

حالا روش این اموزش اینه که میاد یه سری سوال مطرح می‌کنه و اول متن هر سوال، توضیح می‌ده که چه دستور یا تکنیک‌هایی برای حل این سوال لازمه.

اینطوری شما اول به طور خیلی خلاصه یه syntax یا feature جدید یاد می‌گیرید و همون جا هم شروع می‌کنید به استفاده‌ی درست ازون.

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

فقط لازم نیست تازه‌کار باشین تا ازین اموزش استفاده کنید.

اگر میخواید به بخش‌های اصلی زبان مسلط بشین هم خیلی خوبه.

# برای حرفه‌ای‌تر ها

همون طور که توی عکس میبینید پکیج‌هایی مثل Collections و itertools و regex و functional programming و Decorators هم توی این اموزش، پوشش داده شده.

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

کار دیگه‌ای که می‌شه کرد این هست که کد خودتون رو با بقیه شرکت کننده ها مقایسه کنید، تکنیک‌های نابی رو می‌شه اینطوری یاد گرفت.

لطف کردید وقت گذاشتید،

امید وارم که مفید بوده باشه،

ایمیل من fazel (at) maktabkhooneh.org هست، اگر نظری داشتید، درخدمتم.