عملگرها و عبارت ها {op-exp#}
بیشتر دستورها (خطوط منطقی) که می نویسید شامل عبارات (expressions) هستند. یک مثال ساده از عبارت، 3 + 2 است. یک عبارت را می توان به عملگرها و عملوندها تجزیه کرد.
عملگرها قابلیتی هستند که کاری را انجام می دهند و می توان آنها را با نمادهایی مانند + یا با کلمات کلیدی خاص نمایش داد. عملگرها برای انجام عملیات خود به داده هایی نیاز دارند و این داده ها عملوند نامیده می شوند. در این مثال، 2 و 3 عملوند هستند.
عملگرها
در این بخش نگاهی کوتاه و مختصر به عملگرها و کاربرد آنها خواهیم داشت.
توجه داشته باشید که می توانید عبارات داده شده در مثال ها را با استفاده از مفسر و به صورت تعاملی ارزیابی کنید. برای مثال، برای آزمایش عبارت 3 + 2، از خط فرمان مفسر تعاملی پایتون استفاده کنید:
>>> 2 + 3
5
>>> 3 * 5
15
>>>
در اینجا، مروری سریع بر عملگرهای موجود ارائه شده است:
+(جمع)- دو شئ را با یکدیگر جمع می کند.
5 + 3مقدار8را می دهد. عبارت'a' + 'b'مقدار'ab'را ایجاد می کند.
-(تفریق)- تفریق یک عدد از عدد دیگر را انجام می دهد؛ اگر عملوند اول موجود نباشد، مقدار آن صفر در نظر گرفته می شود.
-5.2یک عدد منفی ایجاد می کند و عبارت24 - 50مقدار26را می دهد.
*(ضرب)- حاصل ضرب دو عدد را بر می گرداند یا رشته را به همان تعداد مشخص تکرار می کند.
3 * 2مقدار6را ایجاد می کند. عبارت'la' * 3'مقدار'lalala'را می دهد.
**(توان )- مقدار x را به توان y بر می گرداند.
4**3مقدار81را می دهد (یعنی3 * 3 * 3 * 3)
/(تقسیم)- مقدار x را بر y تقسیم می کند.
3 / 13مقدار4.333333333333333را ایجاد می کند.
//(تقسیم و کف)- مقدار x را بر y تقسیم می کند و پاسخ را به سمت پایین تا نزدیک ترین مقدار صحیح گرد می کند. توجه داشته باشید که اگر یکی از مقادیر از نوع اعشاری باشد، نتیجه نیز از نوع اعشاری خواهد بود.
3 // 13مقدار4را ایجاد می کند.3 // 13-مقدار5-را می دهد.1.81 // 9مقدار4.0را می دهد.
%(باقی مانده)- باقی مانده حاصل از تقسیم را بر می گرداند.
3 % 13مقدار1را می دهد.2.25 % 25.5-مقدار1.5را ایجاد می کند.
>>(شیفت به چپ )- بیت های یک عدد را به اندازۀ تعداد بیت های مشخص شده به چپ جا به جا می کند ( هر عدد در حافظه توسط بیت ها یا ارقام باینری یعنی 0 و 1، نمایش داده می شود).
2 >> 2مقدار8را می دهد.2در نمایش بیتی با10مشخص می شود.- با شیفت دادن 2 بیت به چپ، مقدار
1000به دست می آید که نشان دهندۀ عدد8است.
<<(شیفت به راست )- بیت های یک عدد را به اندازۀ تعداد بیت های مشخص شده به سمت راست جا به جا می کند.
1 << 11مقدار5را می دهد.11 >> 1gives5.- عدد
11در نمایش بیتی به صورت1011است که با شیفت 1 بیت به سمت راست، به101تبدیل می شود که همان عدد5است.
&(AND)- عمل AND بیتی را روی اعداد انجام می دهد: اگر هر دو عدد
1باشند، نتیجه1خواهد بود. در غیر این صورت، نتیجه0می شود. - عبارت
3 & 5مقدار1را می دهد. (عبارت0011 & 0101مقدار0001را می دهد)
- عمل AND بیتی را روی اعداد انجام می دهد: اگر هر دو عدد
|(OR)- عمل OR بیتی را روی اعداد انجام می دهد: اگر هر دو عدد
1باشند، نتیجه0خواهد بود. در غیر این صورت،1خواهد بود. - عبارت
3 | 5مقدار7را می دهد. (0011 | 0101مقدار0111را ایجاد می کند).
- عمل OR بیتی را روی اعداد انجام می دهد: اگر هر دو عدد
^(XOR)- عمل XOR بیتی را روی اعداد انجام می دهد: اگر هر دو بیت (
0یا1) یکسان باشند، نتیجه0می شود. در غیر این صورت،1می شود. 3 ^ 5مقدار6را می دهد (0011 ^ 0101مقدار0110را ایجاد می کند).
- عمل XOR بیتی را روی اعداد انجام می دهد: اگر هر دو بیت (
~(معکوس بیتی)- معکوس بیتی x برابر با (x+1)- است.
- عبارت
5~مقدار6-را می دهد. جزئیات بیشتر را می توانید در http://stackoverflow.com/a/11810203 مشاهده کنید.
>(کوچک تر از)- بررسی می کند که آیا x از y کوچکتر است یا خیر. تمام عملگرهای مقایسه ای مقدار
TrueیاFalseرا بر می گردانند. به بزرگ و کوچک بودن حروف در این نام ها توجه کنید. 3 > 5مقدارFalseو5 > 3مقدارTrueباز می گرداند.- مقایسه ها را می توان به صورت زنجیره ای و بدون محدودیت خاصی انجام داد:
3 < 5 < 7مقدارTrueرا ایجاد می کند.
- بررسی می کند که آیا x از y کوچکتر است یا خیر. تمام عملگرهای مقایسه ای مقدار
<(بزرگ تر از)- بررسی می کند که آیا x بزرگتر از y است یا خیر.
- عبارت
3 < 5مقدارTrueرا بر می گرداند. اگر هردو عملوند عدد باشند، ابتدا به یک نوع مشترک تبدیل می شوند. در غیر این صورت، مقدارFalseرا بر می گرداند.
=>(کوچک تر یا مساوی)- بررسی می کند که آیا x کوچکتر یا مساوی با y است یا خیر.
- عبارت
x = 3; y = 6; x <= yمقدارTrueرا ایجاد می کند.
>=(بزرگتر یا مساوی)>=- بررسی می کند که آیا x از y بزرگتر یا مساوی است یا خیر.
- عبارت
x = 4; y = 3; x >= 3مقدارTrueرا بر می گرداند.
==(مساوی)- بررسی می کند که آیا دو شئ با یکدیگر برابر هستند یا خیر.
- عبارت
x = 2; y = 2; x == yمقدارTrueرا بر می گرداند. - عبارت
x = 'str'; y = 'stR'; x == yمقدارFalseرا بر می گرداند. - عبارت
x = 'str'; y = 'str'; x == yمقدارTrueرا بر می گرداند.
=!(نا مساوی)- بررسی می کند که آیا دو شئ با یکدیگر برابر نیستند.
- عبارت
x = 2; y = 3; x != yمقدارTrueرا بر می گرداند.
not(boolean NOT)- اگر x برابر
Trueباشد، مقدارFalseرا بر می گرداند. اگر x برابرFalseباشد، مقدارTrueرا بر می گرداند. - عبارت
x = True; not xمقدارFalseرا باز می گرداند.
- اگر x برابر
and(boolean AND)- اگر x برابر
Falseباشد، عبارتx and yمقدارFalseرا بر می گرداند. در غیر این صورت، نتیجۀ ارزیابی y را بر می گرداند. - عبارت
x = False; y = True; x and yمقدارFalseرا بر می گرداند زیرا x برابر False است. در این شرایط، پایتون y را ارزیابی نمی کند زیرا می داند سمت چپ عبارت 'and' برابرFalseاست بنابراین صرف نظر از مقادیر دیگر کل عبارتFalseخواهد بود. این رفتار ارزیابی اتصال کوتاه (short-circuit evaluation) نامیده می شود.
- اگر x برابر
or(boolean OR)- اگر x برابر
Trueباشد، مقدار True را بر می گرداند. در غیر این صورت، نتیجۀ ارزیابی y را بر می گرداند. - عبارت
x = True; y = False; x or yمقدارTrueرا باز می گرداند. در اینجا نیز ارزیابی اتصال کوتاه اعمال می شود.
- اگر x برابر
میان بر برای عملیات ریاضی و انتساب
معمول است که یک عملیات ریاضی را روی یک متغیر اجرا کنیم و سپس نتیجۀ آن عملیات را دوباره به همان متغیر نسبت دهیم. بنابراین، برای چنین عباراتی یک میان بر وجود دارد:
a = 2
a = a * 3
را نیز می توان به صورت زیر نوشت:
a = 2
a *= 3
توجه کنید که عبارت var = var operation expression به صورت var operation = expression نوشته می شود.
ترتیب ارزیابی
اگر عبارتی مانند 4 * 3 + 2 داشته باشید، ابتدا جمع انجام می شود یا ضرب؟ ریاضیات دبیرستان به ما می آموزد که ابتدا ضرب باید انجام شود. این بدان معناست که عملگر ضرب نسبت به عملگر جمع تقدم دارد.
جدول زیر ترتیب تقدم عملگرها در پایتون را نشان می دهد؛ این جدول از کمترین تقدم (کمترین میزان اتصال) تا بیشترین تقدم (بیشترین مقدار اتصال) مرتب شده است. این بدان معناست که در یک عبارت مشخص، پایتون ابتدا عملگرها و عباراتی را ارزیابی می کند که در بخش پایین تر جدول قرار دارند و سپس به مواردی می پردازد که در بخش بالاتر جدول آمده اند.
جدول زیر که از راهنمای مرجع پایتون گرفته شده است، برای کامل بودن مطالب ارائه شده است. بسیار بهتر است که برای گروه بندی مناسب عملگرها و عملوندها از پرانتز استفاده کنید تا تقدم آنها را به صورت آشکار مشخص کنید. این کار باعث خوانایی بیشتر برنامه می شود. برای جزئیات بیشتر به تغییر ترتیب ارزیابی مراجعه کنید.
lambda: lambda عبارتif - else: عبارت شرطیor: Boolean ORand: Boolean ANDnot x: Boolean NOTin, not in, is, is not, <, <=, >, >=, !=, ==: مقایسه ها، شامل آزمون های عضویت و آزمون های هویتی|: Bitwise OR^: Bitwise XOR&: Bitwise AND<<, >>: شیفت ها+, -: جمع و تفریق*, /, //, %: ضرب، تقسیم، تقسیم و کف و باقی مانده+x, -x, ~x: Positive, Negative, bitwise NOT**: توان رسانیx[index], x[index:index], x(arguments...), x.attribute: دسترسی به عنصر، برش، فراخوانی و ارجاع به ویژگی(expressions...), [expressions...], {key: value...}, {expressions...}: ایجاد اتصال یا تاپل، ایجاد لیست، ایجاد دیکشنری، ایجاد مجموعه
عملگرهایی که تاکنون با آنها آشنا نشده ایم، در فصل های بعدی توضیح داده خواهند شد.
عملگرهایی که تقدم یکسانی دارند در یک ردیف از جدول بالا قرار گرفته اند. برای مثال، + و - تقدم یکسانی دارند.
تغییر ترتیب ارزیابی {changing-order-of-evaluation#}
برای خواناتر کردن عبارات، می توانیم از پرانتزها استفاده کنیم. برای مثال، (4 * 3) + 2 قطعاً درک ساده تری نسبت به 4 * 3 + 2 دارد، زیرا عبارت دوم به دانستن تقدم عملگرها نیاز دارد. همانند هر چیز دیگری، پرانتزها باید به اندازه و به صورت منطقی استفاده شوند (در استفاده از آنها زیاده روی نکنید) و نباید اضافی باشند؛ مانند ((4 * 3) + 2).
استفاده از پرانتز یک مزیت دیگر نیز دارد - به ما اجازه می دهد ترتیب ارزیابی را تغییر دهیم. برای مثال، اگر بخواهید در یک عبارت، جمع پیش از ضرب انجام شود، می توانید چیزی مانند 4 * (3 + 2) بنویسید.
شرکت پذیری
عملگرها معمولاً از چپ به راست با یکدیگر ترکیب می شوند. این بدان معناست که عملگرهایی با تقدم یکسان، به ترتیب از چپ به راست ارزیابی می شوند. برای مثال، 4 + 3 + 2 به صورت 4 + (3 + 2) ارزیابی می شود.
عبارات
مثال را با نام expression.py ذخیره کنید:
length = 5
breadth = 2
area = length * breadth
print('Area is', area)
print('Perimeter is', 2 * (length + breadth))
خروجی:
$ python expression.py
Area is 10
Perimeter is 14
نحوۀ عملکرد
طول و عرض مستطیل در متغیرهایی با همین نام ذخیره می شوند. از این متغیرها برای مساحبۀ مساحت و محیط مستطیل با کمک عبارت ها استفاده می کنیم. نتیجۀ عبارت length * breadth را در متغیر area ذخیره کرده و سپس با استفاده از تابع print آن را چاپ می کنیم. در حالت دوم، مستقیماً از مقدار عبارت (length + breadth) * 2 در تابع print استفاده می کنیم.
همچنین توجه کنید که پایتون خروجی را به شکلی مرتب و خوانا چاپ می کند. اگرچه فاصله ای بین 'Area is' و متغیر area مشخص نکرده ایم، پایتون این فاصله را برای ما قرار می دهد تا خروجی مرتبی داشته باشیم و برنامه نیز به این شکل خواناتر باشد؛ زیرا دیگر لازم نیست نگران فاصله گذاری در رشته هایی باشیم که برای خروجی استفاده می کنیم. این نمونه ای از این است که چگونه پایتون کار برنامه نویس را آسان می کند.
جمع بندی
دیدیم که چگونه از عملگرها، عملوندها و عبارات استفاده کنیم؛ این ها اجزای سازندۀ اساسی هر برنامه هستند. در ادامه، خواهیم دید که چگونه با استفاده از دستورها از این موارد در برنامه های خود بهره بگیریم.