একটি list comprehension একটি বিদ্যমান লিস্ট থেকে একটি একক লাইনে একটি নতুন লিস্ট তৈরি করে — এটি ভাষার সবচেয়ে স্বতন্ত্রভাবে "Python" ফিচারগুলোর একটি, আর বাস্তব Python কোড এটি ক্রমাগত ব্যবহার করে।
এখানে একই কাজ — একটি লিস্টের প্রতিটি সংখ্যা স্কোয়ার করা — দুই উপায়ে লেখা:
# The long way, with a regular loop:
numbers = [1, 2, 3, 4, 5]
squared = []
for n in numbers:
squared.append(n ** 2)
print(squared) # [1, 4, 9, 16, 25]
# The same thing, as a list comprehension:
squared = [n ** 2 for n in numbers]
print(squared) # [1, 4, 9, 16, 25]প্যাটার্নটি হলো [expression for item in iterable] — এটি বাম থেকে ডানে পড়ুন "iterable-এর প্রতিটি item-এর জন্য, expression-এর ফলাফল" হিসেবে।
শেষে একটি ঐচ্ছিক if কোন আইটেমগুলো অন্তর্ভুক্ত হবে তা ফিল্টার করে — এটি PHP-এর array_filter() আর array_map() একসাথে মেশানোর কম্প্রিহেনশন সমতুল্য, একটি এক্সপ্রেশনে:
numbers = [1, 2, 3, 4, 5, 6]
even_squared = [n ** 2 for n in numbers if n % 2 == 0]
print(even_squared) # [4, 16, 36]একই ধারণা একটি ডিকশনারি তৈরির জন্যও কাজ করে, এর বদলে { } আর একটি key: value জোড়া ব্যবহার করে:
names = ["priya", "amit", "sara"]
capitalized = {name: name.capitalize() for name in names}
print(capitalized) # {'priya': 'Priya', 'amit': 'Amit', 'sara': 'Sara'}কখন একটি ব্যবহার করবেন না
একটি ছোট, সহজ রূপান্তরের জন্য একটি কম্প্রিহেনশন পাঠযোগ্যতার একটি জয়। একবার এর ভেতরের লজিক জটিল হয়ে গেলে — বেশ কয়েকটি কন্ডিশন, নেস্টেড লুপ, একটি মাল্টি-লাইন রূপান্তর — একটি সাধারণ for লুপ সাধারণত বেশি পরিষ্কার। ঠিক কোথায় সেই সীমা তার কোনো নিয়ম নেই; একটি কম্প্রিহেনশন বুঝতে যদি আপনাকে চোখ কুঁচকে তাকাতে হয়, তাহলে এটাই সংকেত যে এর বদলে একটি লুপ হিসেবে লেখা উচিত।