Python-Toán tử

Toán tử là kí tự đặc biệt được dùng để thực hiện một task vụ cụ thể. Toán tử trong ngôn ngữ lập trình được kế thừa từ toán học. Các ứng dụng làm việc với data. Toán tử được sử dụng để xử lí data.

Trong Python, có nhiều loại toán tử
– Arithmetic operators (toán tử số học)
– Boolean operators (toán tử logic)
– Relational operators (toán tử quan hệ)
– Bitwise operators (toán tử thao tác bit )

Toán tử có 1 hoặc 2 toán hạng. Toán hạng là argument của toán tử. Toán tử có 1 toán hạng được gọi là unary operator. Toán tử làm việc với 2 toán hạng gọi là binary operator.

Dấu + và – tùy thuộc vào ngữ cảnh sử dụng, có thể là toán tử cộng/trừ hoặc toán tử dấu.

>>> 2
2
>>> +2
2
>>> 

Dấu cộng được sử dụng để chỉ là số dương. Nhưng ít khi sử dụng. Dấu trừ (-) thay đổi dấu của của giá trị

>>> a = 1
>>> -a
-1
>>> -(-a)
1

Toán tử + và * là toán tử 2 toán hạng (binary operator).

>>> 3 * 3
9
>>> 3 + 3
6

Toán tử gán

Toán tử gán = assign giá trị cho biến.

>>> x = 1
>>> x
1

Assign 1 cho biến x

>>> x = x + 1
>>> x
2

Biểu thức x = x + 1 là vô nghĩa trong toán học, nhưng lại ok trong ngôn ngữ lập trình. Biểu thức này có nghĩa là cộng thêm 1 vào x => x + 1 = 2, gán 2 vào x.

>>> a = b = c = 4
>>> print(a, b, c)
4 4 4

Có thể gán 1 giá trị vào nhiều biến

>>> 3 = y
  File "<stdin>", line 1
SyntaxError: can't assign to literal

Báo lỗi không thể gán biến vào giá trị

Toán tử số học

Dưới đây là bảng tổng hợp các toán tử số học trong Python

+--------+----------------+
| Symbol | Toán tử        |
+--------+----------------+
| +      | Cộng           |
+--------+----------------+
| -      | Trừ            |
+--------+----------------+
| *      | Nhân           |
+--------+----------------+
| /      | Chia           |
+--------+----------------+
| //     | Chia số nguyên |
+--------+----------------+
| %      | Chia lấy số dư |
+--------+----------------+
| **     | Số mũ          |
+--------+----------------+

Ví dụ 1: Sử dụng toán tử toán học trong Python

a = 10
b = 11
c = 12

add = a + b + c
sub = c - a
mult = a * b
div = c / 3

power = a ** 2

print(add, sub, mult, div)
print(power)

Kết quả:

C:\Python34>python.exe test.py
33 2 110 4.0
100

Ví dụ 2: Toán tử chia

print(9 / 3)
print(9 / 4)
print(9 // 4)
print(9 % 4)
print(9 / 4)

Kết quả 2.25.
Trong python 2.x, toán tử / là toán tử trả về số nguyên. Trong python 3.x, toán tử / được thay đổi thành trả về kết quả thập phân.

print(9 // 4)

Toán tử chia trả về phần nguyên

print(9 % 4)

Toán tử % trả về số dư

Kết quả:

C:\Python34>python.exe test.py
3.0
2.25
2
1
>>> 'return' + 'of' + 'the' + 'king'
'returnoftheking'

Toán tử + được sử dụng để nối string

>>> 3 + ' apples'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'int' and 'str'

Không thể cộng số nguyên với string => báo lỗi TypeError

Để đoạn code trên chạy được, cần dùng str() convert sang string như sau:

>>> str(3) + ' apples'
'3 apples'

Toán tử * có thể dùng giữa string và số nguyên để lặp lại string

>>> 'dollar ' * 5
'dollar dollar dollar dollar dollar '

Toán tử boolean

Trong Python, chúng ta có toán tử and, or và not. Với toán tử boolean chúng ta thực hiện các phép toán logic. Phần lớn được sử dụng với keyword if và while.

Ví dụ 3: Toán tử and

print(True and True)
print(True and False)
print(False and True)
print(False and False)

Toán tử and chỉ trả về True nếu cả 2 toán hạng là True.

Kết quả:

C:\Python34>python.exe test.py
True
False
False
False

Ví dụ 4: Toán tử or

print(True or True)
print(True or False)
print(False or True)
print(False or False)

Toán tử or trả về True nếu 1 trong 2 toán hạng là True.

Kết quả:

C:\Python34>python.exe test.py
True
True
True
False

Ví dụ 5: Toán tử not

print(not False)
print(not True)
print(not ( 4 < 3 ))

Toán tử not là toán tử phủ định

Kết quả:

C:\Python34>python.exe test.py
True
True
True
False

Chú ý: toán tử and: A and B
– Nếu toán hạng A là False, toán hạng B sẽ không được thực hiện.
– Nếu toán hạng A là True, toán hạng B sẽ được thực hiện
Xem ví dụ dưới đây để hiểu rõ hơn.

Ví dụ 6:

x = 10
y = 0

if (y != 0 and x/y < 100):
      print("a small value")

Trong ví dụ này, y = 0 => (y != 0) trả về False => biểu thức x/y không được thực hiện.
Nếu ví dụ trên không có biểu thức y != 0 => exception lỗi chia cho 0.

Toán tử quan hệ

Toán tử quan hệ được sử dụng để so sánh giá trị. Dưới đây là bảng toán tử so sánh dùng trong Python

+--------+-----------------------------+
| Symbol | Toán tử                     |
+--------+-----------------------------+
| >      | So sánh lớn hơn             |
+--------+-----------------------------+
| >=     | So sánh lớn hơn hoặc bằng   |
+--------+-----------------------------+
| <      | So sanh nhỏ hơn             |
+--------+-----------------------------+
| <=     | So sánh nhỏ hơn hoặc bằng   |
+--------+-----------------------------+
| ==     | So sánh bằng                |
+--------+-----------------------------+
| !=     | So sánh không bằng          |
+--------+-----------------------------+
| is     | Nhận dạng object            |
+--------+-----------------------------+
| is not | Nhận dạng không phải object |
+--------+-----------------------------+
>>> 3 < 4
True
>>> 4 == 3
False
>>> 4 >= 3
True

Toán tử quan hệ trả về True hoặc False.
Toán tử quan hệ không chỉ được sử dụng cho number, có thể sử dụng để so sánh object.

>>> "six" == "six"
True
>>> 'a' < 'b'
True
>>> 'a' > 6
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unorderable types: str() > int()

Không thể so sánh 2 kiểu dữ liệu khác nhau => gây ra lỗi TypeError

Ví dụ 7: So sánh 2 kí tự

print('a' < 'b')

print("a is:", ord('a'))
print("b is:", ord('b'))

Bản chất việc so sánh 2 kí tự ‘a’ và ‘b’ là việc so sánh 2 mã ASCII của kí tự ‘a’ và ‘b’
‘a’ < 'b' <=> 97 < 98 Kết quả: [code] C:\Python34>python.exe test.py True a is: 97 b is: 98 [/code] Ví dụ 8: So sánh 2 string

>>> "ab" > "aa"
True

String là 1 chuỗi kí tự.
Việc so sánh string, bắt đầu so sánh 2 kí tự đầu tiên => nếu 2 kí tự đầu tiên bằng nhau => so sánh kí tự kế tiếp.

Toán tử nhận dạng object

Xem ví dụ sau để hiểu về cách sử dụng
Ví dụ 9: Sử dụng toán tử is nhận dạng object

print(None == None)
print(None is None)

print(True is True)

print([] == [])
print([] is [])

print("Python" is "Python")

Toán tử == là toán tử so sánh giống nhau, còn toán tử is là toán tử nhận dạng object, kiểm tra xem có cùng 1 object không. Chú ý là nhiều biến có thể refer đến cùng một object.

Kết quả:

C:\Python34>python.exe test.py
True
True
True
True
False
True

Kết quả trên có thể bất ngờ cho bạn. Trong ngôn ngữ Python, chỉ có duy nhất 1 object None và True. Đó là lý do tại sao mà True bằng và giống hệt True. List rỗng [] bằng với một list rỗng khác. Nhưng chúng không giống hệt nhau. Python allocate chúng vào 2 địa chỉ memory khác nhau. Chúng là 2 object riêng biệt. Do vậy toán tử trả về False.
Mặt khác, “Python” is “Python” trả về True. Đây là lí do optimization: nếu 2 hằng string giống nhau, chúng được đặt cùng địa chỉ memory.

Toán tử membership

Toán tử in hoặc not in được dùng để kiểm tra giá trị có tồn tại trong string, list, tuple hay không.

Ví dụ 10: Sử dụng toán tử in để kiểm tra phần tử có thuộc tuple hay không

items = ("coin", "book", "pencil", "spoon", "paper")

if "coin" in items:
    print("There is a coin in the tuple")
else:
    print("There is no coin in the tuple")

if "bowl" not in items:
    print("There is no bowl in the tuple")
else:
    print("There is a bowl in the tuple")
if "coin" in items:

Sử dụng toán tử in để kiểm tra “coin” có tồn tại trong tuple items hay không

if "bowl" not in items:

Sử dụng toán tử in để kiểm tra “bowl” có tồn tại trong tuple items hay không

Kết quả:

C:\Python34>python.exe test.py
There is a coin in the tuple
There is no bowl in the tuple

ternary operator

ternary operator (Toán tử bậc ba) là một câu lệnh gán có điều kiện ngắn gọn đơn giản.
Cú pháp

exp1 if condition else exp2

Nếu biểu thức if condition là True, exp1 được thực hiện và trả về kết quả
Nếu biểu thức if condition là False, exp2 được thực hiện và trả về kết quả

Ví dụ 11: Sử dụng toán tử ternary

age = 31

adult = True if age >= 18 else False

print("Adult: {0}".format(adult))
adult = True if age >= 18 else False

Nếu age > 18, True được gán cho biến adult.
Nếu age < 18, False được gán cho biến adult. Kết quả: [code] C:\Python34>python.exe test.py Adult: True [/code]

Toán tử bitwise

Số thập phân là tự nhiên đối với con người. Số nhị phân có nguồn gốc từ máy tính. Toán tử bitwise làm việc với bit của số nhị phân. Chúng ta có toán tử logic và dịch bit. Các toán tử bitwise thường rất ít dùng trong ngôn ngữ bậc cao như Python.
Dưới đây là bảng các toán tử bitwise trong Python

+--------+--------------------+
| Symbol | Toán tử            |
+--------+--------------------+
| ~      | Đảo bit            |
+--------+--------------------+
| ^      | XOR bit            |
+--------+--------------------+
| &      | AND bit            |
+--------+--------------------+
| |      | OR bit             |
+--------+--------------------+
| <<     | Dịch bit sang trái |
+--------+--------------------+
| >>     | Dịch bit sang phải |
+--------+--------------------+

Toán tử đảo bit: 0 -> 1, 1 -> 0

>>> ~7
-8
>>> ~-8
7

Toán tử ~ revert tất cả các bit của số 7
7(hệ 10) = 0111(hệ nhị phân) => ~0111(hệ nhị phân) = 111…11000(hệ nhị phân – 32 bits) = -8
Gọi lại toán tử: ~-8 = 7

Toán tử & (AND bit) thực hiện so sánh từng bit của 2 số. Kết quả là 1 nếu cả 2 bit đều là 1.

     00110
  &  00011
   = 00010

Số đầu tiên là hệ nhị phân của 6 (cơ số 10), số thứ 2 là hệ nhị phần của 3 (cơ số 10)

>>> 6 & 3
2
>>> 3 & 6
2

Toán tử | (OR bit) thực hiện so sánh từng bit của 2 số. Kết quả là 1 nếu 1 trong 2 bit là 1.

     00110
  |  00011
   = 00111

Kết quả là 7

>>> 6 | 3
7

Toán tử ^ (XOR bit) thực hiện so sánh từng bit của 2 số. Kết quả là 1 nếu chỉ 1 bit là 1.

     00110
  ^  00011
   = 00101

Kết quả là 5

>>> 6 ^ 3
5

Như đã nói ở trên, toán tử bitwise rất ít sử dụng trong Python và các ngôn ngữ bậc cao. Tuy nhiên, có một vài trường hợp có sử dụng toán tử bitwise. Một ví dụ điển hình là mask. Mask là mẫu các bit, được dùng để quyết định xem các thuộc tính được set hoặc không set.
Cùng xem ví dụ về GUI dưới đây
Ví dụ 12:

import wx

app = wx.App()
window = wx.Frame(None, style=wx.MAXIMIZE_BOX | wx.RESIZE_BORDER 
	| wx.SYSTEM_MENU | wx.CAPTION |	 wx.CLOSE_BOX)
window.Show(True)

app.MainLoop()

Đây là ví dụ nhỏ của wxPython code. wx.MAXIMIZE_BOX, wx.RESIZE_BORDER, wx.SYSTEM_MENU, wx.CAPTION, and wx.CLOSE_BOX là các hằng số. Toán tử OR bit thêm tất cả các hằng số vào mask. Trong trường hợp này, tất cả các thuôc tính đều được set.

Cuối cùng là toán tử dịch bit
Dịch trái: number << n : number * 2 mũ n Dịch phải: number >> n : number / 2 mũ n

Dịch phải 1 bit

>>> 6 >> 1
3

Dịch trái 1 bit

>>> 6 << 1
12

Toán tử gán mở rộng

Toán tử gán mở rộng bao gồm 2 toán tử

>>> i = 1
>>> i = i + 1
>>> i
2
>>> i += 1
>>> i
3

Toán tử += là tổ hợp của toán tử + và =.
Ngoài ra, trong Python có các toán tử gán mở rộng như sau
-= *= /= //= %= **= &= |= ^= >>= <<=

Độ ưu tiên toán tử

Độ ưu tiên toán tử cho chúng ta biết toán tử nào được thực hiện trước trong biểu thức toán học nhiều toán tử.

Kết quả của biểu thức sau là 28 hay 40?

3 + 5 * 5

Giống như trong toán học, phép nhân có độ ưu tiên cao hơn phép cộng nên 3 + 5 * 5 = 3 + 25 = 28.

Để thay đổi thứ tự ưu tiên theo chủ ý của developer, cần sử dụng thêm dấu ngoặc tròn ().

(3 + 5) * 5

Dưới đây là bảng thứ tự ưu tiên các toán tử trong Python

unary +  -  ~
**
*  /  %
+  -
>>  <<
&
^
|
<  <=  ==  >=  >  !=  is
not
and 
or

Các toán tử trên cùng một hàng có cùng mức độ ưu tiên. Mức độ ưu tiên tăng dần từ dưới lên trên.

Ví dụ 13: thứ tự ưu tiên toán tử

print(3 + 5 * 5)
print((3 + 5) * 5)

print(2 ** 3 * 5)
print(not True or True)
print(not (True or True))

Kết quả:

C:\Python34>python.exe test.py
28
40
40
True
False

Ví dụ 14: thứ tự ưu tiên toán tử

a = 1
b = 2

if (a > 0 and b > 0):
   print("a and b are positive integers")

Toán tử and chờ 2 giá trị bool (a > 0) và (b > 0). Nếu một trong 2 biểu thức không phải là giá trị bool. Trình thông dịch sẽ báo lỗi.
Trong Python, toán tử quan hệ có độ ưu tiên cao hơn toán tử logic.

Kết quả:

C:\Users\Dell>python test.py
a and b are positive integers

Quy tắc kết hợp

Đôi khi mức độ ưu tiên của toán tử không đủ để quyết định kết quả của biểu thức. Có một quy tắc khác gọi là quy tắc kết hợp. Tính chất kết hợp quyết định thứ tự thực hiện cho các toán tử cùng độ ưu tiên

9 / 3 * 3

Theo các bạn, kết quả của biểu thức này là 9 hay 1? Phép chia, nhân đươc thực hiện từ trái sang phải. Vì vậy, biểu thức được đánh giá theo cách này: (9/3) * 3 và kết quả là 9.

Các toán tử số học, bool, quan hệ và bitwise: quy tắc kết hợp từ trái sang phải.
Toán tử gán quy tắc kết hợp là từ phải sang trái

>>> a = b = c = d = 0
>>> a, b, c, d
(0, 0, 0, 0)

Toán tử gán mở rộng: quy tắc kết hợp từ phải sang trái

>>> j = 0
>>> j *= 3 + 1
>>> j
0

Bạn có thể mong đợi kết quả là 1. Nhưng kết quả thực tế là 0. Vì tính liên kết. Biểu thức bên phải được đánh giá đầu tiên và sau đó toán tử gán ghép được thực hiện.

Be the first to comment

Leave a Reply