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

Chào các bạn,
Chúng ta tiếp tục với danh sách(list) trong Python. Nhưng bài trước chúng ta đã được giới thiệu về các các đặc tính của list và tuple. Phần này chúng ta sẽ tiếp tục hiểu về cách làm việc với danh sách.
Làm việc với danh sách trong Python
Khi bạn lần đầu tiên bắt đầu viết chương trình, nó hấp dẫn để tạo ra nhiều biến riêng lẻ để lưu trữ một nhóm các giá trị tương tự. Ví dụ, nếu tôi muốn lưu trữ tên của những con mèo của tôi, tôi có thể bị cám dỗ để viết mã như thế này:

catName1 = 'Zophie'
catName2 = 'Pooka'
catName3 = 'Simon'
catName4 = 'Lady Macbeth'
catName5 = 'Fat-tail'
catName6 = 'Miss Cleo'

Nó chỉ ra rằng đây là một cách xấu để viết mã. (Ngoài ra, tôi không thực sự sở hữu nhiều con mèo này, tôi thề.) Vì một điều, nếu số lượng mèo thay đổi, chương trình của bạn sẽ không bao giờ có thể lưu trữ nhiều mèo hơn bạn có biến. Các loại chương trình này cũng có rất nhiều mã trùng lặp hoặc gần giống nhau trong đó. Xem xét có bao nhiêu mã trùng lặp trong chương trình sau, bạn nên nhập vào trình chỉnh soạn thảo và lưu dưới dạng allMyCats1.py:

print('Enter the name of cat 1:')
catName1 = input()
print('Enter the name of cat 2:')
catName2 = input()
print('Enter the name of cat 3:')
catName3 = input()
print('Enter the name of cat 4:')
catName4 = input()
print('Enter the name of cat 5:')
catName5 = input()
print('Enter the name of cat 6:')
catName6 = input()
print('The cat names are:')
print(catName1 + ' ' + catName2 + ' ' + catName3 + ' ' + catName4 + ' ' +
catName5 + ' ' + catName6)

Thay vì sử dụng nhiều biến, lặp lại, bạn có thể sử dụng một biến duy nhất chứa giá trị danh sách. Ví dụ: ở đây, một phiên bản mới và được cải tiến của chương trình allMyCats1.py. Phiên bản mới này sử dụng một danh sách duy nhất và có thể lưu trữ bất kỳ số lượng mèo nào mà người dùng nhập vào. Trong cửa sổ trình chỉnh sửa văn bản, nhập mã nguồn sau và lưu dưới dạng allMyCats2.py:

catNames = []
while True:
    print('Enter the name of cat ' + str(len(catNames) + 1) +' (Or enter nothing to stop.):')
    name = input()
    if name == '':
        break
    catNames = catNames + [name] # list concatenation
print('The cat names are:')
for name in catNames:
    print('    ' + name)

Khi ta chạy chương trình này sẽ hiển thị ra màn hình như sau:

Enter the name of cat 1 (Or enter nothing to stop.):
Zophie
Enter the name of cat 2 (Or enter nothing to stop.):
Pooka
Enter the name of cat 3 (Or enter nothing to stop.):
Simon
Enter the name of cat 4 (Or enter nothing to stop.):
Lady Macbeth
Enter the name of cat 5 (Or enter nothing to stop.):
Fat-tail
Enter the name of cat 6 (Or enter nothing to stop.):
Miss Cleo
Enter the name of cat 7 (Or enter nothing to stop.):
The cat names are:
    Zophie
    Pooka
    Simon
    Lady Macbeth
    Fat-tail
    Miss Cleo

Lợi ích của việc sử dụng danh sách là dữ liệu của bạn hiện nằm trong một cấu trúc, vì vậy chương trình của bạn linh hoạt hơn trong việc xử lý dữ liệu so với một số biến lặp lại.
Sử dụng vòng lặp với danh sách
Ở các chương trước, bạn đã học về cách sử dụng các vòng lặp for để thực thi một khối mã
một số lần nhất định. Về mặt kỹ thuật, vòng lặp for lặp lại khóa mã một lần cho mỗi mục trong giá trị danh sách. Ví dụ: nếu bạn chạy mã này:

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

kết quả hiển thị ra màn hình sẽ là

0
1
2
3

Điều này là do giá trị trả về từ range(4) là giá trị chuỗi mà Python xem xét tương tự như [0, 1, 2, 3]. Chương trình sau đây có cùng một đầu ra như chương trình trước:

for i in [0, 1, 2, 3]:
    print(i)

Vòng lặp for trước thực sự lặp qua mệnh đề của nó với biến i được đặt thành giá trị liên tiếp trong danh sách [0, 1, 2, 3] trong mỗi lần lặp. Một kỹ thuật Python phổ biến là sử dụng range(len (someList)) với vòng lặp for để lặp lại các chỉ mục của danh sách. Ví dụ: nhập thông tin sau vào command line:

>>> supplies = ['pens', 'staplers', 'flamethrowers', 'binders']
>>> for i in range(len(supplies)):
       ... print('Index ' + str(i) + ' in supplies is: ' + supplies[i])
Index 0 in supplies is: pens
Index 1 in supplies is: staplers
Index 2 in supplies is: flamethrowers
Index 3 in supplies is: binders

Sử dụng range(len (supplies)) trong vòng lặp được hiển thị trước đó rất tiện lợi vì mã trong vòng lặp có thể truy cập vào chỉ mục (dưới dạng biến i) và giá trị tại chỉ mục đó (như supplies[i]). Tốt nhất của tất cả, range(len (supplies)) sẽ lặp qua tất cả các chỉ mục của nguồn cung cấp, bất kể nó chứa bao nhiêu phần tử.
Toán tử in và not in
Bạn có thể xác định xem một giá trị là có hay không trong một danh sách có các toán tử in và toán tử not in. Giống như các toán tử khác, innot in được sử dụng trong các biểu thức và kết nối hai giá trị: một giá trị cần tìm trong danh sách và danh sách nơi có thể tìm thấy nó. Các biểu thức này sẽ ước tính giá trị Boolean. Nhập thông tin sau vào command line:

>>> 'howdy' in ['hello', 'hi', 'howdy', 'heyas']
True
>>> spam = ['hello', 'hi', 'howdy', 'heyas']
>>> 'cat' in spam
False
>>> 'howdy' not in spam
False
>>> 'cat' not in spam
True

Ví dụ, chương trình sau đây cho phép người dùng nhập tên thú cưng và sau đó kiểm tra xem tên có trong danh sách vật nuôi hay không. Mở một cửa sổ soạn thảo văn bản, nhập mã sau đây và lưu nó dưới dạng myPets.py.

myPets = ['Zophie', 'Pooka', 'Fat-tail']
print('Enter a pet name:')
name = input()
if name not in myPets:
    print('I do not have a pet named ' + name)
else:
    print(name + ' is my pet.')

Chương trình sẽ hiển thị ra màn hình như sau

Enter a pet name:
Footfoot
I do not have a pet named Footfoot

Mẹo để gán nhiều giá trị
Thủ thuật đa gán (về mặt kỹ thuật được gọi là giải nén tuple) là một phím tắt cho phép bạn gán nhiều biến với các giá trị trong danh sách trong một dòng mã. Vì vậy, thay vì làm điều này:

>>> cat = ['fat', 'gray', 'loud']
>>> size = cat[0]
>>> color = cat[1]
>>> disposition = cat[2]

Bạn có thể viết chúng trên cùng một dòng

>>> cat = ['fat', 'gray', 'loud']
>>> size, color, disposition = cat

Số lượng biến và độ dài của danh sách phải bằng nhau. Không trình biên dịch của python sẽ đưa ra lỗi ValueError như ví dụ sau:

>>> cat = ['fat', 'gray', 'loud']
>>> size, color, disposition, name = cat
Traceback (most recent call last):
  File "<pyshell#84>", line 1, in <module>
    size, color, disposition, name = cat
ValueError: not enough values to unpack (expected 4, got 3)

Sử dụng hàm enumerate() với danh sách
Thay vì sử dụng kỹ thuật range(len (someList)) với vòng lặp for để lấy chỉ số nguyên của các mục trong danh sách, bạn có thể gọi hàm enumerate(). Trên mỗi lần lặp của vòng lặp, enumerate() sẽ trả về hai giá trị: chỉ mục của phần tử trong danh sách và phần tử trong chính danh sách. Ví dụ,

>>> supplies = ['pens', 'staplers', 'flamethrowers', 'binders']
>>> for index, item in enumerate(supplies):
...    print('Index ' + str(index) + ' in supplies is: ' + item)
Index 0 in supplies is: pens
Index 1 in supplies is: staplers
Index 2 in supplies is: flamethrowers
Index 3 in supplies is: binders

Hàm enumerate() là hữu dụng khi bạn muốn lấy cả chỉ mục và phần tử trong danh sách.
Sử dụng hàm random.choice() và random.shuffle() với danh sách
Mô-đun random có một vài hàm chấp nhận danh sách cho các đối số. Hàm random.choice () sẽ trả về một phần tử được chọn ngẫu nhiên từ danh sách. Nhập thông tin sau vào command line:

>>> import random
>>> pets = ['Dog', 'Cat', 'Moose']
>>> random.choice(pets)
'Dog'
>>> random.choice(pets)
'Cat'
>>> random.choice(pets)
'Cat'

Bạn có thể cân nhắc sử dụng random.choice(someList) sẽ ngắn hơn khi bạn sử dụng someList[random.randint(0, len(someList) – 1].
Hàm random.shuffle () sẽ sắp xếp lại các mục trong danh sách. Hàm này sửa đổi danh sách tại chỗ, thay vì trả về một danh sách mới. Nhập thông tin sau vào command line:

>>> import random
>>> people = ['Alice', 'Bob', 'Carol', 'David']
>>> random.shuffle(people)
>>> people
['Carol', 'David', 'Alice', 'Bob']
>>> random.shuffle(people)
>>> people
['Alice', 'David', 'Bob', 'Carol']

Người dịch: Hungdh

3 Likes