Làm cách nào để bạn tham chiếu phần tử đầu tiên trong danh sách python?

Danh sách là một trong 4 loại dữ liệu tích hợp trong Python được sử dụng để lưu trữ các bộ sưu tập dữ liệu, 3 loại còn lại là Tuple, Set và Dictionary, tất cả đều có chất lượng và cách sử dụng khác nhau

Danh sách được tạo bằng dấu ngoặc vuông

Thí dụ

Tạo một danh sách

thislist = ["apple", "banana", "cherry"]
print(thislist)

Tự mình thử »


Danh sách sản phẩm

Các mục trong danh sách được sắp xếp theo thứ tự, có thể thay đổi và cho phép các giá trị trùng lặp

Các mục trong danh sách được lập chỉ mục, mục đầu tiên có chỉ mục

>>> numbers[-1]
123
>>> numbers[-2]
17
>>> numbers[-3]
Traceback (most recent call last):
  File "", line 1, in 
IndexError: list index out of range
6, mục thứ hai có chỉ mục
>>> numbers[-1]
123
>>> numbers[-2]
17
>>> numbers[-3]
Traceback (most recent call last):
  File "", line 1, in 
IndexError: list index out of range
7, v.v.


đặt hàng

Khi chúng tôi nói rằng danh sách được sắp xếp theo thứ tự, điều đó có nghĩa là các mục có thứ tự xác định và thứ tự đó sẽ không thay đổi

Nếu bạn thêm các mục mới vào danh sách, các mục mới sẽ được đặt ở cuối danh sách

Ghi chú. Có một số phương pháp danh sách sẽ thay đổi thứ tự, nhưng nói chung. thứ tự của các mục sẽ không thay đổi


có thể thay đổi

Danh sách có thể thay đổi, nghĩa là chúng ta có thể thay đổi, thêm bớt các mục trong danh sách sau khi đã tạo


Cho phép trùng lặp

Vì danh sách được lập chỉ mục nên danh sách có thể có các mục có cùng giá trị

Thí dụ

Danh sách cho phép các giá trị trùng lặp

thislist = ["apple", "banana", "cherry", "apple", "cherry"]
print(thislist)

Tự mình thử »



Độ dài danh sách

Để xác định danh sách có bao nhiêu mục, hãy sử dụng hàm

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

Thí dụ

In số lượng mục trong danh sách

thislist = ["apple", "banana", "cherry"]
print(len(thislist))

Tự mình thử »


Liệt kê các mục - Kiểu dữ liệu

Các mục danh sách có thể thuộc bất kỳ loại dữ liệu nào

Thí dụ

Các kiểu dữ liệu chuỗi, int và boolean

list1 = ["táo", "chuối", "anh đào"]
list2 = [1, 5, 7, 9, 3]
list3 = [True, False, False]

Tự mình thử »

Một danh sách có thể chứa các kiểu dữ liệu khác nhau

Thí dụ

Một danh sách có chuỗi, số nguyên và giá trị boolean

list1 = ["abc", 34, True, 40, "nam"]

Tự mình thử »


loại hình()

Theo quan điểm của Python, danh sách được định nghĩa là đối tượng có kiểu dữ liệu 'danh sách'

Thí dụ

Kiểu dữ liệu của danh sách là gì?

mylist = ["apple", "banana", "cherry"]
print(type(mylist))

Tự mình thử »


Hàm tạo danh sách ()

Cũng có thể sử dụng hàm tạo list() khi tạo một danh sách mới

Thí dụ

Sử dụng hàm tạo

>>> numbers[-1]
123
>>> numbers[-2]
17
>>> numbers[-3]
Traceback (most recent call last):
  File "", line 1, in 
IndexError: list index out of range
9 để tạo Danh sách

thislist = list(("apple", "banana", "cherry")) # lưu ý dấu ngoặc tròn kép
print(thislist)

Tự mình thử »


Bộ sưu tập Python (Mảng)

Có bốn kiểu dữ liệu tập hợp trong ngôn ngữ lập trình Python

  • Danh sách là một bộ sưu tập được sắp xếp theo thứ tự và có thể thay đổi. Cho phép các thành viên trùng lặp
  • Tuple là một bộ sưu tập được sắp xếp và không thể thay đổi. Cho phép các thành viên trùng lặp
  • Set là một bộ sưu tập không có thứ tự, không thể thay đổi* và không được lập chỉ mục. Không có thành viên trùng lặp
  • Từ điển là một bộ sưu tập được sắp xếp theo thứ tự ** và có thể thay đổi. Không có thành viên trùng lặp

*Các mục trong bộ không thể thay đổi, nhưng bạn có thể xóa và/hoặc thêm các mục bất cứ khi nào bạn muốn

** Kể từ phiên bản Python 3. 7, từ điển được đặt hàng. Trong Trăn 3. 6 trở về trước, từ điển không có thứ tự

Khi chọn một loại bộ sưu tập, sẽ rất hữu ích khi hiểu các thuộc tính của loại đó. Việc chọn đúng loại cho một tập dữ liệu cụ thể có thể đồng nghĩa với việc giữ nguyên ý nghĩa và, điều đó có thể đồng nghĩa với việc tăng hiệu quả hoặc tính bảo mật

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 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

Làm cách nào để bạn tham chiếu phần tử đầu tiên trong danh sách python?

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

Làm cách nào để bạn tham chiếu phần tử đầu tiên trong danh sách python?

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

Làm cách nào để bạn tham chiếu phần tử đầu tiên trong danh sách python?

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.

Làm cách nào để bạn tham chiếu phần tử đầu tiên trong danh sách python?

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

Làm cách nào để bạn tham chiếu phần tử đầu tiên trong danh sách python?

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ằng 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