Danh sách con Python theo phạm vi chỉ mục

Danh sách là một tập hợp các giá trị được sắp xếp theo thứ tự, trong đó mỗi giá trị được xác định bởi một chỉ mục. Các giá trị tạo nên một danh sách được gọi là các phần tử của nó. Danh sách tương tự như chuỗi, là tập hợp các ký tự được sắp xếp theo thứ tự, ngoại trừ các phần tử của danh sách có thể có bất kỳ loại nào. Danh sách và chuỗi - và những thứ khác hoạt động giống như tập hợp có thứ tự - được gọi là trình tự

9. 1. Liệt kê các giá trị¶

Có một số cách để tạo danh sách mới; . [ and ]):

[10, 20, 30, 40]
["spam", "bungee", "swallow"]

Ví dụ đầu tiên là danh sách bốn số nguyên. Thứ hai là một danh sách gồm ba chuỗi. Các phần tử của danh sách không nhất thiết phải cùng loại. Danh sách sau đây chứa một chuỗi, một số float, một số nguyên và (mirabile dictu) một danh sách khác

["hello", 2.0, 5, [10, 20]]

Một danh sách trong một danh sách khác được gọi là lồng nhau

Cuối cùng, có một danh sách đặc biệt không chứa phần tử nào. Nó được gọi là danh sách rỗng, và được ký hiệu là [] .

Giống như các giá trị số 0 và chuỗi trống, danh sách trống là sai trong biểu thức boolean

>>> if []:
..    print 'This is true.'
.. else:
..    print 'This is false.'
...
This is false.
>>>

Với tất cả các cách tạo danh sách này, sẽ thật đáng thất vọng nếu chúng ta không thể gán giá trị danh sách cho biến hoặc chuyển danh sách thành tham số cho hàm. Chúng ta có thể

>>> vocabulary = ["ameliorate", "castigate", "defenestrate"]
>>> numbers = [17, 123]
>>> empty = []
>>> print vocabulary, numbers, empty
['ameliorate', 'castigate', 'defenestrate'] [17, 123] []

9. 2. Truy cập các phần tử¶

Cú pháp để truy cập các phần tử của danh sách cũng giống như cú pháp để truy cập các ký tự của một chuỗi—toán tử dấu ngoặc ( [] – not to be confused with an empty list). The expression inside the brackets specifies the index. Remember that the indices start at 0:

>>> print numbers[0]
17

Bất kỳ biểu thức số nguyên nào cũng có thể được sử dụng làm chỉ mục

>>> numbers[9-8]
123
>>> numbers[1.0]
Traceback (most recent call last):
  File "", line 1, in 
TypeError: list indices must be integers

Nếu bạn cố đọc hoặc ghi một phần tử không tồn tại, bạn sẽ gặp lỗi thời gian chạy

>>> numbers[2]
Traceback (most recent call last):
  File "", line 1, in 
IndexError: list index out of range

Nếu một chỉ mục có giá trị âm, nó sẽ đếm ngược từ cuối danh sách

>>> numbers[-1]
123
>>> numbers[-2]
17
>>> numbers[-3]
Traceback (most recent call last):
  File "", line 1, in 
IndexError: list index out of range

numbers[-1] là phần tử cuối cùng của danh sách, numbers[-2] . numbers[-3] doesn’t exist.

Người ta thường sử dụng biến vòng lặp làm chỉ mục danh sách

________số 8

This while đếm từ 0 đến 4. Khi biến vòng lặp i là 4, điều kiện không thành công và vòng lặp kết thúc. Vì vậy, phần thân của vòng lặp chỉ được thực thi khi i là 0, 1, 2 và 3.

Mỗi lần lặp lại, biến i được sử dụng làm chỉ mục trong danh sách, in ra kết quả i-eth element. This pattern of computation is called a list traversal.

9. 3. Độ dài danh sách¶

Hàm len trả về độ dài của danh sách, bằng với số phần tử của danh sách. Bạn nên sử dụng giá trị này làm giới hạn trên của vòng lặp thay vì hằng số. Bằng cách đó, nếu kích thước của danh sách thay đổi, bạn sẽ không phải thực hiện chương trình để thay đổi tất cả các vòng lặp; .

horsemen = ["war", "famine", "pestilence", "death"]

i = 0
num = len(horsemen)
while i < num:
    print horsemen[i]
    i += 1

Lần cuối cùng phần thân của vòng lặp được thực thi, ilen(horsemen)< . Khi - 1, which is the index of the last element. When i bằng len(horsemen) , điều kiện không thành công và . len(horsemen) is not a legal index.

Mặc dù một danh sách có thể chứa một danh sách khác nhưng danh sách lồng nhau vẫn được tính là một phần tử. Độ dài của danh sách này là 4

["hello", 2.0, 5, [10, 20]]
0

9. 4. Liệt kê thành viên¶

in là toán tử boolean kiểm tra tư cách thành viên theo trình tự. Chúng tôi đã sử dụng nó trước đây với các chuỗi, nhưng nó cũng hoạt động với các danh sách và các trình tự khác.

["hello", 2.0, 5, [10, 20]]
1

Vì dịch bệnh là thành viên của kỵ binh danh sách nên trong operator returns True. Since debauchery is not in the list, in trả về Sai .

Chúng ta có thể sử dụng not kết hợp với in .

["hello", 2.0, 5, [10, 20]]
2

9. 5. Danh sách hoạt động¶

Toán tử + nối các danh sách.

["hello", 2.0, 5, [10, 20]]
3

Tương tự, toán tử * lặp lại danh sách một số lần nhất định.

["hello", 2.0, 5, [10, 20]]
4

Ví dụ đầu tiên lặp lại [0] bốn lần. Ví dụ thứ hai lặp lại danh sách [1, 2, 3] ba .

9. 6. Liệt kê các lát cắt¶

Các thao tác cắt mà chúng ta đã thấy với các chuỗi cũng hoạt động trên danh sách

["hello", 2.0, 5, [10, 20]]
5

9. 7. Chức năng phạm vi ¶

Danh sách chứa các số nguyên liên tiếp là phổ biến, vì vậy Python cung cấp một cách đơn giản để tạo chúng

["hello", 2.0, 5, [10, 20]]
6

Hàm phạm vi nhận hai đối số và trả về một danh sách chứa tất cả các số nguyên từ số thứ nhất đến số thứ hai, bao gồm cả số nguyên đầu tiên nhưng không phải số nguyên .

Có hai dạng khác của phạm vi . Với một đối số duy nhất, nó tạo ra một danh sách bắt đầu từ 0.

["hello", 2.0, 5, [10, 20]]
7

Nếu có đối số thứ ba, nó chỉ định khoảng cách giữa các giá trị liên tiếp, được gọi là kích thước bước. Ví dụ này đếm từ 1 đến 10 theo bước 2

["hello", 2.0, 5, [10, 20]]
8

Nếu kích thước bước là số âm thì bắt đầu phải lớn hơn điểm dừng

["hello", 2.0, 5, [10, 20]]
9

hoặc kết quả sẽ là một danh sách trống

>>> if []:
..    print 'This is true.'
.. else:
..    print 'This is false.'
...
This is false.
>>>
0

9. 8. Danh sách có thể thay đổi¶

Không giống như chuỗi, danh sách có thể thay đổi, có nghĩa là chúng ta có thể thay đổi các phần tử của chúng. Sử dụng toán tử dấu ngoặc ở bên trái của phép gán, chúng ta có thể cập nhật một trong các phần tử

>>> if []:
..    print 'This is true.'
.. else:
..    print 'This is false.'
...
This is false.
>>>
1

Toán tử dấu ngoặc được áp dụng cho danh sách có thể xuất hiện ở bất kỳ đâu trong biểu thức. Khi nó xuất hiện ở phía bên trái của một phép gán, nó sẽ thay đổi một trong các phần tử trong danh sách, vì vậy phần tử đầu tiên của quả đã được thay đổi từ < . Phép gán cho một phần tử của danh sách được gọi là phép gán mục. Mục gán không hoạt động cho chuỗi. 'banana' to 'pear', and the last from 'quince' to 'orange'. An assignment to an element of a list is called item assignment. Item assignment does not work for strings:

>>> if []:
..    print 'This is true.'
.. else:
..    print 'This is false.'
...
This is false.
>>>
2

nhưng nó làm cho danh sách

>>> if []:
..    print 'This is true.'
.. else:
..    print 'This is false.'
...
This is false.
>>>
3

Với toán tử lát, chúng ta có thể cập nhật một số phần tử cùng một lúc

>>> if []:
..    print 'This is true.'
.. else:
..    print 'This is false.'
...
This is false.
>>>
4

Chúng tôi cũng có thể xóa các phần tử khỏi danh sách bằng cách gán danh sách trống cho chúng

>>> if []:
..    print 'This is true.'
.. else:
..    print 'This is false.'
...
This is false.
>>>
5

Và chúng ta có thể thêm các phần tử vào danh sách bằng cách ép chúng vào một lát trống ở vị trí mong muốn

>>> if []:
..    print 'This is true.'
.. else:
..    print 'This is false.'
...
This is false.
>>>
6

9. 9. Xóa danh sách¶

Sử dụng các lát cắt để xóa các thành phần danh sách có thể gây khó xử và do đó dễ bị lỗi. Python cung cấp một giải pháp thay thế dễ đọc hơn

del xóa phần tử khỏi danh sách.

>>> if []:
..    print 'This is true.'
.. else:
..    print 'This is false.'
...
This is false.
>>>
7

Như bạn mong đợi, del xử lý các chỉ mục phủ định và gây ra lỗi thời gian chạy nếu chỉ mục nằm ngoài phạm vi.

Bạn có thể sử dụng một lát cắt làm chỉ mục cho del .

>>> if []:
..    print 'This is true.'
.. else:
..    print 'This is false.'
...
This is false.
>>>
8

Như thường lệ, các lát cắt chọn tất cả các phần tử, nhưng không bao gồm, chỉ mục thứ hai

9. 10. Đối tượng và giá trị¶

Nếu chúng ta thực hiện các câu lệnh gán này,

>>> if []:
..    print 'This is true.'
.. else:
..    print 'This is false.'
...
This is false.
>>>
9

chúng tôi biết rằng ab sẽ đề cập đến . Nhưng chúng tôi chưa biết liệu chúng có trỏ đến cùng một chuỗi hay không. "banana". But we don’t know yet whether they point to the same string.

Có hai trạng thái có thể xảy ra

Danh sách con Python theo phạm vi chỉ mục

Trong một trường hợp, ab đề cập đến . Trong trường hợp thứ hai, họ đề cập đến điều tương tự. Những thứ này có tên — chúng được gọi là đồ vật. Một đối tượng là một cái gì đó mà một biến có thể tham chiếu đến.

Chúng ta có thể kiểm tra xem hai tên có cùng giá trị hay không bằng cách sử dụng == .

>>> vocabulary = ["ameliorate", "castigate", "defenestrate"]
>>> numbers = [17, 123]
>>> empty = []
>>> print vocabulary, numbers, empty
['ameliorate', 'castigate', 'defenestrate'] [17, 123] []
0

Chúng ta có thể kiểm tra xem hai tên có tham chiếu đến cùng một đối tượng hay không bằng cách sử dụng toán tử is

>>> vocabulary = ["ameliorate", "castigate", "defenestrate"]
>>> numbers = [17, 123]
>>> empty = []
>>> print vocabulary, numbers, empty
['ameliorate', 'castigate', 'defenestrate'] [17, 123] []
1

Điều này cho chúng ta biết rằng cả ab đều tham chiếu .

Vì các chuỗi là bất biến, nên Python tối ưu hóa tài nguyên bằng cách tạo hai tên tham chiếu đến cùng một giá trị chuỗi tham chiếu đến cùng một đối tượng

Đây không phải là trường hợp với danh sách

>>> vocabulary = ["ameliorate", "castigate", "defenestrate"]
>>> numbers = [17, 123]
>>> empty = []
>>> print vocabulary, numbers, empty
['ameliorate', 'castigate', 'defenestrate'] [17, 123] []
2

Sơ đồ trạng thái ở đây trông như thế này

Danh sách con Python theo phạm vi chỉ mục

ab có cùng giá trị nhưng không tham chiếu đến cùng một đối tượng.

9. 11. Răng cưa¶

Vì các biến tham chiếu đến các đối tượng, nếu chúng ta gán một biến cho một biến khác, thì cả hai biến đều tham chiếu đến cùng một đối tượng

>>> vocabulary = ["ameliorate", "castigate", "defenestrate"]
>>> numbers = [17, 123]
>>> empty = []
>>> print vocabulary, numbers, empty
['ameliorate', 'castigate', 'defenestrate'] [17, 123] []
3

Trong trường hợp này, sơ đồ trạng thái trông như thế này

Danh sách con Python theo phạm vi chỉ mục

Bởi vì cùng một danh sách có hai tên khác nhau, ab, we say that it is aliased. Changes made with one alias affect the other:

>>> vocabulary = ["ameliorate", "castigate", "defenestrate"]
>>> numbers = [17, 123]
>>> empty = []
>>> print vocabulary, numbers, empty
['ameliorate', 'castigate', 'defenestrate'] [17, 123] []
4

Mặc dù hành vi này có thể hữu ích, nhưng đôi khi nó không mong muốn hoặc không mong muốn. Nói chung, tránh răng cưa sẽ an toàn hơn khi bạn đang làm việc với các đối tượng có thể thay đổi. Tất nhiên, đối với các đối tượng bất biến, không có vấn đề gì. Đó là lý do tại sao Python miễn phí cho các chuỗi bí danh khi nó nhận thấy cơ hội tiết kiệm

9. 12. Nhân bản danh sách¶

Nếu chúng tôi muốn sửa đổi một danh sách và cũng giữ một bản sao của bản gốc, chúng tôi cần có khả năng tạo một bản sao của chính danh sách đó, không chỉ tài liệu tham khảo. Quá trình này đôi khi được gọi là nhân bản, để tránh sự mơ hồ của từ sao chép

Cách dễ nhất để sao chép danh sách là sử dụng toán tử lát

>>> vocabulary = ["ameliorate", "castigate", "defenestrate"]
>>> numbers = [17, 123]
>>> empty = []
>>> print vocabulary, numbers, empty
['ameliorate', 'castigate', 'defenestrate'] [17, 123] []
5

Lấy bất kỳ phần nào của a sẽ tạo một danh sách mới. Trong trường hợp này, lát xảy ra bao gồm toàn bộ danh sách.

Giờ đây, chúng tôi có thể thoải mái thực hiện các thay đổi đối với b mà không phải lo lắng về a:

>>> vocabulary = ["ameliorate", "castigate", "defenestrate"]
>>> numbers = [17, 123]
>>> empty = []
>>> print vocabulary, numbers, empty
['ameliorate', 'castigate', 'defenestrate'] [17, 123] []
6

9. 13. Danh sách và các vòng lặp for ¶

Vòng lặp for cũng hoạt động với danh sách. Cú pháp tổng quát của vòng lặp for là.

>>> vocabulary = ["ameliorate", "castigate", "defenestrate"]
>>> numbers = [17, 123]
>>> empty = []
>>> print vocabulary, numbers, empty
['ameliorate', 'castigate', 'defenestrate'] [17, 123] []
7

Tuyên bố này tương đương với

>>> vocabulary = ["ameliorate", "castigate", "defenestrate"]
>>> numbers = [17, 123]
>>> empty = []
>>> print vocabulary, numbers, empty
['ameliorate', 'castigate', 'defenestrate'] [17, 123] []
8

Vòng lặp for ngắn gọn hơn vì chúng ta có thể loại bỏ biến vòng lặp, i. Here is an equivalent to the while từ phần Truy cập phần tử được viết bằng for loop.

>>> vocabulary = ["ameliorate", "castigate", "defenestrate"]
>>> numbers = [17, 123]
>>> empty = []
>>> print vocabulary, numbers, empty
['ameliorate', 'castigate', 'defenestrate'] [17, 123] []
9

Nó gần giống như tiếng Anh. Đối với (mọi) kỵ sĩ trong (danh sách) kỵ sĩ, in (tên của) kỵ sĩ

Mọi biểu thức danh sách đều có thể được sử dụng trong vòng lặp for .

>>> print numbers[0]
17
0

Ví dụ đầu tiên in tất cả các bội số của 3 trong khoảng từ 0 đến 19. Ví dụ thứ hai thể hiện sự nhiệt tình đối với các loại trái cây khác nhau

Vì danh sách có thể thay đổi nên thường nên duyệt qua danh sách, sửa đổi từng phần tử của nó. Các bình phương sau đây là tất cả các số từ 1 đến 5 .

>>> print numbers[0]
17
1

Dành một chút thời gian để suy nghĩ về range(len(numbers)) cho đến khi bạn hiểu cách thức hoạt động của nó. Ở đây chúng tôi quan tâm đến cả giá trị và chỉ mục của nó trong danh sách, để chúng tôi có thể gán một giá trị mới cho nó.

Mẫu này đủ phổ biến để Python cung cấp một cách hay hơn để triển khai nó

>>> print numbers[0]
17
2

enumerate tạo cả chỉ mục và giá trị được liên kết với nó trong quá trình duyệt danh sách. Hãy thử ví dụ tiếp theo này để thấy rõ hơn cách liệt kê hoạt động.

>>> print numbers[0]
17
3

9. 14. Liệt kê các tham số¶

Truyền danh sách dưới dạng đối số thực sự chuyển tham chiếu đến danh sách, không phải bản sao của danh sách. Vì danh sách là những thay đổi có thể thay đổi được thực hiện đối với tham số nên đối số cũng thay đổi. Ví dụ: hàm bên dưới lấy một danh sách làm đối số và nhân mỗi phần tử trong danh sách với 2

>>> print numbers[0]
17
4

Nếu chúng ta đặt double_stuff vào tệp có tên ch09. py , chúng ta có thể kiểm tra nó như thế này.

>>> print numbers[0]
17
5

Tham số a_list và biến things là bí danh . Sơ đồ trạng thái trông như thế này.

Danh sách con Python theo phạm vi chỉ mục

Vì đối tượng danh sách được chia sẻ bởi hai khung, chúng tôi đã vẽ nó giữa chúng

Nếu một chức năng sửa đổi một tham số danh sách, người gọi sẽ thấy sự thay đổi

9. 15. Các hàm thuần túy và công cụ sửa đổi¶

Các hàm lấy danh sách làm đối số và thay đổi chúng trong quá trình thực thi được gọi là công cụ sửa đổi và những thay đổi mà chúng tạo ra được gọi là tác dụng phụ

Hàm thuần túy không tạo ra tác dụng phụ. Nó chỉ giao tiếp với chương trình gọi thông qua các tham số mà nó không sửa đổi và giá trị trả về. Đây là double_stuff được viết dưới dạng một hàm thuần túy.

>>> print numbers[0]
17
6

Phiên bản double_stuff này không thay đổi đối số của nó.

>>> print numbers[0]
17
7

Để sử dụng phiên bản chức năng thuần túy của double_stuff để sửa đổi mọi thứ, you would assign the return value back to things:

>>> print numbers[0]
17
8

9. 16. Cái nào tốt hơn?¶

Bất cứ điều gì có thể được thực hiện với công cụ sửa đổi cũng có thể được thực hiện với các hàm thuần túy. Trên thực tế, một số ngôn ngữ lập trình chỉ cho phép các hàm thuần túy. Có một số bằng chứng cho thấy các chương trình sử dụng các hàm thuần túy sẽ phát triển nhanh hơn và ít bị lỗi hơn các chương trình sử dụng các công cụ sửa đổi. Tuy nhiên, công cụ sửa đổi đôi khi thuận tiện và trong một số trường hợp, các chương trình chức năng kém hiệu quả hơn

Nói chung, chúng tôi khuyên bạn nên viết các hàm thuần túy bất cứ khi nào thấy hợp lý và chỉ sử dụng các công cụ sửa đổi nếu có lợi thế thuyết phục. Cách tiếp cận này có thể được gọi là phong cách lập trình chức năng

9. 17. Danh sách lồng nhau¶

Danh sách lồng nhau là danh sách xuất hiện dưới dạng một phần tử trong danh sách khác. Trong danh sách này, phần tử có chỉ số 3 là danh sách lồng nhau

>>> print numbers[0]
17
9

Nếu chúng tôi in lồng nhau[3] , chúng tôi sẽ nhận được [10, 20]. To extract an element from the nested list, we can proceed in two steps:

>>> numbers[9-8]
123
>>> numbers[1.0]
Traceback (most recent call last):
  File "", line 1, in 
TypeError: list indices must be integers
0

Hoặc chúng ta có thể kết hợp chúng

>>> numbers[9-8]
123
>>> numbers[1.0]
Traceback (most recent call last):
  File "", line 1, in 
TypeError: list indices must be integers
1

Toán tử dấu ngoặc đánh giá từ trái sang phải, do đó, biểu thức này nhận phần tử thứ ba của được lồng vào nhau và trích xuất phần tử thứ nhất từ .

9. 18. Ma trận¶

Danh sách lồng nhau thường được dùng để biểu diễn ma trận. Ví dụ, ma trận

Danh sách con Python theo phạm vi chỉ mục

có thể được đại diện như

>>> numbers[9-8]
123
>>> numbers[1.0]
Traceback (most recent call last):
  File "", line 1, in 
TypeError: list indices must be integers
2

ma trận là một danh sách có ba phần tử, trong đó mỗi phần tử là một hàng của ma trận. Chúng ta có thể chọn toàn bộ hàng từ ma trận theo cách thông thường.

>>> numbers[9-8]
123
>>> numbers[1.0]
Traceback (most recent call last):
  File "", line 1, in 
TypeError: list indices must be integers
3

Hoặc chúng ta có thể trích xuất một phần tử từ ma trận bằng cách sử dụng biểu mẫu chỉ số kép

>>> numbers[9-8]
123
>>> numbers[1.0]
Traceback (most recent call last):
  File "", line 1, in 
TypeError: list indices must be integers
4

Chỉ mục đầu tiên chọn hàng và chỉ mục thứ hai chọn cột. Mặc dù cách biểu diễn ma trận này là phổ biến, nhưng nó không phải là khả năng duy nhất. Một biến thể nhỏ là sử dụng danh sách cột thay vì danh sách hàng. Sau này chúng ta sẽ thấy một giải pháp thay thế triệt để hơn là sử dụng từ điển

9. 19. Phát triển dựa trên thử nghiệm (TDD)¶

Phát triển theo hướng thử nghiệm (TDD) là một phương pháp phát triển phần mềm nhằm đạt được một tính năng mong muốn thông qua một loạt các bước nhỏ, lặp đi lặp lại được thúc đẩy bởi các bài kiểm tra tự động được viết trước để thể hiện các cải tiến ngày càng tăng của tính năng mong muốn

Doctest cho phép chúng tôi dễ dàng chứng minh TDD. Giả sử chúng ta muốn một hàm tạo ma trận hàng theo cột đã cho . rows and columns.

Đầu tiên, chúng tôi thiết lập thử nghiệm cho chức năng này trong tệp có tên ma trận. p .

>>> numbers[9-8]
123
>>> numbers[1.0]
Traceback (most recent call last):
  File "", line 1, in 
TypeError: list indices must be integers
5

Chạy cái này trả về trong một bài kiểm tra không thành công

>>> numbers[9-8]
123
>>> numbers[1.0]
Traceback (most recent call last):
  File "", line 1, in 
TypeError: list indices must be integers
6

Kiểm tra không thành công vì phần thân của hàm chỉ chứa một chuỗi trích dẫn ba và không có câu lệnh trả về, do đó, nó trả về Không có . Thử nghiệm của chúng tôi chỉ ra rằng chúng tôi muốn nó trả về một ma trận có 3 hàng 5 cột không.

Quy tắc sử dụng TDD là sử dụng điều đơn giản nhất có tác dụng viết giải pháp để vượt qua bài kiểm tra, vì vậy trong trường hợp này, chúng tôi chỉ cần trả về kết quả mong muốn

>>> numbers[9-8]
123
>>> numbers[1.0]
Traceback (most recent call last):
  File "", line 1, in 
TypeError: list indices must be integers
7

Việc chạy thử nghiệm này bây giờ sẽ vượt qua, nhưng việc triển khai make_matrix hiện tại của chúng tôi luôn trả về cùng một kết quả, rõ ràng đây không phải là kết quả chúng tôi dự định. Để khắc phục điều này, trước tiên chúng tôi thúc đẩy sự cải tiến của mình bằng cách thêm một bài kiểm tra.

>>> numbers[9-8]
123
>>> numbers[1.0]
Traceback (most recent call last):
  File "", line 1, in 
TypeError: list indices must be integers
8

mà như chúng ta mong đợi thất bại

>>> numbers[9-8]
123
>>> numbers[1.0]
Traceback (most recent call last):
  File "", line 1, in 
TypeError: list indices must be integers
9

Kỹ thuật này được gọi là chạy thử nghiệm vì mã chỉ nên được viết khi có một thử nghiệm không vượt qua được. Được thúc đẩy bởi bài kiểm tra thất bại, giờ đây chúng ta có thể tạo ra một giải pháp tổng quát hơn

>>> numbers[2]
Traceback (most recent call last):
  File "", line 1, in 
IndexError: list index out of range
0

Giải pháp này có vẻ hiệu quả và chúng tôi có thể nghĩ rằng chúng tôi đã hoàn thành, nhưng khi chúng tôi sử dụng chức năng mới sau đó, chúng tôi phát hiện ra một lỗi

>>> numbers[2]
Traceback (most recent call last):
  File "", line 1, in 
IndexError: list index out of range
1

Chúng tôi muốn gán phần tử ở hàng thứ hai và cột thứ ba giá trị 7, thay vào đó, tất cả các phần tử trong cột thứ ba là 7

Sau khi phản ánh, chúng tôi nhận ra rằng trong giải pháp hiện tại của chúng tôi, mỗi hàng là bí danh của các hàng khác. Đây chắc chắn không phải là những gì chúng tôi dự định, vì vậy chúng tôi bắt đầu khắc phục sự cố, trước tiên bằng cách viết một bài kiểm tra không thành công

>>> numbers[2]
Traceback (most recent call last):
  File "", line 1, in 
IndexError: list index out of range
2

Với một bài kiểm tra không thể khắc phục, chúng tôi hiện đang hướng đến một giải pháp tốt hơn

>>> numbers[2]
Traceback (most recent call last):
  File "", line 1, in 
IndexError: list index out of range
3

Sử dụng TDD có một số lợi ích đối với quy trình phát triển phần mềm của chúng tôi. Nó

  • giúp chúng ta suy nghĩ cụ thể về vấn đề mà chúng ta đang cố gắng giải quyết trước khi cố gắng giải quyết nó
  • khuyến khích chia nhỏ các vấn đề phức tạp thành các vấn đề nhỏ hơn, đơn giản hơn và từng bước hướng tới giải pháp cho vấn đề lớn hơn
  • đảm bảo rằng chúng tôi có bộ thử nghiệm tự động được phát triển tốt cho phần mềm của mình, tạo điều kiện thuận lợi cho các bổ sung và cải tiến sau này

9. 20. Chuỗi và danh sách¶

Python có một lệnh gọi là list lấy một loại trình tự làm đối số và tạo một danh sách từ các phần tử của nó.

>>> numbers[2]
Traceback (most recent call last):
  File "", line 1, in 
IndexError: list index out of range
4

Cũng có một lệnh str lấy bất kỳ giá trị Python nào làm đối số và trả về một chuỗi đại diện cho giá trị đó.

>>> numbers[2]
Traceback (most recent call last):
  File "", line 1, in 
IndexError: list index out of range
5

Như chúng ta có thể thấy từ ví dụ trước, không thể sử dụng str để nối danh sách các ký tự với nhau. Để làm điều này, chúng ta có thể sử dụng hàm join trong mô-đun string .

>>> numbers[2]
Traceback (most recent call last):
  File "", line 1, in 
IndexError: list index out of range
6

Hai trong số các hàm hữu ích nhất trong mô-đun chuỗi liên quan đến danh sách các chuỗi. Hàm split ngắt một chuỗi thành một danh sách các từ. Theo mặc định, bất kỳ số lượng ký tự khoảng trắng nào cũng được coi là ranh giới từ.

>>> numbers[2]
Traceback (most recent call last):
  File "", line 1, in 
IndexError: list index out of range
7

Một đối số tùy chọn được gọi là dấu phân cách có thể được sử dụng để chỉ định ký tự nào sẽ được sử dụng làm ranh giới từ. Ví dụ sau sử dụng chuỗi ai làm dấu phân cách.

>>> numbers[2]
Traceback (most recent call last):
  File "", line 1, in 
IndexError: list index out of range
8

Lưu ý rằng dấu phân cách không xuất hiện trong danh sách

chuỗi. tham gia là nghịch đảo của chuỗi. tách . Phải mất hai đối số. một danh sách các chuỗi và dấu phân cách sẽ được đặt giữa mỗi phần tử trong danh sách trong chuỗi kết quả.

>>> numbers[2]
Traceback (most recent call last):
  File "", line 1, in 
IndexError: list index out of range
9

9. 21. Bảng chú giải¶

aliasesNhiều biến chứa tham chiếu đến cùng một đối tượng. cloneĐể tạo một đối tượng mới có cùng giá trị với một đối tượng hiện có. Sao chép tham chiếu đến đối tượng sẽ tạo bí danh nhưng không sao chép đối tượng. dấu phân cách Một ký tự hoặc chuỗi được sử dụng để chỉ ra nơi một chuỗi sẽ được tách ra. phần tửMột trong các giá trị trong danh sách (hoặc chuỗi khác). Toán tử dấu ngoặc chọn các phần tử của danh sách. indexMột biến số nguyên hoặc giá trị chỉ ra một phần tử của danh sách. listMột tập hợp các đối tượng được đặt tên, trong đó mỗi đối tượng được xác định bởi một chỉ mục. duyệt danh sáchTruy cập tuần tự từng phần tử trong danh sách. modifierMột hàm thay đổi các đối số của nó bên trong thân hàm. Chỉ các loại có thể thay đổi mới có thể được thay đổi bởi công cụ sửa đổi. mutable typeMột kiểu dữ liệu trong đó các phần tử có thể được sửa đổi. Tất cả các loại có thể thay đổi là loại hợp chất. Danh sách là kiểu dữ liệu có thể thay đổi; . danh sách lồng nhauMột danh sách là một phần tử của một danh sách khác. đối tượngMột thứ mà một biến có thể tham chiếu. chức năng thuần túy Một chức năng không có tác dụng phụ. Các hàm thuần túy chỉ thực hiện các thay đổi đối với chương trình gọi thông qua các giá trị trả về của chúng. trình tựBất kỳ kiểu dữ liệu nào bao gồm một tập hợp các phần tử được sắp xếp theo thứ tự, với mỗi phần tử được xác định bởi một chỉ mục. tác dụng phụS thay đổi trạng thái của một chương trình được thực hiện bằng cách gọi một hàm không phải là kết quả của việc đọc giá trị trả về từ hàm. Tác dụng phụ chỉ có thể được tạo ra bởi công cụ sửa đổi. kích thước bước Khoảng cách giữa các phần tử liên tiếp của một chuỗi tuyến tính. Đối số thứ ba (và đối số tùy chọn) của hàm phạm vi được gọi là kích thước bước. Nếu không được chỉ định, nó sẽ mặc định là 1. phát triển dựa trên thử nghiệm (TDD)Một phương pháp phát triển phần mềm nhằm đạt được một tính năng mong muốn thông qua một loạt các bước nhỏ, lặp đi lặp lại được thúc đẩy bởi các thử nghiệm tự động được viết trước để thể hiện các cải tiến ngày càng tăng của tính năng mong muốn. (xem bài viết trên Wikipedia về Phát triển dựa trên thử nghiệm để biết thêm thông tin. )

9. 22. Bài tập¶

  1. Viết một vòng lặp đi qua

    ["hello", 2.0, 5, [10, 20]]
    
    0

    và in độ dài của từng phần tử. Điều gì xảy ra nếu bạn gửi một số nguyên đến len ? . 1 to 'one' and run your solution again.

  2. Mở tệp có tên ch09e02. py và với nội dung sau.

    >>> numbers[-1]
    123
    >>> numbers[-2]
    17
    >>> numbers[-3]
    Traceback (most recent call last):
      File "", line 1, in 
    IndexError: list index out of range
    
    1

    Thêm từng bộ tài liệu sau vào chuỗi tài liệu ở đầu tệp và viết mã Python để vượt qua các tài liệu

    >>> numbers[-1]
    123
    >>> numbers[-2]
    17
    >>> numbers[-3]
    Traceback (most recent call last):
      File "", line 1, in 
    IndexError: list index out of range
    
    2

    >>> numbers[-1]
    123
    >>> numbers[-2]
    17
    >>> numbers[-3]
    Traceback (most recent call last):
      File "", line 1, in 
    IndexError: list index out of range
    
    3

    >>> numbers[-1]
    123
    >>> numbers[-2]
    17
    >>> numbers[-3]
    Traceback (most recent call last):
      File "", line 1, in 
    IndexError: list index out of range
    
    4

    >>> numbers[-1]
    123
    >>> numbers[-2]
    17
    >>> numbers[-3]
    Traceback (most recent call last):
      File "", line 1, in 
    IndexError: list index out of range
    
    5

    Mỗi lần chỉ thêm một bộ tài liệu. Không nên thêm bộ tài liệu tiếp theo cho đến khi bộ trước vượt qua