ترفندهای کاربرد حلقه در پایتون | به زبان ساده

۲۸۲ بازدید
آخرین به‌روزرسانی: ۲۸ خرداد ۱۴۰۱
زمان مطالعه: ۴ دقیقه
ترفندهای کاربرد حلقه در پایتون | به زبان ساده

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

Zip برای چرخش هم‌زمان روی دو لیست

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

برای چرخش هم‌زمان روی دو آرایه باید صرفاً از متد zip()‎ استفاده کنیم.

1for first,second in zip(array1,array2):
2    print(first)
3    print(second)

نمونه خوبی از نمایش این موضوع در مواردی است که یک لیست از اعداد زوج و یک لیست از اعداد فرد داریم:

1odds = [1,3,5,7,9]
2evens = [2,4,6,8,10]
3for oddnum, evennum in zip(odds,evens):
4    print(oddnum)
5    print(evennum)

خروجی مثال فوق به صورت زیر است:

1
2
3
4
5
6
7
8
9
10

In Range برای نوشتن حلقه‌های شبیه زبان C

با این که زبان C ممکن است ابتدایی به نظر برسد، اما کارهای جالب زیادی با حلقه‌های به سبک زبان C می‌توان انجام داد.

1for i in range(10):
2    print(i)
3    if i == 3:
4        i.update(7)

افرادی که با زبان C آشنایی دارند، شاید استدلال کنند که این حلقه شباهت زیادی به حلقه‌های C ندارد، اما این شبیه‌ترین حلقه‌ای است که بدون نوشتن یک متد سفارشی تکرار می‌توان به دست آورد. در ادامه یک متد جدید برای تکرار می‌نویسیم تا این حلقه را تا حد امکان به حلقه‌های زبان C نزدیک کنیم:

1class forrange:
2
3    def __init__(self, startOrStop, stop=None, step=1):
4        if step == 0:
5            raise ValueError('forrange step argument must not be zero')
6        if not isinstance(startOrStop, int):
7            raise TypeError('forrange startOrStop argument must be an int')
8        if stop is not None and not isinstance(stop, int):
9            raise TypeError('forrange stop argument must be an int')
10
11        if stop is None:
12            self.start = 0
13            self.stop = startOrStop
14            self.step = step
15        else:
16            self.start = startOrStop
17            self.stop = stop
18            self.step = step
19
20    def __iter__(self):
21        return self.foriterator(self.start, self.stop, self.step)
22
23    class foriterator:
24
25        def __init__(self, start, stop, step):
26            self.currentValue = None
27            self.nextValue = start
28            self.stop = stop
29            self.step = step
30
31        def __iter__(self): return self
32
33        def next(self):
34            if self.step > 0 and self.nextValue >= self.stop:
35                raise StopIteration
36            if self.step < 0 and self.nextValue <= self.stop:
37                raise StopIteration
38            self.currentValue = forrange.forvalue(self.nextValue, self)
39            self.nextValue += self.step
40            return self.currentValue
41
42    class forvalue(int):
43        def __new__(cls, value, iterator):
44            value = super(forrange.forvalue, cls).__new__(cls, value)
45            value.iterator = iterator
46            return value
47
48        def update(self, value):
49            if not isinstance(self, int):
50                raise TypeError('forvalue.update value must be an int')
51            if self == self.iterator.currentValue:
52                self.iterator.nextValue = value + self.iterator.step

()Enumerate برای اندیس کردن ابعاد

متد Enumerate در پایتون موجب می‌شود بتوانیم اندیس‌های لیست را به صورتی که از آرایه به دست می‌آیند، شماره‌گذاری کنیم. برای نشان دادن این موضوع یک مثال از لیست سه عنصری ارائه می‌کنیم:

1l = [5,10,15]

اکنون می‌توانید به صورت زیر به اندیس‌های آرایه دسترسی پیدا کنید:

l[1]
10
l[0]
5
l[2]
15

در زمانی که روی این لیست‌ها «شمارش» (Enumerate) می‌کنید، موقعیت اندیس ابعاد به دست می‌آید و ابعاد به صورت یک متغیر جدید ذخیره می‌شود. به نوع متغیر جدید توجه کنید:

ترفندهای کاربرد حلقه در زبان پایتون

پایتون به صورت خودکار این اندیس‌ها را در یک چندتایی قرار می‌دهد. این کار عجیب به نظر ‌می‌رسد و شاید بهتر بود که نتایج در یک دیکشنری یک عنصری پایتون ارائه می‌شد. خوشبختانه همواره می‌توان این Enumerate را به یک دیکشنری پایتون تبدیل کرد. روش کار با استفاده از type assertion به صورت زیر است:

1data = dict(enumerate(l))

که نتیجه زیر را به دست می‌دهد:

>>> data
{0: 5, 1: 10, 2: 15}

()Sorted برای مرتب‌سازی داده‌ها

متد sort یک متد ضروری برای کار با حجم بالایی از داده‌ها محسوب می‌شود. این کاری است که دانشمندان علوم داده همواره انجام می‌دهند. مرتب‌سازی مطابق انتظار ما کار می‌کند و رشته‌‌ها با ترتیب الفبایی مرتب می‌شوند. اعداد صحیح و اعشاری نیز از ‎∞- به سمت بالا مرتب‌سازی می‌شوند. نکته مهمی که باید در مورد این تابع اشاره کنیم، این است که با لیست‌های شامل رشته‌ها و اعداد صحیح یا اعشاری کار نمی‌کند.

1l = [15,6,1,8]
2for i in sorted(l):
3    print(i)
41
56
68
715

با تعیین پارامتر reverse به صورت true می‌توانیم مرتب‌سازی را به صورت معکوس نیز اجرا کنیم:

1for i in sorted(l,reverse = True):
2    print(i)
315
48
56
61

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

1l.sort(key=lambda s: s[::-1])

()Filter برای چرخش روی داده‌های خاص

تابعی که قطعاً به افزایش عملکرد در زمان کار با داده‌ها کمک می‌کند، ‌تابع filter است. تابع filter دقیقاً همانطور که از نامش برمی‌آید، داده‌ها را پیش از ورود به حلقه فیلتر می‌کند. این وضعیت در مواردی مفید است که می‌خواهیم روی داده‌ها در یک بازه خاص تأثیر بگذاریم و قصد نداریم شرطی را روی داده‌ها اعمال کنیم.

1people = [{"name": "John", "id": 1}, {"name": "Mike", "id": 4}, {"name": "Sandra", "id": 2}, {"name": "Jennifer", "id": 3}]
2for person in filter(lambda i: i["id"] % 2 == 0, people):
3...     print(person)
4... 
5{'name': 'Mike', 'id': 4}
6{'name': 'Sandra', 'id': 2}

سخن پایانی

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

بر اساس رای ۰ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
towardsdatascience
نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *