آموزش List Comprehension ها در پایتون

مقدمه و آشنایی با List Comperehnsion ها

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

در این جلسه قصد داریم به بحث List Comprehension ها بپردازیم. این بحث یکی از مباحثی است که حتی اگر آن را یاد نگیریم نیز میتوانیم برنامه های خود را با پایتون بنویسیم ولی اگر میخواهیم واقعا پایتون کار شویم و با شیوه پایتون کار کنیم ، بهتر است آن را یاد بگیریم.

نکته ای که در مورد List Comprehension ها وجود دارد این است که برای ما بسیار کدنویسی را راحتتر می کنند و به جای نوشتن چند خط کد میتوانیم یک خط کد بنویسیم و همان کارها را انجام دهیم. اجازه دهید برای روشن شدن این موضوع مثالی را مطرح کنیم : 

مثال 1 : فرض کنید که میخواهیم حروف واژه های human را از یکدیگر جدا کنیم و آن را تک به تک در یک لیست قرار دهیم. اولین چیزی که به ذهن ما میرسد استفاده از حلقه for است. در زیر نحوه انجام این کار آمده است : 

h_letters = []

for letter in 'human':
    h_letters.append(letter)

print(h_letters)

در کد بالا به صورت iterative بر روی حرف های کلمه human حرکت کرده ایم و هر کدام از این حرف ها را به یک لیست اضافه کرده ایم. نتیجه خروجی این کد به صورت زیر است : 

['h','u','m','a','n']

زبان پایتون برای حل این مساله روش دیگری را نیز ارایه می دهد و آن استفاده از list comprehension ها است. در واقع List Comprehension ها ساخت و ایجاد یک لیست به کمک لیست ( و یا لیست هایی ) دیگر است.  حال اجازه دهید که همین مثال را به کمک List Comprehension ها بنوسیم. در این صورت خواهیم داشت : ( فعلا به نحوه نوشتن این کد کاری نداشته باشید. در ادامه به صورت کامل آن را توضیح خواهیم داد. ) 

h_letters = []
h_letters = [ letter for letter in 'human' ]
print( h_letters)

اگر این کد را اجرا کنیم نتیجه به صورت زیر است : 

['h', 'u', 'm', 'a', 'n']

در مثال بالا ، یک لیست جدید در h_letters قرار گرفته است که این لیست به صورت iterative بر روی رشته human حرکت می کند و حروف آن را در h_letters قرار می دهد. در نهایت هم با دستور print ، نتیجه در خروجی نشان داده شده است. 

Syntax مربوط به List Comprehension ها

در شکل زیر Syntax مربوط به List Comprehension ها آورده شده است : 

List Comprehension

همانطور که مشخص است ، List Comprehension از سه بخش اصلی تشکیل می شود :

  • بخش اول : داده ای است که میخواهیم از یک لیست یا String به لیست جدید خود ببریم. توجه کنید که این داده میتوانند یک کاراکتر مثل x باشد و یا یک عبارت باشد که یک متد روی آن صدا زده شده است و یا حتی عبارتی که 
  • بخش دوم : حلقه for ما است که باید داده مورد نظر را در آن بیاوریم. مثلا اگر x داده بخش اول ما باشد ، در این صورت for x in my_list  بخش دوم ما را تشکیل می دهد. 
  • بخش سوم : اگر شرطی برای قرار گرفتن x در لیست جدید خود داریم ، آن را در این بخش می آوریم. ( توجه داشته باشید که در مثال قبل ما به شرطی نیاز نداشتیم. به همین علت ، آن را نیاورده بودیم. ) 

اجازه دهید برای بهتر شدن درک خود از List Comprehension یک مثال دیگر را نیز مطرح کنیم. 

مثال 2: فرض کنیم که میخوایم یک لیستی از اعداد زوج 1 تا 20 بسازیم و قصد داریم از List Comprehension ها استفاده کنیم. 

اگر بخش اول List Comprehension  را x در نظر بگیریم در این صورت بخش دوم را میتوان به صورت(for x in range(0 , 20 میتوان در نظر گرفت که نشان می دهد x از 0 تا 20 می رود. 

برای زوج بودن کافی است شرط x%2 == 0 ارضا شود که در این صورت قطعا ، x عددی زوج است. بنابراین میتوان کد مربوط به این سوال را به صورت زیر بنویسیم  :

number_list = [ x for x in range(20) if x % 2 == 0]
print(number_list)

نتیجه اجرای کد بالا به صورت زیر خواهد بود : 

[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

که همانطور که میبینیم به مقصود خود رسیده ایم. مثال زیر نیز به ما درک عمیق ترین از این موضوع ارایه می دهد : 

مثال 3: استفاده از  if های  تو در تو در List Comprehension ها : 

در این مثال میخواهیم اعدادی که هم بر 2 و هم بر 5 بخش پذیر هستند را در یک لیست قرار دهیم. فرض کنید بازه انتخابی برای این کار ، از 0 تا 100 می باشد. برای این کار کافی است در قسمت شرط هم تقسیم پذیری بر 2 و هم تقسیم پذیری بر 5 را قرار دهیم. بنابراین خواهیم داشت : 

num_list = [y for y in range(100) if y % 2 == 0 if y % 5 == 0]
print(num_list)

همانطور که میبینیم در قسمت مربوط به شرط ، هر دو شرط آورده شده است. یعنی در صورتی یک عدد به یک لیست ، اضافه می شود که آن عدد هم بر 2 و هم بر 5 بخش پذیر باشد.  نتیجه اجرای این کد به صورت زیر است : 

[0, 10, 20, 30, 40, 50, 60, 70, 80, 90]

اجازه دهید بحث را با مثالی  کمی متفاوت تر ادامه دهیم : 

مثال 4: فرض کنید میخواهیم برنامه ای بنویسیم که برای اعداد 1 تا 10 اگر عدد زوج بود مقدار Even به یک لیست Append شود و اگر آن عدد فرد بود Odd به لیست Append شود.   

برای نوشتن این کد باید در قسمت اول تغییراتی مورد نظر خود را اعمال کنیم. یعنی مقدار even را اگر i%2 == 0 بود به لیست مورد نظر append کنیم و مقدار odd را اگر i%2 !=0 بود ، به لیست Append کنیم. اگر همین حرف را در قالب کد بنویسم در این صورت خواهیم داشت : 

obj = ["Even" if i%2==0 else "Odd" for i in range(10)]
print(obj)

و نتیجه اجرای کد به صورت زیر است : 

['Even', 'Odd', 'Even', 'Odd', 'Even', 'Odd', 'Even', 'Odd', 'Even', 'Odd']

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

نکات کلیدی که باید در List Comprehension ها به خاطر بسپاریم : 

  • List Comprehension ها یک روش بسیار مناسب برای ایجاد یک لیست به کمک لیست یا لیست هایی دیگر است. 
  • List Comprehension ها روشی سریع تر و جمع و جور تر برای نوشتن برنامه های عادی است.  
  • سعی کنید که یک List Comprehension را زیاد طولانی و تو در تو نکنید تا خوانایی آن از دست نرود و کاربران بتوانند راحتتر کدهای شما را بخوانند. 
  • به یاد داشته باشید که هر List Comprehension را میتوان با یک حلقه for نوشت ولی هر حلقه for را نمیتوان الزاما با یک List Comprehension نوشت. 
تمارین:

 تمرین 1 : به کمک List Comprehension ها یک لیست از مکعب اعداد زوج بین 1 تا 10 ایجاد کنید. 

 تمرین 2 : به کمک List Comprehension ها  برنامه ای بنویسید که همه اعضای یک ماتریس را به صورت لیستی از اعداد در آورد. به عنوان مثال اگر ماتریس شما به صورت  [[1,2],[3,4],[5,6]] باشد ، باید خروجی برنامه شما [2, 1, 4, 3, 6, 5]  باشد. ( برای این سوال لازم است از for تو در تو استفاده شود. سعی کنید ابتدا برنامه را به صورت عادی بنویسید و سپس آن را به List Comprehension تبدیل کنید.) 

 تمرین 3 : با استفاده از حلقه for تو در تو ، Transpose یک ماتریس را بیابید. ( عوض کردن جای سطر و ستون های یک ماتریس را Transpose کردن آن می نامند.) توجه کنید که در این حالت از توابع آماده نمیتوانید استفاده کنید. 

 تمرین 4 : سوال بالا را با استفاده از List Comprehension ها انجام دهید. 

نکته :  پس از حل سوالات ، لطفا  کد های خود را در قسمت کامنت ها قرار دهید تا در صورتی که دوستان دیگر دچار مشکل شدند ، از کدهای شما کمک بگیرند. 

دوستان مجددا تاکید می شود که تمرینات بالا را حل کنید. در هر بخشی از تمارین نیز که به مشکل برخوردید ، سوالات خود را در قسمت کامنت ها مطرح کنید تا توضیحات لازم ارایه شود. مثل همیشه میتوانید ما را در تلگرام و یا اینستاگرام دنبال کنید: 

اشتراک گذاری:
مطالب زیر را حتما بخوانید

دیدگاهتان را بنویسید