Contents
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.
Leave a Reply
You must be logged in to post a comment.