ترفندهای ساده پایتون برای برنامه نویسان حرفه ای | راهنمای کاربردی
با این که ممکن است پایتون در ظاهر یک زبان ساده برنامهنویسی به نظر بیاید که هر کسی میتواند آن را بیاموزد و شاید در واقع نیز چنین باشد، اما مسلماً از این که بدانید برای کسب مهارت و تسلط کامل بر این زبان، به چه مقدار تلاش نیاز دارید، شگفتزده میشوید. در این مقاله به بررسی برخی ترفندهای ساده پایتون میپردازیم که مورد نیاز برنامهنویسان در سطح حرفهای و پیشرفته این زبان است.
پایتون یکی از زبانهایی است که یادگیری آن آسان است، اما کسب تسلط بر آن کار دشواری است. در اغلب موارد در پایتون برای انجام کارها، روشهای مختلفی وجود دارد، اما انجام کارها به روش نادرست، آسان است. حتی برخی افراد کتابخانه استاندارد پایتون را از نو اختراع میکنند و زمان خود را به سادگی به هدر میدهند، زیرا از وجود یک ماژول آگاه نیستند.
متأسفانه کتابخانه استاندارد پایتون بسیار گسترده است و علاوه بر آن اکوسیستم پایتون به طرز ترسناکی گسترش یافته است. با این که نزدیک به دو میلیون گیگابایت ماژول مختلف برای پایتون وجود دارد، اما برخی نکات مفید در خصوص کتابخانه استاندارد و پکیجهای معمول مرتبط با محاسبات علمی در پایتون وجود دارند که با یادگیری آنها میتوانید کارهای خود را به طرز سریعتر و آسانتری انجام دهید.
معکوس ساختن یک رشته
با این که شاید فکر کنید معکوس ساختن یک رشته باید یک کار ابتدایی باشد، اما استفاده از حلقه char به این منظور میتواند پیچیده و ملالآور باشد. خوشبختانه پایتون یک عملیات داخلی آسان برای اجرای این وظیفه دارد. به این منظور کافی است به اندیس 1-:: روی رشته دسترسی پیدا کنید.
a = "!dlrow olleH" backward = a[::-1]
تعریف ابعاد آرایه به عنوان متغیر
در اغلب زبانها به منظور تبدیل یک آرایه به مجموعهای از متغیرها باید نوعی حلقه تعریف کرده و روی مقادیر به صورت تکراری بچرخیم یا با استفاده از موقعیتهایی مانند زیر به ابعاد آرایه دسترسی پیدا کنیم:
firstdim = array[1]
با این حال در پایتون یک روش جالبتر و سریعتر برای انجام این کار وجود دارد. به منظور تغییر دادن یک لیست از مقادیر به متغیرها، میتوانیم نامهای متغیرها را برابر با آرایه و برابر با همان طول آرایه قرار دهیم:
array = [5, 10, 15, 20] five, ten, fift, twent = array
Itertools
اگر قصد دارید به طور جدی به برنامهنویسی با پایتون بپردازید، در این صورت باید با Itertools آشنا شوید. Itertools یک ماژول درون کتابخانه استاندارد پایتون است که به ما امکان میدهد تا به صورت آنی فرایندهای تکرار را دور بزنیم. این ماژول نه تنها کدنویسی حلقههای پیچیده را آسانتر میسازد، بلکه موجب میشود که کد شما سریعتر و منسجمتر شود. در ادامه صرفاً یک نمونه از کاربرد Itertools را میبینید، اما این ماژول کاربردهای فراوان دیگری نیز دارد:
c = [[1, 2], [3, 4], [5, 6]] # Let's convert this matrix to a 1 dimensional list. import itertools as it newlist = list(it.chain.from_iterable(c))
Unpacking هوشمند
Unpack کردن مقادیر به صورت تکراری میتواند کاری سنگین و زمانبر باشد. خوشبختانه پایتون چند روش جالب دارد که با استفاده از آنها میتوان یک لیست را Unpack کرد. یک مثال از این روشها استفاده از * است که در مقادیر انتساب یافته وارد شده و آنها را به لیست جدیدی زیر نام متغیر اضافه میکند.
a, *b, c = [1, 2, 3, 4, 5]
Enumerate
اگر با مفهوم Enumerate آشنا نیستید، بهتر است که با آن آشنا شوید. Enumerate به ما امکان میدهد که اندیسهای مقادیر خاصی را در یک لیست به دست آوریم. این امکان به طور خاص در علوم داده مفید است که به جای دیتافریمها روی آرایهها کار میکنیم:
for i,w in enumerate(array): print(i,w)
Slice نام
استفاده از Slice برای جداسازی بخش خاصی از یک لیست در پایتون کار بسیار آسانی است. به این منظور میتوان از ابزارهای مختلفی استفاده کرد، اما یکی از مفیدترین این ابزارها Slice-های نام است. این ابزار به طور خاص در مواردی مفید است که میخواهیم از جبر خطی در پایتون استفاده کنیم:
a = [0, 1, 2, 3, 4, 5] LASTTHREE = slice(-3, None) slice(-3, None, None) print(a[LASTTHREE])
گروهبندی لیستهای مجاور
گروهبندی حلقههای مجاور دریک حلقه for قطعاً به روش سادهای به خصوص با استفاده از zip() قابل انجام است اما این قطعاً بهترین روش برای انجام این دسته از کارها نیست. برای این که کارها آسانتر و سریعتر انجام شوند، میتوانیم یک عبارت لامبدا بنویسیم که لیستهای مجاور را به صورت زیر گروهبندی کند:
a = [1, 2, 3, 4, 5, 6] group_adjacent = lambda a, k: zip(*([iter(a)] * k)) group_adjacent(a, 3) [(1, 2, 3), (4, 5, 6)] group_adjacent(a, 2) [(1, 2), (3, 4), (5, 6)] group_adjacent(a, 1)
()next برای generator-ها
در اغلب سناریوهای معمول برنامهنویسی، میتوانیم به یک اندیس دسترسی یافته و شماره موقعیت را با استفاده از یک شمارنده به دست آوریم. این شمارنده، مقداری است که ما خودمان به لیست اضافه کردهایم:
array1 = [5, 10, 15, 20] array2 = (x ** 2 for x in range(10)) counter = 0 for i in array1: # This code wouldn't work because 'i' is not in array2. # i = array2[i] i = array2[counter] # ^^^ This code would because we are accessing the position of i
با این حال، به جای استفاده از این رویکرد، میتوانیم از next() بهره بگیریم. این متد یک تکرارپذیر (iterator) میگیرد که موقعیت کنونی را در حافظه ذخیره کرده و در پسزمینه روی لیست میچرخد:
g = (x ** 2 for x in range(10)) print(next(g)) print(next(g))
Counter
یکی دیگر از ماژولهای مفید کتابخانه استاندارد پایتون، collection است و در این ماژول قصد داریم به بررسی Counter بپردازیم. با استفاده از Counter از ماژول collections میتوانیم به سادگی شمارههای یک لیست را به دست آوریم. این ابزار در مواردی مفید است که بخواهیم کل مقادیر داخل ساختمان داده را به دست آوریم، یک شماره تهی از دادهها داشته باشیم و یا مقادیر یکتای دادهها را بررسی کنیم. شاید فکر کنید در این موارد بهتر است از Pandas کمک بگیریم.
البته Pandas در این زمینه راهکار معقولی محسوب میشود، اما استفاده از پانداز به این منظور موجب میشود که خودکارسازی کارها دشوار باشد و یک وابستگی دیگر به پروژه اضافه شود که در زمان توزیع الگوریتم باید به محیط مجازی اضافه شود. به علاوه یک نوع counter در پایتون قابلیتهای زیادی دارد که سریهای پانداز ندارند و موجب میشود که در برخی موقعیتها مفیدتر از آن باشد.
A = collections.Counter([1, 1, 2, 2, 3, 3, 3, 3, 4, 5, 6, 7]) A Counter({3: 4, 1: 2, 2: 2, 4: 1, 5: 1, 6: 1, 7: 1}) A.most_common(1) [(3, 4)] A.most_common(3) [(3, 4), (1, 2), (2, 2)]
Dequeue
یکی دیگر از امکانات مفید ماژول collections به صورت Dequeue نامگذاری شده است. با استفاده از Dequeue میتوانیم کارهای زیر را انجام دهیم:
import collections Q = collections.deque() Q.append(1) Q.appendleft(2) Q.extend([3, 4]) Q.extendleft([5, 6]) Q.pop() Q.popleft() Q.rotate(3) Q.rotate(-3) print(Q)
سخن پایانی
در این مقاله با برخی ترفندهای ساده پایتون آشنا شدیم که برنامهنویسان حرفهای به طور مکرر مورد استفاده قرار میدهند. با این که برخی از این ترفندها ممکن است گاه به گاه مورد نیاز شما باشند، اما بسیار مفید و کارگشا هستند. خوشبختانه جعبه ابزار پایتون به صورت تابعهای کتابخانه استاندارد بسیار گسترده است و ابزارهای بسیار زیاد دیگری داخل آن وجود دارند. یادگیری همه این ابزارها به زمان زیادی نیاز دارد. مطمئن باشید که در هر سطحی که قرار دارید، در هر حال در پایتون چیز تازهای برای یادگیری وجود خواهد داشت.