پنج ترفند پایتون که باید حتماً بدانید — به زبان ساده
شما چه یک مهندس هوش مصنوعی ارشد و چه یک دانشجوی سال اول زیستشناسی باشید، به هر حال در مقطعی با زبان برنامهنویسی پایتون مواجه خواهید شد. پایتون نخستین بار در سال 1991 انتشار یافت و به زبان محبوبی تبدیل شد که از سوی برنامهنویسها و اهالی فناوری مورد استفاده قرار میگیرد. بر اساس میزان نمایش سؤالهای وبسایت Stack Overflow، پایتون به سرعت در حال تبدیل شدن به محبوبترین زبان برنامهنویسها است.
پایتون چیست ؟
پایتون یک زبان سطح بالا و تفسیری با ساختار نسبتاً ساده است و حتی برای افرادی که هیچ تجربه قبلی برنامهنویسی ندارند نیز عالی است. کتابخانههای محبوب پایتون کاملاً با آن یکپارچه شدهاند و در رشتههای مختلفی مانند بیوانفورماتیک (biopython)، علم داده (pandas)، یادگیری ماشین (keras/ tensorflow) و حتی نجوم (astropy) مورد استفاده قرار میگیرند. افرادی که زبانهای جاوا و C را آموخته باشند، احتمالاً میتوانند پایتون را به صورت خودآموز یاد بگیرند. با این که پایتون بسیار کندتر از جاوا و دیگر زبانها اجرا میشود؛ اما در عمل با داشتن امکانات یکپارچهای که به خوبی توسعه یافتهاند، موجب بهبود بهرهوری میشود. در تصویر زیر رشد شگفتانگیز زبان پایتون ملاحظه میشود.
پیش از آن که شروع به معرفی ترفندهای پایتون بکنیم، توصیه میکنیم که «تقلب نامه (Cheat Sheet) دستورهای پایتون» را مطالعه کنید. در این تقلب نامه، برخی نکات و ترفندهای مفید در مورد روش کدنویسی کارآمدتر در پایتون معرفی شده است. اگر از پایتون هیچ اطلاعاتی ندارید، پیشنهاد میکنیم مسیر یادگیری خود را از «آموزش برنامهنویسی پایتون – مقدماتی» آغاز کنید.
ترفند یکم: تکخطیهای قدرتمند
آیا تاکنون تلاش کردهاید چندین خط را بخوانید و در میان گزارههای شرطی گم شده باشید؟ بنابراین گزارههای تکخطی پایتون مناسب شما هستند. برای نمونه گزارههای شرطی زیر را در نظر بگیرید:
1>>> if alpha > 7:
2>>> beta = 999
3>>> elif alpha == 7:
4>>> beta = 99
5>>> else:
6>>> beta = 0
این کد را میتوان به صورت زیر کاملاً سادهسازی کرد:
1>>> beta = 999 if alpha > 7 else (beta = 99 if alpha == 7 else 0)
این قابلیت بینظیری است. شما میتوانید به کدهایی که مینویسید توجه کنید و همواره جاهایی را پیدا خواهید کرد که میتوانید از گزارههای تکخطی در آنها استفاده کنید. علاوه بر گزارههای شرطی، حلقههای for را نیز میتوان سادهسازی کرد. برای نمونه کد دوبل کردن لیستی از اعداد صحیح در چهار خط به صورت زیر:
1>>> lst = [1, 3, 5]
2>>> doubled = []
3>>> for num in lst:
4>>> doubled.append(num*2)
را میتوان به صورت تک خطی زیر سادهسازی کرد:
1>>> doubled = [num * 2 for num in lst]
البته در صورتی که همه چیز را در گزارههای تکخطی به صورت زنجیری بنویسید ممکن است موجب سردرگمی شود. باید اطمینان حاصل کنید که در کدهای خود بیش از حد از گزارههای تکخطی استفاده نمیکنید چون برخی افراد بر این باور هستند که استفاده فراوان از گزارههای تکخطی کاری «غیر پایتونی» محسوب میشود.
1>>> import pprint; pprint.pprint(zip(('Byte', 'KByte', 'MByte', 'GByte', 'TByte'), (1 << 10*i for i in xrange(5))))
ترفند دوم: دستکاری سریع رشتهها
دستکاری رشتهها میتواند کاری پردردسر باشد؛ اما پایتون برخی میانبرهای پنهان برای سادهسازی عمده این قبیل کارها دارد. برای معکوس ساختن یک رشته میتوانیم 1-:: را مانند اندیسهای لیست اضافه کنیم:
1>>> a = "ilovepython"
2>>> print a[::-1]
3nohtypevoli
همین ترفند را میتوانیم در مورد یک لیست از اعداد صحیح نیز به کار بگیریم. دستکاری رشتهها در پایتون کاری بسیار آسان است. برای نمونه اگر میخواهید یک جمله را با استفاده از متغیرهای از پیش تعریف شده str1, str2 و lst3 در خروجی به صورت زیر ارائه کنید:
1>>> str1 = "Totally"
2>>> str2 = "Awesome"
3>>> lst3 = ["Omg", "You", "Are"]
کافی است از متد ()join. و عملگرهای حسابی برای ایجاد جمله مطلوب خود استفاده کنید:
1>>> print ' '.join(lst3)
2Omg You Are
3>>> print ' '.join(lst3)+' '+str1+' '+str2
4Omg You Are Totally Awesome
علاوه بر دستکاری رشته، معمولاً توصیه میشود که از عبارتهای منظم (regex) نیز برای جستجوی مؤثر رشتهها و الگوهای فیلتراسیون استفاده کنید.
ترفند سوم: ترکیب تو در توی لیستها
Itertools احتمالاً یکی از محبوبترین کتابخانههای پایتون است. تصور کنید کد شما حاوی دهها لیست است و پس از برخی دستکاری ها با لیستهای تو در توی کاملاً درهمتنیدهای مواجه میشوید. Itertools دقیقاً آن چیزی است که برای رفع این آشفتگی نیاز دارید.
1>>> import itertools
2>>> flatten = lambda x: list(itertools.chain.from_iterable(x))
3>>> s = [['"', 'An', 'investment'], ['in'], ['knowledge'], ['pays'], ['the', 'best'], ['interest."', '--'], ['Benjamin'], ['Franklin']]
4>>> print(' '.join(flatten(s)))
5" An investment in knowledge pays the best interest." -- Benjamin Franklin
همان طور که در مثال فوق میبینید، میتوانیم لیستها و رشتههای تو در تو را با استفاده از ()join. و itertools با هم ترکیب کنیم. متد ()combinations. در itertools نیز ابزار قدرتمندی برای بازگشت دادن طول زیر دنبالهای از عناصر iterable ورودی است. برای مطالعه بیشتر در مورد intertools به این آدرس (+) مراجعه کنید.
ترفند چهارم: ساختمانهای داده ساده
اگر به ترفند یکم این راهنما مراجعه کنید، میبینید که استفاده از گزارههای تکخطی برای مقداردهی اولیه ساختمانهای داده در پایتون بسیار ساده است. هارولد کوپر (Harold Cooper) یک ساختمان داده درخت تکخطی را با استفاده از کد زیر پیادهسازی کرده است:
1>>> def tree(): return defaultdict(tree)
در کدی که در بخش فوق نشان داده شده است، یک درخت تعریف میشود که یک دیکشنری است که مقدارهای پیشفرض آن درختها هستند. تابعهای تکخطی دیگری مانند تولیدکننده اعداد اول نیز وجود دارند:
1>>> reduce( (lambda r,x: r-set(range(x**2,N,x)) if (x in r) else r),
2 range(2,N), set(range(2,N)))
این نوع تابعها را میتوانید روی گیتهاب یا Stack Overflow مشاهده کنید. پایتون کتابخانههای قدرتمندی مانند Collections نیز دارد که به حل طیف متنوعی از مسائل واقعی بدون نوشتن کدهای طولانی کمک میکنند.
1>>> from collections import Counter
2>>> myList = [1,1,2,3,4,5,3,2,3,4,2,1,2,3]
3>>> print(Counter(myList))
4Counter({2: 4, 3: 4, 1: 3, 4: 2, 5: 1})
ترفند پنجم: پرینت آسان
آخرین ترفندی که در این نوشته معرفی میکنیم موردی است که شاید بسیاری از افراد آرزو کنند کاش زودتر آن را یاد گرفته بودند. برای پرینت کردن یک آرایه با رشتهها به صورت رشتهای جدا شده با کاما، نیازی نیست که از ()join. و حلقهها استفاده کنیم:
1>>> row = ["1", "bob", "developer", "python"]
2>>> print(','.join(str(x) for x in row))
31,bob,developer,python
دستور ساده تکخطی زیر این کار را انجام میدهد:
1>>> print(*row, sep=',')
21,bob,developer,python
ترفند جالب دیگر برای پرینت کردن، بهرهگیری از enumerate است. enumerate یک تابع درونی پایتون است که به طرز خارقالعادهای مفید محسوب میشود. بنابراین به جای نوشتن یک کد چهار خطی برای پرینت کردن:
1>>> iterable = ['a','b','c']
2>>> c = 0
3>>> for item in iterable:
4>>> print c, item
5>>> c+= 1
60 a
71 b
82 c
کافی است همان کد را در دو خط بنویسید:
سپاس فراوان