Home » Chia sẻ kiến thức - tài liệu » Lập Trình » Giới thiệu qua về chuỗi, số, list trong Python

Giới thiệu qua về chuỗi, số, list trong Python

Trong phần trước, chúng ta đã làm quen với chương trình Python đầu tiên là thêm hai số và in tổng của chúng ra ngoài màn hình. Phần này, bạn sẽ học cách sử dụng Python như một chiếc máy tính, học về số, chuỗi, list và đi bước đầu tiên hướng tới lập trình Python.

Hãy chắc chắn bạn đã lưu lại trang Tài liệu Python này để cập nhật những bài mới nhất nhé.

1. Sử dụng Python như một máy tính

Hãy thử vài lệnh Python đơn giản dưới đây, bắt đầu trình thông dịch và đợi dấu nhắc chính xuất hiện, nó không quá lâu đâu.

1.1. Số

Trình thông dịch hoạt động như một máy tính đơn giản: Bạn có thể nhập vào một phép tính và nó sẽ viết ra giá trị. Cú pháp biểu thức khá đơn giản: các toán tử như +, -, * và / làm việc giống như trong hầu hết các ngôn ngữ lập trình khác (Pascal, C), dấu ngoặc đơn () có thể được sử dụng để nhóm. Ví dụ:

>>> 2+24>>> 50-5*620>>> (50-5*6)/45.0>>> 8/5# phép chia luôn trả về một số dạng thập phân với dấu chấm1.6

Số nguyên (ví dụ như 2, 4, 20) có kiểu int, số dạng thập phân (như 5.0, 1.6) có kiểu float. Chúng ta sẽ thấy thêm về các kiểu số trong những bài hướng dẫn sau.

Phép chia (/) luôn luôn trả về kiểu float. Để thực hiện phép chia lấy phần nguyên (loại bỏ các số sau dấu thập phân) bạn có thể sử dụng toán tử //; để tính phần dư thì sử dụng % như ví dụ dưới đây:

>>> 17/3# phép chia thường trả về số thập phân5.666666666666667>>>>>> 17//3# phép chia lấy số nguyên, loại bỏ phần sau dấu thập phân5>>> 17%3# toán tử % trả về số dư của phép chia2>>> 5*3+2# thương * số chia + số dư17

Với Python, bạn có thể sử dụng toán tử ** để tính số mũ:

>>> 5**2# 5 bình phương25>>> 2**7# 2 mũ 7128

Dấu bằng = được sử dụng để gán giá trị cho 1 biến. Sau đó, không có kết quả nào được hiển thị trước dấu nhắc lệnh tiếp theo:

>>> width=20>>> height=5*9>>> width*height900

Nếu một biến không được định nghĩa (gán giá trị), cố gắng sử dụng biến đó, bạn sẽ nhận được lỗi sau:

>>> n# bạn đang cố truy cập vào biến n chưa được gán giá trịTraceback (most recent call last): File "<stdin>", line 1, in <module>NameError: name 'n' is not defined

Python hỗ trợ đầy đủ cho dấu chấm động, phép tính có cả số nguyên và số thập phân thì kết quả sẽ trả về số dưới dạng thập phân (nguyên văn: toán tử với toán hạng kiểu hỗn hợp chuyển đổi toán hạng số nguyên sang số thập phân):

>>> 4*3.75-114.0

Trong chế độ tương tác, biểu thức được in ra cuối cùng sẽ được gán cho biến _, giúp dễ dàng thực hiện các phép tính tiếp theo hơn. Ví dụ:

>>> tax=12.5/100>>> price=100.50>>> price*tax12.5625>>> price+_113.0625>>> round(_,2)113.06

Bạn nên coi biến này là read-only, đừng gán giá trị cho nó – vì nếu tạo ra một biến cùng tên nó sẽ chiếm mất biến mặc định này và không còn làm được những thứ hay ho như trên nữa.

Ngoài intfloat, Python hỗ trợ thêm 2 loại số nữa là DecimalFraction. Python cũng hỗ trợ số phức và sử dụng hậu tố j hoặc J để chỉ phần ảo. Ví dụ: 3+5j

1.2. Chuỗi (string)

Bên cạnh số, Python cũng có thể thao tác với chuỗi, được biểu diễn bằng nhiều cách. Chúng có thể được để trong dấu nháy đơn ('...') hoặc kép ("...") với cùng một kết quả. được sử dụng để “trốn” 2 dấu nháy này.

>>> 'spam eggs'# dấu nháy đơn'spam eggs'>>> 'doesn't'# sử dụng ' để viết dấu nháy đơn..."doesn't">>> "doesn't"# ...hoặc sử dụng dấu nháy kép"doesn't">>> '"Yes," he said.''"Yes," he said.'>>> ""Yes," he said."'"Yes," he said.'>>> '"Isn't," she said.''"Isn't," she said.'

Trong trình thông dịch tương tác, chuỗi kết quả bao gồm phần trong dấu ngoặc kép và các ký tự đặc biệt “trốn” được nhờ sử dụng . Dù đầu ra trông có vẻ hơi khác với đầu vào (dấu nháy kèm theo có thể thay đổi) nhưng hai chuỗi này là tương đương. Chuỗi được viết trong dấu ngoặc kép khi chuỗi chứa dấu nháy đơn và không có dấu nháy kép), ngược lại nó sẽ được viết trong dấu nháy đơn. Hàm print() tạo chuỗi đầu ra dễ đọc hơn, bằng cách bỏ qua dấu nháy kèm theo và in các ký tự đặc biệt, đã “trốn” được dấu nháy:

>>> '"Isn't," she said.''"Isn't," she said.'>>> print('"Isn't," she said.')"Isn't," she said.>>> s='First line.nSecond line.'# n nghĩa là dòng mới>>> s# không có print(), n sẽ được viết trong kết quả đầu ra'First line.nSecond line.'>>> print(s)# có print(), n sẽ tạo ra dòng mớiFirst line.Second line.

Nếu không muốn các ký tự được thêm vào bởi được trình thông dịch hiểu là ký tự đặc biệt thì sử dụng chuỗi raw bằng cách thêm r vào trước dấu nháy đầu tiên:

>>> print('C:somename')# ở đây n là dòng mới!C:someame>>> print(r'C:somename')# thêm r trước dấu nháyC:somename

Chuỗi ký tự dạng chuỗi có thể viết trên nhiều dòng bằng cách sử dụng 3 dấu nháy: """...""" hoặc '''...'''. Kết thúc dòng tự động bao gồm trong chuỗi, nhưng có thể ngăn chặn điều này bằng cách thêm vào cuối dòng. Ví dụ:

print("""Usage: thingy [OPTIONS] -h Display this usage message -H hostname Hostname to connect to""")

Đây là kết quả (dòng mới ban đầu không được tính):

Viết chuỗi ký tự trên nhiều dòng trong Python

Các chuỗi có thể được nối với nhau bằng toán tử + và thay thế bằng *:

>>> # thêm 3 'un' vào sau 'ium'>>> 3*'un'+'ium''unununium'

Hai hoặc nhiều ký tự dạng chuỗi (tức là ký tự trong dấu nháy) cạnh nhau được nối tự động.

>>> 'Py''thon''Python'

Tính năng trên chỉ làm việc với chuỗi dạng chuỗi (literal), không áp dụng với biến hay biểu thức:

>>> prefix='Py'>>> prefix'thon'# không thể nối một biến với một chuỗi ...SyntaxError: invalid syntax>>> ('un'*3)'ium' ...SyntaxError: invalid syntax

Nếu muốn ghép nối các biến với nhau hoặc biến với chuỗi hãy sử dụng dấu +:

>>> prefix+'thon''Python'

Tính năng này đặc biệt hữu ích khi muốn bẻ các chuỗi dài thành chuỗi ngắn hơn:

>>> text=('Put several strings within parentheses '... 'to have them joined together.')>>> text'Put several strings within parentheses to have them joined together.'

Các chuỗi có thể được lập chỉ mục với ký tự đầu tiên được đánh số 0. Không có kiểu ký tự riêng biệt, mỗi ký tự đơn giản là một con số:

>>> word='Python'>>> word[0]# ký tự ở vị trí số 0'P'>>> word[5]# ký tự ở vị trí số 5'n' Chỉ số cũng có thể là số âm, bắt đầu đếm từ bên phải:
>>> word[-1]# last character'n'>>> word[-2]# second-last character'o'>>> word[-6]'P'

Lưu ý rằng vì -0 cũng tương tự như 0, nên các chỉ số âm bắt đầu từ -1.

Ngoài việc đánh số, thì cắt lát cũng được hỗ trợ. Trong khi index được sử dụng để lấy các ký tự riêng lẻ thì cắt lát sẽ cho phép bạn lấy chuỗi con:

>>> word[0:2]# các ký tự từ vị trí 0 (bao gồm) đến 2 (loại trừ)'Py'>>> word[2:5]# các ký tự từ vị trí 2 (bao gồm) đến 5 (loại trừ)'tho'

Hãy để ý đến cách các ký tự được giữ lại và loại trừ. Nó luôn đảm bảo rằng s[:i] + s[i:] bằng s:

>>> word[:2]+word[2:]'Python'>>> word[:4]+word[4:]'Python'

Các chỉ số trong cắt chuỗi có thiết lập mặc định khá hữu ích, có 2 chỉ số bị bỏ qua theo mặc định, là 0 và kích thước của chuỗi được cắt.

>>> word[:2]# các ký tự từ đầu đến vị trí thứ 2 (loại bỏ)'Py'>>> word[4:]# các ký tự từ vị trí thứ 4(lấy) đến hết'on'>>> word[-2:]# các ký tự thứ hai tính từ cuối lên (lấy) đến hết'on'

Một cách khác để ghi nhớ cách thức cắt chuỗi làm việc là hình dung các chỉ số như là vách ngăn giữa các ký tự, với ký tự ngoài cùng bên trái được đánh số 0. Khi đó, ký tự cuối cùng bên phải, trong chuỗi n ký tự sẽ có chỉ số n, ví dụ:

+---+---+---+---+---+---+|P|y|t|h|o|n|+---+---+---+---+---+---+0123456-6-5-4-3-2-1

Hàng đầu tiên của số mang đến vị trí của chỉ số từ 0 đến 6 trong chuỗi. Hàng thứ hai là các chỉ số âm tương ứng. Khi cắt từ i đến j sẽ bao gồm tất cả các ký tự nằm giữa i và j, tương ứng.

Đối với các chỉ số không âm, chiều dài của một lát cắt là sự chênh lệch của các chỉ số, nếu cả hai đều nằm trong giới hạn. Ví dụ, chiều dài của word[1:3] là 2.

Cố gắng sử dụng một chỉ mục quá lớn sẽ trả về kết quả lỗi:

>>> word[42]# từ chỉ có 6 ký tựTraceback (most recent call last): File "<stdin>", line 1, in <module>IndexError: string index out of range

Tuy nhiên, các chỉ mục bên ngoài phạm vi lát cắt vẫn được xử lý gọn gàng khi được sử dụng để cắt:

>>> word[4:42] # cắt ký tự từ vị trí thứ 4 đến 42

'on'

>>> word[42:] # cắt ký tự sau vị trí 42

''
Các chuỗi Python không thể thay đổi – chúng là cố định. Vì vậy, nếu cứ cố tình gán một ký tự nào đó cho vị trí đã được lập chỉ mục thì bạn sẽ nhận được thông báo lỗi:

>>> word[0]='J' ...TypeError: 'str' object does not support item assignment>>> word[2:]='py' ...TypeError: 'str' object does not support item assignment

Nếu cần một chuỗi khác, cách tốt nhất là tạo mới:

>>> 'J'+word[1:]'Jython'>>> word[:2]+'py''Pypy'

Hàm len() được tích hợp trong Python, sẽ trả về độ dài của chuỗi:

>>> s='supercalifragilisticexpialidocious'>>> len(s)34

1.3. Danh sách

Python biết một số loại dữ liệu phức hợp, được sử dụng để nhóm các giá trị khác nhau. Đa năng nhất là danh sách (list). Một danh sách được biểu diễn bằng dãy các giá trị, được phân tách nhau bằng dấu phẩy, nằm trong dấu []. Các danh sách có thể chứa nhiều mục với kiểu khác nhau, nhưng thông thường là các mục có cùng kiểu.

>>> squares=[1,4,9,16,25]>>> squares[1, 4, 9, 16, 25]

Giống như chuỗi (và các kiểu dữ liệu dạng chuỗi tuần tự (sequence type) khác), list có thể được đánh số và cắt lát:

>>> squares[0]# lập chỉ mục trả về một mục1>>> squares[-1]25>>> squares[-3:]# cắt list trả về một list mới[9, 16, 25]

Mọi hành động cắt list đều trả về list mới chứa những yếu tố được yêu cầu. Nếu thực hiện hành động cắt sau thì nó sẽ trả về một list mới là bản sao của list ban đầu:

>>> squares[:][1, 4, 9, 16, 25]

List cũng hỗ trợ các hoạt động như nối list:

>>> squares+[36,49,64,81,100][1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

Không giống như chuỗi, bị gán cố định, list là kiểu dữ liệu có thể thay đổi. Ví dụ, bạn có thể thay đổi các mục trong list:

>>> cubes=[1,8,27,65,125]# có vẻ sai sai>>> 4**3# lập phương của 4 là 64, không phải 65!64>>> cubes[3]=64# thay thế giá trị sai>>> cubes[1, 8, 27, 64, 125]

Bạn cũng có thể cho thêm mục mới vào cuối list bằng cách sử dụng các phương thức, chẳng hạn như append():

>>> cubes.append(216)# thêm lập phương của 6>>> cubes.append(7**3)# và lập phương của 7>>> cubes[1, 8, 27, 64, 125, 216, 343]

Việc gán cho lát cũng có thể thực hiện và thậm chí có thể thay đổi cả kích thước của list hay xóa nó hoàn toàn:

>>> letters=['a','b','c','d','e','f','g']>>> letters['a', 'b', 'c', 'd', 'e', 'f', 'g']>>> # thay thế vài giá trị>>> letters[2:5]=['C','D','E']>>> letters['a', 'b', 'C', 'D', 'E', 'f', 'g']>>> # giờ thì xóa chúng>>> letters[2:5]=[]>>> letters['a', 'b', 'f', 'g']>>> # xóa list bằng cách thay tất cả các phần tử bằng một list rỗng>>> letters[:]=[]>>> letters[]

Hàm len() cũng có thể áp dụng với list:

>>> letters=['a','b','c','d']>>> len(letters)4

Bạn cũng có thể tạo các danh sách lồng nhau (danh sách chứa trong danh sách), ví dụ:

>>> a=['a','b','c']>>> n=[1,2,3]>>> x=[a,n]>>> x[['a', 'b', 'c'], [1, 2, 3]]>>> x[0]['a', 'b', 'c']>>> x[0][1]'b'

2. Bước đầu tiên hướng tới lập trình

Tất nhiên, chúng ta có thể sử dụng Python cho những tác vụ phức tạp hơn là thêm vài phần tử vào chuỗi. Ví dụ, có thể viết một chuỗi con của dãy Fibonacci (dãy vô hạn các số tự nhiên bắt đầu bằng hai phần tử 0 và 1 hoặc 1 và 1, các phần tử sau đó được thiết lập bằng cách cộng hai phần tử trước nó lại) như sau:

>>> # Dãy Fibonacci:... # tổng của hai phần tử tạo nên phần tử tiếp theo... a,b=0,1>>> whileb<10:... print(b)... a,b=b,a+b...112358

Ví dụ này giới thiệu một số tính năng mới:

>>> i=256*256>>> print('The value of i is',i)The value of i is 65536

Có thể sử dụng thêm đối số end cho hàm print() để tránh thêm dòng mới trong kết quả đầu ra hoặc kết thúc kết quả với một chuỗi khác:

>>> a,b=0,1>>> whileb<1000:... print(b,end=',')... a,b=b,a+b...1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,

Đến đây các bạn đã bắt đầu hình dung được phần nào về Python rồi đúng không? Hãy cùng chờ đón những bài học tiếp theo về các câu lệnh, cấu trúc dữ liệu trong Python nhé.

Đọc thêm: Lệnh if, if…else, if…elif…else trong Python