[ATBS2nd]Chương 1 - Python cơ bản - Phần 14

Chào các bạn,
Chúng ta lại tiếp tục với danh sách(list) trong python.
Ngoại lệ cho luật thụt lề(identification) trong python
Trong hầu hết các trường hợp, số lượng thụt lề cho một dòng mã cho Python biết nó đang trong block nào. Tuy nhiên, có một số trường hợp ngoại lệ cho quy tắc này. Ví dụ, danh sách thực sự có thể trải dài trên một số dòng trong tệp mã nguồn. Việc thụt lề của các dòng này không quan trọng; Python biết rằng danh sách này chưa kết thúc cho đến khi nó nhìn thấy dấu ngoặc vuông đóng. Ví dụ: bạn có thể có mã trông như thế này:

spam = ['apples',
    'oranges',
                           'bananas',
'cats']
print(spam)

Tất nhiên, thực tế mà nói, hầu hết mọi người đều sử dụng hành vi Python để làm cho danh sách của họ trông đẹp và dễ đọc, giống như danh sách tin nhắn trong chương trình Magic 8 Ball.
Bạn cũng có thể tách một lệnh đơn trên nhiều dòng bằng ký tự tiếp tục \ dòng ở cuối. Hãy nghĩ về \ như đã nói, hướng dẫn này tiếp tục trên dòng tiếp theo. Việc thụt dòng trên dòng sau khi tiếp tục \ là không cần thiết. Ví dụ: sau đây là mã Python hợp lệ:

print('Four score and seven ' + \
    'years ago...')

Các thủ thuật này rất hữu ích khi bạn muốn sắp xếp lại các dòng mã Python dài để dễ đọc hơn một chút.
Ví dụ: Chương trình Magic 8 ball với danh sách.
Sử dụng danh sách, bạn có thể viết một phiên bản thanh lịch hơn nhiều của phần trước, chương trình Magic 8 Ball trước đó. Thay vì một vài dòng của các câu lệnh elif gần như giống hệt nhau, bạn có thể tạo một danh sách duy nhất mà mã làm việc với. Mở một cửa sổ soạn thảo văn bản mới và nhập mã sau đây. Lưu nó dưới dạng magic8Ball2.py.

import random
messages = ['It is certain',
	'It is decidedly so',
	'Yes definitely',
	'Reply hazy try again',
	'Ask again later',
	'Concentrate and ask again',
	'My reply is no',
	'Outlook not so good',
	'Very doubtful']
print(messages[random.randint(0, len(messages) - 1)])

Khi bạn chạy chương trình này, bạn sẽ thấy rằng nó hoạt động giống như chương trình magic8Ball.py trước đó. Lưu ý biểu thức bạn sử dụng làm chỉ mục cho messages: random.randint (0, len (messages) - 1). Điều này tạo ra một số ngẫu nhiên để sử dụng cho chỉ mục, bất kể kích thước của messages. Nghĩa là, bạn sẽ nhận được một số ngẫu nhiên trong khoảng từ 0 đến giá trị của len (messages) - 1. Lợi ích của phương pháp này là bạn có thể dễ dàng thêm và xóa chuỗi vào danh sách messages mà không thay đổi các dòng mã khác. Nếu sau này bạn cập nhật mã của mình, sẽ có ít dòng bạn phải thay đổi và ít lỗi hơn.
Dạng dữ liệu liên tục
Liệt kê các loại dữ liệu duy nhất biểu thị các chuỗi giá trị theo thứ tự. Ví dụ, các chuỗi và danh sách thực sự giống nhau nếu bạn coi một chuỗi là một danh sách của người dùng trong số các ký tự văn bản. Các kiểu dữ liệu chuỗi Python bao gồm các danh sách, chuỗi, các đối tượng phạm vi được trả về bởi range() và bộ dữ liệu. Nhiều điều bạn có thể làm với danh sách cũng có thể được thực hiện với chuỗi và các giá trị khác của các loại trình tự: lập chỉ mục; thái lát; và sử dụng chúng với các vòng lặp, với len () và với các toán tử trong và không trong các toán tử. Để xem điều này, nhập thông tin sau vào command line:

>>> name = 'Zophie'
>>> name[0]
'Z'
>>> name[-2]
'i'
>>> name[0:4]
'Zoph'
>>> 'Zo' in name
True
>>> 'z' in name
False
>>> 'p' not in name
False
>>> for i in name:
... 	print('* * * ' + i + ' * * *')
* * * Z * * *
* * * o * * *
* * * p * * *
* * * h * * *
* * * i * * *
* * * e * * *

Kiểu dữ liệu thay đổi và không thay đổi được
Nhưng danh sách và chuỗi là khác nhau theo một cách quan trọng. Giá trị danh sách là loại dữ liệu có thể thay đổi: nó có thể có các giá trị được thêm, xóa hoặc thay đổi. Tuy nhiên, một chuỗi là bất biến: nó không thể thay đổi. Cố gắng gán lại một ký tự đơn trong chuỗi dẫn đến lỗi TypeError, như bạn có thể thấy bằng cách nhập thông tin sau vào command line:

>>> name = 'Zophie a cat'
>>> name[7] = 'the'
Traceback (most recent call last):
  File "<pyshell#50>", line 1, in <module>
	name[7] = 'the'
TypeError: 'str' object does not support item assignment

Cách thích hợp để biến đổi thành một chuỗi là sử dụng cắt và ghép để xây dựng một chuỗi mới bằng cách sao chép từ các phần của chuỗi cũ. Nhập thông tin sau vào command line:

>>> name = 'Zophie a cat'
>>> newName = name[0:7] + 'the' + name[8:12]
>>> name
'Zophie a cat'
>>> newName
'Zophie the cat'

Chúng tôi đã sử dụng [0: 7] và [8:12] để chỉ các nhân vật mà chúng tôi không muốn thay thế. Lưu ý rằng chuỗi ‘Zophie a cat’ ban đầu không được sửa đổi, vì các chuỗi là bất biến. Mặc dù giá trị danh sách có thể thay đổi, dòng thứ hai trong đoạn mã sau không sửa đổi danh sách eggs:

>>> eggs = [1, 2, 3]
>>> eggs = [4, 5, 6]
>>> eggs
[4, 5, 6]

Giá trị danh sách trong eggs là không thay đổi ở đây; thay vào đó, một giá trị danh sách hoàn toàn mới và khác ([4, 5, 6]) đang ghi đè giá trị danh sách cũ ([1, 2, 3]). Điều này được mô tả trong hình dưới đây.


Nếu bạn thực sự muốn sửa đổi danh sách ban đầu trong eggs để chứa [4, 5, 6], bạn sẽ phải làm một cái gì đó như thế này:

>>> eggs = [1, 2, 3]
>>> del eggs[2]
>>> del eggs[1]
>>> del eggs[0]
>>> eggs.append(4)
>>> eggs.append(5)
>>> eggs.append(6)
>>> eggs
[4, 5, 6]

Trong ví dụ đầu tiên, giá trị danh sách mà eggs kết thúc là như nhau danh sách giá trị nó bắt đầu. Nó chỉ là danh sách này đã được thay đổi, thay vì ghi đè. Hình dưới đây mô tả bảy thay đổi được thực hiện bởi bảy dòng đầu tiên trong ví dụ command line phía trên.


Thay đổi giá trị của kiểu dữ liệu có thể thay đổi (như câu lệnh del
và phương thức append () làm trong ví dụ trước) thay đổi giá trị tại chỗ, vì giá trị biến đổi không được thay thế bằng giá trị danh sách mới.
Kiểu dữ liệu tuple
Kiểu dữ liệu tuple gần giống với kiểu dữ liệu danh sách, ngoại trừ theo hai cách. Đầu tiên, các bộ dữ liệu được gõ bằng dấu ngoặc đơn, (và), thay vì dấu ngoặc vuông, [và]. Ví dụ: nhập thông tin sau vào command line:

>>> eggs = ('hello', 42, 0.5)
>>> eggs[0]
'hello'
>>> eggs[1:3]
(42, 0.5)
>>> len(eggs)
3

Nhưng cách chính mà các tuple khác với các danh sách là các tuple, giống như các chuỗi, là bất biến. Các tuple không thể sửa đổi, gắn thêm hoặc xóa giá trị của chúng. Nhập thông tin sau vào command line và xem thông báo lỗi TypeError:

>>> eggs = ('hello', 42, 0.5)
>>> eggs[1] = 99
Traceback (most recent call last):
  File "<pyshell#5>", line 1, in <module>
    eggs[1] = 99
TypeError: 'tuple' object does not support item assignment

Nếu bạn chỉ có một giá trị trong tuple của mình, bạn có thể chỉ ra điều này bằng cách đặt dấu phẩy sau giá trị bên trong dấu ngoặc đơn. Nếu không, Python sẽ nghĩ rằng bạn chỉ cần gõ một giá trị bên trong dấu ngoặc đơn thông thường. Dấu phẩy là thứ cho phép Python biết đây là giá trị tuple. (Không giống như một số ngôn ngữ lập trình khác, nó rất tốt để có dấu phẩy sau mục cuối cùng trong danh sách hoặc tuple trong Python.) Nhập hàm type() sau vào command line để thấy sự khác biệt:

>>> type(('hello',))
<class 'tuple'>
>>> type(('hello'))
<class 'str'>

Bạn có thể sử dụng tuple để truyền đạt cho bất kỳ ai đọc mã của bạn mà bạn không có ý định thay đổi chuỗi giá trị đó. Nếu bạn cần một chuỗi các giá trị không bao giờ thay đổi, hãy sử dụng một tuple. Lợi ích thứ hai của việc sử dụng tuple thay vì danh sách là bởi vì chúng không thay đổi và nội dung của chúng không thay đổi, Python có thể thực hiện một số tối ưu hóa giúp mã sử dụng bộ dữ liệu nhanh hơn một chút so với mã sử dụng danh sách.
Hàm biến đổi giữa tuple và list
Giống như cách str (42) sẽ trả về ‘42’, biểu diễn chuỗi của số nguyên 42, hàm list() và tuple () sẽ trả về danh sách và các phiên bản tuple của các giá trị được truyền cho chúng. Nhập thông tin sau vào command line và lưu ý rằng giá trị trả về thuộc loại dữ liệu khác với giá trị được truyền:

>>> tuple(['cat', 'dog', 5])
('cat', 'dog', 5)
>>> list(('cat', 'dog', 5))
['cat', 'dog', 5]
>>> list('hello')
['h', 'e', 'l', 'l', 'o']

Chuyển đổi một tuple thành một danh sách là tiện dụng nếu bạn cần một phiên bản có thể thay đổi của một giá trị tuple.
Người dịch: Hungdh

2 Likes

Bác nhiệt tình thật.

Viết ra là học mà bạn.