Daily Archives: 25/01/2016

Python – Từ khóa

Trong phần này chúng ta sẽ tìm hiểu về hệ thống từ khóa có trong Python.

Dưới đây là danh sách các từ khóa trong Python.

and       del       from      not       while
as        elif      global    or        with
assert    else      if        pass      yield
break     except    import    print
class     exec      in        raise
continue  finally   is        return 
def       for       lambda    try

Python luôn được cập nhật, danh sách các từ khóa trên có thể sẽ không giống với phiên bản bạn đang dùng


import sys
import keyword


print ("Python version: ", sys.version_info)
print ("Python keywords: ", keyword.kwlist)

Đoạn code trên sẽ in ra phiên bản Python và danh sách các từ khóa của nó.

Các từ khóa điều khiển luồng chương trình

Từ khóa while là từ khóa cơ bản để điều khiển luồng chương trình. Các câu lệnh bên trong vòng lặp while sẽ được thực thi cho đến khi điều kiện sai.


numbers = [22, 34, 12, 32, 4]
sum = 0

i = len(numbers)

while (i != 0):
   i -= 1
   sum = sum + numbers[i]

print ("The sum is: ", sum)

Đoạn code trên tính tổng của các số có trong một list. Đầu tiên chúng ta tính số lượng phần tử của list và gán vào biến i, sau đó cứ mỗi vòng lặp, chúng ta lấy phần tử thứ của list để tính tổng rồi trừ đi 1. Vòng lặp dừng lại khi = 0.

Ngoài ra chúng ta có thể dùng từ khóa break để dừng vòng lặp ngay nếu muốn.


import random

while (True):
   val = random.randint(1, 30)
   print (val,)
   if (val ==  22):
      break

Trong đoạn code trên, chúng ta cho một vòng lặp chạy, cứ mỗi lần lặp, chúng ta lấy ngẫu nhiên một số từ 1 đến 30, nếu số ngẫu nhiên là 22 thì chúng ta ngắt vòng lặp bằng từ khóa break.

14 14 30 16 16 20 23 15 17 22

Trong ví dụ tiếp theo, chúng ta sẽ sử dụng từ khóa continue. Từ khóa này có tác dụng bỏ qua lần lặp đang thực hiện dở để thực hiện lần lặp tiếp theo.


import random

num = 0

while (num < 1000):
   num = num + 1
   if (num % 2) == 0:
      continue
   print (num,)

Trong đoạn code trên, chúng ta in ra các chữ số bé hơn 1000 mà không thể chia hết cho 2.

Ví dụ tiếp theo sử dụng từ khóa if, đây là từ khóa được dùng rất nhiều trong luồng điều khiển của chương trình.


# licence.py

age = 17

if age > 18:
   print ("Driving licence issued")
else:
   print ("Driving licence not permitted")

Trong đoạn code trên, chúng ta kiểm tra xem biến age bé hơn hay lớn hơn 18 để in ra các chuỗi khác nhau.

Đi cùng với từ khóa if và từ khóa elif, từ khóa này tương đương với else if trong các ngôn ngữ khác.


name = "Luke"

if name == "Jack":
   print ("Hello Jack!")
elif name == "John":
   print ("Hello John!")
elif name == "Luke":
   print ("Hello Luke!")
else:
   print ("Hello there!")

Trong đoạn code trên, các câu lệnh if sẽ tuần tự được thực hiện cho đến khi có điều kiện đúng. Nếu không có điều kiện nào thỏa thì câu lệnh sau từ khóa else sẽ được thực hiện.

Hello Luke!

Từ khóa for được dùng để duyệt qua một danh sách các đối tượng nào đó.


lyrics = """\
Are you really here or am I dreaming
I can't tell dreams from truth 
for it's been so long since I have seen you
I can hardly remember your face anymore 
"""


for i in lyrics:
   print (i,)

Trong ví dụ trên, chúng ta có một chuỗi là lời bài hát. Chúng ta duyệt qua chuỗi đó, mỗi lần duyệt chúng ta in các chữ cái có trong chuỗi ra, dấu phẩy trong hàm print có tác dụng ngăn không cho xuống dòng.

A r e   y o u   r e a l l y   h e r e   o r   a m   I   d r e a m i n g 
I   c a n ' t   t e l l   d r e a m s   f r o m   t r u t h   
f o r   i t ' s   b e e n   s o   l o n g   s i n c e   I   h a v e   s e e n   y o u 
I   c a n   h a r d l y   r e m e m b e r   y o u r   f a c e   a n y m o r e   

Biểu thức boolean

Ở đây mình giới thiệu lại các từ khóa boolean đã được học trong bài trước là: is, or, and, và not.

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

print (True is True)

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

print ("Python" is "Python")

Toán tử == kiểm tra xem 2 đối tượng có cùng giá trị hay không. Từ khóa is kiểm tra xem 2 đối tượng có cùng bộ nhớ hay không vì trong lập trình một địa chỉ bộ nhớ có thể được tham chiếu bởi nhiều đối tượng.

True
True
True
True
False
True

Đoạn tiếp theo có thể sẽ hơi khó hiểu nhưng bạn cũng không cần đọc làm gì 😀

Sự khác nhau giữa toán tử == và từ khóa is là khi chúng được sử dụng trên các đối tượng thì toán tử == sẽ so sánh các giá trị trong khi từ khóa is sẽ so sánh địa chỉ của chúng trong bộ nhớ. Do đó trong biểu thức []==[] kết quả trả về True vì chúng đều là các list rỗng, nhưng []is[] lại cho kết quả False vì chúng là các thực thể khác nhau trong bộ nhớ. Còn đối với các đối tượng None, True thì lại khác, đây là các đối tượng đặc biệt, trong Python chúng là duy nhất, không hề có 2 đối tượng None hay True nên kết quả trả về True. Đối với trường hợp so sánh 2 string("Python" is "Python") thì do Python tự động tối ưu bộ nhớ nên những string có giá trị giống nhau sẽ được sử dụng chung bộ nhớ, kết quả trả về True.

Tiếp theo là từ khóa not, từ khóa này đảo ngược một giá trị boolean.


grades = ["A", "B", "C", "D", "E", "F"]

grade = "L"

if grade not in grades:
   print ("unknown grade")

Trong ví dụ trên, chúng ta kiểm tra xem giá trị của biến grade không thuộc list grades hay không. Từ khóa in có tác dụng kiểm tra xem một giá trị có thuộc một danh sách hay không, khi ta thêm từ khóa not vào trước thì giá trị của in bị đảo ngược.

unknown grade

Từ khóa and trả về giá trị True khi cả hai biểu thức là True.

sex = "M"
age = 26

if age < 55 and sex == "M":
   print ("a young male")

Trong ví dụ trên, nếu biến age bé hơn 55 biến sex là “M” thì in dòng chữ “a young male” ra màn hình.

a young male

Khác với từ khóa and, từ khóa or chỉ cần một biểu thức là True thì trả về True.


name = "Jack"

if ( name == "Robert" or name == "Frank" or name == "Jack" 
      or name == "George" or name == "Luke"):
   print ("This is a male")

Hai toán tử andor chỉ xét tới toán hạng thứ hai khi toán hạng thứ nhất thỏa điều kiện. Ví dụ trong toán tử and nếu toán hạng đầu tiên là false thì tự động kết quả trả về sẽ là false chứ không xét toán hạng thứ 2 nữa, còn đối với toán tử or thì nếu toán hạng đầu tiên là True thì lập tức kết quả trả về là True luôn chứ cũng không xét toán hạng thứ hai nữa.

Ví dụ.


x = 10
y = 0

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

Đoạn code trên sẽ trả về False vì y khác 10 và toán hạng thứ hai không được xét đến. Nếu không sẽ xảy ra lỗi exception vì chúng ta không thể chia một số cho 0.

Module

Các từ khóa dưới đây làm việc với module. Một module thực chất là một file chứa code Python trong đó để có thể sử dụng bất cứ lúc nào.

Đầu tiên là từ khóa import, từ khóa này được sử dụng để tích hợp module cần sử dụng vào chương trình.


import math

print (math.pi)

Trong ví dụ trên, chúng ta sử dụng từ khóa import để tích hợp module math vào chương trình của chúng ta. Sau đó chúng ta in ra hằng số pi của module này.

Từ khóa as được dùng để đổi tên module mà chúng ta muốn sử dụng thành tên mà chúng ta thích.


import random as rnd

for i in range(10):
   print (rnd.randint(1, 10),) 

Trong ví dụ trên, chúng ta import module random. Chúng ta sử dụng hàm randint() để lấy giá trị ngẫu nhiên từ 1 đến 10. Nhưng chúng ta không sử dụng cái tên random mà sử dụng tên rnd do chúng ta đặt. Tuy nhiên khi sử dụng tên mới bạn không được đổi tên file mã nguồn của bạn thành random.py hoặc rnd.py, nếu không sẽ báo lỗi.

1 2 5 10 10 8 2 9 7 2

Trong một module có rất nhiều hàm, biến, lớp… khi dùng từ khóa import mặc nhiên chúng ta được sử dụng toàn bộ mọi thứ có trong module. Nhưng nếu bạn chỉ muốn dùng một vài thứ nhất định trong module đó thì sử dụng từ khóa from.


from sys import version

print (version)

Câu lệnh from sys import version có nghĩa là chỉ sử dụng biến version trong module sys. Và khi in ra màn hình thì chúng ta không cần đưa tên module ra trước. Lúc này biến version có đặc tính y hệt như những biến thông thường.

3.5.1 (v3.5.1:37a07cee5969, Dec  6 2015, 01:38:48) [MSC v.1900 32 bit (Intel)]

Hàm

Tiếp theo chúng ta sẽ tìm hiểu các từ khóa làm việc với hàm. Từ khóa def là từ khóa bắt đầu định nghĩa hàm. Chúng ta sẽ tìm hiểu sâu hơn về hàm ở bài sau.

def root(x):
   return x * x

a = root(2)
b = root(15)

print (a, b)

Trong ví dụ trên chúng ta viết một hàm đơn giản. Hàm này tính bình phương của một số cho trước. Từ khóa return trả về giá trị của hàm và thoát hàm.

Từ khóa lambda có tác dụng tạo một hàm ẩn, hàm ẩn là hàm không dính tới một cái tên cụ thể nào. Trong các ngôn ngữ khác thì hàm này được gọi là hàm nội tuyến (inline function).


for i in (1, 2, 3, 4, 5):
   a =  lambda x: x * x
   print (a(i),)

Trong ví dụ trên, chúng ta không định nghĩa một hàm với từ khóa def mà dùng hàm ẩn.

1 4 9 16 25

Khi định nghĩa một hàm thì các biến trong hàm đó chỉ tồn tại bên trong hàm, khi kết thúc hàm chúng bị xóa khỏi bộ nhớ. Tuy nhiên nếu muốn sử dụng chúng ngoài thân hàm thi chúng ta có thể sử dụng từ khóa global.


x = 15

def function():
   global x
   x = 45

function()
print (x)
45

Exception

Tiếp theo chúng ta tìm hiểu về các từ khóa làm việc với exception. Chi tiết về exception sẽ được đề cập ở các bài sau.

Fargo
Aguirre, der Zorn Gottes
Capote
Grizzly man
Notes on a scandal

Ở trên là một file text chứa các tựa phim. Chúng ta sẽ đọc file này.


f = None

try:
   f = open('films', 'r')
   for i in f:
      print (i,)
except IOError:
   print ("Error reading file")

finally:
   if f:
       f.close()

Trong ví dụ trên, chúng ta đọc một file. Nếu không có lỗi xảy ra thì nội dung file sẽ được in ra màn hình. Nhưng đôi khi có những lỗi xảy ra trong quá trình đọc, chẳng hạn như tên file không chính xác, lúc này sẽ xuất hiện lỗi exception IOError. Từ khóa except có tác dụng “bắt” lỗi này và xử lý nó. Từ khóa finally có tác dụng thực thi các câu lệnh cho dù có lỗi hay không có lỗi xảy ra.

Trong ví dụ tiếp theo, chúng ta sẽ tìm hiểu về từ khóa raise.


class YesNoException(Exception):
   def __init__(self):
      print ('Invalid value')


answer = 'y'

if (answer != 'yes' and answer != 'no'):
   raise YesNoException
else:
   print ('Correct value')

Trong Python có rất nhiều các exception được định nghĩa sẵn, nhưng tất nhiên sẽ có trường hợp chúng ta cần các exception riêng cho chúng ta tự định nghĩa. Từ khóa raise có tác dụng “phát” exception khi cần.

Invalid value
Traceback (most recent call last):
  File "./userexception.py", line 13, in <module>
    raise YesNoException
__main__.YesNoException

Một số từ khóa khác

Từ khóa del có tác dụng xóa một đối tượng.

a = [1, 2, 3, 4]

print (a)
del a[:2]
print (a)

Trong ví dụ trên, chúng ta có một list các số nguyên. Sau đó chúng ta xóa phần tử đầu tiên trong list.

[1, 2, 3, 4]
[3, 4]

Từ khóa pass có tác dụng… không làm gì cả :D.

 def function():
     pass

Đôi khi chúng ta định nghĩa một hàm nhưng chưa muốn viết phần thân hàm mà để sau. Nhưng chúng ta không thể để thân hàm trống không được. Lúc đó chúng ta để từ khóa pass trong thân hàm.

Từ khóa assert được dùng trong quá trình debug. Thường chúng ta dùng từ khóa này để kiểm tra các trạng thái của đối tượng. Ví dụ chúng ta có một chương trình tính lương, vì lương không thể bé hơn 0 nên nếu chúng ta có thể dùng từ khóa assert để kiểm tra xem lương có lớn hơn 0 hay không. Nếu sai thì trình thông dịch sẽ báo lỗi.


salary = 3500
salary -= 3560 # a mistake was done

assert salary > 0

Đoạn code trên Ví dụ về chương trình tính lương.

Traceback (most recent call last):
  File "./salary.py", line 9, in <module>
    assert salary > 0
AssertionError

Lỗi exception AssertionError sẽ xảy ra.

Cuối cùng là từ khóa class, từ khóa class là một trong những từ khóa quan trọng nhất trong lập trình hướng đối tượng. Từ khóa này dùng để tạo những kiểu dữ liệu do người dùng định nghĩa. Chúng ta sẽ tìm hiểu về lập trình hướng đối tượng (Object Oriented Programming – OOP) trong các bài sau.

class Square:
   def __init__(self, x):
      self.a = x

   def area(self):
      print (self.a * self.a)


sq = Square(12)
sq.area()

Trong đoạn code trên. Chúng ta tạo ra lớp Square (hình vuông), bên trong lớp này chúng ta định nghĩa phương thức khởi tạo và phương thức tính diện tích hình vuông.

Python – Toán tử

Trong phần này chúng ta sẽ tìm hiểu về các toán tử có trong Python.

Toán tử ở đây là các kí tự dùng để thực thi các phép tính nào đó. Hầu hết các toán tử trong lập trình đều bắt nguồn từ các phép toán trong toán học. Chỉ khác là trong lập trình thì toán tử thao tác với dữ liệu.

Trong Python, toán tử được chia ra làm những loại sau:

  • Toán tử số học
  • Toán tử boolean
  • Toán tử quan hệ
  • Toán tử thao tác bit

Trong một biểu thức toán tử có thể có một hoặc hai toán hạng. Toán hạng là các giá trị hay các biến tham gia vào biểu thức. Toán tử sẽ xử lý các toán hạng và trả về kết quả. Ví dụ a = 1 + c, trong đó dấu = và dấu + là các toán tử, còn a, 1c là các toán hạng.

Dấu + và – trong toán tử cộng trừ có thể được dùng để làm dấu của số. Nhưng thường thì chúng ta chỉ dùng dấu – để biểu diễn số nguyên âm chứ ít ai dùng dấu + để biểu diễn số nguyên dương.

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

Toán tử gán

Toán tử gán có kí hiệu là dấu =, ý nghĩa của toán tử này là gán một giá trị cho một biến nào đó. Toán hạng nằm bên trái dấu = sẽ được gán giá trị.

>>> x = 1
>>> x
1

Trong đoạn code trên chúng ta gán x bằng 1.

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

Trong đoạn code kế tiếp thì biểu thức x = x + 1 không có ý nghĩa trong toán học. Nhưng trong lập trình thì hợp lệ. Biểu thức đó có ý nghĩa tăng giá trị của x lên 1. Ở bên phải toán tử, biểu thức x + 1 có giá trị là 2 sẽ được gán cho biến x.

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

Trong Python và hầu hết các ngôn ngữ lập trình, chúng ta có thể gán 1 giá trị cho nhiều biến cùng một lúc.

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

Đoạn code trên báo lỗi vì bạn chỉ có thể gán giá trị hoặc biến cho một biến chứ không thể gán cho một giá trị khác.

Toán tử số học

Bảng dưới đây mô tả các toán tử số học trong Python.

Kí HIỆU TÊN
+ Cộng
- Trừ
* Nhân
/ Chia
// Floor division
% Chia lấy phần dư
** Lũy thừa

Đoạn code dưới đây ví dụ về các toán tử trên.

a = 10
b = 11
c = 12

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

pow = a ** 2

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

Tất cả các toán tử này đều có trong toán học.

33 2 110 4.0
100

Kết quả trả về.

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

Đoạn code trên ví dụ rõ hơn về phép toán chia.

print (9 // 4.0)

Dòng trên ví dụ về toán tử //, đây là toán tử làm tròn xuống, ví dụ 2.25 hay 2.75 đều được làm tròn về 2.0.

print (9 % 4)

Toán tử % là phép toán lấy phần dư. Ví dụ 9 chia 4 được 2 1.

3.0
2.25
2.25
2.0
1
>>> 'return' + 'of' + 'the' + 'king'
'returnoftheking'

Trong các bài trước, chúng ta đã biết là toán tử cộng có thể được 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'

Chúng ta không thể cộng một số với một string. Kết quả sẽ cho ra một lỗi exception.

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

Nếu muốn chuyển một số sang chuỗi để nối vào một chuỗi thì chúng ta phải dùng hàm str() để chuyển.

Tuy nhiên toán tử * lại có thể dùng cho chuỗi và số.

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

Toán tử boolean

Trong Python, chúng ta có các toán tử and, or và not. Các toán tử này làm công việc mang tính logic. Chúng thường được dùng trong các câu lệnh if và while.


# andop.py

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

Đoạn code trên ví dụ về các toán tử and. Kết quả chỉ trả về True khi cả hai đều là True.

True
False
False
False

Đoạn code dưới đây ví dụ về toán tử or. Kết quả trả về True khi một trong hai toán hạng là True.

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

Toán tử not chỉ làm việc với một toán hạng. Toán tử này sẽ đảo ngược giá trị từ True thành False và ngược lại.

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

Hai toán tử andor chỉ xét tới toán hạng thứ hai khi toán hạng thứ nhất thỏa điều kiện. Ví dụ trong toán tử and nếu toán hạng đầu tiên là false thì tự động kết quả trả về sẽ là false chứ không xét toán hạng thứ 2 nữa, còn đối với toán tử or thì nếu toán hạng đầu tiên là True thì lập tức kết quả trả về là True luôn chứ cũng không xét toán hạng thứ hai nữa.

Ví dụ.

x = 10
y = 0

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

Đoạn code trên sẽ trả về False vì y khác 10 và toán hạng thứ hai không được xét đến. Nếu không sẽ xảy ra lỗi exception vì chúng ta không thể chia một số cho 0.

Toán tử quan hệ

Các toán tử quan hệ dùng để so sánh các giá trị, kết quả trả về là True hoặc False.

KÍ HIỆU Ý NGHĨA
< Bé hơn
<= Bé hơn hoặc bằng
> Lớn hơn
>= Lớn hơn hoặc bằng
== Bằng
!= or <> Không bằng (khác)
is định danh đối tượng
is not định danh không phải đối tượng

Bảng trên mô tả các toán tử quan hệ.

>>> 3 < 4 True >>> 4 == 3
False
>>> 4 >= 3
True

Chúng ta không chỉ có thể dùng các toán tử quan hệ với các số mà có thể dùng với các đối tượng khác nữa, mặc dù làm thế cũng không ý nghĩa mấy.

>>> "six" == "six"
True
>>> "a" > 6
True
>>> 'a' < 'b'
True

Chúng ta có thể so sánh hai string, hai kí tự hoặc so sánh một string với một số.

>>> 'a' < 'b'

Trong máy tính thì các kí tự này đều mang một mã số bên mình, khi so sánh hai kí tự thì thực chất máy tính so sánh hai mã số này. Mã số của các kí tự này được lưu trong các bảng mã. Mặc định là bảng mã ASCII.

print ('a' < 'b')

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

Nếu như bạn muốn biết mã số của các kí tự thì bạn có thể dùng hàm ord().

True
a is: 97
b is: 98

Như vậy trong máy tính khi so sánh hai kí tự ‘a’ và ‘b’ thực chất là so sánh hai số 97 và 98.

>>> "ab" > "aa"
True

Khi so sánh một chuỗi, các kí tự đầu tiên sẽ được so sánh với nhau, nếu chúng bằng nhau, các kí tự thứ 2, thứ 3…. sẽ lần lượt được so sánh. Thực ra chúng ta cũng ít khi so sánh hai chuỗi vì việc này cũng không có ý nghĩa mấy.

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

print (True is True)

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

print ("Python" is "Python")

Toán tử == có tác dụng kiểm tra xem hai toán hạng có bằng nhau hay không. Từ khóa is kiểm tra xem toán hạng có phải là một đối tượng kiểu nào đó hay không.

True
True
True
True
False
True

Đoạn tiếp theo có thể sẽ hơi khó hiểu nhưng bạn cũng không cần đọc làm gì 😀

Sự khác nhau giữa toán tử == và từ khóa is là khi chúng được sử dụng trên các đối tượng thì toán tử == sẽ so sánh các giá trị trong khi từ khóa is sẽ so sánh địa chỉ của chúng trong bộ nhớ. Do đó trong biểu thức []==[] kết quả trả về True vì chúng đều là các list rỗng, nhưng []is[] lại cho kết quả False vì chúng là các thực thể khác nhau trong bộ nhớ. Còn đối với các đối tượng None, True thì lại khác, đây là các đối tượng đặc biệt, trong Python chúng là duy nhất, không hề có 2 đối tượng None hay True nên kết quả trả về True. Đối với trường hợp so sánh 2 string ("Python" is "Python") thì do Python tự động tối ưu bộ nhớ nên những string có giá trị giống nhau sẽ được sử dụng chung bộ nhớ, kết quả trả về True.

Toán tử thao tác bit

Đối với loài người chúng ta thì chúng ta sử dụng bộ chữ số hệ thâp phân (tức hệ 10) gồm các chữ số từ 0 đến 9, bộ chữ số này rất tiện cho chúng ta vì mặc nhiên chúng ta có 10 ngón tay và 10 ngón chân. Đối với máy tính thì khác, máy tính chỉ dùng một bộ chữ số đơn giản là hệ nhị phân, chỉ gồm hai chữ số 0 và 1. Các toán tử thao tác bit là các phép toán thực hiện với chữ số nhị phân. Tuy nhiên trong các ngôn ngữ cấp cao như Python chúng ta cũng ít khi dùng đến chúng.

KÍ HIỆU Ý NGHĨA
~ Phép nghịch đảo
^ Phép xor
& Phép and
| Phép or
<< Phép dịch trái
>> Phép dịch phải

Phép nghịch đảo có tác dụng đổi các bit từ 0 sang 1 và ngược lại.

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

Phép nghịch đảo của số 7 là -8. Nếu chúng ta thực hiện nghịch đảo của -8 sẽ lại được 7.

Toán tử and so sánh 2 bit với nhau, kết quả là 1 nếu cả hai là 1, ngược lại thì ra 0.

     00110
  &  00011
   = 00010
>>> 6 & 3
2
>>> 3 & 6
2

Toán tử or so sánh 2 bit với nhau. Nếu một trong hai bit là 1 thì kết quả sẽ ra 1. Nếu cả 2 là 0 thì kết quả ra 0.

     00110
  |  00011
   = 00111

Kết quả của phép toán trên là 00110 hay số 7 trong hệ 10.

>>> 6 | 3
7

Phép toán xor so sánh 2 bit. Nếu cả 2 giống nhau thì ra 0, ngược lại thì ra 1.

     00110
  ^  00011
   = 00101

Kết quả trên ra 00101 hoặc 5 trong hệ 10.

>>> 6 ^ 3
5

TIếp theo là các toán tử dịch bit. Chúng ta có phép dịch bit sang trái và sang phải. Ví dụ với dãy bit 00110 khi dịch sang trái sẽ được 01100, còn dịch sang phải sẽ được 00011. Phép dịch bit sang trái còn mang ý nghĩa là nhân một số cho 2, còn dịch sang phải mang ý nghĩa chia một số cho 2.

     00110
  >>  00001
   = 00011

Trong ví dụ trên, chúng ta có 00110 là số 6 trong hệ 10, khi dịch dang phải 1 bit, chúng ta được dãy bit 00011 hay 3 trong hệ 10. Tức là chúng ta đã chia 6 cho 2 và được 3.

>>> 6 >> 1
3
     00110
  << 00001
   = 01100

Ngược lại cũng với dãy bit 00110 khi dịch trái chúng ta được 01100 tức 12 trong hệ 10. Tức là chúng ta đã nhân 6 cho 2 và được 12.

>>> 6 << 1
12

Toán tử gán bằng

Các toán tử gán bằng bao gồm 2 kí tự, thực chất chúng chỉ là cách viết tắt thôi.

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

Toán tử += là một toán tử gán bằng. Ví dụ i += 1 tương đương với i = i + 1. Cách viết này rất được hay dùng.

Dưới đây là một số toán tử gán bằng khác:

-=   *=   /=   //=   %=   **=   &=   |=   ^=   >>=   <<=

Mức độ ưu tiên của toán tử

Khi một biểu thức có nhiều toán tử, chúng sẽ được thực hiện từ các toán tử có độ ưu tiên cao hơn đến thấp hơn.

Ví dụ với biểu thức dưới đây, phép toán * sẽ được thực hiện trước rồi mới đến phép toán +.

3 + 5 * 5

Cũng giống như trong toán, chúng ta có thể tăng mức độ ưu tiên cho một toán tử bằng cặp dấu ().

(3 + 5) * 5

Các toán tử nằm trong cặp dấu () sẽ được ưu tiên thực hiện trước.

Dưới đây là danh sách các toán tử được sắp xếp theo mức độ ưu tiên từ cao xuống thấp.

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

Các toán tử nằm cùng hàng với nhau có mức độ ưu tiên bằng nhau, khi đó chúng sẽ được thực hiện từ trái qua phải.


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

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

Đoạn code trên ví dụ về mức độ ưu tiên của một số toán tử.

print (2 ** 3 * 5)

Phép lấy lũy thừa có mức độ ưu tiên cao hơn phép nhân. Do đó phép tính 2 ** 3 sẽ được thực hiện trước rồi mới nhân cho 5. Kết quả ra 40.

print (not True or True)

Trong dòng trên, toán tử not có độ ưu tiên cao hơn nên sẽ được thực hiện trước sau đó mới đến toán tử or. Kết quả ra True.

28
40
40
True
False

Các toán tử quan hệ có mức độ ưu tiên cao hơn toán tử boolean.

a = 1
b = 2

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

Trong đoạn code trên, toán tử and sẽ được thực hiện sau cùng khi 2 toán tử quan hệ đã thực hiện xong.

a and b are positive integers