استفادهی حرفهایتر از حلقهی for در زبان Python
۱۰ تیر ۱۴۰۰
حلقهی for یکی از پرکاربردترین حلقهها در برنامههای Python است و توسعهدهندگان زیادی از آن برای پیمایش انواع توالیها مانند لیستها، دیکشنریها و … استفاده میکنند. حال ما در این مقاله تصمیم داریم برخی توابع built-in در زبان Python که بهکمک آنها میتوانید حرفهایتر از قبل کدنویسی کنید و همچنین کدهای خواناتری داشته باشید را به شما معرفی کنیم.
تابع Items و Values
فرض کنید نمرههای پایانی دانشآموزان یک کلاس به شکل زیر است و از ما خواسته شده نام هر دانشآموز را بههمراه نمرهی پایانیاش بهصورت جداگانه چاپ کنیم:
scores = {"John": 94, "Mike": 95, "Sandra": 98, "Jennifer": 95}
for score in scores:
print(score)
'''
John
Mike
Sandra
Jennifer
'''
در کدهای فوق سعی کردهایم با استفاده از حلقهی For توالی مورد نظر را پیمایش کنیم اما همانطور که مشاهده میکنید فقط نام دانشآموزان چاپ شده و مسئلهی مورد نظر ما حل نشده است. حال با ایجاد کمی تغییر در کدها و استفاده از تابع items()
میتوانیم به نام و نمرهی دانشآموزان دسترسی پیدا کنیم:
scores = {"John": 94, "Mike": 95, "Sandra": 98, "Jennifer": 95}
for score in scores.items():
print(score)
'''
('John', 94)
('Mike', 95)
('Sandra', 98)
('Jennifer', 95)
'''
همچنین میتوانیم گام را فراتر گذاشته و به شکل زیر به هرکدام از دادهها بهصورت جداگانه دسترسی پیدا کنیم:
scores = {"John": 94, "Mike": 95, "Sandra": 98, "Jennifer": 95}
for name, score in scores.items():
print("Student Name: " + name + ", Score: " + str(score))
'''
Student Name: John, Score: 94
Student Name: Mike, Score: 95
Student Name: Sandra, Score: 98
Student Name: Jennifer, Score: 95
'''
و اگر نیاز شد میتوان با استفاده از تابع values()
فقط به مقادیر هر ایندکس در دیکشنری فعلی دسترسی پیدا کرد:
scores = {"John": 94, "Mike": 95, "Sandra": 98, "Jennifer": 95}
for score in scores.values():
print(score)
'''
94
95
98
95
'''
تابع Enumerate
فرض کنید که لیست زیر در اختیار ما قرار داده شده و میخواهیم با استفاده از حلقهی For به ایندکس و مقدار آن بهطور همزمان دسترسی پیدا کنیم. در این سناریو میتوان از تابع enumerate()
که در مقالهی مقدمهای بر تابع enumerate در Python به آن پرداخته بودیم، استفاده کرد:
grades = ["Freshman", "Sophomore", "Junior", "Senior"]
for grade in enumerate(grades):
print(grade)
'''
(0, 'Freshman')
(1, 'Sophomore')
(2, 'Junior')
(3, 'Senior')
'''
همچنین میتوانیم بهصورت مستقیم و جداگانه به ایندکس و مقدار هر Tuple دسترسی پیدا کنیم:
grades = ["Freshman", "Sophomore", "Junior", "Senior"]
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
در سناریو دیگری فرض کنید لیست زیر نشان دهندهی ترتیب زمانیای است که دانشآموزان وارد کلاس شدهاند و معلم تصمیم دارد تکالیف را از آخرین دانشآموزی که وارد کلاس شده است، بررسی کند. احتمالا همانطور که متوجه شدهاید باید لیست زیر را معکوس کنیم و برای این کار میتوان از تابع reversed()
استفاده کرد:
arrived_students = ["John", "Mike", "Sandra", "Jennifer"]
for student in reversed(arrived_students):
print(student)
'''
Jennifer
Sandra
Mike
John
'''
البته میتوانیم از تابع reverse()
نیز استفاده کنیم اما باید کدها را بهشکل زیر تغییر داد:
arrived_students = ["John", "Mike", "Sandra", "Jennifer"]
arrived_students.reverse()
for student in arrived_students:
print(student)
'''
Jennifer
Sandra
Mike
John
'''
تابع Sorted
همان مثال بخش قبل را درنظر بگیرید که معلمی میخواهد تکالیف دانشآموزان را تصحیح کند اما این بار تصمیم دارد براساس حروف الفبا این کار را انجام دهد. در این سناریو میتوان از تابع sorted()
استفاده کرد:
arrived_students = ["John", "Mike", "Sandra", "Jennifer"]
for student in sorted(arrived_students):
print(student)
'''
Jennifer
John
Mike
Sandra
'''
البته تابع sorted()
یک آرگومان دیگر دریافت میکند که میتوانیم بهکمک آن ترتیب ascending را به descending تغییر دهیم:
arrived_students = ["John", "Mike", "Sandra", "Jennifer"]
for student in sorted(arrived_students, reverse=True):
print(student)
'''
Sandra
Mike
John
Jennifer
'''
اما اگر اطلاعات دانشآموزان بهصورت لیستی از دیشکنریها باشد باید چه کار کرد؟ برای این سناریو میتوانیم از پارامتر lambda
در تابع sorted()
استفاده کنیم:
arrived_students = students = [{"name": "John", "id": 1},
{"name": "Mike", "id": 4},
{"name": "Sandra", "id": 2},
{"name": "Jennifer", "id": 3}]
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}
'''
همچنین اگر لازم باشد مرتبسازی براساس چندین ایندکس مختلف انجام شود میتوانیم بهصورت زیر این کار را انجام دهیم:
arrived_students = students = [{"name": "John", "id": 1},
{"name": "Mike", "id": 4},
{"name": "Sandra", "id": 2},
{"name": "Jennifer", "id": 3}]
for student in sorted(students, key=lambda i: (i["id"], i["name"]), reverse=True):
print(student)
'''
{'name': 'Mike', 'id': 4}
{'name': 'Jennifer', 'id': 3}
{'name': 'Sandra', 'id': 2}
{'name': 'John', 'id': 1}
'''
تابع Filter
فرض کنید هنوز دادههای دانشآموزان بهصورت لیستی از دیکشنریهای مختلف در اختیار ما قرار دارد و از ما خواسته شده دانشآموزانی که id
آنها عدد زوج است را از بقیهی دانشآموزان جدا کنیم. برای پیادهسازی این سناریو میتوان بهشکل زیر از تابع filter()
و lambda
استفاده کرد:
arrived_students = students = [{"name": "John", "id": 1},
{"name": "Mike", "id": 4},
{"name": "Sandra", "id": 2},
{"name": "Jennifer", "id": 3}]
for student in filter(lambda i: i["id"] % 2 == 0, students):
print(student)
'''
{'name': 'Mike', 'id': 4}
{'name': 'Sandra', 'id': 2}
'''
تابع Zip
در حلقهی For میتوانیم از اطلاعات دو لیست مختلف با استفاده از تابع zip()
که قبلتر در مقالهی آموزش استفاده از تابع Zip در زبان Python به آن پرداخته بودیم، استفاده کرد:
names = ["John", "Mike", "Sandra", "Jennifer"]
ids = [1, 3, 2, 4]
for student in zip(names, ids):
print(student)
'''
('John', 1)
('Mike', 3)
('Sandra', 2)
('Jennifer', 4)
'''
منبع: https://betterprogramming.pub/how-to-use-for-loops-better-in-python-1dfbc3d9e91f
توسعهدهندگان دربارهی ما چه میگویند
تجربه کار باliara_cloud@امروز خیلی خوب بود. یکی از سرویس هام رو منتقل کردم روش و راضیم. انقد سریع و جذاب کارم راه افتادم اصن باورم نمیشد! برعکس سرویس های PaaS دیگه با اون همه پیچیدگیشون. دمتون گرم
...
MohammadReza
keikaavousi
بعد از بسته شدن @fandoghpaas و ناراحتی همهمون از اینکه یه سرویس خوب و صادق نمیتونه از پس هزینهها بر بیاد، سرویسم رو منتقل کردم به پاس لیارا (https://liara.ir @liara_cloud) . تجربه راحت و خوب. تفاوتهایی داشت که کمی کار میخواست ولی تا الان کاملا راضی.
jadi
jadi
یه خسته نباشید باید به تصمیمliara_cloud@بگم،
بعد از چندین روز سرکله زدن با سرویس های مشابه بالاخره تصمیم گرفتم لیارا رو امتحان کنم و باور نمیشه ۱۰ دقیقه بیشتر وقت نبرد،
دمتون گرم.
Arch
EbadiDev
واسه سرویس PaaS با اختلاف لیارا بهترین رابط کاربری داره و یکی از مزیتهای سرویس دیتابیسشون اینه که خودشون به صورت دورهای بکآپ میگیرن.
...
Ali Najafi
me_ali_najafi
یکی از کارهای خوبی که جدیداً میکنم اینه که یه دیتابیس روی لیارا میسازم و به پروژه وصل میکنم اینطوری هم خونه و هم محل کار دیتابیس بروز رو دارم و راحت میتونم ادامه بدم کار روliara_cloud@
Navid
1navid
عاشقliara_cloud@شدم درسته در حد AWS نیست ولی خب تجربه خوبی واسه پروژه های داخل ایران ارائه میده، میتونم رو CD هم اجراش کنم
Amir H Shekari
vanenshi