Category Archives: Python

Python – File

Trong phần này chúng ta sẽ tìm hiểu về cách đọc ghi file trong Python.

Hệ thống nhập xuất chuẩn

Trong Python có 3 luồng nhập xuất là luồng input, luồng output và luồng error. Luồng input là luồng nhập, tất cả các dữ liệu đi vào chương trình đều đi qua đường này, luồng này mặc định được kết nối giữa chương trình với bàn phím. Luồng output là luồng xuất, làm nhiệm vụ đưa dữ liệu ra ngoài, mặc định gắn với màn hình console (trên Windows là cmd – Command Prompt, trên Linux là Terminal). Luồng error là luồng báo lỗi, luồng này đưa các thông báo lỗi ra ngoài, mặc định cũng gắn với màn hình console.

Luồng input

Đây là dòng dữ liệu đi vào chương trình.

import sys


print ('Enter your name: ',)

name = ''

while True:
   c = sys.stdin.read(1)
   if c == '\n':
      break
   name = name + c

print ('Your name is:', name)

Để làm việc với dòng nhập xuất thì chúng ta phải import module sys. Trong module này có đối tượng stdin với phương thức read(), phương thức này đọc các kí tự trong luồng nhập. Trong ví dụ trên, chúng ta in ra dòng chữ “Enter your name:”, sau đó cho một vòng lặp chạy, mỗi lần lặp chúng ta gọi phương thức read() trên để đọc từng kí tự vào từ luồng nhập và kiểm tra nếu kí tự vào là kí tự Enter thì thoát vòng lặp. Kí tự enter có kí hiệu là \n.

Enter your name: Jan
 Your name is: Jan

Ngoài phương thức read() ra còn có các hàm làm nhiệm vụ tương tự là input() và raw_input() .

Hàm input() in ra dòng thông báo, đọc dữ liệu vào và đánh giá  dữ liệu.

data = input('Enter expression: ')

print ('You have entered:', data)
Enter expression: 3*3
You have entered: 9

Hàm raw_input() cũng tương tự như hàm input().

Luồng output

Luồng output là luồng dữ liệu đi ra khỏi chương trình.

import sys

sys.stdout.write('Honore de Balzac, Father Goriot\n')
sys.stdout.write('Honore de Balzac, Lost Illusions\n')

Trong ví dụ trên, chúng ta in các đoạn text ra màn hình bằng phương thức write().

Honore de Balzac, Father Goriot
Honore de Balzac, Lost Illusions

Hàm print() mà chúng ta dùng lâu nay thực chất là nó gọi tới phương thức write() của đối tượng stdout.

print ('Honore de Balzac, The Splendors and Miseries of Courtesans')
print ('Honore de Balzac, Gobseck')

Chuyển hướng luồng nhập xuất vào file

Như đã nói ở đầu bài, luồng nhập xuất mặc định được gắn với màn hình và bàn phím. Tuy nhiên chúng ta có thể chuyển hướng chúng để làm việc với file.

import sys


f = open('output.txt', 'w')
sys.stdout = f

print ('Lucien')
sys.stdout.write('Rastignac\n')
sys.stdout.writelines(['Camusot\n', 'Collin\n'])

sys.stdout = sys.__stdout__

print ('Bianchon')
sys.stdout.write('Lambert\n')

Trong đoạn code trên, chúng ta chuyển hướng stdout từ màn hình sang file.

Bianchon
Lambert
Lucien 
Rastignac 
Camusot 
Collin

Hàm open

Hàm open() được dùng để mở file trong hệ thống.

open(filename, [mode='r'], [bufsize])

Hàm này nhận ba tham số đầu vào, tham số thứ nhất là tên file, tham số thứ 2 là chế độ mở, tham số thứ 3 là kích thước bộ đệm. Chế độ mở file ở đây chỉ định cách mà file được mở. Có các chế độ như mở để đọc, ghi, ghi đè… Tham số bộ đệm là tham số tùy chọn, tức là bạn không cần đưa tham số này vào, nhưng thường thì bạn cũng không cần quan tâm đến tham số này làm gì.

Dưới đây là danh sách các chế độ mở file:

Mode Meaning
r Đọc dữ liệu kiểu text
rb Đọc dữ liệu kiểu nhị phân
w Ghi dữ liệu kiểu text
wb Ghi dữ liệu nhị phân
a Ghi thêm vào cuối file
+ Ghi đè

Đoạn code đưới dây đọc nội dung một file.

f = open('ifyouwantme', 'r')

for line in f:
   print (line,)

f.close()

Chúng ta mở file ở chế độ đọc. Sau đó duyệt qua toàn bộ nội dung file bằng vòng lặp for. Cuối cùng chúng ta đóng file này lại.

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 

When I get really lonely
and the distance causes our silence
I think of you smiling 
with pride in your eyes a lover that sighs 

...

Trong ví dụ dưới đây, chúng ta cũng đọc file nhưng dùng phương thức readline().

f = open('ifyouwantme', 'r')

while True:
   line = f.readline()
   if not line: break
   else: print (line,)

f.close()

Ngoài ra chúng ta có phương thức readlines() (có thêm chữ s sau readline), phương thức này sử dụng đơn giản vì mỗi lần gọi, phương thức này đọc toàn bộ nội dung file vào bộ nhớ, cũng vì thế nên chúng ta nên hạn chế sử dụng phương thức này với các file có kích thước lớn.

f = open('ifyouwantme', 'r')

contents = f.readlines()

for i in contents:
   print (i,)

f.close()

Trong ví dụ tiếp theo, chúng ta sẽ ghi nội dung vào file.


text = """Incompatible, it don't matter though
'cos someone's bound to hear my cry
Speak out if you do
You're not easy to find\n"""


f = open('strophe.txt', 'w')
f.write(text)

f.close()

Để ghi file thì chỉ đơn giản là mở file ở chế độ w, sau đó dùng phương thức write() để ghi, nếu file đã tồn tại thì nội dung file sẽ bị ghi đè.

Incompatible, it don't matter though
'cos someone's bound to hear my cry
Speak out if you do
You're not easy to find

Module pickle

Bây giờ chúng ta sẽ đọc và ghi file theo kiểu dữ liệu nhị phân, ví dụ về các dạng dữ liệu nhị phân là hình ảnh, nhạc, phim… ngay cả các đoạn text thông thường cũng có cách để ghi theo kiểu nhị phân. Trong ví dụ dưới đây, chúng ta sẽ ghi dữ liệu của một đối tượng vào file. Để ghi dữ liệu dạng nhị phân thì chúng ta dùng tới module pickle. Khi ghi lên file, pickle sẽ chuyển các đoạn text thành các dạng kí hiệu, khi đọc, nó sẽ chuyển ngược lại về text cho chúng ta.


import pickle

class Person:
   def __init__(self, name, age):
      self.name = name
      self.age = age

   def getName(self):
      return self.name

   def getAge(self):
      return self.age


person = Person('Monica', 15)
print (person.getName())
print (person.getAge())

f = open('monica', 'wb')
pickle.dump(person, f)
f.close()

f = open('monica', 'r')
monica = pickle.load(f)
f.close()

print (monica.getName())
print (monica.getAge())

Trong đoạn code trên, chúng ta định nghĩa lớp Person và tạo một đối tượng với lớp này. Sau đó chúng ta ghi dữ liệu của đối tượng này vao file bằng phương thức dump(). Để đọc dữ liệu nhị phân thì chúng ta dùng phương thức load().

Monica
15
Monica
15
monica: ASCII text

 

Python – Hàm

Trong phần này chúng ta sẽ tìm hiểu về hàm trong Python.

Hàm là một đoạn lệnh trong một chương trình thực hiện một công việc nào đó. Việc dùng hàm có các lợi ích sau:

  • Giảm khối lượng mã nguồn
  • Dễ quản lý do chương trình được chia thành nhiều phần nhỏ
  • Mã nguồn trở nên sáng sủa
  • Tái sử dụng lại mã nguồn
  • Che giấu thông tin

Trong Python một hàm cũng tương đương với một đối tượng. Giá trị của hàm có thể được gán vào biến, lưu vào trong danh sách hoặc được dùng để làm tham số của các hàm khác… làm cho ngôn ngữ lập trình trở nên tinh xảo hơn.

Có hai loại hàm, thứ nhất là các hàm có sẵn ví dụ như dir(), len(), abs()… thứ hai là các hàm do chúng ta tạo ra, để tạo ra một hàm (hay còn còn là định nghĩa một hàm) thì chúng ta dùng từ khóa def.

Định nghĩa một hàm

Chúng ta định nghĩa một hàm bằng từ khóa def, phần code bên trong hàm phải thụt lùi vào.

def function():
    pass

Sau từ khóa def là tên hàm với cặp dấu ngoặc tròn () và dấu hai chấm. Bên dưới chúng ta thụt lùi vô để viết các đoạn code, phần này là phần thân hàm.

Hàm sau khi được định nghĩa xong sẽ được thực thi khi cần thiết. Trong lập trình thì chúng ta dùng từ “gọi hàm” để chỉ việc sử dụng hàm đó. Chỉ khi chúng ta gọi hàm, đoạn code bên trong thân hàm mới được thực hiện.

myfunc()

Để gọi một hàm thì chỉ đơn giản là ghi lại tên hàm đó cùng với cặp dấu ngoặc tròn ().

"""
The test.py script shows how to work with
functions in Python. 
author: PhoCode, 2016
"""

def showModuleName(): 
    print (__doc__ )

def getModuleFile(): 
    return __file__

a = showModuleName() 
b = getModuleFile() 

print (a, b)

Trong ví dụ trên, ở phần đầu chúng ta có một string giới thiệu về đoạn code trong file, đoạn string này có tác dụng giống như lời giới thiệu, mô tả về chương trình vậy. File chứa đoạn code này được gọi là module. Trong đoạn code trên, chúng ta định nghĩa hai hàm, hàm đầu tiên in ra nội dung của biến __doc__, hàm thứ hai trả về giá trị của biến __file__. Một hàm có thể có hoặc không có giá trị trả về. Nếu chúng ta không trả về một thứ gì thì mặc định Python sẽ ngầm trả về None. Hai biến __doc__ và __file__ là hai biến đặc biệt trong Python.


The test.py script shows how to work with
functions in Python. 
author: PhoCode, 2016

None C:\Users\PhoCode\test.py

Như đã nói ở trên, phần thân hàm phải viết lùi vào trong, nếu không sẽ có lỗi.


def f1():
    print ("f1()")
    
f1()
#f2()

def f2():
    print ("f2()")

Trong ví dụ trên, chúng ta định nghĩa hai hàm và gọi hai hàm đó. Nhưng một câu lệnh gọi hàm đã bị đánh dấu là chú thích vì nó được gọi trước phần định nghĩa hàm, một hàm luôn luôn phải được định nghĩa trước khi được gọi, tức là phải viết phần định nghĩa trước rồi mới đến câu lệnh gọi.

#f2()

def f2():
    print ("f2()")

Nếu muốn gọi hàm f2() thì bạn phải để câu lệnh f2() sau phần định nghĩa hàm. Nếu không sẽ báo lỗi.

Vị trí của hàm

Một hàm có thể được định nghĩa bên trong một module, một lớp hoặc bên trong một hàm khác. Hàm được định nghĩa bên trong một lớp được gọi là phương thức.


class Some:

    @staticmethod  
    def f():
        print ("f() method")

def f():
    print ("f() function")
    
def g():
    def f():
        print ("f() inner function")
    f()        
        
Some.f()
f()
g()

Trong ví dụ trên, chúng ta định nghĩa hàm ở những vị trí khác nhau.

class Some:

    @staticmethod  
    def f():
        print ("f() method")

Đoạn code trên định nghĩa một phương thức tĩnh với nhờ vào chỉ thị @staticmethod trong lớp Some.

def f():
    print ("f() function")

Đoạn code trên định nghĩa một hàm bình thường.

def g():
    def f():
        print ("f() inner function")
    f()   

Đoạn code trên định nghĩa hàm f() bên trong hàm g(), hàm được định nghĩa bên trong một hàm khác được gọi là hàm nội (inner function).

Some.f()
f()
g() 

Chúng ta gọi phương thức tĩnh bằng cách ghi tên lớp, sau đó là dấu chấm và tên phương thức cùng với cặp dấu ngoặc tròn (). Các hàm bình thường được gọi bằng cách ghi tên hàm với cặp dấu ngoặc tròn ().

f() method
f() function
f() inner function

Đối tượng hàm

Bản chất của hàm trong Python là các đối tượng. Chúng được xử lý như các đối tượng tạo ra từ các lớp.


def f():
    """This function prints a message """
    print ("Today it is a cloudy day")
    
print (isinstance(f, object))
print (id(f))
    
print (f.__doc__)
print (f.__name__)

Đoạn code trên kiểm tra tính đối tượng của hàm.

def f():
    """This function prints a message """
    print ("Today it is a cloudy day")

Đoạn code trên định nghĩa hàm f(). Hàm này in một string là màn hình. Ngoài ra hàm này còn có một đoạn string giới thiệu ở đầu nữa.

print (isinstance(f, object))

Hàm isinstance() có tác dụng kiểm tra xem hàm f() có phải là một đối tượng của lớp object hay không. Lớp object là lớp cơ sở, mọi lớp trong Python đều kế thừa từ lớp này.

print (id(f))

Mỗi đối tượng trong Python đều có một id. Hàm id() trả về id của đối tượng đó.

print (f.__doc__)
print (f.__name__)

Tất cả các đối tượng đều chứa biến bên trong nó, biến trong đối tượng được gọi là các thuộc tính. Hai thuộc tính __doc____name__ là hai thuộc tính có sẵn có các đối tượng trong Python.

True
3077407212
This function prints a message 
f

Các đối tượng có thể được lưu trữ trong các danh sách hoặc làm tham số cho các hàm khác.


def f():
    pass

def g():
    pass
  
def h(f):
    print (id(f))
  
a = (f, g, h)

for i in a:
    print (i)
    
h(f)
h(g)

Ở trên chúng ta định nghĩa 3 hàm. Sau đó chúng ta lưu chúng trong một tuple và đưa vào tham số của một hàm.

a = (f, g, h)

for i in a:
    print (i)

Trong đoạn code trên, chúng ta đưa 3 đối tượng vào một tuple và duyệt tuple đó.

h(f)
h(g)

Hai dòng trên chúng ta đưa hàm f() và g() làm tham số của hàm h().

<function f at 0xb7664fb4>
<function g at 0xb766c1b4>
<function h at 0xb766c3ac>
3076935604
3076964788

Từ khóa return

Hàm được tạo ra để thực hiện các công việc nào đó. Thường thì các công việc này phải có một kết quả nào đó. Ví dụ bạn viết một hàm làm công việc là tính tổng của một dãy số, sau khi khai báo tên hàm, bạn khai báo biến để lưu giá trị tổng rồi duyệt qua một danh sách cho trước để tính tổng rồi lưu vào biến tổng đó, nhưng khi kết thúc hàm thì biến tính tổng đó bị xóa, bạn chẳng thể nào lấy được biến tổng ở ngoài hàm đó nữa. Lúc này bạn cần dùng đến từ khóa return, từ khóa return có tác dụng “trả về” một giá trị của một hàm. Một hàm có thể có hoặc không có từ khóa return, nếu không có thì Python mặc định ngầm trả về một đối tượng None.


def showMessage(msg):
    print (msg)

def cube(x):
    return x * x * x   
   
x = cube(3)    
print (x)

showMessage("Computation finished.")
print (showMessage("Ready."))

Trong đoạn code trên, chúng ta định nghĩa hai hàm. Một hàm có return, một hàm không.

def showMessage(msg):
    print (msg)

Hàm showMessage() không trả về mọt giá trị gì mà chỉ in ra một dòng string.

def cube(x):
    return x * x * x

Hàm cube() thực hiện tính lập phương của một số và trả về giá trị của phép tính này.

x = cube(3) 

Ở dòng code trên, chúng ta gọi hàm cube(). Như đã nói ở trên hàm này sẽ trả về một giá trị, chúng ta lưu lại giá trị này bằng cách gán nó cho biến x.

showMessage("Computation finished.")

Ở dòng trên chúng ta gọi hàm showMessage() có tham số đầu vào là một string. Hàm này chỉ có nhiệm vụ in đoạn string ra màn hình chứ không trả về gì cả.

print (showMessage("Ready."))

Dòng code trên in ra hai lần, vì trong hàm showMessage() đã có lệnh in ra một string. Hàm này lại được làm đối số trong một hàm print() khác, mà vì hàm này không có câu lệnh return nào nên ngầm trả về đối tượng None nên hàm print() ở ngoài sẽ in ra None.

Định nghĩa lại hàm

Trong Python bạn có thể định nghĩa lại một hàm đã được định nghĩa sẵn, mặc dù làm thế cũng không có ý nghĩa mấy và thực tế thì trong các ngôn ngữ khác bạn không được phép làm điều này.


from time import gmtime, strftime


def showMessage(msg):
    print (msg)
        
showMessage("Ready.")

def showMessage(msg):
    print (strftime("%H:%M:%S", gmtime()),)
    print (msg)
    
showMessage("Processing.")  

Trong ví dụ trên chúng ta định nghĩa hàm showMessage() hai lần.

from time import gmtime, strftime

Ở dòng trên chúng ta import hàm gmtime(), strftime() từ module time.

def showMessage(msg):
    print (msg )       

Đây là hàm showMessage() được định nghĩa lần thứ nhất.

def showMessage(msg):
    print (strftime("%H:%M:%S", gmtime()),)
    print (msg)

Đoạn code trên là phần định nghĩa hàm showMEssage() lần thứ hai. Lần này chúng ta sử dụng một số hàm lấy thời gian trong module time.

Ready.
23:49:33 Processing.

Tham số cho hàm

Ví dụ khi bạn cần một hàm làm công việc tính tổng của một dãy số, hàm đó sẽ cần biết phải tính dãy số nào chứ? Và dãy số mà bạn “đưa” cho hàm để nó làm công việc tính toán gọi là tham số. Vậy là bâu giờ bạn biết được quá trình làm việc của một hàm thông thường rồi. Ban đầu hàm nhận vào các tham số, sau đó xử lý chúng và return lại kết quả cho chúng ta.

Untitled


def C2F(c):
    return c * 9/5 + 32

print (C2F(100))
print (C2F(0))
print (C2F(30))

Trong đoạn code trên, chúng ta viết hàm chuyển đổi nhiệt độ từ Celsius sang Fahrenheit. Hàm này nhận vào tham số là nhiệt độ ở Celsius.

212
32
86

Bạn có thể đặt giá trị mặc định cho các tham số, giá trị mặc định sẽ được sử dụng nếu bạn không đưa vào một tham số nào khi gọi hàm.


def power(x, y=2):
    r = 1
    for i in range(y):
       r = r * x
    return r

print (power(3))
print (power(3, 3))
print (power(5, 5))

Ở trên chúng ta định nghĩa hàm lấy lũy thừa. Hàm này nhận hai tham số, trong đó tham số y có giá trị mặc định là 2.

9
27
3125

Truyền tham số kiểu tham chiếu

Khi bạn đưa các tham số vào một hàm, bên trong hàm sẽ tạo một biến khác và copy giá trị của tham số truyền vào vào biến mới này, và khi kết thúc hàm thì biến này sẽ bị xóa, tham số kiểu này được gọi là tham trị. Tuy nhiên bạn có thể đưa chính biến ở ngoài vào, hàm sẽ thực hiện xử lý trên biến này luôn chứ không tạo biến mới nữa, tham số kiểu này được gọi là tham chiếu. 

def f(x):
 x = "Bonjour"
 
str = "Hello"
print (str)

f(str)

print(str)

Trong ví dụ trên, chúng ta định nghĩa hàm f(), hàm này thay đổi giá trị truyền vào thành chuỗi “Bonjour”, tuy nhiên vì là truyền theo kiểu tham trị, nên khi đưa một biến vào hàm này, giá trị của biến đó cũng không thay đổi.

Hello
Hello

Mặc định các tham số có kiểu dữ liệu dạng danh sách như list, tuple, dictionary thì các tham số này là tham chiếu.


n = [1, 2, 3, 4, 5]

print ("Original list:", n)

def f(x):
    x.pop()
    x.pop()
    x.insert(0, 0)
    print ("Inside f():", x) 
    
f(n)    

print ("After function call:", n)

Trong ví dụ trên, chúng ta truyền vào hàm f() list n, sau khi hàm này xử lý xong thì list này cũng thay đổi do hàm này xử lý trên list chứ không tạo list mới.

Original list: [1, 2, 3, 4, 5]
Inside f(): [0, 1, 2, 3]
After function call: [0, 1, 2, 3]

Biến toàn cục và biến cục bộ

Tiếp theo chúng ta tìm hiểu về biến toàn cục và biến cục bộ.


name = "Jack"

def f():
   name = "Robert"
   print ("Within function", name)

print ("Outside function", name)
f()

Một biến được định nghĩa bên trong một hàm chỉ có thể nhìn thấy bên trong hàm đó và được gọi là biến cục bộ.

Outside function Jack
Within function Robert

name = "Jack"

def f():
   print ("Within function", name)

print ("Outside function", name)
f()

Các biến được định nghĩa ngoài hàm, nói chính xác hơn là không nằm trong hàm nào thì được gọi là biến toàn cục. Biến này có thể được nhìn thấy ở bất cứ đâu.

Outside function Jack
Within function Jack

Tuy nhiên bạn có thể làm cho một biến cục bộ trở thành biến toàn cục bằng từ khóa global.


name = "Jack"

def f():
   global name 
   name = "Robert"
   print ("Within function", name)


print ("Outside function", name)
f()
print ("Outside function", name)

Trong đoạn code trên, chúng ta chỉ định cho biến name bên trong hàm là biến toàn cục, tức là bay giờ biến name đó chính là biến name đã được định nghĩa ở ngoài hàm.

global name 
name = "Robert"

Ở đoạn code trên, chúng ta dùng từ khóa global để làm cho một biến cục bộ trở thành biến toàn cục.

Outside function Jack
Within function Robert
Outside function Robert

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

Python – Kiểu Dictionary

Trong phần này chúng ta sẽ tìm hiểu sâu hơn về kiểu dữ liệu Dictionary.

Kiểu dictionary là kiểu dữ liệu danh sách, trong đó các phần tử được lưu trữ theo các cặp khóa-giá trị (key-value). Các phần tử trong dictionary không có thứ tự, tức là bạn không thể truy xuất chúng qua chỉ số mà chỉ dùng khóa, ngoài ra vì không có thứ tự nên Python cũng không có sẵn các hàm sắp xếp như hàm sort(), tuy nhiên nếu muốn bạn vẫn có thể tự code lấy hàm sort cho riêng mình. Trong các ngôn ngữ khác thì kiểu dictionary hay được gọi là bảng băm. Trong dictionary không có 2 khóa trùng nhau.

Khởi tạo dictionary

Đầu tiên chúng ta sẽ tìm hiểu cách khởi tạo một dictionary.


weekend = { "Sun": "Sunday", "Mon": "Monday" }
vals = dict(one=1, two=2)

capitals = {}
capitals["svk"] = "Bratislava"
capitals["deu"] = "Berlin"
capitals["dnk"] = "Copenhagen"

d = { i: object() for i in range(4) }

print (weekend)
print (vals)
print (capitals)
print (d)

Đoạn code trên ví dụ về 4 cách để khởi tạo 1 dictionary trong Python.

weekend = { "Sun": "Sunday", "Mon": "Monday" }

Cách đầu tiên và cũng là cách đơn giản nhất. Chúng ta tạo dictionary bằng cách gán dữ liệu trực tiếp. Dictionary được bao bọc bởi cặp dấu ngoặc nhọn {}. Trong đó mỗi phần tử được gán giá trị theo cú pháp key1:value1, key2:value2…, các phần tử phân cách nhau bởi dấu phẩy.

vals = dict(one=1, two=2)

Cách thứ 2 là chúng ta dùng hàm dict().

capitals = {}
capitals["svk"] = "Bratislava"
capitals["deu"] = "Berlin"
capitals["dnk"] = "Copenhagen"

Trên đây là cách thứ 3, đầu tiên chúng ta khởi tạo dict rỗng bằng cặp dấu {}. Sau đó khởi tạo các khóa và gán giá trị, các khóa được tạo trong cặp dấu ngoặc vuông [].

d = { i: object() for i in range(4) }

Cũng giống như kiểu list, dictionary cũng có thể được khởi tạo theo cú pháp comprehension. Cú pháp này có 2 phần, phần đầu tiên là phần biểu thức i: object(), phần thứ 2 là vòng lặp for i in range(4). Tức là cứ mỗi lần lặp, giá trị từ biểu thức sẽ được thêm vào dictionary. Hàm object() khởi tạo một đối tượng kiểu object. Đối tượng này không có giá trị, do đó khi in ra màn hình python sẽ in thông tin về địa chỉ bộ nhớ.

{'Sun': 'Sunday', 'Mon': 'Monday'}
{'two': 2, 'one': 1}
{'svk': 'Bratislava', 'dnk': 'Copenhagen', 'deu': 'Berlin'}
{0: <object object at 0xb76cb4a8>, 1: <object object at 0xb76cb4b0>, 
2: <object object at 0xb76cb4b8>, 3: <object object at 0xb76cb4c0>}

Các phép toán cơ bản

Tiếp theo chúng ta sẽ tìm hiểu về các phép toán cơ bản với dictionary.


basket = { 'oranges': 12, 'pears': 5, 'apples': 4 }

basket['bananas'] = 5

print (basket)
print ("There are %d various items in the basket" % len(basket))

print (basket['apples'])
basket['apples'] = 8
print (basket['apples'])

print (basket.get('oranges', 'undefined'))
print (basket.get('cherries', 'undefined'))

Trong ví dụ trên chúng ta có một dictionary và chúng ta sẽ thực hiện một số phép toán với dict này.

basket = { 'oranges': 12, 'pears': 5, 'apples': 4 }

Đầu tiên chúng ta tạo dict với 3 cặp khóa-giá trị.

basket['bananas'] = 5

Tiếp theo chúng ta tạo thêm 1 cặp khóa-giá trị nữa. Ở đây khóa là bananas còn giá trị là 5.

print ("There are %d various items in the basket" % len(basket))

Chúng ta dùng hàm len() để đếm số lượng các cặp khóa-giá trị.

print (basket['apples'])

Tiếp theo chúng ta in ra màn hình giá trị của khóa apples.

basket['apples'] = 8

Dòng trên thay đổi giá trị của khóa apples thành 8.

print (basket.get('oranges', 'undefined'))

Phương thức get() trả về giá trị của khóa oranges, nếu không có khóa nào có tên như thế thì trả về dòng chữ undefined.

print (basket.get('cherries', 'undefined'))

Dòng trên sẽ trả về undefined vì không có khóa nào tên là cherries.

{'bananas': 5, 'pears': 5, 'oranges': 12, 'apples': 4}
There are 4 various items in the basket
4
8
12
undefined

Tiếp theo chúng ta tìm hiểu về 2 phương thức fromkeys() và setdefault().


basket = ('oranges', 'pears', 'apples', 'bananas')

fruits = {}.fromkeys(basket, 0)
print (fruits)

fruits['oranges'] = 12
fruits['pears'] = 8
fruits['apples'] = 4

print (fruits.setdefault('oranges', 11))
print (fruits.setdefault('kiwis', 11))

print (fruits)

Phương thức fromkeys() tạo một dictionary từ một list, còn phương thức setdefault() trả về giá trị của một khóa, nếu khóa đó không tồn tại thì nó tự động thêm một khóa mới với giá trị mặc định do chúng ta chỉ định.

basket = ('oranges', 'pears', 'apples', 'bananas')

Đầu tiên chúng ta tạo một list các string.

fruits = {}.fromkeys(basket, 0)

Tiếp theo chúng ta dùng phương thức fromkeys() để tạo dictionary từ list trên, trong đó các khóa sẽ là các phần tử của list, còn các giá trị sẽ được gán mặc định là 0. Lưu ý phương thức fromkeys là phương thức của một lớp nên cần được gọi từ tên lớp, trong trường hợp này là {}.

fruits['oranges'] = 12
fruits['pears'] = 8
fruits['apples'] = 4

Ba dòng trên thay đổi giá trị của các khóa trong dict.

print (fruits.setdefault('oranges', 11))
print (fruits.setdefault('kiwis', 11))

Ở 2 dòng trên, dòng đầu tiên sẽ in số 12 ra màn hình vì oranges là khóa đã tồn tại trong dict, dòng thứ 2 sẽ in số 11 ra màn hình vì khóa kiwis chưa tồn tại nên sẽ được tự động thêm vào dict với giá trị mặc định là 11.

{'bananas': 0, 'pears': 0, 'oranges': 0, 'apples': 0}
12
11
{'kiwis': 11, 'bananas': 0, 'pears': 8, 'oranges': 12, 'apples': 4}

Trong ví dụ tiếp theo, chúng ta sẽ tìm hiểu cách nối 2 dictionary với nhau.


domains = { "de": "Germany", "sk": "Slovakia", "hu": "Hungary"}
domains2 = { "us": "United States", "no": "Norway" }

domains.update(domains2)

print (domains)

Để nối 2 dictionary thì chúng ta dùng phương thức update().

domains.update(domains2)

Chúng ta nối domains2 vào domains.

{'sk': 'Slovakia', 'de': 'Germany', 'no': 'Norway', 
'us': 'United States', 'hu': 'Hungary'}

Tiếp theo chúng ta học cách xóa một phần tử ra khỏi dictionary.


items = { "coins": 7, "pens": 3, "cups": 2, 
    "bags": 1, "bottles": 4, "books": 5 }

print (items) 

items.pop("coins")
print (items)

del items["bottles"]
print (items)

items.clear()
print (items)

Trong ví dụ trên, chúng ta có 6 cặp khóa-giá trị, chúng ta sẽ xóa chúng ra khỏi items.

items.pop("coins")

Đầu tiên là phương thức pop(), phương thức này xóa một phần tử trong dictionary theo khóa.

del items["bottles"]

Cách thứ 2 là dùng từ khóa del, dòng code trên sẽ xóa phần tử có khóa bottles ra khỏi dict bằng từ khóa del.

items.clear()

Tiếp theo phương thức clear() có tác dụng xóa toàn bộ phần tử ra khỏi dictionary.

{'bags': 1, 'pens': 3, 'coins': 7, 'books': 5, 'bottles': 4, 'cups': 2}
{'bags': 1, 'pens': 3, 'books': 5, 'bottles': 4, 'cups': 2}
{'bags': 1, 'pens': 3, 'books': 5, 'cups': 2}
{}

Làm việc với khóa và giá trị

Trong phần này chúng ta sẽ tìm hiểu phương thức keys(), values() và items(), phương thức keys() trả về list các khóa có trong dict, phương thức values() trả về list các giá trị, còn phương thức items() trả về list các tuple, trong đó mỗi tuple có 2 phần tử, phần tử đầu tiên là khóa, phần tử thứ 2 là giá trị.

domains = { "de": "Germany", "sk": "Slovakia", "hu": "Hungary",
    "us": "United States", "no": "Norway"  }

print (domains.keys())
print (domains.values())
print (domains.items())

print ("de" in domains)
print ("cz" in domains)

Đoạn code trên ví dụ về cách sử dụng các phương thức đã trình bày ở trên, ngoài ra chúng ta còn dùng thêm từ khóa in.

print (domains.keys())

Dòng trên trả về một list các khóa trong dict bằng phương thức keys().

print (domains.values())

Dòng tiếp theo trả về một list các giá trị trong dict bằng phương thức values().

print (domains.items())

Cuối cùng phương thức items() trả về list các tuple, mỗi tuple chứa 2 phần tử là khóa và giá trị trong dict.

print ("de" in domains)
print ("cz" in domains)

Từ khóa in có tác dụng kiểm tra xem một giá trị nào đó có tồn tại trong dict hay không. Giá trị trả về True hoặc False.

['sk', 'de', 'no', 'us', 'hu']
['Slovakia', 'Germany', 'Norway', 'United States', 'Hungary']
[('sk', 'Slovakia'), ('de', 'Germany'), ('no', 'Norway'), 
('us', 'United States'), ('hu', 'Hungary')]
True
False

Duyệt dictionary

Trong phần này chúng ta sẽ tìm hiểu cách duyệt một dictionary bằng vòng lặp for.


domains = { "de": "Germany", "sk": "Slovakia", "hu": "Hungary",
    "us": "United States", "no": "Norway"  }

for key in domains:
    print (key)
    
for k in domains:
    print (domains[k])
    
for k, v in domains.items():
    print (": ".join((k, v)))

Trong ví dụ trên, chúng ta duyệt 3 lần, mỗi lần duyệt chúng ta lấy khóa, giá trị và cả khóa lẫn giá trị.

for key in domains:
    print (key)

Vòng lặp trên sẽ in ra danh sách các khóa trong dict.

for k in domains:
    print (domains[k])

Vòng lặp trên in ra danh sách cấc giá trị trong list.

for k, v in domains.items():
    print (": ".join((k, v)))

Vòng lặp cuối cùng in ra cả khóa và giá trị.

sk
de
no
us
hu
Slovakia
Germany
Norway
United States
Hungary
sk: Slovakia
de: Germany
no: Norway
us: United States
hu: Hungary

Python – Kiểu List

Bên cạnh String, list cũng là một kiểu dữ liệu quan trọng và trong phần này chúng ta sẽ tìm hiểu sâu hơn về list.

List là một danh sách các phần tử, các phần tử trong một list có thể có nhiều kiểu dữ liệu khác nhau. Các phần tử trong list được lưu trữ theo thứ tự. Giá trị của các phần tử có thể giống nhau.

Các phần tử trong list có thể được truy xuất thông qua chỉ số. Cũng như các kiểu tập hợp khác, chỉ số trong list được đánh số từ 0.


nums = [1, 2, 3, 4, 5]
print (nums)

Trong ví dụ trên, chúng ta có một list có 5 phần tử. List được khởi tạo trong cặp dấu []Các phần tử của list được phân cách bởi dấu phẩy.

[1, 2, 3, 4, 5]

Các phần tử trong một list có thể mang nhiều kiểu dữ liệu khác nhau.


class Being:
    pass

objects = [1, -2, 3.4, None, False, [1, 2], "Python", (2, 3), Being(), {}]
print (objects)

Ví dụ trên tạo ra một list có nhiều kiểu dữ liệu khác nhau, bao gồm kiểu số nguyên, kiểu bool, một string, một tuple, một kiểu từ điển và nguyên cả một list khác.

[1, -2, 3.4, None, False, [1, 2], 'Python', (2, 3), <__main__.Being instance at 0xb76a186c>, {}]

Khởi tạo list

Cách khởi tạo ở trên là cách khởi tạo bằng cách đưa giá trị trực tiếp, ngoài ra bạn có thể khởi tạo mà không cần biết giá trị cụ thể:


n1 = [0 for i in range(15)]
n2 = [0] * 15

print (n1)
print (n2)

n1[0:11] = [10] * 10

print (n1)

Ví dụ trên mô tả hai cách khởi tạo một list. Cách đầu tiên dùng vòng lặp for với cú pháp comprehension bên trong cặp dấu [], cách thứ hai là dùng toán tử *.

n1 = [0 for i in range(15)]
n2 = [0] * 15

Hai dòng code trên ví dụ về cách khởi tạo list dùng toán tử * và cú pháp comprehension, cú pháp comprehension sẽ được giải thích ở gần cuối bài này. Kết quả đều cho ra một list các phần tử có giá trị là 0.

n1[0:11] = [10] * 10

Dòng code trên gán 10 phần tử đầu tiên với giá trị 10.

[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0]

Hàm list()

Hàm list() có tác dụng khởi tạo một list từ một đối tượng tập hợp, có thể là 1 tuple, 1 list khác… hoặc tạo một list rỗng.


a = []
b = list()

print (a == b)

print (list((1, 2, 3)))
print (list("PhoCode"))
print (list(['Ruby', 'Python', 'Perl']))

Trong ví dụ trên, chúng ta khởi tạo một list rỗng, một list từ một string, một list từ một tuple và một list từ một list khác.

a = []
b = list()

Hai dòng trên là 2 cách để khởi tạo một list rỗng.

print (a == b)

Dòng trên sẽ cho ra kết quả True vì và bằng nhau.

print (list((1, 2, 3)))

Dòng trên tạo một list từ một tuple.

print (list("PhoCode"))

Dòng code trên tạo một list từ một string.

print (list(['Ruby', 'Python', 'Perl']))

Cuối cùng là tạo một list từ một list khác.

True
[1, 2, 3]
['Z', 'e', 't', 'C', 'o', 'd', 'e']
['Ruby', 'Python', 'Perl']

Các phép tính trên list

Đoạn code dưới đây ví dụ về các phép tính trên list.

n1 = [1, 2, 3, 4, 5]
n2 = [3, 4, 5, 6, 7]

print (n1 == n2)
print (n1 + n2)

print (n1 * 3)

print (2 in n1)
print (2 in n2)

Chúng ta khởi tạo 2 list gồm các số nguyên và thực hiện một số phép tính.

print (n1 == n2)

Dòng code trên thực hiện phép so sánh thông qua toán tử ==. Kết quả ra False vì các phần tử trong 2 list là khác nhau.

print (n1 + n2)

Toán tử + sẽ gộp hai list lại với nhau và tạo thành một list với chứa các phần tử của 2 list con.

print (n1 * 3)

Toán tử * sẽ nhân số lượng phần tử trong list lên n lần, trong trường hợp trên là 3 lần.

print (2 in n1)

Toán tử in kiểm tra xem một giá trị nào đó có tồn tại trong list hay không. Giá trị trả về là True hoặc False.

False
[1, 2, 3, 4, 5, 3, 4, 5, 6, 7]
[1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5]
True
False

Một số hàm dùng với list


n = [1, 2, 3, 4, 5, 6, 7, 8]

print ("There are %d items" % len(n))
print ("Maximum is %d" % max(n))
print ("Minimum is %d" % min(n))
print ("The sum of values is %d" % sum(n))

Đoạn code trên ví dụ về tác dụng của bốn hàm len(), max(), min(), và sum().

print ("There are %d items" % len(n))

Hàm len() lấy độ dài của một list.

print ("Maximum is %d" % max(n))
print ("Minimum is %d" % min(n))

Hàm max() và min() tìm giá trị lớn nhất và nhỏ nhất có trong list, tất nhiên là trong trường hợp các phần tử trong list phải có cùng kiểu dữ liệu, nếu không sẽ báo lỗi.

print ("The sum of values is %d" % sum(n))

Hàm sum() trả về tổng các giá trị của các phần tử trong list, chỉ có thể dùng khi list chứa các phần tử kiểu số.

There are 8 items
Maximum is 8
Minimum is 1
The sum of values is 36

Thêm phần tử mới vào list


langs = list()

langs.append("Python")
langs.append("Perl")
print (langs)

langs.insert(0, "PHP")
langs.insert(2, "Lua")
print (langs)

langs.extend(("JavaScript", "ActionScript"))
print (langs)

Có 3 phương thức để thêm một phần tử vào list, đó là các phương thức append(), insert() và extend().

langs.append("Python")
langs.append("Perl")

Phương thức append() thêm một phần tử vào cuối list.

langs.insert(0, "PHP")
langs.insert(2, "Lua")

Phương thức insert() có thể thêm phần tử vào vị trí bất kì trong list.

langs.extend(("JavaScript", "ActionScript"))

Trong khi phương thức append() chỉ thêm một phần tử vào cuối list thì phương thức extend() có thể thêm một dãy các phần tử vào cuối list.

['Python', 'Perl']
['PHP', 'Python', 'Lua', 'Perl']
['PHP', 'Python', 'Lua', 'Perl', 'JavaScript', 'ActionScript']

Lỗi IndexError, TypeError

Lỗi exception IndexError là lỗi khi chúng ta thực hiện các thao tác có sử dụng chỉ số mà chỉ số vượt ngoài phạm vi list. Loại lỗi exception sẽ được đề cập ở các bài sau.

n = [1, 2, 3, 4, 5]

try:
    n[0] = 10
    n[6] = 60    
except IndexError as e:
    (print e)

Trong ví dụ trên, chúng ta có một list có 5 phần tử, các phần tử được đánh số từ 0..4

n[6] = 60

Nếu chúng ta truy xuất phần tử vượt quá 4 thì lỗi IndexError sẽ xảy ra, trong ví dụ trên chúng ta truy xuất phần tử thứ 6.

list assignment index out of range

Một lỗi exception khác là TypeError, lỗi này xảy ra khi chỉ số chúng ta đưa vào không phải là kiểu số.


n = [1, 2, 3, 4, 5]

try:
    print (n[1])
    print (n['2']  ) 
except TypeError as e:
    print ("Error in file %s" % __file__)
    print ("Message: %s" % e)

Ví dụ trên sẽ xảy ra lỗi TypeError.

print (n['2'])

Chỉ số bắt buộc phải là kiểu số, tất cả các kiểu dữ liệu còn lại đều không hợp lệ.

2
Error in file ./typeerror.py
Message: list indices must be integers, not str

Xóa phần tử trong list


langs = ["Python", "Ruby", "Perl", "Lua", "JavaScript"]
print (langs)

langs.pop(3)
langs.pop()
print (langs)

langs.remove("Ruby")
print (langs)

Chúng ta có hai phương thức để xóa phần tử trong một list là phương thức pop() và phương thức remove(). Phương thức pop() xóa phần tử thông qua chỉ số, phương thức remove() xóa phần tử thông qua giá trị.

langs.pop(3)
langs.pop()

Ở đoạn code trên chúng ta xóa phần tử có chỉ số là 3, nếu chúng ta không đưa chỉ số vô thì  Python sẽ tự động xóa phần tử cuối cùng.

langs.remove("Ruby")

Dòng trên xóa phần tử theo giá trị, phần tử đầu tiên trong list có giá trị “Ruby” sẽ bị xóa.

['Python', 'Ruby', 'Perl', 'Lua', 'JavaScript']
['Python', 'Ruby', 'Perl']
['Python', 'Perl']

Ngoài ra chúng ta có thể xóa phần tử của list bằng từ khóa del.


langs = ["Python", "Ruby", "Perl", "Lua", "JavaScript"]
print (langs)

del langs[1]
print (langs)

#del langs[15]

del langs[:]
print (langs)

Trong ví dụ trên chúng ta có một list các string, chúng ta sẽ xóa các phần tử bằng từ khóa del.

del langs[1]

Dòng trên xóa phần tử thứ 1.

#del langs[15]

Nếu chúng ta xóa các phần tử có chỉ số vượt ngoài phạm vi của list thì lỗi IndexError sẽ xảy ra.

del langs[:]

Dòng code trên xóa toàn bộ list.

['Python', 'Ruby', 'Perl', 'Lua', 'JavaScript']
['Python', 'Perl', 'Lua', 'JavaScript']
[]

Thay đổi giá trị phần tử trong list


langs = ["Python", "Ruby", "Perl"]

langs.pop(2)
langs.insert(2, "PHP")
print (langs)

langs[2] = "Perl"
print (langs)

Đoạn code trên sửa đổi giá trị của phần tử cuối cùng trong list.

langs.pop(2)
langs.insert(2, "PHP")

Trong hai dòng code trên, chúng ta xóa phần tử cuối cùng sau đó thêm một phần tử mới vào, cách này khá rườm rà và mất thời gian.

langs[2] = "Perl"

Thay vào đó bạn chỉ đơn giản là gán cho phần tử đó một giá trị mới là được.

['Python', 'Ruby', 'PHP']
['Python', 'Ruby', 'Perl']

Sao chép một list


import copy

w = ["Python", "Ruby", "Perl"]

c1 = w[:]
c2 = list(w)
c3 = copy.copy(w)
c4 = copy.deepcopy(w)
c5 = [e for e in w]

c6 = []
for e in w:
    c6.append(e)
    
c7 = []
c7.extend(w)

print (c1, c2, c3, c4, c5, c6, c7)

Đoạn code trên chúng ta có một list chứa 3 string. Chúng ta sao chép list này sang 7 list khác.

import copy

Trong Python có module copy, module này có 2 phương thức dùng cho việc sao chép.

c1 = w[:]

Cách một bạn dùng cú pháp như trên sẽ copy được một list.

c2 = list(w)

Cách thứ 2 là dùng hàm list() để khởi tạo ngay một list.

c3 = copy.copy(w)
c4 = copy.deepcopy(w)

Cả hai phương thức copy() deepcopy() đều có tác dụng là tạo ra bản sao của một list. Đến đây nếu bạn không muốn nghe giải thích về sự khác nhau của 2 phương thức này thì có thể bỏ qua đoạn dưới vì cũng không cần thiết lắm :D.

Nếu đã từng học hướng đối tượng thì bạn đã biết là một đối tượng có một phần bộ nhớ dành riêng cho chúng trong máy tính. Khi chúng ta tạo một list trong Python, chẳng hạn như a = [1, 2, 3], một ô nhớ sẽ được cấp cho biến a để lưu trữ thông tin về 3 phần tử của nó, và 3 ô nhớ riêng được cấp cho 3 phần tử của list a. Khi chúng ta dùng phương thức copy(), vd b = copy.copy(a), thì biến b được cấp một vùng nhớ riêng, còn 3 phần tử của biến b cũng được cấp vùng nhớ nhưng chúng không trực tiếp lưu trữ giá trị như biến mà bản thân chúng là một con trỏ tham chiếu đến 3 phần tử của biến a. Còn nếu dùng phương thức deepcopy() thì biến cũng được cấp một vùng nhớ riêng, và 3 phần tử của biến b cũng được cấp vùng nhớ riêng và lưu trữ giá trị giống như biến a, có nghĩa là lúc này chúng là các thực thể độc lập, không liên quan đến nhau.

c5 = [e for e in w]

Đoạn code trên tạo ra một bản copy khác bằng cách dùng vòng lặp.

c6 = []
for e in w:
    c6.append(e)

Dòng trên cũng không có gì khó hiểu.

c7 = []
c7.extend(w)

Phương thức extend cũng có thể được dùng để tạo bản sao.

['Python', 'Ruby', 'Perl'] ['Python', 'Ruby', 'Perl'] ['Python', 'Ruby', 'Perl'] 
['Python', 'Ruby', 'Perl'] ['Python', 'Ruby', 'Perl'] ['Python', 'Ruby', 'Perl'] 
['Python', 'Ruby', 'Perl']

Chỉ số trong list

Như chúng ta đã biết, chúng ta có thể truy xuất phần tử thông qua chỉ số. Chỉ số trong Python được đánh số từ 0. Ngoài ra chúng ta có thể dùng chỉ số âm để lấy lùi.


n = [1, 2, 3, 4, 5, 6, 7, 8]

print (n[0])
print (n[-1])
print (n[-2])

print (n[3])
print (n[5])

Chỉ số được đặt bên trong cặp dấu [].

1
8
7
4
6

Phương thức index(e, start, end) tìm xem có phần tử nào có giá trị giống như tham số hay không trong phạm vi từ start đến end. Chúng ta có thể không cần đưa hai tham số sau vào và Python sẽ tự ngầm tìm từ đầu đến cuối list.


n = [1, 2, 3, 4, 1, 2, 3, 1, 2]

print (n.index(1))
print (n.index(2))

print (n.index(1, 1))
print (n.index(2, 2))

print (n.index(1, 2, 5))
print (n.index(3, 4, 8))

Đoạn code trên ví dụ về phương thức index().

print (n.index(1))
print (n.index(2))

Hai dòng code trên tìm vị trí của phần tử đầu tiên có giá trị 1 và 2.

print (n.index(1, 1))
print (n.index(2, 2))

Hai dòng code trên cũng tìm phần tử có giá trị 1 và 2 bắt đầu từ vị trí số 1.

print (n.index(1, 2, 5))

Đoạn code trên tìm phần tử có giá trị 1 trong phạm vi từ 2 đến 5.

0
1
4
5
4
6

Duyệt chuỗi

Tiếp theo chúng ta sẽ tìm hiểu cách duyệt một chuỗi.


n = [1, 2, 3, 4, 5]

for e in n:
    print (e,)
    
print ()  

Đoạn code trên duyệt chuỗi bằng vòng lặp for khá đơn giản.

1 2 3 4 5

Đoạn code dưới đây hơi rườm rà hơn một tí.


n = [1, 2, 3, 4, 5]

i = 0
s = len(n)

while i < s:
    print (n[i],)
    i = i + 1

print()   

Chúng ta duyệt qua chuỗi bằng vòng lặp while.

i = 0
l = len(n)

Đầu tiên chúng ta định nghĩa biến đếm và biến lưu trữ chiều dài của list.

while i < s:
    print (n[i],)
    i = i + 1

Cứ mỗi lần lặp, chúng ta tăng biến đếm lên.

Khi dùng vòng lặp for với hàm enumerate(), chúng ta có thể lấy được cả chỉ số và giá trị của các phần tử trong list.


n = [1, 2, 3, 4, 5]

for e, i in enumerate(n):
    print ("n[%d] = %d" % (e, i))
n[0] = 1
n[1] = 2
n[2] = 3
n[3] = 4
n[4] = 5

Đếm số lượng phần tử trong list

Không những đếm số lượng phần tử của list mà còn đếm số lần xuất hiện của các phần tử nhất định trong list.


n = [1, 1, 2, 3, 4, 4, 4, 5]

print (n.count(4))
print (n.count(1))
print (n.count(2))
print (n.count(6))

Chúng ta dùng phương thức count(), trong ví dụ trên, chúng ta đếm số lần xuất hiện của một vài chữ số trong list.

n = [1, 1, 2, 3, 4, 4, 4, 5]

Chúng ta tạo ra một list. Trong đó số 1 và số 4 được xuất hiện nhiều lần.

print (n.count(4))
print (n.count(1))
print (n.count(2))
print (n.count(6))

Ở đây chúng ta đếm số lần xuất hiện của số 4, 1, 2, và 6.

3
2
1
0

Lồng các list lại với nhau

Một list không chỉ chứa các phần tử đơn lẻ mà có thể chứa nguyên cả một list khác.

nums = [[1, 2], [3, 4], [5, 6]]

print (nums[0])
print (nums[1])
print (nums[2])

print (nums[0][0])
print (nums[0][1])

print (nums[1][0])
print (nums[2][1])

print (len(nums))

Trong ví dụ trên, chúng ta tạo ra một list chứa 3 list khác.

print (nums[0][0])
print (nums[0][1])

Để truy xuất phần tử của list con thì chúng ta dùng hai cặp dấu ngoặc vuông [].

[1, 2]
[3, 4]
[5, 6]
1
2
3
6
3

Đoạn code dưới đây lồng 4 list lại với nhau.


nums = [[1, 2, [3, 4, [5, 6]]]]

print (nums[0])
print (nums[0][2])
print (nums[0][2][2])

print (nums[0][0])
print (nums[0][2][1])
print (nums[0][2][2][0])
print (nums[0][0])
print (nums[0][2][1])
print (nums[0][2][2][0])

Để truy xuất các phần tử con thì chúng ta cứ dùng thêm các cặp dấu ngoặc vuông []. 

[1, 2, [3, 4, [5, 6]]]
[3, 4, [5, 6]]
[5, 6]
1
4
5

Sắp xếp list


n = [3, 4, 7, 1, 2, 8, 9, 5, 6]
print (n)

n.sort()
print (n)

n.sort(reverse=True)
print (n)

Trong ví dụ trên, chúng ta có một list chứa các con số không theo một thứ tự nào cả. Chúng ta sẽ sắp xếp chúng bằng phương thức sort(). 

n.sort()

Mặc định phương thức sort() sẽ sắp xếp từ bé đến lớn.

n.sort(reverse=True)

Nếu muốn sắp xếp theo chiều ngược lại, bạn cho tham số reverse là True.

[3, 4, 7, 1, 2, 8, 9, 5, 6]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[9, 8, 7, 6, 5, 4, 3, 2, 1]

Phương thức sort() thay đổi chính list gốc, nếu bạn không muốn thay đổi list gốc mà chỉ muốn có một bản copy list mới đã được sắp xếp thì dùng phương thức sorted().


n = [3, 4, 1, 7, 2, 5, 8, 6]

print (n)
print (sorted(n))
print (n)
[3, 4, 1, 7, 2, 5, 8, 6]
[1, 2, 3, 4, 5, 6, 7, 8]
[3, 4, 1, 7, 2, 5, 8, 6]

Đảo ngược list

a1 = ["bear", "lion", "tiger", "eagle"]

a1.reverse()
print (a1)

Để đảo ngược một list thì chúng ta dùng phương thức reverse().

['eagle', 'tiger', 'lion', 'bear']

Khởi tạo list bằng comprehension

Comprehension là một kiểu cú pháp dùng khi khởi tạo list từ một list khác. Bạn đã thấy cú pháp này ở các phần trên và trong các bài trước.

L = [<biểu thức> for <biến> in <danh sách> [câu lệnh if]]

Đoạn code mã giả trên là cú pháp comprehension. Khi chúng ta khởi tạo list theo cú pháp này. Một vòng for sẽ lặp qua danh sách cho trước, cứ mỗi lần lặp, nó sẽ kiểm tra xem nếu câu lệnh if có thỏa điều kiện không, nếu thỏa thì thực hiện biểu thức và gán giá trị trả về của biểu thức cho list L.

a = [1, 2, 3, 4, 5, 6, 7, 8, 9] 
b = [e + 2 for e in a if e % 2] 
print (b)

Trong ví dụ trên, chúng ta tạo list gồm các con số. Chúng ta tạo một list gồm các phần tử là các số nguyên không thể chia hết cho 2 trong list và cộng thêm 2 cho số đó.

b = [e + 2 for e in a if e % 2]

Trong vòng lặp for, mỗi lần lặp sẽ kiểm tra xem nếu e có chia hết cho 2 hay không, nếu không thì thực hiện biểu thức, biểu thức ở đây là cộng e thêm 2, sau đó thêm vào list b.

Cú pháp comprehension có thể viết một cách tường minh lại như sau:

a = [1, 2, 3, 4, 5, 6, 7, 8, 9]

b = list()
for e in a:
    if (e % 2):
       b.append(e + 2)
 
print (b)

Đoạn code trên tương đường với cú pháp comprehension.

[3, 5, 7, 9, 11]

Hàm map() và hàm filter()

Hai hàm map() và filter() là hai hàm có tác dụng thực thi các câu lệnh trên các phần tử của list và trả về một list mới. Hai hàm này có tác dụng tương tự như cú pháp comprehension. Hiện tại thì người ta có xu hướng dùng cú pháp comprehension nhiều hơn do tính hữu dụng của nó.

def to_upper(s):
    return s.upper()

words = ["stone", "cloud", "dream", "sky"]

words2 = map(to_upper, words)
print (words2)

Hàm map() có tác dụng thực thi một hàm khác lên từng phần tử của một list.

def to_upper(s):
    return s.upper()

Trong ví dụ trên thì đây là hàm mà chúng ta sẽ dùng để thực thi cho các phần tử của list. Ở đây chúng ta viết hoa một string cho trước.

words2 = map(to_upper, words)
print (words2)

Tham số đầu tiên của hàm map() là tên của hàm sẽ được thực thi, tham số thứ hai là list nguồn.

['STONE', 'CLOUD', 'DREAM', 'SKY']

Hàm filter() cũng thực thi một hàm nhưng không làm gì với list gốc cả mà chỉ đơn giản là lấy các phần tử của list gốc nếu chúng thỏa điều kiện nào đó.

def positive(x):
    return x > 0

n = [-2, 0, 1, 2, -3, 4, 4, -1]

print (filter(positive, n))

Trong ví dụ trên, chúng ta tạo một list có các số nguyên. Hàm filter() sẽ lọc ra các phần tử > 0 bằng hàm positive().

def positive(x):
    return x > 0

Đoạn code trên là hàm do chúng ta định nghĩa, hàm này sẽ được sử dụng bởi hàm filter(). Giá trị trả về của hàm này là một kiểu bool.

[1, 2, 4, 4]

Python – Kiểu String

Trong bài các kiểu dữ liệu cơ bản chúng ta đã học về kiểu string, trong bài này chúng ta sẽ tìm hiểu sâu hơn về kiểu dữ liệu này. String là một trong những kiểu dữ liệu quan trọng trong các ngôn ngữ lập trình, vì thế nên mình quyết định dành hẳn một bài để nói về string.

Khởi tạo string

Trong Python, để tạo một string, chúng ta có thể dùng một dấu nháy đơn, một dấu nháy kép hoặc ba dấu nháy kép. Khi dùng ba dấu nháy kép, chúng ta có thể viết string trên nhiều dòng mà không cần dùng ký tự thoát.


a = "proximity alert"
b = 'evacuation'
c = """
requiem 
for
a 
tower
"""

print (a)
print (b)
print (c)

Trong ví dụ trên, chúng ta khởi tạo 3 string và in ra màn hình.

proximity alert
evacuation

requiem 
for 
a 
tower

Dùng dấu nháy bên strong string

Để tạo string thì chúng ta dùng các dấu nháy, nhưng nếu chúng ta muốn dùng chính các dấu nháy đó bên trong string thì sao? Có hai cách, một là dùng kí tự thoát, hai là trộn lẫn giữa dấu nháy cần dùng với dấu nháy khởi tạo string.


print ("There are many stars.")
print ("He said, \"Which one is your favourite?\"")

print ('There are many stars.')
print ('He said, "Which one is your favourite?"')

Cách thứ nhất là dùng kí tự thoát \ các kí tự điều khiển sẽ bị vô hiệu hóa và sẽ được in ra như các kí tự bình thường. Cách thứ hai là chúng ta trộn, nếu muốn sử dụng dấu nháy kép trong string thì chúng ta dùng dấu nháy đơn để bao bọc lấy string và ngược lại.

There are many stars.
He said, "Which one is your favourite?"
There are many stars.
He said, "Which one is your favourite?"

Độ dài của string

Phương thức len() trả về số lượng chữ cái trong string, kể cả dấu cách.


s1 = "Eagle"
s2 = "Eagle\n"
s3 = "Eagle  "

print (len(s1))
print (len(s2))
print (len(s3))

Ví dụ trên in ra độ dài của 3 string.

s1 = "Eagle"
s2 = "Eagle\n"
s3 = "Eagle  "

Ở đây, string thứ 2 có kí tự xuống dòng, string thứ 3 có 2 dấu cách và chúng đều được tính.

5
6
7

Loại bỏ khoảng trắng thừa trong string

Đôi khi các khoảng trắng thừa ở đầu string hay cuối string nhìn khá là khó chịu và bạn muốn loại bỏ chúng đi. Python cung cấp các phương thức strip(), rstrip() và lstrip() để làm công việc này. Bản thân các phương thức này không loại bỏ các kí tự trong string gốc mà chúng sẽ copy string gốc sang một nơi khác, sau đó loại bỏ khoảng trắng ở các string này rồi trả string mới này cho chúng ta.


s = " Eagle  "

s2 = s.rstrip()
s3 = s.lstrip()
s4 = s.strip()

print (s, len(s))
print (s2, len(s2))
print (s3, len(s3))
print (s4, len(s4))

Ở ví dụ trên, chúng ta áp dụng cả 3 phương thức trên vào string s. String có 1 khoảng trắng thừa ở đâu câu và 2 khoảng trắng thừa ở cuối câu.

s2 = s.rstrip()

Phương thức rstrip() loại bỏ khoảng trắng thừa ở cuối string.

s3 = s.lstrip()

Phương thức lstrip() loại bỏ khoảng trắng thừa ở đầu string.

s4 = s.strip()

Phương thức strip() loại bỏ khoảng trắng thừa ở cả đầu và cuối string.

 Eagle   8
 Eagle 6
Eagle   7
Eagle 5

Chúng ta in kết quả ra màn hình. Lưu ý là python tự động cách dòng các thành phần trong hàm print.

Các ký tự thoát

Đây là các kí tự đặc biệt dùng để điều khiển string.


print ("Incompatible, it don't matter though\n'cos someone's bound to hear my cry")
print ("Speak out if you do\nYou're not easy to find")

Kí tự \n mang ý nghĩa xuống dòng, kí tự nào đứng đằng sau kí tự này sẽ tự động xuống dòng.

Incompatible, it don't matter though
'cos someone's bound to hear my cry
Speak out if you do
You're not easy to find

Tiếp theo là kí tự backspace \b.

print ("Python\b\b\booo") # prints Pytooo

Kí tự này đưa con trỏ về trước 1 kí tự. Trong ví dụ trên, chúng ta có 3 kí tự \b nên con trỏ được đưa lùi về 3 kí tự nên 3 kí tự hon được thay thế bằng 3 kí tự ooo.

print ("Towering\tinferno") # prints Towering        inferno

Kí tự \t có tác dụng in ra một dấu tab.

Nếu chúng ta đưa r vào trước dấu nháy. Các ký tự thoát trong string sẽ không được sử dụng và chúng sẽ được in ra như các kí tự bình thường.

print (r"Another world\n")
Another world\n

Ngoài ra Python còn nhiều kiểu kí tự thoát khác nữa, bạn có thể tham khảo tại đây.

So sánh string

Chúng ta có thể so sánh 2 string bằng các toán tử ==, !=… và kết quả trả về là một giá trị boolean.

print ("12" == "12")
print ("17" == "9")
print ("aa" == "ab")

print ("abc" != "bce")
print ("efg" != "efg")

Trong ví dụ trên, chúng ta so sánh 2 string.

print ("12" == "12")

Hai string trên bằng nhau, kết quả là True.

print ("aa" == "ab")

Hai string trên khác nhau, hai kí tự đầu tiên bằng nhau nhưng kí tự thứ hai khác nhau, trong đó kí tự a lớn hơn kí tự b. Kết quả trả về là False.

print ("abc" != "bce")

Hai string này khác nhau hoàn toàn. Kết quả trả về là True.

True
False
False
True
False

Truy xuất phần tử trong string

Cũng như tuple, list… chúng ta có thể truy xuất các phần tử trong string.


s = "Eagle"

print (s[0])
print (s[4])
print (s[-1])
print (s[-2])

print ("****************")

print (s[0:4])
print (s[1:3])
print (s[:])

Ở trên chúng ta truy xuất thông qua chỉ số.

print (s[0])
print (s[4])

Chỉ số ở đây được đánh số từ 0, nếu string có 5 kí tự thì chúng được đánh số từ 0..4.

print (s[-1])
print (s[-2])

Nếu chúng ta đưa vào chỉ số là số âm, chúng ta lấy được các phần tử từ cuối string.

print (s[0:4])

Chúng ta có thể đưa các phạm vi lấy từ đâu đến đâu vào để lấy một tập các phần tử chứ không chỉ lấy được các phần tử riêng biệt.

print (s[:])

Nếu chúng ta đưa vào chỉ số như phía trên thì sẽ lấy toàn bộ string.

E
e
e
l
****************
Eagl
ag
Eagle

Chúng ta có thể dùng vòng lặp để duyệt qua string.

s = "Pho Code"

for i in s:
  print (i,)

Đoạn code trên in toàn bộ các phần tử trong string ra màn hình.

P h o C o d e

Tìm string con

Các phương thức find(), rfind(), index() và rindex() là các phương thức dùng để tìm string con. Kết quả trả về là vị trí của kí tự đầu tiên của string con được tìm thấy trong string cha. Phương thức find() và index() tìm từ đầu string, phương thức rfind() rindex() tìm từ cuối string.

Sự khác nhau của 2 phương thức find() và index() là nếu không tìm thấy string con thì phương thức đầu tiên trả về -1, còn phương thức thứ 2 trả về một ValueError exception. Exception là một khái niệm quan trọng và chúng ta sẽ tìm hiểu ở các bài cuối.

find(str, beg=0, end=len(string))
rfind(str, beg=0, end=len(string))
index(str, beg=0, end=len(string))
rindex(str, beg=0, end=len(string))

Trong đoạn code trên, các phương thức này nhận vào 3 tham số, tham số đầu tiên str là string con cần tìm, tham số thứ 2 và thứ 3 là vị trí bắt đầu tìm và vị trí kết thúc để tìm trong string cha. Chúng ta có thể không đưa 2 tham số này vào và các phương thức trên sẽ mặc định tìm từ vị trí đầu tiên là 0 và vị trí cuối cùng là độ dài của string cha.

a = "I saw a wolf in the forest. A lone wolf."

print (a.find("wolf"))
print (a.find("wolf", 10, 20))
print (a.find("wolf", 15))

print (a.rfind("wolf"))

Trong ví dụ trên, chúng ta có một string và chúng ta thử tìm string con từ các khoảng vị trí khác nhau.

print (a.find("wolf"))

Dòng trên tìm vị trí xuất hiện đầu tiên của string “wolf”.

print (a.find("wolf", 10, 20))

Dòng trên tìm vị trí xuất hiện đầu tiên của string “wolf” từ vị trí 10 đến 20 trong string gốc, kết quả trả về -1 vì không tìm thấy.

print (a.find("wolf", 15))

Dòng trên chúng ta cũng tìm string “wolf” từ vị trí 15 đến cuối string và tìm ra vị trí thứ hai mà string này xuất hiện trong string cha.

print (a.rfind("wolf"))

Phương thức rfind() tìm string gốc từ cuối string cha, do đó cũng tìm ra vị trí thứ hai của string này trong string cha.

8
-1
35
35

Tiếp theo chúng ta sẽ tìm hiểu về phương thức index().

a = "I saw a wolf in the forest. A lone wolf."

print (a.index("wolf"))
print (a.rindex("wolf"))

try:
    print (a.rindex("fox"))
except ValueError as e:
    print ("Could not find substring")

Như đã nói ở trên, điểm khác nhau của phương thức này với phương thức find() là cách chúng gửi giá trị trả về khi không tìm thấy.

print (a.index("wolf"))
print (a.rindex("wolf"))

Hai dòng trên tìm vị trí bắt đầu của string “wolf” từ vị trí đầu và cuối string cha.

try:
    print (a.rindex("fox"))
except ValueError as e:
    print ("Could not find substring")

Ở đây chúng ta thử tìm string “fox” và tất nhiên là không tìm thấy, phương thức này trả về một ValueError exception.

8
35
Could not find substring

Toán tử trên string

Ví dụ dưới đây sử dụng toán tử nhân * và toán tử nối chuỗi.


print ("eagle " * 5)

print ("eagle " "falcon")

print ("eagle " + "and " + "falcon")

Toán tử * sẽ lặp lại string n lần. Trong ví dụ trên là 5 lần. Hai string được đặt sát nhau sẽ tự động  ngầm nối vào nhau. Bạn cũng có thể dùng dấu + để nối chuỗi một cách rõ ràng.

eagle eagle eagle eagle eagle 
eagle falcon
eagle and falcon

Phương thức len() có tác dụng tính số chữ cái trong string.


var = 'eagle'

print (var, "has", len(var), "characters")

Ví dụ trên tính số lượng các kí tự có trong string.

eagle has 5 characters

Trong một số ngôn ngữ khác như Java, C#, kiểu string và kiểu số có thể được ngầm nối thành một string, chẳng hạn trong Java, bạn có thể gõ System.out.println("Number: " + 12) để in chuỗi “Number: 12” ra màn hình. Python không cho phép điều này, bạn phải chuyển đổi kiểu dữ liệu một cách rõ ràng.


print (int("12") + 12)
print ("There are " + str(22) + " oranges.")
print (float('22.33') + 22.55)

Chúng ta có thể dùng phương thức int() để chuyển một string thành một số, float() để chuyển một string thành một số thực, hoặc hàm str() để chuyển một số thành một string,

Thay thế string

Phương thức replace() sẽ thay thế một chuỗi con trong chuỗi cha thành một chuỗi mới.

replace(old, new [, max])

Mặc định thì phương thức này sẽ thay thế tất cả các chuỗi con mà nó tìm thấy được. Nhưng bạn cũng có thể giới hạn phạm vi tìm kiếm.

a = "I saw a wolf in the forest. A lonely wolf."

b = a.replace("wolf", "fox")
print (b)

c = a.replace("wolf", "fox", 1)
print (c)

Ở ví dụ trên chúng ta thay thế string “wolf” thành “fox”.

b = a.replace("wolf", "fox")

Dòng trên sẽ thay thế tất cả các string “wolf” thành “fox”.

c = a.replace("wolf", "fox", 1)

Dòng này thì chỉ thay thế string “wolf” đầu tiên mà nó tìm thấy.

I saw a fox in the forest. A lonely fox.
I saw a fox in the forest. A lonely wolf.

Tách, nối string

Chúng ta có thể tách một string bằng phương thức split() hoặc rsplit(). Kết quả trả về là một đối tượng kiểu list có các phần tử là các kí tự được tách ra từ string gốc, string gốc được tách dựa trên các kí tự phân cách mà chúng ta cung cấp. Ngoài ra 2 phương thức trên còn có 1 tham số thứ 2 là số lượng lần tách tối đa.

nums = "1,5,6,8,2,3,1,9"

k = nums.split(",")
print (k)

l = nums.split(",", 5)
print (l)

m = nums.rsplit(",", 3)
print (m)

Trong ví dụ trên, chúng ta sử dụng kí tự phân cách là dấu phẩy “,” để tách string thành các string con.

k = nums.split(",")

String gốc của chúng ta có 8 kí tự, nên list trả về sẽ có 8 phần tử.

l = nums.split(",", 5)

Dòng code trên quy định số lần tách tối đa là 5 lần, do đó list trả về của chúng ta sẽ có 6 phần tử.

m = nums.rsplit(",", 3)

Ở đây chúng ta tách string gốc thành 4 phần tử nhưng quá trình tách bắt đầu từ cuối string.

['1', '5', '6', '8', '2', '3', '1', '9']
['1', '5', '6', '8', '2', '3,1,9']
['1,5,6,8,2', '3', '1', '9']

Chúng ta có thể nối các string bằng hàm join(). Các string được nối lại cũng có thể có các kí tự phân tách.

nums = "1,5,6,8,2,3,1,9"

n = nums.split(",")
print (n)

m = ':'.join(n)
print (m)

Trong ví dụ trên chúng ta tách string nums ra dựa trên dấu phẩy “,”, sau đó nối các phần tử mới trong list thành một string và cách nhau bởi dấu hai chấm “:”.

m = ':'.join(n)

Phương thức join() sẽ tạo ra một string mới từ một list các string con, cách nhau bởi dấu “:”.

['1', '5', '6', '8', '2', '3', '1', '9']
1:5:6:8:2:3:1:9

Ngoài phương thức split() dùng để tách chuỗi, chúng ta có một phương thức khác có chức năng tương tự là partition(), phương thức này chỉ cắt chuỗi 1 lần khi nó gặp kí tự phân cách, do đó nó cũng giống như là khi dùng split(str, 1) vậy. Thế nên kết quả trả về của phương thức này luôn là một list chứa 3 phần tử, phần tử đầu tiên là đoạn string nằm phía trước kí tự phân tách, phần tử thứ 2 là chính bản thân kí tự phân tách, phần tử thứ 3 là đoạn string nằm phía sau kí tự phân tách.

s = "1 + 2 + 3 = 6"

a = s.partition("=")

print (a)

Đoạn code trên ví dụ về phương thức partition().

a = s.partition("=")
('1 + 2 + 3 ', '=', ' 6')

Chữ HOA và chữ thường

Python có các phương thức để làm việc với từng trường hợp.


a = "PhoCode"

print (a.upper())
print (a.lower())
print (a.swapcase())
print (a.title()) 

Ví dụ trên sử dụng bốn phương thức.

print (a.upper())

Phương thức upper() sẽ chuyển toàn bộ các kí tự trong string thành viết HOA.

print (a.lower())

Phương thức lower() sẽ chuyển toàn bộ các kí tự trong string thành viết thường.

print (a.swapcase())

Phương thức swapcase() đảo ngược kiểu HOA thành kiểu thường và ngược lại.

print (a.title())

Phương thức title() sẽ viết HOA chữ cái đầu tiên, các chữ cái còn lại sẽ chuyển thành kiểu thường.

PHOCODE
phocode
pHOcODE
Phocode

Một số thao tác khác trên string


sentence = "There are 22 apples"

alphas = 0
digits = 0
spaces = 0

for i in sentence:
   if i.isalpha():
      alphas += 1
   if i.isdigit():
      digits += 1
   if i.isspace():
      spaces += 1

print ("There are", len(sentence), "characters")
print ("There are", alphas, "alphabetic characters")
print ("There are", digits, "digits")
print ("There are", spaces, "spaces")

Ở đây chúng ta sử dụng các phương thức isalpha(), isdigit(), isspace() để xác định xem kí tự nào là chữ cái, chữ số hay dấu cách.

There are 19 characters
There are 14 alphabetic characters
There are 2 digits
There are 3 spaces

Ví dụ dưới đây chúng ta sẽ căn chỉnh lề khi in string ra màn hình.


print ("Ajax Amsterdam" " - " + "Inter Milano " "2:3")
print ("Real Madridi" " - " "AC Milano " "3:3")
print ("Dortmund" " - " "Sparta Praha " "2:1")

Bạn đã biết là chúng ta có thể nối chuỗi bằng cách đặt hai chuỗi sát nhau hoặc dùng toán tử +.

Ajax Amsterdam - Inter Milano 2:3
Real Madridi - AC Milano 3:3
Dortmund - Sparta Praha 2:1

Chúng ta sẽ căn chỉnh lề cho đẹp hơn.


teams = { 
      0: ("Ajax Amsterdam", "Inter Milano"),
      1: ("Real Madrid", "AC Milano"),
      2: ("Dortmund", "Sparta Praha")
}

results = ("2:3", "3:3", "2:1")


for i in teams:
   print (teams[i][0].ljust(16) + "-".ljust(5) + \
       teams[i][1].ljust(16) + results[i].ljust(3))

Ở ví dụ trên chúng ta có một kiểu từ điển và một tuple. Phương thức ljust() sẽ đưa các string về lề trái, phương thức rjust() để đưa các string về lề phải. Chúng ta có thể quy định số lượng kí tự của mỗi string, nếu string không đủ số lượng thì các dấu cách sẽ tự động được thêm vào.

Ajax Amsterdam  -    Inter Milano    2:3
Real Madrid     -    AC Milano       3:3
Dortmund        -    Sparta Praha    2:1

Định dạng string

Định dạng chuỗi tức là bạn đưa các tham số/biến vào bên trong string và tùy theo các tham số này mang giá trị gì mà string sẽ hiển thị ra giá trị đó. Định dạng kiểu này rất được hay dùng không chỉ trong Python mà các ngôn ngữ lập trình khác. Các tham số định dạng sử dụng toán tử %.


print ('There are %d oranges in the basket' % 32)

Ví dụ trên chúng ta sử dụng định dạng %d, đây là định dạng cho số nguyên. Bên trong chuỗi, chúng ta ghi %d tại vị trí mà chúng ta muốn hiển thị tham số, sau khi kết thúc chuỗi, chúng ta thêm % vào sau chuỗi và các giá trị và chúng ta muốn đưa vào.

There are 32 oranges in the basket

Nếu chúng ta dùng nhiều tham số bên trong chuỗi thì ở sau chuỗi các giá trị đưa vào phải nằm trong cặp dấu (), tức là giống như một tuple vậy.


print ('There are %d oranges and %d apples in the basket' % (12, 23))
There are 12 oranges and 23 apples in the basket

Ví dụ dưới đây dùng tham số được định dạng kiểu số thực và kiểu string.


print ('Height: %f %s' % (172.3, 'cm'))

%f dùng cho số thực, còn %s là một string.

Height: 172.300000 cm

Mặc định định dạng số thực có 6 chữ số thập phân theo sau. Chúng ta có thể quy định số lượng chữ số này.


print ('Height: %.1f %s' % (172.3, 'cm'))

Bằng cách thêm dấu . và số phần thập phân vào giữa %f. Python sẽ tự động loại bỏ các chữ số 0 thừa cho chúng ta.

Height: 172.3 cm

Dưới đây là một số kiểu định dạng khác.


# hexadecimal
print ("%x" % 300)
print ("%#x" % 300)

# octal
print ("%o" % 300)

# scientific
print ("%e" % 300000)

%x sẽ chuyển một số từ hệ bất kì sang hệ thập lục phân, nếu thêm kí tự # vào giữa %x thì được thêm cặp chữ 0x 😀 Định dạng %o là hiển thị số ở hệ bát phân (octal). %e thì hiển thị theo định dạng số mũ (thật ra mình cũng chẳng biết kiểu định dạng này 😀 )

12c
0x12c
454
3.000000e+05

Ví dụ dưới đây chúng ta sẽ in ra các chữ số trên 3 cột.


for x in range(1,11):
    print ('%d %d %d' % (x, x*x, x*x*x))
1 1 1
2 4 8
3 9 27
4 16 64
5 25 125
6 36 216
7 49 343
8 64 512
9 81 729
10 100 1000

Như bạn thấy, các cột không được đều nhau nhìn không đẹp. Chúng ta sẽ thêm các đặc tả độ rộng vào. Bạn xem ví dụ để biết cách làm.


for x in range(1,11):
    print ('%2d %03d %4d' % (x, x*x, x*x*x))

Nếu như chúng ta ghi là %2d thì sẽ có thêm một dấu cách vào cho đủ 2 kí tự, nếu ghi là 03 thì các số 0 sẽ được thêm vào cho đủ 3 kí tự…

 1 001    1
 2 004    8
 3 009   27
 4 016   64
 5 025  125
 6 036  216
 7 049  343
 8 064  512
 9 081  729
10 100 1000

Python – Câu lệnh điều kiện và vòng lặp

Trong phần này chúng ta sẽ tìm hiểu về câu lệnh điều kiện và vòng lặp.

Trong lập trình có những trường hợp bạn phải tùy theo dữ liệu mà có những kiểu xử lý khác nhau. Ví dụ như bài toán tìm nghiệm của phương trình bậc hai, bạn sẽ phải đưa ra 3 kết quả khác nhau khi delta khác nhau. Khi đó bạn phải dùng đến câu lệnh điều kiện. Câu lệnh điều kiện đánh giá xem một trường hợp là đúng (true) hay sai (false), để dẫn tới các quyết định khác nhau.

Mặc định trong Python thì các giá trị không phải kiểu boolean mà có giá trị khác 0 hay khác rỗng đều có thể chuyển thành boolean mang giá trị True, còn nếu bằng 0 hay rỗng thì mang giá trị False.

Câu lệnh If

if (biểu thức):
    các câu lệnh

Câu lệnh if kiểm tra xem biểu thức mang giá trị True hay False, nếu true thì thực thi các câu lệnh.

number = 8
if (number % 2 == 0):
    print (number, "is an even number")

Trong ví dụ trên, chúng ta kiểm tra xem number có phải là số chẵn hay không.

Number is an even number

Câu lệnh If..elif..else

if (biểu thức 1):
    các câu lệnh
elif (biểu thức 2):
    các câu lệnh
elif (biểu thức n):
    các câu lệnh
else:
    các câu lệnh

Nếu bạn có nhiều trường hợp cần xử lý, chẳng hạn như tìm nghiệm phương trình bậc 2 có tới 3 trường hợp của delta, thì bạn sử dụng cú pháp if..elif..else.

time = 10
if (time < 10):
    print ("Good morning")
elif (time < 20):
    print ("Good day")
else:
    print ("Good evening")

Đoạn code trên kiểm tra nếu time < 10 thì in ra Good morning, nếu time < 20 thì in ra Good day, còn nếu không phải 2 trường hợp trên thì in ra Good evening.

Good day

Ngoài ra bạn cũng có thể lồng các câu lệnh if vào nhau. Xem ví dụ.

var1 = 100
if var1:
   print("1 - Got a true expression value")
   print (var1)
else:
   print("1 - Got a false expression value")
   print(var1)

var2 = 0
if var2:
   print("2 - Got a true expression value")
   print(var2)
else:
   print("2 - Got a false expression value")
   print(var2)
1 - Got a true expression value
100
2 - Got a false expression value
0

Bây giờ chúng ta sẽ tìm hiểu về vòng lặp.

Khi Python dịch một chương trình thì nó sẽ dịch các câu lệnh một cách có thứ tự từ trên xuống dưới. Đôi khi bạn muốn làm một công việc có tính chất lặp đi lặp lại, chẳng hạn như in ra các số chẵn từ 0→1000. Bạn không thể ngồi gõ 1000 câu lệnh if..print được. Bạn sẽ phải dùng dến vòng lặp.

Vòng lặp while

Vòng lặp while thường dùng khi bạn chưa biết trước số lượng vòng lặp cần dùng.

while (biểu thức):
    các câu lệnh

Ý nghĩa của câu lệnh này là trong khi điều kiện còn đúng thì thực hiện các câu lệnh.

x = 0
while (x < 1000):
    x = x + 1
print (x)

Trong đoạn code trên, trong khi x vẫn còn < 1000 thì tăng x lên 1.

1000

Bạn có thể dùng while…else trong Python, cú pháp này có tác dụng thực thi các câu lệnh sau khi rời khỏi vòng lặp.

count = 0
while count < 5:
   print (count, " is  less than 5")
   count = count + 1
else:
   print (count, " is not less than 5")
0 is less than 5
1 is less than 5
2 is less than 5
3 is less than 5
4 is less than 5
5 is not less than 5

Vòng lặp for

Vòng lặp for thường được dùng khi bạn đã biết trước số lượng vòng lặp cần thực hiện.

for biến lặp in tập hợp:
    các câu lệnh

Biến lặp có thể là bất cứ biến nào. Bạn chỉ cần đưa vào một cái tên là Python sẽ tự ngầm hiểu kiểu dữ liệu. Còn tập hợp có thể là bất kỳ kiểu tập hợp nào mà chúng ta đã học trong bài trước, hoặc cũng có thể là một string.

for letter in 'Python':   
   print('Current Letter :', letter)

fruits = ['banana', 'apple',  'mango']</span>
for fruit in fruits:    
   print ('Current fruit :', fruit)
Current Letter : P
Current Letter : y
Current Letter : t
Current Letter : h
Current Letter : o
Current Letter : n
Current fruit : banana
Current fruit : apple
Current fruit : mango

Bạn cũng có thể dùng vòng lặp for theo chỉ số.

fruits = ['banana','apple',  'mango']
for index in range(len(fruits)):
   print ('Current fruit :', fruits[index])
Current fruit : banana
Current fruit : apple
Current fruit : mango

Cũng giống như vòng lặp while, bạn cũng có thể dùng else cho vòng lặp for.

for num in range(10,20):
   for i in range(2,num):
      if num%i == 0:      
         j=num/i         
         print('%d equals %d * %d' % (num,i,j))
         break
   else:               
      print (num, 'is a prime number')

Ví dụ trên tìm ước số của các số khác 1 và chính nó của từ 10 đến 20. Nếu không tìm thấy thì thông báo số đó là số nguyên tố. Và cũng giống như các câu lệnh điều kiện, bạn cũng có thể lồng các vòng lặp vào nhau.

10 equals 2 * 5
11 is a prime number
12 equals 2 * 6
13 is a prime number
14 equals 2 * 7
15 equals 3 * 5
16 equals 2 * 8
17 is a prime number
18 equals 2 * 9
19 is a prime number

Câu lệnh Break

Khi bạn muốn dừng vòng lặp giữa chừng thì dùng câu lệnh break.

for letter in 'Python':
   if letter == 'h':
      break
   print ('Current Letter :', letter)
  
var = 10                
while var > 0:           
   print ('Current variable value :', var)
   var = var -1
   if var == 5:
      break

Trong đoạn code trên, ở vòng lặp for chúng ta sẽ dừng vòng lặp nếu tìm thấy kí tự ‘h’ trong chuỗi “Python”, ở vòng lặp while thì sẽ dừng vòng lặp khi biến var giảm bằng 5.

Current Letter : P
Current Letter : y
Current Letter : t
Current variable value : 10
Current variable value : 9
Current variable value : 8
Current variable value : 7
Current variable value : 6

Câu lệnh Continue

Câu lệnh continue có tác dụng nhảy sang lần lặp kế tiếp. Các câu lệnh phía sau contine sẽ không được thực thi.

for letter in 'Python':     
   if letter == 'h':
      continue
   print ('Current Letter :', letter)

var = 10                    
while var > 0:              
   var = var -1
   if var == 5:
      continue
   print ('Current variable value :', var)

Trong ví dụ trên, ở vòng lặp for, chúng ta cho lặp tiếp khi tìm thấy kí tự ‘h’ mà không in ký tự đó ra màn hình. Còn ở vòng lặp while thì chúng ta cho lặp tiếp khi biến var bằng 5.

Current Letter : P
Current Letter : y
Current Letter : t
Current Letter : o
Current Letter : n
Current variable value : 9
Current variable value : 8
Current variable value : 7
Current variable value : 6
Current variable value : 4
Current variable value : 3
Current variable value : 2
Current variable value : 1
Current variable value : 0

Python – Các kiểu dữ liệu cơ bản

Trong phần này chúng ta sẽ cùng tìm hiểu về các kiểu dữ liệu cơ bản trong Python.

Kiểu Boolean

Lâu nay người ta thường dịch boolean là kiểu “luận lý”, đối với dân kỹ thuật thì cái từ này nghe hơi khó hiểu, nên mình xin mạn phép dịch là kiểu “đúng sai” cho đơn giản 🙂 Tức là kiểu giá trị này chỉ có hai giá trị là đúng (True) và sai (False), nhưng thực ra thì đối với những người đã lập trình lâu năm thì họ thường gọi là kiểu boolean (hoặc kiểu bool) luôn cho tiện. Hầu như tất cả các ngôn ngữ lập trình đều hỗ trợ kiểu này.

Ví dụ.


import random

male = False
male = bool(random.randint(0, 1))

print (male)

Đoạn code trên có sử dụng module random để tạo số ngẫu nhiên.

 import random

Để sử dụng module này thì chúng ta thêm dòng import random vào đầu chương trình.

 male = bool(random.randint(0, 1))

Và ở đây chúng ta sẽ sử dụng phương thức randint(x, y), phương thức này sẽ trả về giá trị ngẫu nhiên từ x→y, ở đây là 0→1. Sau đó chúng ta chuyển kiểu dữ liệu từ kiểu int sang kiểu bool bằng cách bao bọc lấy phương thức này bằng bool(). Nếu giá trị trả về là 0 thì sẽ được chuyển thành False, ngược lại là True.

Đoạn code dưới đây sẽ cho chúng ta biết các dạng dữ liệu khác khi được chuyển sang kiểu bool sẽ có giá trị nào.


print (bool(True))
print (bool(False))
print (bool("text"))
print (bool(""))
print (bool(' '))
print (bool(0))
print (bool())
print (bool(3))
print (bool(None))
True
False
True
False
True
False
False
True
False

Kiểu None

Đây là một kiểu đặc biệt trong Python. Ý nghĩa của kiểu này là không có giá trị gì cả, không tồn tại, rỗng…v..v


def function():
   pass

print (function())

Trong đoạn code trên, chúng ta định nghĩa một hàm. Chúng ta sẽ tìm hiểu về hàm ở các bài sau. Hàm này cũng không trả về giá trị gì cả nên nó sẽ tự động ngầm trả về giá trị None.

None

Kiểu số

Trong Python, kiểu số có 3 loại là số nguyên, số thực và số phức.


# number of baskets
baskets = 16

# number of apples in a basket
apples_in_basket = 24

# we get the total number of apples
total = baskets * apples_in_basket


print ("There are total of", total, "apples")

Trong ví dụ trên, chúng ta đếm số lượng táo dùng phép nhân trên kiểu số nguyên.

There are total of 384 apples

Ví dụ dưới đây mô tả số thực trong Python.

# 100m is 0.1 km

distance = 0.1

# 9.87s is 9.87/60*60 h

time = 9.87 / 3600

speed = distance / time

print ("The average speed of" \
      " a sprinter is " , speed, "km/h")

Chúng ta tính vận tốc chạy của vận động viên theo công thức vận tốc = quãng đường / thời gian.

print ("The average speed of" \
      " a sprinter is " , speed, "km/h")

Đoạn code trên sử dụng dấu \. Dấu này có tác dụng nối 2 chuỗi ghi trên hai dòng làm 1.

The average speed of a sprinter is  36.4741641337 km/h

String

String là kiểu dữ liệu lưu trữ văn bản.

Chúng ta có thể tạo ra một string bằng dấu nháy đơn, nháy kép hay 3 dấu nháy kép. Khi dùng 3 dấu nháy kép, chúng ta cũng có thể ghi một chuỗi trên nhiều dòng mà không cần dùng dấu \.

a = "proximity alert"
b = 'evacuation'
c = """
requiem 
for
a 
tower
"""

print (a)
print (b)
print (c)

Trong ví dụ trên chúng ta gán 3 chuỗi vào 3 biến a, b, c rồi in ra màn hình.

proximity alert
evacuation

requiem 
for 
a 
tower

Trong một chuỗi chúng ta có thể dùng các ký tự thoát. Ký tự thoát là các ký tự đặc biệt dùng cho nhiều mục đích khác nhau. Xem ví dụ.

print ("Incompatible, it don't matter though\n'cos someone's bound to hear my cry")
print ("Speak out if you do\nYou're not easy to find")

Ký tự \n là ký tự xuống dòng, các đoạn text sau ký tự này sẽ tự động xuống dòng.

Incompatible, it don't matter though
'cos someone's bound to hear my cry
Speak out if you do
You're not easy to find

Tiếp theo chúng ta tìm hiểu về ký tự xóa.

print ("Python\b\b\booo") # prints Pytooo

Ký tự \b xóa 1 ký tự, trong ví dụ trên, chúng ta dùng 3 ký tự \b, do đó 3 ký tự “hon” sẽ bị xóa để nhường chỗ cho 3 ký tự “ooo“.

print ("Towering\tinferno") # prints Towering        inferno

Dòng code trên ví dụ về ký tự tab \t, nó hoạt động giống như khi bạn bấm phim Tab vậy.

"Johnie's dog"
'Johnie\'s dog'

Đôi khi bạn ghi chuỗi trong cặp dấu nháy đơn, và bản thân bên trong chuỗi này bạn cũng cần dùng một dấu nháy đơn khác, lúc này bạn phải thêm một dấu \ trước dấu nháy đơn đó, nếu không trình biên dịch sẽ báo lỗi.

Nếu bạn không muốn sử dụng các ký tự thoát thì bạn thêm r vào trước chuỗi của mình. Các ký tự thoát sẽ được in ra như các ký tự bình thường.

print (r"Another world\nhas come")
Another world\nhas come

Như ở trên dòng chữ Another world\n sẽ được in ra.

Tiếp theo chúng ta sẽ tìm hiểu về cách nhân chuỗi và nối chuỗi.

print ("eagle " * 5)

print ("eagle " "falcon")

print ("eagle " + "and " + "falcon")

Phép nhân * có thể được dùng cho một chuỗi, lúc này nội dung chuỗi sẽ được lặp lại n lần, trong đoạn code trên chữ “eagle” được lặp lại 5 lần. Hai chuỗi để sát nhau sẽ ngầm tự động được nối vào. Và nếu bạn muốn nối chuỗi một cách rõ ràng hơn thì bạn có thể dùng toán tử +.

eagle eagle eagle eagle eagle 
eagle falcon
eagle and falcon

Kiểu Tuple

Kiểu Tuple là kiểu tập hợp nhiều phần tử, kiểu này lưu trữ các phần tử một cách có thứ tự và có thể lưu nhiều kiểu giá trị khác nhau trong một tuple. Giá trị trong tuple không thể thay đổi được.

fruits = ("oranges", "apples", "bananas")
fruits = "oranges", "apples", "bananas"
print (fruits)

Ở trên là hai cách tạo tuple.

first = (1, 2, 3)
second = (4, 5, 6)

print ("len(first) : ", len(first))
print ("max(first) : ", max(first))
print ("min(first) : ", min(first))
print ("first + second :", first + second)
print ("first * 3 : ", first * 3)
print ("1 in first : ", 1 in first)
print ("5 not in second : ", 5 not in second)

Đoạn code trên ví dụ về các thao tác với một tuple. Hàm len() có tác dụng lấy số lượng phần tử trong một tuple. Hàm max() và min() lấy giá trị lớn nhất và nhỏ nhất của tuple. Toán tử + gộp 2 tuple với nhau. Toán tử * tạo ra thêm n tuple. Toán tử in tìm xem một giá trị có nằm trong một tuple hay không.

len(first) :  3
max(first) :  3
min(first) :  1
first + second : (1, 2, 3, 4, 5, 6)
first * 3 :  (1, 2, 3, 1, 2, 3, 1, 2, 3)
1 in first :  True
5 not in second :  False

Tiếp theo chúng ta tìm hiểu về cách truy xuất phần tử.

five = (1, 2, 3, 4, 5)

print ("five[0] : ", five[0])
print ("five[-1] : ", five[-1])
print ("five[-2] : ", five[-2])
print ("five[:] : ", five[:])
print ("five[0:4] : ", five[0:4])
print ("five[1:2] : ", five[1:2])
print ("five[:2] : ", five[:2])
print ("five[:-1] : ", five[:-1])
print ("five[:9] : ", five[:9])

Để lấy một phần tử nào đó trong tuple, chúng ta sử dụng cặp dấu [], và cũng giống như các ngôn ngữ lập trình khác, chỉ số trong một tuple bắt đầu từ 0. Tức là nếu trong tuple có 5 phần tử, thì các phần tử được đánh số từ 0..4. Bạn cũng có thể dùng chỉ số là số nguyên âm, và Python sẽ tự động lấy lùi, chẳng hạn nếu bạn đưa chỉ số là -1, bạn sẽ được phần tử thứ 4. Bạn cũng có thể lấy các đoạn giá trị cố định dùng dấu hai chấm, ví dụ lấy các phần tử là 1, 2, 3, 4 là [1:4], ngoài ra nếu bạn không đưa chỉ số bắt đầu hay chỉ số kết thúc, bạn sẽ lấy được tất cả các phần tử về trước hay về sau đó, ví dụ [:3] sẽ cho ra các phần tử 0, 1, 2, 3.

five[0] :  1
five[-1] :  5
five[-2] :  4
five[:] :  (1, 2, 3, 4, 5)
five[0:4] :  (1, 2, 3, 4)
five[1:2] :  (2,)
five[:2] :  (1, 2)
five[:-1] :  (1, 2, 3, 4)
five[:9] :  (1, 2, 3, 4, 5)

Tuple có thể lưu trữ các kiểu dữ liệu khác nhau một cách linh hoạt.

mix = (1, 2, "solaris", (1, 2, 3))

print ("mix[1] :", mix[1])
print ("mix[2] :", mix[2])
print ("mix[3] :", mix[3])
print ("mix[3][0] :", mix[3][0])
print ("mix[3][1] :", mix[3][1])
print ("mix[3][2] :", mix[3][2])

Trong ví dụ trên, tuple của chúng ta có số nguyên, string và cả một tuple khác.

mix[1] : 2
mix[2] : solaris
mix[3] : (1, 2, 3)
mix[3][0] : 1
mix[3][1] : 2
mix[3][2] : 3

Để truy xuất phần tử của tuple bên trong một tuple, bạn dùng hai cặp dấu [].

Kiểu List

Kiểu list cũng là một kiểu lưu các giá trị tuần tự, một list cũng có thể lưu nhiều giá trị khác nhau. Do đó list và tuple có nhiều điểm tương đồng. Điểm khác biệt giữa list và tuple là các phần tử trong list có thể thay đổi giá trị, ngoài ra list có một số phương thức mà tuple không có. Chúng ta sẽ có nguyên một bài để nói riêng về kiểu list.

actors = ["Jack Nicholson", "Antony Hopkins", "Adrien Brody"]

Để tạo một list thì ta dùng cặp ký tự [].

num = [0, 2, 5, 4, 6, 7]

print (num[0])
print (num[2:])
print (len(num))
print (num + [8, 9])

Như đã nói ở trên, chúng ta có thể dùng các thao tác cộng trừ, lấy chỉ số… như của tuple.

0
[5, 4, 6, 7]
6
[0, 2, 5, 4, 6, 7, 8, 9]

Tiếp theo chúng ta tìm hiểu về một số thao tác của riêng list. Bắt đầu là thao tác sắp xếp một list.

numbers = [4, 3, 6, 1, 2, 0, 5 ]

print (numbers)
numbers.sort()
print (numbers)

Để sắp xếp một list thì chúng ta dùng phương thức sort()Lưu ý chúng ta không thể sắp xếp một list chứa nhiều kiểu dữ liệu khác nhau được, chẳng hạn [1, "Hello"] không thể nào được sắp xếp, vì chúng không cùng kiểu, bạn chỉ có thể sắp xếp các phần tử có cùng kiểu dữ liệu.

[4, 3, 6, 1, 2, 0, 5]
[0, 1, 2, 3, 4, 5, 6]

Phương thức reverse() cũng sắp xếp các phần tử nhưng thep thứ tự ngược lại.

numbers.reverse()   #  [5, 4, 3, 2, 1, 0]

Chúng ta có thể đếm một phần tử xuất hiện bao nhiêu lần trong một list bằng phương thức count().

numbers = [0, 0, 2, 3, 3, 3, 3]

print ("zero is here ",  numbers.count(0), "times") 
print ("one is here ",   numbers.count(1), "times")
print ("two is here ",   numbers.count(2), "time")
print ("three is here ", numbers.count(3), "times")

Trong ví dụ trên chúng ta đếm các số 0, 1, 2, 3 xuất hiện bao nhiêu lần.

zero is here  2 times
one is here  0 times
two is here  1 time
three is here  4 times

Tiếp theo chúng ta tìm hiểu cách thêm, xóa phần tử.

names = []

names.append("Frank")
names.append("Alexis")
names.append("Erika")
names.append("Ludmila")

print (names)
names.insert(0, "Adriana")
print (names)
names.remove("Frank")
names.remove("Alexis")
del names[1]
print (names)
del names[0]
print (names)

Để thêm một phần tử chúng ta dùng phương thức append() hoặc insert(), mặc định append() thêm phần tử mới vào cuối list, còn insert() có thể thêm phần tử vào vị trí bất kỳ do chúng ta quy định.

Để xóa một phần tử chúng dùng phương thức remove() hoặc dùng từ khóa del. Phương thức remove() xóa một phần tử có giá trị nhất định. Còn từ khóa del sẽ xóa phần tử ở một vị trí cụ thể.

['Frank', 'Alexis', 'Erika', 'Ludmila']
['Adriana', 'Frank', 'Alexis', 'Erika', 'Ludmila']
['Adriana', 'Ludmila']
['Ludmila']

Tiếp theo chúng ta tìm hiểu cách thay đổi một list.

first = [1, 2, 3]
second = [4, 5, 6]

first.extend(second)
print (first)

first[0] = 11
first[1] = 22
first[2] = 33
print (first)

print (first.pop(5))
print (first)

Chúng ta có dùng phương thức extend() để nhập một list vào một list khác, dùng phương thức pop() để lấy phần tử thứ n.

[1, 2, 3, 4, 5, 6]
[11, 22, 33, 4, 5, 6]
6
[11, 22, 33, 4, 5]

Tiếp theo là cách tìm vị trí xuất hiện của một giá trị nào đó trong list.

numbers = [0, 1, 2, 3, 3, 4, 5]

print (numbers.index(1))
print (numbers.index(3))

Chúng ta dùng phương thức index(), giá trị trả về là vị trí xuất hiện của phần tử mà chúng ta tìm, nếu có nhiều phần tử có giá trị giống nhau thì phương thức này in ra vị trí đầu tiên kể từ vị trí số 0.

1
3

Tiếp theo là cách chuyển đổi kiểu..

first = [1, 2, 3]
second = (4, 5, 6)

print (tuple(first))
print (list(second))

print (first)
print (second)

Chúng ta có thể dùng hàm tuple() để lấy một tuple từ một list, hoặc dùng hàm list() để lấy một list từ một tuple. Ở đây các list hay tuple nguồn không bị thay đổi mà Python sẽ lấy các giá trị gốc để tạo ra một list hay tuple mới rồi mới trả về cho chúng ta.

(1, 2, 3)
[4, 5, 6]
[1, 2, 3]
(4, 5, 6)

Kiểu Set

Set là kiểu tập hợp các phần tử không có thứ tự, không có nhiều hơn 2 phần tử có cùng một giá trị. Các phép toán có thể dùng trên set là phép hợp, giao, hiệu… giống như trong toán học.

set1 = set(['a', 'b', 'c', 'c', 'd'])
set2 = set(['a', 'b', 'x', 'y', 'z'])

print ("set1: " , set1)
print ("set2: " , set2)
print ("intersection: ", set1 & set2)
print ("union: ", set1 | set2)
print ("difference: ", set1 - set2)
print ("symmetric difference: ", set1 ^ set2)

Để tạo một set thì chúng ta dùng hàm set(). Trong ví dụ trên có 2 set. Chúng ta thực hiện phép giao 2 set bằng toán tử &, kết quả được một set mới có chứa các phần tử của chung cả 2 set, nếu chỉ tồn tại trong 1 set thì không lấy. Dùng toán tử | để thực hiện phép hợp, phép hợp lấy tất cả cá phần tử của cả 2 set. Phép hiệu có toán tử là dấu trừ -, set1 – set2 sẽ trả về các phần tử của set1 và các phần tử vừa tồn tại trong set1, vừa tồn tại trong set2. Cuối cùng phép hiệu đối xứng là toán tử ^, phép toán này lấy các phần tử trong set1 và set2, nhưng nếu tồn tại trong cả 2 set thì không lấy.

set1:  set(['a', 'c', 'b', 'd'])
set2:  set(['a', 'x', 'b', 'y', 'z'])
intersection:  set(['a', 'b'])
union:  set(['a', 'c', 'b', 'd', 'y', 'x', 'z'])
difference:  set(['c', 'd'])
symmetric difference:  set(['c', 'd', 'y', 'x', 'z'])

Tiếp theo là một số thao tác trên set.

set1 = set([1, 2])
set1.add(3)
set1.add(4)

set2 = set([1, 2, 3, 4, 6, 7, 8])
set2.remove(8)

print (set1)
print (set2)

print ("Is set1 subset of set2 ? : ", set1.issubset(set2))
print ("Is set1 superset of set2 ? : ", set1.issuperset(set2))

set1.clear()
print (set1)

Phương thức add() sẽ chèn một phần tử vào set. Phương thức remove() xóa một phần tử tại vị trí bất kỳ. Phương thức clear() xóa toàn bộ phần tử trong set. Phương thức issubset() kiểm tra xem một set có phải là set con của một set khác không. Phương thức issuperset() kiểm tra xem một set có phải là set cha của set khác không.

 
set([1, 2, 3, 4]) 
set([1, 2, 3, 4, 6, 7]) 
Is set1 subset of set2 ? : True 
Is set1 superset of set2 ? : False set([]) 

Kiểu từ điển

Kiểu này lưu trữ các phần tử theo dạng các cặp khóa-giá trị (keyvalue). Các chỉ số trong từ điển là các khóa. Do đó các khóa phải khác nhau, chúng ta sẽ có một bài riêng để nói về kiểu này.

words = { 'girl': 'Maedchen', 'house': 'Haus', 'death': 'Tod' }

print (words['house'])

print (words.keys())
print (words.values())
print (words.items())

print (words.pop('girl'))
print (words)
words.clear()
print (words)

Ví dụ trên mô tả sơ lược về cách sử dụng kiểu từ điển.

Haus
['house', 'girl', 'death']
['Haus', 'Maedchen', 'Tod']
[('house', 'Haus'), ('girl', 'Maedchen'), ('death', 'Tod')]
Maedchen
{'house': 'Haus', 'death': 'Tod'}
{}

Python – Các thành phần của ngôn ngữ Python

Ngôn ngữ lập trình cũng như ngôn ngữ tự nhiên của con người, tất cả đều có các thành phần cấu tạo nên nó. Các thành phần của Python gồm có chú thích (comment), biến (variable), giá trị (value), toán tử (operator), từ khóa (keyword), và ký hiệu (delimeter).

Chú thích

Các dòng chú thích được dùng để ghi chú cho người viết code dễ đọc các đoạn code khác, chú thích không được dịch bởi trình thông dịch. Để biến một dòng thành chú thích thì chúng ta thêm dấu # vào trước dòng đó.

>>># Day la ham main
>>># Tac gia Pho Code

def main():
    print ("Comments example")

main()

Tất cả những dòng phía sau dấu # đều không được dịch bởi trình thông dịch.

Biến

Biến là một cái tên dùng để lưu trữ một giá trị nào đó, có thể là một số, một chuỗi kí tự… Khác với các ngôn ngữ lập trình như C, Java… bạn phải khai báo cả kiểu dữ liệu đi kèm, thì trong Python bạn không phải khai báo kiểu dữ liệu, trình thông dịch Python sẽ tự phát hiện kiểu dữ liệu khi bạn gán giá trị cho biến đó.

Biến trong Python được đặt tên bằng chữ cái, chữ số và dấu gạch dưới _, tuy nhiên tên biến không được phép bắt đầu bằng chữ số, còn lại chữ cái và dấu _ thì được phép.

Value
value2
company_name

Trên đây là những tên biến hợp lệ.

12Val
exx$
first-name

Trên đây là những tên biến không hợp lệ.

Tên biến trong Python phân biệt chữ HOA và thường, tức là Price, price, và PRICE là ba biến khác nhau.

number = 10
Number = 11
NUMBER = 12

print (number, Number, NUMBER)

Đoạn code trên gán 3 giá trị số vào 3 biến khác nhau.

10 11 12

Giá trị

Giá trị là các ký tự đại diện cho một đại lượng gắn liền với một biến nào đó.

age = 29
nationality = "Hungarian"

Trên đây agenationality là các biến. 29"Hungarian" là các giá trị.


# literals.py

name1 = "Jane"
age1 = 12

name2 = "Rose"
age2 = 16

"Patrick"
34

"Luke"
23

print (name1, age1)
print (name2, age2)

Nếu chúng ta không gán các giá trị vào biến thì chúng sẽ bị hủy bỏ.

Jane 12
Rose 16

Toán tử

Toán tử chính là các phép tính toán.

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

Trên đây là danh sách các toán tử trong ngôn ngữ Python. Chúng ta sẽ nói chi tiết về các toán tử ở bài sau.

Khối lệnh

Trong các ngôn ngữ lập trình khác như Pascal, Java… một khối lệnh được nằm trong cặp dấu {} hoặc cặp từ khóa BEGINEND. Còn Python thì dùng khoảng trắng, bạn có thể dùng dấu tab hoặc dấu cách (space) đều được. Trên hướng dẫn của Python khuyến khích dùng 4 dấu cách.

if age > 18:
    print ("adult person")

for i in range(5):
    print (i)

Trong đoạn code trên, sau câu lệnh if là một khối lệnh. Câu lệnh mới trong khối lệnh này phải thụt dòng vào trong. Khi muốn thoát ra khỏi khối lệnh thì thụt ra ngoài 🙂 Giả sử như câu lệnh for cũng thụt vào bằng chiều dài với câu lệnh print thì câu lệnh for nằm cùng khối lệnh với câu lệnh print.

Ký hiệu

Các ký hiệu dùng để bao bọc lấy các biểu thức, điều kiện… Trong các ví dụ trước có hàm print chúng ta phải dùng cặp ký hiệu () để bao bọc lấy nội dung cần được in ra màn hình. Thực ra đối với Python 2.x thì lệnh print không cần cặp ký tự này, nhưng Python 3.x thì phải có cặp ký tự này, lý do là vì trong phiên bản 2.x, print là một câu lệnh nhưng trong 3.x thì print đã được phát triển thành một hàm riêng.

(       )       [       ]       {       }      
,       :       .       `       =       ;
+=      -=      *=      /=      //=     %=
<= |= ^= >>=     <<=     **=
'       "       \       @

Từ khóa

Từ khóa là các từ dành riêng cho Python. Từ khóa thường được dùng để thi hành một lệnh nào đó, hoặc tên của một thành phần trong Python. Chẳng hạn từ khóa if thi hành lệnh so sánh. Từ khóa for để bắt đầu một vòng lặp, từ khóa and là tên của toán tử and… Bạn không được đặt tên biến hay tên hàm trùng với tên của các từ khóa.

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

Trên đây là danh sách các từ khóa trong Python. Chúng ta sẽ tìm hiểu sâu hơn về từ khóa trong bài khác.