خب بریم سراغ جواب این سوال🤓
در مرحله اول ما با یه list comperasion رو به رو هستیم :
[x for x in range(10) if not (x& 7 and x &1 and 0<x>x-1)]
عبارت بالا یه list comp هستش .این از list comperasionمون.
خب داخل list comp ما اومدیم از حلقه for و condition ها و logical operator و BitWiseOperatorها استفاده کردیم . بریم ببینیم که عبارت داخل list comp چجوری محاسبه میشه🚗🚗
در ابتدا ما اومدیم یه range مشخصی از اعداد رو در نظر گرفتیم . رینج مورد نظر ما از 0 تا 10 هستش. حتما میدونید که تابع range سه تا پارامتر میگیره:
range(start,stop,step)
اولین پارامتر که startهست تعیین میکند که از چه عددی رینج ما شروع میشه وقتی براش مقداری در نظر نمیگیریم خودش به صورت دیفالت از 0 شروع میکنه . پارامتر بعدی stop هستش که مشخص میکنه که تا چه عددی ادامه پیدا میکنه . (نکته مهم:: رینج ما تا stop-1 هستش . یعنی تا خود stop پیش نمیره تا یکی مونده به stop ،عملیات پیمایش یا iteration را انجام میدهد .اگر میخواهیم شامل خود stop هم باشد به صورت stop+1 مینویسیم .) پارامتر بعدی step هستش . که گام های پیمایش یا iteration را مشخص میکند . هنگامی که مقداری برای step در نظر گرفته نمیشود پایتون به صورت دیفالت مقدار1 را در نظر میگیرد. در این مثال منظور از :
x for x in range(10)

این است که میخواهیم بر روی اعداد از 0(start=0) تا 10 (stop=10) (یعنی 0.....9) پیمایش کنیم . پس مقادیر x ما شامل0 تا 9 می باشد . این از کارکرد حلقه for. بریم سراغ if:
در قسمت condition ما عبارت زیر را نوشتیم :
if not (x &7 and x&1 and 0<x>x-1)
خب اول بریم سراغ عبارت های داخل پرانتر. داخل پرانتز ما داریم :
x & 7 and x&1 and 0<x>x-1
میدانیم & عملگر BitWise و and عملگر logical هستش . خب در x &7 در ابتدا باید ما هم x و هم 7 را به مقادیر باینری یعنی 0 و 1 تبدیل کنیم و با یک دیگر & کنیم . یعنی به چه صورت؟؟ در مرحله اول x ما مقدارش 0 است درسته؟؟ خب باینری0 به صورت:
000000
هستش . باینری 7 به صورت :
000111
میتونید از متد bin() برای به دست آوردن مقدار باینری عدد استفاده کنید. وقتی که به bin عدد 7 رو پاس بدید نتیجه ای که بهتون برمیگردونه به صورت0b111 هستش یعنی مقدار باینری عدد رو بهتون برمیگردونه. خب حالا اگه از متد bin استفاده نکردید و به صورت دستی به دست آوردید برای اینکه از مقدار باینری مورد نظر مطمئن بشید میتونید از int() استفاده کنید و مقدار باینری عدد رو به صورت string بهش پاس بدید و بگید که در مبنای 2 بهتون برگردونه .یعنی به صورت:
int('0b111',2)——->7
حالا وقتی که مقدار باینری x در حلقه for و 7 رو به دست آوردید ، کافیه با هم & کنید . میدونیم که در & زمانی مقدار1 میشه که هر دوbitما 1 باشه در غیر این صورت 0 میشه.الان در :

0 —-> 00000
&
7 —-> 00111
———————-
00000
مقدار & شده ی 0 و 7 برابر با 0 میشه . و در نتیجه حاصل x&7 برابر با false میشود . خب این از حاصل x&7 . برای x&1 نیز همین کار رو انجام میدیم . یعنی :
0—->0000
&
1—-->0001
——————----
0000
خب حاصل 0&1 نیز برابر با False شد. تا اینجای کار داریم:
fasle and false and 0<x>x-1
خب در :
0<x>x-1
مقدار اولیه xما 0 هستش پس داریم:
0<0>-1
حاصل عبارت بالا Fasleست . چراا ؟؟ چرا syntax error نداد ؟. این عبارت کاملا از نظر Comparison Operators کاملا درسته به خاطر اینکه 0 از خودش بزرگتر نیست و از -1 نیز بزرگتر است و حاصل عبارت False است است .چند نمونه مثال دیگه:
7<9>8 ——>True
9<10>15——->False
8<=14>=14——>True
خب تا این جا حاصل عبارت داخل پرانتز می شود:
False and False and False
میدانیم که حاصل عبارتی که داخلش andاست زمانی برابر با true میشود که شرط هایی که اطرافش نوشته شده اند همه true باشند . خب پس با در نظر گرفتن این نکته حاصل :
False and False and False
به خاطر وجود False برابر با False میشود . در نتیجه مقدار عبارت داخل پرانتز کلا False میشود . خب الان داریم:
if not (False)
میدانیم not False میشود True پس چون شرط True شد پایتون به داخل بدنه ی if میرود و statement مورد نظر را محاسبه میکند . statementمورد نظر مقدار x است . که داخل لیست قرار میگیرد. پس اولین عضوی که داخل list compما ذخیره میشود عدد 0 است . پس الان لیستی به صورت: [0] داریم . برای x با مقدار 1 نیز راه بالا را پیش میگیریم . (فقط یه نمونه & با 7 رو براتون مینویسم) & عدد 1 با 7 میشه 1 پس حاصل 7&1 میشه True.)
1——>00001
&
7——->00111
———————-
00001
مقداری که در پرانتز به دست می آید True است و not True میشود False پس قسمت if اجرا نمیشود . (برای x با مقادیر فرد شرط برقرار نیست ) فقط برای x با مقادیر زوج شرط برقرار است پس جواب نهایی میشود:
[0,2,4,6,8]
@raspberry_python

Comments

Be the first to add a comment