Kiểu dữ liệu tuần tự❖Kiểu dữ liệu tuần tự trong python: những kiểu dữliệu chứa bên trong nó các dữ liệu con và thườngđược xử lý bằng cách lấy ra từng phần-tử-mộttheo thứ tự nào đó thường
Trang 1TRƯỜNG ĐẠI HỌC THỦY LỢI Khoa Công nghệ thông tin
Trang 3Kiểu dữ liệu tuần tự
❖Hai loại đặc trưng cơ bản trong điều khiển
➢ Sequential access: truy cập tuần tự
➢ Random access: truy cập ngẫu nhiên
❖Tuần tự: khá thông dụng trong cuộc sống, chẳng hạn
như xếp hàng, xử lý dây chuyền, lưu trữ trong băng từ,…
Trang 4Kiểu dữ liệu tuần tự
❖Kiểu dữ liệu tuần tự trong python: những kiểu dữliệu chứa bên trong nó các dữ liệu con và thườngđược xử lý bằng cách lấy ra từng phần-tử-mộttheo thứ tự nào đó (thường là bằng vòng for)
➢ Các kiểu dữ liệu chứa bên trong nó các dữ liệu nhỏ hơn thường được gọi
4
Trang 5Chương 5
Kiểu dữ liệu tuần tự List (danh sách)
Trang 6Bất biến (immutable) và Khả biến (mutable)
❖Bất biến = không thay đổi, các loại dữ liệu bất biến thông dụng trong Python: bool , int , float , str , tuple và frozenset
❖Khả biến = có thể thay đổi, các loại dữ liệu khả biến thông dụng trong Python gồm: list , set , dict
❖Chúng ta vẫn thay đổi giá trị của int, tại sao nói “bất biến”
➢Python không thực sự thay đổi giá trị của int, phần mềm tạo vùng nhớ chứa giá trị mới và cho biến “trỏ” tới vùng đó
❖Ví dụ để hiểu rõ cơ chế này:
Trang 7Giới thiệu và khai báo
❖List = dãy các đối tượng (một loại array đa năng)
❖Các phần tử con trong list không nhất thiết phải cùng kiểu dữ liệu
❖Khai báo trực tiếp: liệt kê các phần tử con đặt trong cặp ngoặc vuông ( [] ), ngăn cách bởi dấu phẩy ( , )
[1, 2, 3, 4, 5] # list 5 số nguyên
['a', 'b', 'c', 'd'] # list 4 chuỗi
[[1, 2], [3, 4]] # list 2 list con
[1, 'one', [2, 'two']] # list hỗn hợp
❖Kiểu chuỗi (str) trong python có thể xem như một list đặc biệt, bên trong gồm toàn các str độ dài 1
Trang 8Khởi tạo list
❖Tạo list bằng constructor (hàm tạo)
l1 = list([1, 2, 3, 4]) # list 4 số nguyên
l2 = list('abc') # list 3 chuỗi con
Trang 9So sánh 2 list: theo thứ tự từ điển
Trang 10Phép toán, chỉ mục và cắt
❖Giữa list và str có sự tương đồng nhất định
➢List cũng hỗ trợ 3 phép toán: ghép nối (+), nhân bản (*) và kiểm tra nội dung (in)
➢List sử dụng hệ thống chỉ mục và các phép cắt phần con tương tự như str
❖Điểm khác biệt: nội dung của list có thể thay đổi
# khởi tạo list ban đầu
Trang 11Chỉ mục, lát cắt, xóa dữ liệu với list
a = list ( 'abcde' )
print ( a ) # ['a', 'b', 'c', 'd', 'e']
a [- 1 ] = [ 0 , 5 , 9 ] # thay đổi phần tử cuối cùng
print ( a ) # ['a', 'b', 'c', 'd', [0, 5, 9]]
a [ 1 : 3 ] = [ 1 , 2 , 3 ] # thay đổi một đoạn
print ( a ) # ['a', 1, 2, 3, 'd', [0, 5, 9]]
print ( a [ 2 ::- 1 ]) # [2, 1, 'a']
a [ 2 ::- 1 ] = [ 0 ] # lỗi, đoạn ngược không thể thay đổi
del a [ 2 ::- 1 ] # xóa đoạn con từ 2 trở về đầu
print ( a ) # [3, 'd', [0, 5, 9]]
print ( a ) # lỗi, a không tồn tại
Trang 12Các phương thức của list
❖Một số phương thức thường hay sử dụng
➢count(sub, [start, [end]]) : đếm số lần xuất hiện của sub
➢index(sub[, start[, end]]) : tìm vị trí xuất hiện của sub, phát sinh lỗi ValueError nếu không tìm thấy
➢clear (): xóa trắng list
➢append(x) : thêm x vào cuối list
➢extend(x) : thêm các phần tử của x vào cuối list
➢insert (p, x) : chèn x vào vị trí p trong list
➢pop(p) : bỏ phần tử thứ p ra khỏi list (trả về giá trị của phần tử đó), nếu không chỉ định p thì lấy phần
tử cuối
12
Trang 13Các phương thức của list
❖Một số phương thức thường hay sử dụng
➢copy (): tạo bản sao của list (tương tự list[:])
➢remove(x) : bỏ phần tử đầu tiên trong list có giá trị x, báo lỗi ValueError nếu không tìm thấy
➢reverse() : đảo ngược các phần tử trong list
➢sort(key=None, reverse=False) : mặc định là sắp xếp các phần tử từ bé đến lớn trong list bằng cách so sánh trực tiếp giá trị
x = “Dai hoc Thuy loi”.split()
Trang 14Các phương thức của list
❖Ví dụ:
14
Trang 15Ví dụ về sắp xếp với list
a = [ '123' , '13' , '90' , "-1" , - 100 ]
a sort () # lỗi, vì các phần tử không cùng kiểu
a [- 1 ] = '-100' # thay đổi phần tử cuối thành dạng chuỗi
a sort () # xếp tăng dần theo so sánh chuỗi
Trang 16Duyệt list với vòng lặp for
my_list = [ 'foo' , 'bar' , 'baz' , 'noo’ ]
# duyệt các phần tử, cách làm đơn giản nhất
for item in my_list :
print ( item )
# duyệt các phần tử theo giá trị chỉ mục
for i in range ( len ( my_list )):
Trang 17Ví dụ về làm việc với list
# tạo và in nội dung của một list
danhsach = ["apple", "banana", "cherry"]
Trang 18Một số thao tác thông dụng với list
Trang 19Bài tập
1 Tính tổng các số nguyên lẻ
Nhập số nguyên dương n và danh sách gồm n số
nguyên a0, a1, …an-1 Hãy tính tổng các số nguyên
dương lẻ có trong dãy.
Trang 20Bài tập 1
Tính tổng các số nguyên lẻ: Nhập số nguyên dương n và danh sách gồm n số nguyên a0, a1, …an-1 Hãy tính tổng các số nguyên dương lẻ có trong dãy.
20
Trang 21Bài tập
2 Nhập n số nguyên và k (0<k<=n, n>=5)
Tổng k số hạng liên tiếp có tổng lớn nhất?
Trang 22Bài tập 2
Nhập n số nguyên và k (0<k<=n, n>=5) Tổng k số hạng liên tiếp có tổng lớn nhất?
22
Trang 25Bài tập 3 Sàng số nguyên tố
Eratosthenes
❖Ý tưởng thuật toán:
Sử dụng 1 danh sách List gồm N =10 7 phần tử với ý nghĩa:
Ta nhận thấy với mỗi số tự nhiên a (2,3, ,N) a sẽ không là số
nguyên tố khi và chỉ khi có thể phân tích a = i x k với i là
một số nguyên tố i<=k suy ra i<=sqrt(a)
Trang 26Bài tập 3 Sàng số nguyên tố
Eratosthenes
26
Trang 27Sàng số nguyên tố Eratosthenes
Trang 28Bài tập vận dụng: Chọn số
❖ Cho dãy số nguyên gồm n số hạng Hãy chọn các
số hạng của dãy sao cho:
- Không chọn 2 số hạng kề nhau
- Tổng các số hạng được chọn là giá trị lớn nhất
Ví dụ: Dãy 1 , -2, 3 , 2 , 6 thì sẽ chọn: 1, 3, 6
28
Trang 29Ma trận – danh sách hai chiều
Trong Python, các phần tử trong danh sách có thể
là một danh sách Một ma trận hay 1 mảng 2 chiều
được biểu diễn như một danh sách mà mỗi phần tử của nó là một danh sách biểu diễn các phần tử trên
Trang 30Ma trận – danh sách hai chiều
Các dòng cột của ma trận được đánh chỉ số từ 0
<danh sách>[chỉ số hàng][chỉ số cột]
Ví dụ: In các phần tử của ma trận
30
Trang 31Ma trận – danh sách hai chiều
Ví dụ: Viết chương trình nhập vào một ma trận gồm
m hàng và n cột In ra ma trận được nhập.
Trang 32Ma trận – danh sách hai chiều
Ví dụ: Viết chương trình nhập vào một ma trận gồm
m hàng và n cột (0<=m, n<=5) In ra ma trận được nhập.
32
Trang 33Ma trận – danh sách hai chiều
Ví dụ: Viết chương trình nhập vào một ma trận
gồm m hàng và n cột (0<=m, n<=5) In ra ma
trận được nhập.
Trang 36Bài tập
36
Trang 37Ma trận chuyển vị
❖ Nhập ma trận A gồm m hàng và n cột Tìm ma trận chuyển vị AT của A.
Trang 38Ma trận chuyển vị
❖ Nhập ma trận A gồm m hàng và n cột Tìm ma trận chuyển vị AT của A.
Trang 39Ma trận chuyển vị
Nhập ma trận A gồm m hàng và n cột Tìm ma trận chuyển vị
AT của A.
Trang 41Bài tập
𝐶𝑚×𝑛 = 𝐴𝑚×𝑘 ∗ 𝐵𝑘×𝑛
Trang 42𝐶𝑚×𝑛 = 𝐴𝑚×𝑘 ∗ 𝐵𝑘×𝑛
Trang 43Danh sách của danh sách
Trang 44Bài tập
1 Tổng các số hạng liên tiếp trong dãy có giá trị lớn nhất
2 Tạo 1 danh sách n số nguyên bằng cách tạo ngẫu nhiên
trong khoảng từ [0,10 7 ] Hãy thống kê danh sách xem mỗi
phần tử xuất hiện bao nhiêu lần?
3 Dãy con tăng dài nhất: xét dãy số a gồm n số nguyên
Trang 45Bài tập
Dãy con tăng dài nhất: xét dãy số a gồm n số nguyên
a0,a1, ,an-1
Trang 46Bài tập
Dãy con tăng dài nhất: xét dãy số a gồm n số nguyên
a0,a1, ,an-1
46
Trang 50Bài tập Tìm số nguyên tố trong dãy n số nguyên (n>5)
Trang 51Bài tập
Nhập số nguyên dương n Tạo 1 danh sách gồm
n số Fibonacci Xuất danh sách theo hàng, mỗiphần tử cách nhau 1 dấu cách “ ”
Minh họa chương trình:
Trang 52List n số Fibinacci đầu tiên
Trang 53Bài tập
Nhập số nguyên dương n Tạo 1 danh sách gồmcác số Fibonacci nhỏ hơn n Xuất danh sách theohàng, mỗi phần tử cách nhau 1 dấu cách “ ”
Minh họa chương trình:
Trang 54In ra list gồm các số Fibonacci nhỏ hơn n
54
Trang 55Chương 5
Kiểu dữ liệu tuần tự Tuple (Hàng/Bộ)
Trang 56Tuple là một dạng readonly list
❖Tuple = dãy các đối tượng (list), nhưng không
thể bị thay đổi giá trị trong quá trình tính toán
❖Như vậy chuỗi giống tuple nhiều hơn list
❖Khai báo trực tiếp bằng cách liệt kê các phần tử
con đặt trong cặp ngoặc tròn (), ngăn cách bởi
phẩy
(1, 2, 3, 4, 5) # tuple 5 số nguyên
('a', 'b', 'c', 'd') # tuple 4 chuỗi
(1, 'one', [2, 'two']) # tuple hỗ hợp
56
Trang 57Khai báo tuple không nhất thiết phải dùng ()
t3 = ( 1 , 'one' , [ 2 , 'two' ]) # tuple hỗn hợp
t4 = 1 , 'one' , [ 2 , 'two' ] # tuple hỗn hợp
Trang 58Tuple và list nhiều điểm giống nhau
❖Tuple có thể tạo bằng constructor hoặc generator
(bộ sinh) – một cách viết tương tự list
comprehension
❖Tuple hỗ trợ 3 phép toán: +, *, in
❖Tuple cho phép sử dụng chỉ mục và cắt
❖Các phương thức thường dùng của tuple
➢count(v): đếm số lần xuất hiện của v trong
Trang 59Bộ sinh của tuple chỉ dùng được 1 lần
# t0 viết giống như bộ suy diễn danh sách
print ( t0 ) # <generator object <genexpr> at XXXX>
print ( t1 ) # ('H', 'e', 'l', 'l', 'o', '!')
print ( t2 ) # () <~~ như vậy t0 chỉ dùng được một lần
Trang 60Tính bất biến của kiểu tuple
60
Trang 61Hàm dựng sẵn làm việc với list và tuple
➢Hàm all (X): trả về True nếu tất cả các phần tử của X đều
là True hoặc tương đương với True hoặc x rỗng
➢Hàm any (X): trả về True nếu có ít nhất một phần tử của X
là True hoặc tương đương với True
➢Hàm len (X): trả về số lượng phần tử của X
➢Hàm list (X): tạo một list gồm các phần tử con của X
➢Hàm max (X): trả về giá trị lớn nhất trong X
➢Hàm min (X): trả về giá trị nhỏ nhất trong X
➢Hàm sorted (X): trả về danh sách mới gồm các phần tử của
X đã được sắp xếp
Trang 62Ví dụ
❖Viết chương trình nhập vào 1 bộ (tuple) gồm n sốnguyên (a0, a1, , an-1) Tính tổng các số nguyên lẻ/ chẵn trong tuple
Trang 63Tổng các số chẵn/lẻ trong tuple n số nguyên
Trang 64Ví dụ
❖Viết chương trình nhập vào 1 bộ (tuple) P gồm
n số nguyên (a0, a1, , an-1) Lưu các số chính phương có trong tuple P trong tuple CP.
Trang 65Tuple các số chính phương
Trang 66Ví dụ
66Tạo tuple P gồm các số nguyên tố nhỏ hơn n Số
nguyên tố là số tự nhiên có 2 ước số là 1 và chính nó
Trang 67Tuple P gồm các số nguyên tố nhỏ hơn n
Trang 68Tuple P chứa các số nguyên tố trong khoảng n đến2n
Minh họa:
Ví dụ
Trang 69Tuple P gồm các số nguyên tố trong khoảng
n đến 2n
Trang 71Bài tập dãy số ngẫu nhiên
#Nhap day so ngau nhien
from random import *
n = int(input("Nhap n = "))
print("Tao day n so ngau nhien trong khoang [0, 10]")
A = [randint(0,10) for i in range(n)]
Trang 72Ví dụ tổng hợp
❖Lưu thông tin của n sinh viên trong 1 danh sách
L, mà mỗi phần tử của danh sách là 1 bộ (Tên, Điểm Toán, Điểm Tin, Điểm Anh)
Trang 73Ví dụ tổng hợp
❖Lưu thông tin của n sinh viên trong 1 danh sách L, mà mỗi phần tử của danh sách là 1 bộ (Tên, Điểm Toán, Điểm Tin, Điểm Anh)
Trang 74Danh sách sinh viên
Trang 78Chương 5
Kiểu dữ liệu tuần tự Range (miền)
Trang 79Range là một tuple đặc biệt?
❖Chúng ta đã làm quen với range khi dùng vòng for
➢range(stop) : tạo miền từ 0 đến stop-1
➢range(start, stop[, step]) : tạo miền từ start đến stop-1,
với bước nhảy là step
▪ Nếu không chỉ định thì step = 1
▪ Nếu step là số âm sẽ tạo miền đếm giảm dần (start > stop)
❖Vậy range khác gì một tuple đặc biệt
➢Range chỉ chứa số nguyên
➢Range nhanh hơn rất nhiều
➢Range chiếm ít bộ nhớ hơn
Trang 80Tóm tắt nội dung bài
❖Ngoài kiểu chuỗi ( str ), Python có những kiểu dữ liệu tuần tự khác: danh sách ( list ), hàng ( tuple ), miền ( range )
❖Danh sách là kiểu tuần tự mạnh mẽ và uyển chuyển:
➢Có thể chứa bên trong nó tất cả các loại dữ liệu
➢Nhiều cách khởi tạo:
▪ Khai báo trực tiếp trong cặp ngoặc vuông
▪ Khởi tạo bằng hàm list
▪ Khởi tạo bằng một đoạn for ngắn (bộ suy diễn danh sách)
➢Duyệt các phần tử con bằng vòng lặp hoặc truy cập qua chỉ số
➢Hỗ trợ các phép toán: ghép nối (+), nhân bản (*), kiểm tra (in)
➢Hai danh sách có thể so sánh với nhau theo thứ tự từ điển
➢Phép cắt lát cho phép lấy phần con của danh sách dễ dàng
➢Rất nhiều phương thức hỗ trợ khác
80
Trang 81Tóm tắt nội dung bài
❖Hàng cũng là một dãy các dữ liệu như danh sách, nhưng không thể
thay đổi sau khi khởi tạo
➢ Cũng có 3 cách khởi tạo:
▪ Khai báo trực tiếp trong cặp ngoặc tròn
▪ Khởi tạo bằng hàm tuple
▪ Khởi tạo bằng hàm sinh (một loại bộ suy diễn dành cho kiểu hàng)
➢ Cũng duyệt phần tử con bằng for hoặc truy cập qua chỉ mục
➢ Cũng hỗ trợ các phép toán +, *, in và cắt lát
➢ Các phương thức hỗ trợ chỉ có đếm (count) và tìm kiếm (index)
➢ Hàng nhanh hơn danh sách, vì hàng “tĩnh” hơn
❖Miền là kiểu dữ liệu thiết kế đặc biệt cho vòng for theo chỉ số, nhưng cũng có một vài đặc trưng của kiểu dữ liệu tuần tự như kiểm tra, chỉ
mục, cắt lát,
Trang 82Một số kiểu dữ liệu trong Python
Text Type str
Numeric Types int, float, complex
Sequence Types list, tuple, range
Mapping Type dict
Set Types set, frozenset
Boolean Type bool
Binary Types bytes, bytearray, memoryview
Trang 83% Modulus x % y
** Exponentiation x ** y
Trang 84Một số toán tử gán
= x = 5 x = 5 += x += 3 x = x + 3 -= x -= 3 x = x - 3
*= x *= 3 x = x * 3 /= x /= 3 x = x / 3
%= x %= 3 x = x % 3 //= x //= 3 x = x // 3
Trang 85>= Greater than or equal to x >= y
<= Less than or equal to x <= y
Trang 86Một số toán tử logic
and Returns True if both
statements are true
x < 5 and x < 10
or Returns True if one of
the statements is true
x < 5 or x < 4
not Reverse the result,
returns False if the result is true
not(x < 5 and x < 10)
Trang 87Một số toán tử trên bit
^ XOR Sets each bit to 1 if only one of two bits is 1
<< Zero fill left shift Shift left by pushing zeros in from the right
and let the leftmost bits fall off
>> Signed right shift Shift right by pushing copies of the leftmost
bit in from the left, and let the rightmost bits
fall off
Trang 88Bài tập
Trang 89Bài tập
1) Người dùng nhập từ bàn phím liên tiếp các từ tiếng
Anh viết tách nhau bởi dấu cách Hãy nhập chuỗi đầu
vào và tách thành các từ sau đó in ra màn hình các từ
đó theo thứ tự từ điển.
2) Người dùng nhập từ bàn phím chuỗi các số nhị phân
viết liên tiếp được nối nhau bởi dấu phẩy Hãy nhập
chuỗi đầu vào sau đó in ra những giá trị được nhập.
3) Nhập số n, in ra màn hình các số nguyên dương nhỏ
hơn n có tổng các ước số lớn hơn chính nó.
4) Nhập vào một chuỗi từ người dùng, kiểm tra xem đó
có phải địa chỉ email hợp lệ hay không?
5) Nhập n, in n dòng đầu tiên của tam giác Pascal
Trang 907.Tạo tuple P gồm các số nguyên tố nhỏ hơn 1 triệu
➢Số nguyên tố là số tự nhiên có 2 ước số là 1 và chính nó.
8.*Liệt kê các chuỗi độ dài ít hơn N của tuple X gồm các chuỗi được định nghĩa như sau:
➢Chuỗi A = ‘()’ thuộc X
➢Nếu chuỗi A thuộc X thì chuỗi (A) cũng thuộc X
➢Nếu chuỗi A và B thuộc X thì chuỗi AB cũng thuộc X
90
Trang 91Bài tập
Tạo tuple P gồm các số nguyên tố nhỏ hơn 1 triệu
Số nguyên tố là số tự nhiên có 2 ước số là 1 vàchính nó
→Dùng thuật toán kiểm tra số nguyên tố thôngthường không hiệu quả khi n lớn, ví dụ n =1000000
→ Cần có phương pháp hiệu quả: Phương phápsàng số nguyên tố
Trang 92Thuật toán tìm số nguyên tố thông thường
Trang 93Thuật toán sàng số nguyên tố
#Thuat toan sang nguyen to nho hon N
if L[i]==1:
Trang 94Thuật toán sàng số nguyên tố
#Thuat toan sang nguyen to nho hon N
NT = [i for i in range(N) if L[i]==1] #NT: list nguyen to print("Danh sach cac so nguyen to nho hon %d:"%N) print(NT)
Trang 95Thuật toán sàng số nguyên tố
#Thuat toan sang nguyen to nho hon N
NT = tuple (i for i in range(N) if L[i]==1)
Trang 96Sàng Atkin
➢ Tất cả các số dư là số dư khi chia cho sáu mươi (chia cho 60 và xét số dư).
➢ Tất cả các số, bao gồm cả x và y đều là số nguyên dương.
➢ Đảo một ô trong sàng nghĩa là thay đổi đánh dấu (là số nguyên tố hoặc
không) thành ngược lại.
1 Tạo bảng kết quả, điền vào 2, 3, và 5.
2 Tạo bảng sàng nguyên tố với các số nguyên dương; tất cả các số đánh
dấu là không nguyên tố.
3 Với tất cả các số trong sàng:
▪ Nếu số đó chia 60 dư 1, 13, 17, 29, 37, 41, 49, hoặc 53, đảo đánh dấu cho
các số ở 4x 2 +y 2 = số đang xét.
▪ Nếu số đó chia 60 dư 7, 19, 31, hoặc 43, đảo các ô 3x 2 +y 2 = số đang xét.
▪ Nếu số đó chia 60 dư 11, 23, 47, hoặc 59, đảo các số 3x 2 - y 2 = số đang xét.
▪ Còn lại, không làm gì cả
4 Bắt đầu từ số nhỏ nhất trong sàng.
5 Lấy các số tiếp theo trong sàng được đánh dấu là nguyên tố.
6 Thêm vào danh sách kết quả.
7 Bình phương số đó và đánh dấu các bội số của số đó là không phải số
nguyên tố.
8 Lặp lại bước 5 cho tới bước 8.