پیمایش لیست با حلقه
در واقع، در این درس پیمایش لیست با حلقه را از پایه و با مثال یاد میگیرید.
بنابراین در درس قبل برای دیدن هر عنصر، ایندکسش را دستی مینوشتید. این روش برای چهار عنصر قابل تحمل است، ولی برای لیستی که هزار عضو دارد یا تعداد اعضایش از قبل معلوم نیست، عملاً بیفایده است.
همچنین، اینجاست که حلقهی for دقیقاً به درد میخورد.
سادهترین شکل پیمایش
fruits = ["سیب", "موز", "پرتقال"]
for fruit in fruits:
print(fruit)
سیب
موز
پرتقال
به این ترتیب، این خط را دقیق بخوانید: for fruit in fruits. پایتون در هر دور، یک عنصر از fruits برمیدارد و داخل متغیر fruit میگذارد، بعد بلوک را اجرا میکند.
علاوه بر این، نام fruit را خودتان انتخاب میکنید و هیچ معنای خاصی برای پایتون ندارد. ولی اسم معنادار بگذارید؛ کسی که شش ماه بعد کد را میخواند ممکن است خودتان باشید.
fruits = ["سیب", "موز", "پرتقال"]
دور ۱: fruit ◄── "سیب" → print
دور ۲: fruit ◄── "موز" → print
دور ۳: fruit ◄── "پرتقال" → print
│
▼
لیست تمام شد → خروج از حلقه
وقتی شمارهی عنصر را هم لازم دارید
گاهی فقط خود عنصر کافی نیست و میخواهید بدانید چندمین عنصر است. تازهکارها معمولاً این کار را میکنند:
index = 0
for fruit in fruits:
print(index, fruit)
index = index + 1
کار میکند، ولی پایتون برای همین کار ابزار دارد:
for index, fruit in enumerate(fruits):
print(index, fruit)
0 سیب
1 موز
2 پرتقال
اگر میخواهید شمارش از یک شروع شود:
for index, fruit in enumerate(fruits, start=1):
print(index, fruit)
پیمایش همزمان دو لیست
names = ["علی", "زهرا", "رضا"]
ages = [18, 20, 22]
for name, age in zip(names, ages):
print(name, age)
علی 18
زهرا 20
رضا 22
تابع zip دو لیست را دوشادوش هم حرکت میدهد. اگر طولشان برابر نباشد، به محض تمام شدن کوتاهتر، کار تمام میشود.
فیلتر کردن حین پیمایش
ترکیب حلقه و شرط، همان جایی است که درسهای قبلی کنار هم معنا پیدا میکنند:
numbers = [4, 7, 10, 13, 16]
for number in numbers:
if number % 2 == 0:
print(number, "زوج است")
اشتباهات رایج
حذف عنصر حین پیمایش
numbers = [1, 2, 3, 4]
for number in numbers:
if number % 2 == 0:
numbers.remove(number)
print(numbers)
[1, 3]
این خروجی اتفاقی درست است. در حالت کلی، حذف کردن عنصر از لیستی که دارید رویش حرکت میکنید، باعث میشود بعضی عناصر از قلم بیفتند، چون ایندکسها زیر پای حلقه جابهجا میشوند. راه درست این است که یک لیست جدید بسازید:
numbers = [1, 2, 3, 4]
odd_numbers = []
for number in numbers:
if number % 2 != 0:
odd_numbers.append(number)
print(odd_numbers)
استفاده از متغیر حلقه بعد از پایان حلقه
بعد از تمام شدن حلقه، متغیر هنوز وجود دارد و مقدار آخرین عنصر را دارد. تکیه کردن به این رفتار کد را شکننده میکند، مخصوصاً وقتی لیست خالی باشد و متغیر اصلاً ساخته نشود.
جمعبندی
برای پیمایش لیست، مستقیم روی خود لیست حرکت کنید نه روی ایندکسها. اگر شماره لازم دارید enumerate و اگر دو لیست را همزمان میخواهید zip.
در درس بعدی سراغ توابعی میرویم که خود لیست در اختیارتان میگذارد و خیلی از این حلقهها را غیرلازم میکنند.
برای مطالعهی بیشتر میتوانید به مستندات رسمی پایتون سر بزنید.
این درس بخشی از دوره آموزش پایتون مقدماتی است.