منظور از comprehension تولید یک iterable بر اساس iterable دیگری هست. با این روش میشه چندین خط کد رو توی یک خط نوشت و از loop ها اجتناب کرد. تو این مقاله میخایم تولید set بر اساس iterable های دیگر بر اساس comprehension رو بررسی کنیم.
فرمول کلی set comprehension اینه:
new_set = {expression_from_x for x in iterable if condition}
تو این فرمول منظور از expression_from_x هر عبارت برنامه نویسی با استفاده از x هست مثلا:
x
x.upper()
x + 2
منظور از iterable هر متغیری هست که بشه توش چرخید. مثل: list, set, tuple, range و ...
نکته:چون ترتیب در set ها اهمیت نداره حاصل comprehension هامون مثل ترتیب iterable اولیه نیست.
مثلا فرض کن میخایم مجموعه ای از اعداد فرد رو به اعداد زوج تبدیل کنیم. یعنی هر کدومش رو به علاوه 1 کنیم. میشه این کار رو با for انجام داد:
odds = {1,3,5,7} evens = set() for num in odds: evens.add(num+1)
همین کد رو میشه با استفاده از comprehension توی یک خط نوشت:
evens = {num+1 for num in {1,3,5,7}}
میشه در حین comprehension شرط هم اضافه کرد. در این صورت فقط اون اعضایی که شرط براشون True میشه به حاصل نهایی اضافه خواهند شد. مثلا در کد زیر فقط اعداد زوج به مجموعه evens اضافه میشه:
nums = {1,2,3,4,5,6,7,8} evens = {num for num in nums if num % 2 == 0}
توی expression_from_x میشه از عبارت ternary استفاده کرد. مثلا توی کد زیر زوج یا فرد بودن هر عددی رو به set نهایی اضافه می کنیم.
nums = {1,2,3,4,5,6,7,8,9} titles = {"Even" if num % 2 == 0 else "Odd" for num in nums}
نکته: چون اعضای تکراری در set پذیرفته نیست titles در کد بالا نهایتا فقط 2 عضو خواهد داشت: Even و Odd
مثل list ها میشه set ها رو هم comprehend کرد. با این روش کدی که در چند خط نوشته می شد رو به یک خط کاهش میدیم. به این طریق احتمال باگ هم کمتر میشه و بر فرضی هم که باگ درست بشه باگ گیریش راحت تر خواهد بود. فقط حواست باشه که set ای که comprehend شده (یعنی بر اساس comprehension ساخته شده) مثل همه set ها اعضای تکراری نخواهد داشت و ترتیبش غیر قابل پیش بینی عه.