Bài 4.3. Tạo List số

Có nhiều lý do để lưu trữ một tập hợp các số. Ví dụ, bạn sẽ cần theo dõi vị trí của từng nhân vật trong một trò chơi, và bạn có thể muốn theo dõi điểm cao của người chơi. Trong các hình ảnh hóa dữ liệu, bạn sẽ gần như luôn làm việc với các tập hợp số, chẳng hạn như nhiệt độ, khoảng cách, kích thước dân số, hoặc giá trị vĩ độ và kinh độ, trong số các loại tập hợp số khác.

Danh sách là lý tưởng để lưu trữ các tập hợp số, và Python cung cấp nhiều công cụ để giúp bạn làm việc hiệu quả với các danh sách số. Khi bạn hiểu cách sử dụng các công cụ này một cách hiệu quả, mã của bạn sẽ hoạt động tốt ngay cả khi danh sách của bạn chứa hàng triệu mục.

Sử dụng hàm range()

Hàm range() của Python làm cho việc tạo ra một dãy số trở nên dễ dàng. Ví dụ, bạn có thể sử dụng hàm range() để in ra một dãy số như sau:

for value in range(1, 5):
    print(value)

Mặc dù mã này trông như thể nó sẽ in ra các số từ 1 đến 5, nhưng nó không in ra số 5:

1
2
3
4

Trong ví dụ này, range() chỉ in ra các số từ 1 đến 4. Đây là một kết quả khác của hành vi lệch một mà bạn sẽ thấy thường xuyên trong các ngôn ngữ lập trình. Hàm range() khiến Python bắt đầu đếm từ giá trị đầu tiên bạn cung cấp, và nó dừng lại khi đạt đến giá trị thứ hai bạn cung cấp. Vì nó dừng lại ở giá trị thứ hai, đầu ra không bao giờ chứa giá trị cuối cùng, trong trường hợp này là 5.

Để in ra các số từ 1 đến 5, bạn sẽ sử dụng range(1, 6):

for value in range(1, 6):
    print(value)

Lần này đầu ra bắt đầu từ 1 và kết thúc ở 5:

1
2
3
4
5

Nếu đầu ra của bạn khác với những gì bạn mong đợi khi sử dụng range(), hãy thử điều chỉnh giá trị cuối cùng của bạn lên 1.

Bạn cũng có thể truyền cho range() chỉ một đối số, và nó sẽ bắt đầu dãy số từ 0. Ví dụ, range(6) sẽ trả về các số từ 0 đến 5.

Sử dụng range() để tạo danh sách số

Nếu bạn muốn tạo một danh sách số, bạn có thể chuyển đổi kết quả của range() trực tiếp thành một danh sách bằng cách sử dụng hàm list(). Khi bạn bao quanh list() xung quanh một lệnh gọi đến hàm range(), đầu ra sẽ là một danh sách các số.

Trong ví dụ ở phần trước, chúng ta chỉ đơn giản in ra một dãy số. Chúng ta có thể sử dụng list() để chuyển đổi cùng một tập hợp số đó thành một danh sách:

numbers = list(range(1, 6))
print(numbers)

Đây là kết quả:

[1, 2, 3, 4, 5]

Chúng ta cũng có thể sử dụng hàm range() để yêu cầu Python bỏ qua các số trong một phạm vi nhất định. Nếu bạn truyền một đối số thứ ba cho range(), Python sử dụng giá trị đó làm kích thước bước khi tạo ra các số.

Ví dụ, đây là cách liệt kê các số chẵn giữa 1 và 10:

even_numbers = list(range(2, 11, 2))
print(even_numbers)

Trong ví dụ này, hàm range() bắt đầu với giá trị 2 và sau đó thêm 2 vào giá trị đó. Nó thêm 2 liên tục cho đến khi đạt đến hoặc vượt qua giá trị cuối cùng, 11, và tạo ra kết quả này:

[2, 4, 6, 8, 10]

Bạn có thể tạo ra hầu như bất kỳ tập hợp số nào bạn muốn bằng cách sử dụng hàm range(). Ví dụ, hãy xem xét cách bạn có thể tạo ra một danh sách các số bình phương đầu tiên (tức là bình phương của mỗi số nguyên từ 1 đến 10). Trong Python, hai dấu sao (**) đại diện cho số mũ. Đây là cách bạn có thể đưa các số bình phương đầu tiên vào một danh sách:

squares = []
for value in range(1, 11):
    square = value ** 2
    squares.append(square)
print(squares)

Chúng ta bắt đầu với một danh sách trống có tên là squares. Sau đó, chúng ta yêu cầu Python lặp qua từng giá trị từ 1 đến 10 bằng cách sử dụng hàm range(). Bên trong vòng lặp, giá trị hiện tại được nâng lên lũy thừa hai và gán cho biến square. Mỗi giá trị mới của square sau đó được thêm vào danh sách squares. Cuối cùng, khi vòng lặp đã hoàn thành, danh sách các số bình phương được in ra:

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

Để viết mã này ngắn gọn hơn, bỏ qua biến tạm thời square và thêm trực tiếp mỗi giá trị mới vào danh sách:

squares = []
for value in range(1, 11):
    squares.append(value ** 2)
print(squares)

Dòng này thực hiện cùng công việc như các dòng bên trong vòng lặp for trong danh sách trước đó. Mỗi giá trị trong vòng lặp được nâng lên lũy thừa hai và sau đó ngay lập tức được thêm vào danh sách các số bình phương.

Bạn có thể sử dụng bất kỳ cách tiếp cận nào trong số này khi bạn đang tạo ra các danh sách phức tạp hơn. Đôi khi sử dụng một biến tạm thời làm cho mã của bạn dễ đọc hơn; những lần khác nó làm cho mã không cần thiết dài. Tập trung trước tiên vào việc viết mã mà bạn hiểu rõ ràng và làm những gì bạn muốn nó làm. Sau đó tìm kiếm các cách tiếp cận hiệu quả hơn khi bạn xem xét lại mã của mình.

Thống kê đơn giản với danh sách số

Một vài hàm Python hữu ích khi làm việc với danh sách số. Ví dụ, bạn có thể dễ dàng tìm thấy giá trị nhỏ nhất, lớn nhất và tổng của một danh sách số:

>>> digits = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
>>> min(digits)
0
>>> max(digits)
9
>>> sum(digits)
45

Hiểu danh sách

Cách tiếp cận được mô tả trước đó để tạo ra danh sách squares bao gồm việc sử dụng ba hoặc bốn dòng mã. Một hiểu danh sách cho phép bạn tạo ra cùng một danh sách chỉ trong một dòng mã. Một hiểu danh sách kết hợp vòng lặp for và việc tạo ra các phần tử mới thành một dòng, và tự động thêm mỗi phần tử mới. Hiểu danh sách không phải lúc nào cũng được trình bày cho người mới bắt đầu, nhưng tôi đã bao gồm chúng ở đây vì bạn sẽ rất có thể thấy chúng ngay khi bạn bắt đầu xem mã của người khác.

Ví dụ sau đây xây dựng cùng một danh sách các số bình phương mà bạn đã thấy trước đó nhưng sử dụng một hiểu danh sách:

squares = [value ** 2 for value in range(1, 11)]
print(squares)

Để sử dụng cú pháp này, bắt đầu với một tên mô tả cho danh sách, chẳng hạn như squares. Tiếp theo, mở một tập hợp dấu ngoặc vuông và định nghĩa biểu thức cho các giá trị bạn muốn lưu trữ trong danh sách mới. Trong ví dụ này, biểu thức là value 2, nâng giá trị lên lũy thừa hai. Sau đó, viết một vòng lặp for để tạo ra các số bạn muốn đưa vào biểu thức, và đóng dấu ngoặc vuông. Vòng lặp for trong ví dụ này là for value in range(1, 11), đưa các giá trị từ 1 đến 10 vào biểu thức value 2. Lưu ý rằng không có dấu hai chấm ở cuối câu lệnh for.

Kết quả là cùng một danh sách các số bình phương mà bạn đã thấy trước đó:

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

Cần thực hành để viết các hiểu danh sách của riêng bạn, nhưng bạn sẽ thấy chúng đáng giá khi bạn trở nên thoải mái hơn trong việc tạo ra các danh sách thông thường. Khi bạn đang viết ba hoặc bốn dòng mã để tạo ra các danh sách và nó bắt đầu cảm thấy lặp đi lặp lại, hãy xem xét việc viết các hiểu danh sách của riêng bạn.

Làm thêm nhiều bài tập miễn phí tại đây

Comments

There are no comments at the moment.