استفاده بهتر از حلقه for در پایتون — از صفر تا صد

۲۹۴ بازدید
آخرین به‌روزرسانی: ۲۹ خرداد ۱۴۰۱
زمان مطالعه: ۴ دقیقه
استفاده بهتر از حلقه for در پایتون — از صفر تا صد

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

>>> students = ["John", "Mike", "Sandra", "Jennifer"]
>>> for student in students:
... print(student)
...
John
Mike
Sandra
Jennifer

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

1. ()items و ()vlues

فرض کنید یک دیکشنری مانند زیر داریم:

>>> scores = {"John": 94, "Mike": 95, "Sandra": 98, "Jennifer": 95}

زمانی که روی این دیکشنری تکرار می‌کنیم، حلقه for معمولی تنها کلیدهای دیکشنری را به دست می‌دهد در این حالت، تنها نام هر آیتم را پرینت می‌کند. این حالت شبیه آن است که گویی روی keys لیست تکرار می‌کند.

>>> for score in scores:
... print(score)
...
Mike
John
Jennifer
Sandra

به جای آن می‌توانیم از تابع ()items استفاده کنیم که هم به کلیدها و هم مقادیر هر آیتم دسترسی می‌دهد:

>>> for score in scores.items():
... print(score)
...
('Mike', 95)
('John', 94)
('Jennifer', 95)
('Sandra', 98)

با نامگذاری آیتم‌های چندتایی می‌توانید یک گام فراتر برداشته و مستقیماً به هر دو مورد دسترسی پیدا کنید:

>>> for name, score in scores.items():
... print("Student Name: " + name + ", Score: " + str(score))
...
Student Name: Mike, Score: 95
Student Name: John, Score: 94
Student Name: Jennifer, Score: 95
Student Name: Sandra, Score: 98

گاهی اوقات اگر علاقه‌مند باشیم تنها مقادیر را در دیکشنری داشته باشیم، می‌توانیم صرفاً از تابع values()‎ استفاده کنیم:

>>> for score in scores.values():
... print(score)
...
95
94
95
98

2. ()enumerate

فرض کنید لیستی مانند زیر داریم:

>>> grades = ["Freshman", "Sophomore", "Junior", "Senior"]

برخی اوقات می‌خواهیم هم به اندیس و هم خود آیتم دسترسی داشته‌ باشیم. در این حالت می‌توانیم از تابع ()enumerate استفاده کنیم که در آن لیست به عنوان پارامتر ارسال می‌شود:

>>> for grade in enumerate(grades):
... print(grade)
...
(0, 'Freshman')
(1, 'Sophomore')
(2, 'Junior')
(3, 'Senior')

به طور مشابه، می‌توانیم در صورت اشاره به آیتم‌های چندتایی به اندیس و آیتم مستقل از هم دسترسی پیدا کنیم. به علاوه می‌توانیم اندیس آغازین تابع ()enumerate را مشخص کنیم که در این مورد کارساز است:

>>> for year, name in enumerate(grades, start=1):
... print("Year " + str(year) + ": " + name)
...
Year 1: Freshman
Year 2: Sophomore
Year 3: Junior
Year 4: Senior
reversed()

فرض کنید لیستی مانند زیر داریم. در این لیست دانش‌آموزانی که به ترتیب زمانی به کلاس درس رسیده‌اند را نمایش می‌دهیم:

>>> arrived_students = ["John", "Mike", "Sandra", "Jennifer"]

سپس معلم می‌خواهد تکالیف آن‌ها را بررسی کند و از دانش‌آموزی که آخر از همه رسیده است آغاز می‌کند. بنابراین می‌توان با فراخوانی ()reversed روی لیست به نتیجه مطلوب دست یافت:

>>> for student in reversed(arrived_students):
... print(student)
...
Jennifer
Sandra
Mike
John

نکته‌ای که باید توجه داشت این است که باید بین تابع ()reversed و تابع ()revers تفاوت قائل شد. تابع دوم ترتیب لیست مفروض را بدون بازگشت خود لیست معکوس می‌سازد. به بیان دیگر می‌توان ()arrived_students.reverse را معکوس کرد، اما نمی‌توان مستقیماً با فراخوانی ()for student in arrived_students.reverse روی آن تکرار کرد.

3. ()sorted

فرض کنید لیست زیر را داریم:

>>> students = ["John", "Mike", "Sandra", "Jennifer"]

معلم می‌خواهد دانش‌آموزان را بر مبنای نام آن‌ها مرتب‌سازی کرده و کاری انجام دهد مثلاً سؤالی بپرسد. این کار با استفاده از تابع sorted()‎ و ارسال لیست دانش‌آموزان به عنوان پارامتر میسر است. در این حالت لیستی با نام‌های دانش‌آموزان تولید می‌شود که با ترتیب نزولی مرتب‌سازی شده است. همچنین می‌توان یک مقدار بولی برای پارامتر reverse تعیین کرد که با استفاده از آن می‌توان ترتیب نزولی را صعودی را به صورت sorted(students, reverse=True) تعیین کرد. به مثال زیر توجه کنید:

>>> for student in sorted(students):
... print(student)
...
Jennifer
John
Mike
Sandra

اینک فرض کنید آیتم‌های لیست به صورت زیر دیکشنری باشند:

>>> students = [{"name": "John", "id": 1}, {"name": "Mike", "id": 4}, {"name": "Sandra", "id": 2}, {"name": "Jennifer", "id": 3}]

در این حالت باید یک لیست از دیکشنری‌ها را مرتب‌سازی کنیم. این کار با استفاده از تعیین پارامتر key با استفاده از lambda در تابع ()sorted ممکن است:

>>> for student in sorted(students, key = lambda i: i["id"], reverse=True):
... print(student)
...
{'name': 'Mike', 'id': 4}
{'name': 'Jennifer', 'id': 3}
{'name': 'Sandra', 'id': 2}
{'name': 'John', 'id': 1}

در مثال فوق، می‌خواهیم لیست با استفاده از کلید id مربوط به دیکشنری با ترتیب reverse مرتب‌سازی شود که مشخصاً در خروجی بازتاب می‌یابد. اگر بخواهیم با استفاده از چندین کلید مرتب‌سازی کنیم، می‌توانیم پارامتر key را به چیزی مانند زیر عوض کنیم:

key = lambda i: (i["id"], i["name"])

4. ()filter

فرض کنید از همان لیست دانش‌آموزان مثال قبل استفاده می‌کنیم:

>>> students = [{"name": "John", "id": 1}, {"name": "Mike", "id": 4}, {"name": "Sandra", "id": 2}, {"name": "Jennifer", "id": 3}]

این بار می‌خواهیم تنها اطلاعات آن دسته از دانش‌آموزان را که شماره شناسه آن‌ها زوج است بازیابی کنیم. آن کار با استفاده از تابع filter با بهره‌گیری از یک لامبدا به سهولت ممکن است:

>>> for student in filter(lambda i: i["id"] % 2 == 0, students):
... print(student)
...
{'name': 'Mike', 'id': 4}
{'name': 'Sandra', 'id': 2}

5. ()zip

فرض کنید دو لیست زیر را داریم:

names = ["John", "Mike", "Sandra", "Jennifer"]
ids = [1, 3, 2, 4]

با بهره‌گیری از تابع ()zip می‌توان به سادگی از اطلاعات هر دو لیست استفاده کرد. این بار نیز مانند بخش‌های قبل می‌توانیم در صورت انتساب نام متغیر مانند for name, id in zip(names, ids) مستقیماً به آیتم‌های چندتایی دسترسی داشته باشیم:

>>> for student in zip(names, ids):
... print(student)
...
('John', 1)
('Mike', 3)
('Sandra', 2)
('Jennifer', 4)

سخن پایانی

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

اگر این مطلب برای شما مفید بوده است آموزش‌های زیر نیز به شما پیشنهاد می‌شوند:

==

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

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