Lưu ý rằng chúng ta muốn duyệt qua chính lịch sử giao dịch, vì vậy bạn có thể sử dụng danh sách lịch sử giao dịch như là cơ sở cho việc duyệt qua iterable.Cuối cùng, bạn sẽ có thể chạy đ
Trang 1( Bản Dịch : Tiếng Việt)
Nhóm 19
Trang 2Bài tập 31.6
Mục tiêu của bài tập này là làm việc với một tập hợp/danh sách
(collection/container), ví dụ như một danh sách (list)
Để làm điều này, chúng ta sẽ quay lại với các lớp liên quan đến Tài khoản (Account)
Bạn cần sửa đổi lớp Account sao cho nó có thể lưu trữ lịch sử các giao dịch
Một giao dịch (Transaction) là một bản ghi của một lần gửi tiền (deposit) hoặc rút
tiền (withdrawal) kèm theo một số tiền
Lưu ý rằng số tiền ban đầu trong tài khoản có thể được xem như là một giao dịch gửi tiền ban đầu
Lịch sử giao dịch có thể được triển khai dưới dạng một danh sách chứa các giao dịch theo thứ tự thời gian Mỗi giao dịch có thể được định nghĩa bởi một lớp (class) với các thuộc tính là hành động (deposit hoặc withdrawal) và số tiền giao dịch
Mỗi khi có một giao dịch gửi tiền hoặc rút tiền, một bản ghi giao dịch mới sẽ được thêm vào danh sách lịch sử giao dịch
Sau đó, bạn cần hỗ trợ việc duyệt qua lịch sử giao dịch của tài khoản sao cho có thể xem lại từng giao dịch gửi tiền hoặc rút tiền Bạn có thể làm điều này bằng cách triển khai giao thức Iterable (tham khảo chương cuối cùng nếu bạn cần xem cách làm)
Lưu ý rằng chúng ta muốn duyệt qua chính lịch sử giao dịch, vì vậy bạn có thể sử dụng danh sách lịch sử giao dịch như là cơ sở cho việc duyệt qua (iterable).Cuối cùng, bạn sẽ có thể chạy đoạn mã sau trong ứng dụng của mình:
Tùy thuộc vào các giao dịch bạn đã thực hiện (gửi tiền và rút tiền), bạn sẽ nhận được một danh sách các giao dịch được in ra như sau:
Trang 332.2 Tạo một Set
Một Set được định nghĩa bằng cách sử dụng dấu ngoặc nhọn (ví dụ: {}).{}
Ví dụ: Khi chạy đoạn mã sau, ta sẽ thấy rằng từ "apple" chỉ được thêm vào Set mộtlần:
Lưu ý rằng vì Set là một tập hợp không có thứ tự, bạn không thể truy cập các phần
tử của Set bằng cách sử dụng chỉ số (index)
Kết Quả :
Trang 4Ở đây, mặc dù chúng ta đã thêm "apple" và "orange" hai lần, nhưng Set sẽ tự động loại bỏ các phần tử trùng lặp, và mỗi phần tử chỉ xuất hiện một lần trong tập hợp.
32.3 Hàm Khởi Tạo Set()
Giống như các kiểu dữ liệu Tuple và List, Python cung cấp một hàm đã được định nghĩa sẵn có thể chuyển đổi bất kỳ kiểu đối tượng nào có thể lặp lại (iterable) thànhmột Set Cú pháp của hàm là:
set(iterable)
Với một đối tượng có thể lặp lại (iterable), hàm này sẽ trả về một Set mới được tạo
ra từ các giá trị lấy từ đối tượng đó Điều này có nghĩa là một Set có thể dễ dàng được tạo ra từ List Tuple Dictionary, , , hoặc bất kỳ kiểu dữ liệu nào tuân thủ giao thức iterable
Ví dụ: Đoạn mã sau sẽ chuyển đổi một Tuple thành một Set:
32.4 Truy Cập Các Phần Tử trong Set
Khác với List, bạn không thể truy cập các phần tử trong Set thông qua chỉ số (index) Điều này là do Set là một tập hợp không có thứ tự, vì vậy không có chỉ số
để truy cập các phần tử
Tuy nhiên, Set vẫn là một tập hợp có thể lặp qua được (Iterable) Bạn có thể lặp qua các phần tử của Set bằng cách sử dụng câu lệnh for:
Trang 5Ví dụ:
for item basket: in
print(item)Câu lệnh trên sẽ áp dụng hàm print cho từng phần tử trong Set một cách lần lượt
32.5 Làm Việc với Sets
32.5.1 Kiểm Tra Sự Tồn Tại của Một Phần Tử
Bạn có thể kiểm tra sự tồn tại của một phần tử trong Set bằng cách sử dụng từ khóa
in, ví dụ:
Print (‘apple’ in basket)
Dòng lệnh này sẽ in ra True nếu 'apple' là một phần tử của set basket
32.5.2 Thêm Mục Vào Set
Có thể thêm các mục vào một Set bằng phương thức add():
basket = {'apple', 'orange', 'banana'}
basket.add('apricot')
print(basket)
Kết quả:
{'orange', 'apple', 'banana', 'apricot', ‘pear’}
Nếu bạn muốn thêm nhiều mục vào một Set, bạn có thể sử dụng phương thức
update():
basket = {‘apple’, ‘orange’, ‘banana’ }
basket.update(['apricot', 'mango', 'grapefruit'])
print(basket)
Kết quả:
{'orange', 'apple', 'mango', 'banana', 'apricot', 'grapefruit'}
Giải thích:
Trang 6 Tham số truyền vào phương thức update() có thể là một set list tuple, , , hoặc dictionary.
Phương thức update() tự động chuyển đổi tham số vào thành một Set nếu
nó chưa phải là Set, và sau đó thêm các giá trị vào Set gốc
32.5.3 Thay Đổi Mục Trong Set
Không thể thay đổi các mục đã có trong Set
32.5.4 Lấy Độ Dài của Một Set
Giống như các lớp tập hợp (collection/container) khác, bạn có thể lấy độ dài của một Set bằng cách sử dụng hàm len()
basket = {'apple', 'orange', 'apple', 'pear', 'orange', 'banana'}
print(len(basket)) # generates 4
32.5.5 Lấy Giá Trị Tối Đa và Tối Thiểu trong một Set
Bạn cũng có thể lấy giá trị lớn nhất hoặc nhỏ nhất trong một Set bằng cách sử dụngcác hàm max() và min():
print(max(a_set)) # Lấy giá trị lớn nhất trong a_set
print(min(a_set)) # Lấy giá trị nhỏ nhất trong a_set
32.5.6 Xóa Một Mục trong Set
Để xóa một mục trong Set, bạn có thể sử dụng các hàm remove() hoặc discard()
remove() sẽ xóa một mục trong Set, nhưng nếu mục đó không có trong Set
thì sẽ gây ra lỗi
discard() cũng xóa một mục trong Set, nhưng nếu mục đó không có trong
Set, thì sẽ không gây ra lỗi
Trang 7basket = {'apple', 'orange', 'apple', 'pear', 'orange', 'banana'}
{'pear', 'banana', 'orange', 'apple'}
{'pear', 'banana', 'orange'}
Cũng có một phương thức pop() có thể được sử dụng để xóa một phần tử (và trả vềphần tử đó như kết quả khi thực thi phương thức) Tuy nhiên, nó sẽ xóa một phần
tử "cuối cùng" trong set (dù rằng vì set không có thứ tự nên bạn sẽ không biết phần
tử nào sẽ bị xóa)
Phương thức clear() được sử dụng để xóa tất cả các phần tử khỏi set:
basket = {'apple', 'orange', 'banana'}
remove(): Xóa một phần tử khỏi Set, gây lỗi nếu phần tử không tồn tại
discard(): Xóa một phần tử khỏi Set, không gây lỗi nếu phần tử không tồn tại
pop(): Xóa một phần tử và trả về phần tử đó, không xác định được phần tử nào bị xóa do Set không có thứ tự
Trang 8 clear(): Xóa tất cả các phần tử trong Set.
len(): Trả về số lượng phần tử trong Set
max() và min(): Lấy giá trị lớn nhất và nhỏ nhất trong Set
32.5.7 Lồng các Set
Có thể chứa bất kỳ đối tượng bất biến nào trong một set Điều này có nghĩa là một set có thể chứa một tham chiếu đến một Tuple (vì Tuple là bất biến) Vì vậy, bạn có thể viết mã như sau:
#Không thể có các phần tử sau đây
s2 = { {1, 2, 3} }
print(s2)
s3 = { [1, 2, 3] }
print(s3)
Tuy nhiên, bạn có thể sử dụng Frozenset (một loại Set bất biến) và lồng các
Frozenset trong một Set Frozenset giống hệt như một Set, nhưng nó là bất biến (không thể thay đổi) và vì vậy có thể được lồng trong một Set
#Cần chuyển đổi các set và list thành frozensets.
s2 = { frozenset({1, 2, 3}) }
print(s2)
Trang 9 Bạn có thể lồng Tuple trong Set vì Tuple là bất biến.
Bạn không thể lồng List hoặc Set trong Set vì chúng không phải là bất biến
Frozenset là một loại Set bất biến và có thể được lồng trong một Set
32.6 Các phép toán tập hợp
Bộ chứa tập hợp cũng hỗ trợ các phép toán giống tập hợp như (|), giao (&),hiệu (−) và hiệu đối xứng (^) Các phép toán này dựa trên lý thuyết tập hợp đơn giản
Cho hai tập hợp:
print('Union:', s1 | s2)
Ví dụ, Hợp của hai tập hợp biểu diễn sự kết hợp của tất cả các giá trị trong hai tập
hợp:
s1 = {'apple', 'orange', 'banana'}
s2 = {'grapefruit', 'lime', 'banana'}
Lệnh này sẽ in ra:
Union: {'apple', 'lime', 'banana', 'grapefruit', 'orange'}
Giao của hai tập hợp biểu diễn các giá trị chung giữa hai tập hợp:
Trang 10Difference: {'apple', 'orange'}
Sự khác biệt đối xứng biểu diễn tất cả các giá trị duy nhất trong hai tập hợp (tức là
nó là nghịch đảo của giao điểm:
print('Symmetric Difference:', s1 ^ s2)
Đầu ra từ hoạt động cuối cùng này là
Symmetric Difference: {'orange', 'apple', 'lime', 'grapefruit'}
Trang 11Ngoài các toán tử còn có các phiên bản phương thức:
• s1.union(s2) tương đương với s1 | s2
• s1.interaction(s2) tương đương với s1 & s2
• s1.difference(s2) tương đương với s1 − s2
• s1.symmetric_difference(s2) tương đương với s1 ^ s2
Trang 12Các tài nguyên trực tuyến trên các bộ được liệt kê dưới đây:
Mục tiêu của bài tập này là sử dụng một tập hợp (Set)
Hãy tạo hai tập hợp sinh viên: một tập hợp cho những người đã tham gia kỳ thi
và một tập hợp cho những người đã nộp dự án Bạn có thể sử dụng các chuỗi đơn giản để đại diện cho các sinh viên, ví dụ như:
Cấu hình các tập hợp:
#Cấu hình các set
exam = {' Andrew', 'Kirsty', 'Beth', 'Emily', 'Sue '}
project = {'Kirsty', 'Emily', 'Ian', 'Stuart'}
# Xuất ra các tập hợp cơ bản
print('exam:', exam)
print('project:', project)
Sử dụng các tập hợp này, hãy trả lời các câu hỏi sau:
Những sinh viên nào đã tham gia cả kỳ thi và nộp dự án?
Những sinh viên nào chỉ tham gia kỳ thi?
Những sinh viên nào chỉ nộp dự án?
Trang 13 Liệt kê tất cả sinh viên đã tham gia kỳ thi hoặc nộp dự án (hoặc cả hai).
Liệt kê tất cả sinh viên đã tham gia kỳ thi hoặc nộp dự án (nhưng không phải
về một Từ điển với một tập hợp các quốc gia và thủ đô của chúng Lưu ý rằng trong một Từ điển, các khóa phải là duy nhất, nhưng các giá trị không nhất thiếtphải duy nhất
Trang 14 Tùy chọn đầu tiên nhận một chuỗi các cặp khóa: giá trị.
Tùy chọn thứ hai nhận một bản đồ (mapping) và (tùy chọn) một chuỗi các cặp khóa: giá trị
Phiên bản thứ ba nhận một dãy các cặp khóa: giá trị và một chuỗi các cặp khóa: giá trị (tùy chọn)
Dưới đây là một số ví dụ minh họa:
# Lưu ý: các khóa không phải là chuỗi
dict1 = dict(uk=' London ', ireland= 'Dublin', france=' Paris' )
print('dict1:', dict1)
# Các cặp khóa: giá trị là tuple
Trang 15dict2 = dict([('uk', 'London'), ( 'ireland', 'Dublin' ), ( 'france', 'Paris')])
print('dict2:', dict2)
# Các cặp khóa: giá trị là danh sách
dict3 = dict(([ 'uk', 'London' ], [ 'ireland', 'Dublin' ], [ 'france', 'Paris']))
print('dict3:', dict3)
Kết quả in ra:
dict1: {'uk': 'London', 'ireland': 'Dublin', 'france': 'Paris'}
dict2: {'uk': 'London', 'ireland': 'Dublin', 'france': 'Paris'}
dict3: {'uk': 'London', 'ireland': 'Dublin', 'france': 'Paris'}
33.3 Làm việc với Dictionaries
33.3.1 Truy cập các mục thông qua Keys
Bạn có thể truy cập các giá trị trong một Dictionary bằng cách sử dụng
khóa (key) tương ứng của chúng Điều này có thể được chỉ định bằng cách sử
dụng cú pháp dấu ngoặc vuông ('[]') (nơi khóa được đặt trong ngoặc vuông) hoặc phương thức get()
Trang 16cities['France'] = 'Paris'
33.3.3 Thay đổi giá trị khóa
Giá trị liên kết với khóa có thể được thay đổi bằng cách gán lại giá trị mới bằng
ký hiệu dấu ngoặc vuông, ví dụ:
cities['Wales'] = 'Swansea'
print(cities)
Bây giờ sẽ hiển thị 'Swansea' là thủ đô của xứ Wales:
{'Wales': 'Swansea', 'England': 'London', 'Scotland': 'Edinburgh', 'Northern Ireland': 'Belfast', 'Ireland': 'Dublin'}
• Phương thức popitem() xóa mục được chèn cuối cùng trong từ điển (mặc
dù trước Python 3.7,một mục ngẫu nhiên trong từ điển đã bị xóathay vào đó!) Cặp khóa:giá trị đang bị xóa được trả về từ phương thức
Từ khóa del xóa mục có khóa được chỉ định khỏi từ điển.Từ khóa này chỉ xóa mục; nó không trả về giá trị liên quan Nó có khả năng hiệu quả hơn pop(<key>)
Ví dụ về từng loại được đưa ra dưới đây:
Cities = {'Wales': 'Cardiff',
'England': 'London',
'Scotland': 'Edinburgh’,
Trang 17'Northern Ireland': 'Belfast',
Đầu ra của đoạn mã này như sau:
{'Wales': 'Cardiff', 'England': 'London', 'Scotland': 'Edinburgh', 'Northern Ireland': 'Belfast', 'Ireland': 'Dublin'}
{'Wales': 'Cardiff', 'England': 'London', 'Scotland': 'Edinburgh', 'Northern Ireland': 'Belfast'}
{'Wales': 'Cardiff', 'England': 'London', 'Scotland': 'Edinburgh'}
{'Wales': 'Cardiff', 'England': 'London'}
Ngoài ra, phương thức clear() sẽ xóa tất cả các mục trong từ điển:
cities = {'Wales': 'Cardiff',
Trang 18print(cities)
Tạo ra kết quả sau
{'Wales': 'Cardiff', 'England': 'London', 'Scotland': 'Edinburgh', 'Northern Ireland': 'Belfast', 'Ireland': 'Dublin'} {}
Lưu ý rằng từ điển rỗng được biểu diễn bằng '{}' ở trên, trong đó tập rỗng được biểu diễn là set()
33.3.5 Lặp qua các Khóa
Bạn có thể lặp qua một từ điển bằng cách sử dụng câu lệnh vòng lặp for Vòng lặp for xử lý từng khóa trong từ điển theo lượt Điều này có thể được sử dụng
để truy cập từng giá trị được liên kết với các khóa, ví dụ:
for country cities: in
Belfast Ireland, Dublin
Nếu bạn muốn lặp lại tất cả các giá trị trực tiếp, bạn có thể thực hiện bằng phương thức values() Phương thức này trả về một tập hợp tất cả các giá trị, tất nhiên bạn có thể lặp lại:
for e d.values(): in
print(e)
Trang 1933.3.6 Các giá trị, khóa và mục (Items)
Có ba phương thức cho phép bạn truy cập vào các nội dung của một
dictionary, đó là values() keys(), và items()
Phương thức values() trả về một view (cửa sổ) đối với các giá trị của dictionary
Phương thức keys() trả về một view đối với các khóa của dictionary
Phương thức items() trả về một view đối với các mục của dictionary (các cặp khóa-giá trị)
Một view cung cấp một cửa sổ động vào các mục trong dictionary, có nghĩa là khi dictionary thay đổi, view sẽ phản ánh những thay đổi đó
Đoạn mã sau đây sử dụng dictionary cities với ba phương thức này:
print(cities.values())
print(cities.keys())
print(cities.items())
Kết quả xuất ra cho thấy rõ rằng tất cả chúng đều liên quan đến một dictionary
bằng cách chỉ ra rằng kiểu dữ liệu là dict_values dict_keys hoặc dict_items, dict_values(['Cardiff', 'London', 'Edinburgh', 'Belfast', 'Dublin'])
dict_keys(['Wales', 'England', 'Scotland', 'Northern Ireland', 'Ireland'])
dict_items([('Wales', 'Cardiff'), ('England', 'London'), ('Scotland', 'Edinburgh'), ('Northern Ireland', 'Belfast'), ('Ireland', 'Dublin')])
33.3.7 Kiểm tra sự có mặt của khóa
Bạn có thể kiểm tra xem một khóa có phải là thành viên của một dictionary hay không bằng cách sử dụng cú pháp (và kiểm tra xem nó không có trong in
dictionary bằng cú pháp not in), ví dụ:
print('Wales' cities) in
print('France' not in cities)
Trang 20Cả hai đều in ra True đối với dictionary cities.
33.3.8 Lấy độ dài của một Dictionary
Một lần nữa, giống như các lớp tập hợp khác, bạn có thể biết độ dài của một
Dictionary (theo số cặp khóa:giá trị) bằng cách sử dụng hàm len()
cities = {'Wales': 'Cardiff',
Một mẫu phổ biến là khi giá trị trong một dictionary lại chính là một container, chẳng hạn như List Tuple Set, , hoặc thậm chí là một Dictionary khác
Ví dụ dưới đây sử dụng Tuples để đại diện cho các tháng trong các mùa:
seasons = {'Spring': ('Mar', 'Apr', 'May'),
'Summer': ('June', 'July', 'August'),
'Autumn': ('September', 'October', 'November'),
'Winter': ('December', 'January', 'February')}
Trang 21Mỗi mùa có một Tuple làm phần giá trị của mục (entry) Khi Tuple này được trả
về bằng cách sử dụng khóa, nó có thể được xử lý giống như bất kỳ Tuple nào khác.
Lưu ý rằng trong trường hợp này, chúng ta hoàn toàn có thể sử dụng một List hoặc thậm chí là một Set thay vì Tuple.
33.4 Lưu ý về Các Đối Tượng Khóa trong Dictionary
Một lớp mà đối tượng của nó sẽ được sử dụng làm khóa trong một dictionary nên xem xét việc triển khai hai phương thức đặc biệt, đó là hash () và eq ()
Phương thức hash () được sử dụng để tạo ra một số băm (hash number)
có thể được sử dụng bởi container dictionary
Phương thức eq () được sử dụng để kiểm tra xem hai đối tượng có bằng nhau hay không
Python có hai quy tắc liên quan đến các phương thức này:
Nếu hai đối tượng bằng nhau, thì băm (hash) của chúng phải bằng nhau
Để một đối tượng có thể được băm, nó phải là bất biến (immutable).Python cũng có hai tính chất liên quan đến mã băm (hashcodes) của một đối tượng