Tạo danh sách mới trong vòng lặp Python

Cho đến nay, chúng tôi cần một tên biến mới cho mỗi phần thông tin mới mà chúng tôi muốn lưu trữ. Danh sách là một kiểu dữ liệu Python có thể lưu trữ nhiều mẩu thông tin theo thứ tự và với một tên biến duy nhất. Sau đó, tên danh sách cùng với một số nguyên không âm có thể được sử dụng để chỉ các mục dữ liệu riêng lẻ. Hãy bắt đầu với một ví dụ

Lưu ý rằng chúng ta có thể sử dụng

worst_things_about_cs1 = []
2 và
worst_things_about_cs1 = []
3 như thể chúng là các biến theo cách riêng của chúng

Có hai cách sử dụng chính của danh sách

  1. Lưu trữ một lượng lớn dữ liệu tương tự chỉ bằng một tên cho danh sách
  2. Áp dụng các hoạt động tương tự cho nhiều phần dữ liệu

Tạo danh sách

Bạn có thể nhập một danh sách bằng cách sử dụng dấu ngoặc và dấu phẩy

Khi trình thông dịch Python đến dấu ngoặc, Python sẽ phân bổ không gian trong bộ nhớ cho các mục trong danh sách. Tất nhiên, thường thì không có ích lợi gì nếu chỉ in ra một danh sách được tạo theo cách này; . Toán tử gán

worst_things_about_cs1 = []
4 gán danh sách cho biến ở phía bên trái

characters = ["Horton", "Lorax", "Mayzie"]

Nói một cách chính xác, sẽ không chính xác khi nói “______05 là một danh sách. ” Thay vào đó, điều đúng để nói là “

worst_things_about_cs1 = []
5 giữ địa chỉ trong bộ nhớ của một danh sách. ” Mặc dù sự khác biệt giữa “là một danh sách” và “giữ địa chỉ trong bộ nhớ của một danh sách” hiện có vẻ khó nhận thấy, nhưng sau này chúng ta sẽ thấy rằng chắc chắn có sự khác biệt

Bạn cũng có thể tạo một danh sách trống

worst_things_about_cs1 = []

Hiện tại, chúng tôi không sử dụng nhiều danh sách trống, nhưng chúng tôi sẽ sớm thấy rằng chúng tôi có thể bắt đầu với một danh sách trống và sau đó thêm các mục vào đó

Tập thể dục. ngôi sao quyền lực

Khách quan. Tạo danh sách có dữ liệu và sử dụng danh sách đó bằng cách chuyển danh sách đó cho một hàm

Các đỉnh của một ngôi sao có tâm ở giữa một vùng vẽ nhỏ là [161, 86], [119, 80], [100, 43] [81, 80], [39, 86], [70, 116], [

Trong đoạn mã dưới đây, hàm

worst_things_about_cs1 = []
7 nhận hai tham số. Tham số đầu tiên là tham chiếu đến danh sách chứa tọa độ x của đa giác. Tham số thứ hai là tham chiếu đến danh sách chứa tọa độ y của đa giác. Vẽ một ngôi sao trên màn hình

Đây là một giải pháp

Truy cập các mục của một danh sách

Khi một danh sách đã được tạo và địa chỉ của nó được gán cho một biến, bạn sẽ muốn thực hiện mọi việc với các mục riêng lẻ của danh sách. Chúng tôi sử dụng dấu ngoặc vuông để lập chỉ mục vào danh sách. Phần tử danh sách đầu tiên ở chỉ số 0 [vì đó là cách các nhà khoa học máy tính muốn đếm. bắt đầu từ 0], vì vậy để lấy mục thứ 0 trong danh sách, hãy theo tên của biến danh sách có dấu ngoặc vuông chứa số 0

Những gì nằm trong dấu ngoặc có thể là bất kỳ biểu thức nào đánh giá một int nằm trong phạm vi của các chỉ số

Lưu ý rằng các mục danh sách thực sự có thể được coi là biến. Bạn có thể sử dụng toán tử gán để thay đổi một mục trong danh sách [

worst_things_about_cs1 = []
8]. Đây là một ví dụ khác

worst_things_about_cs1 = []
9 có giá trị 8 [hãy nhớ rằng chúng ta bắt đầu đếm hoặc lập chỉ mục danh sách từ 0].
worst_things_about_cs1 = []
00 có giá trị 12. Sau khi thêm, chúng tôi nhận được 20 và gán giá trị đó cho mục 0 của danh sách. Chạy chương trình để xem kết quả

Lỗi lập trình phổ biến. Danh sách chỉ số vượt khỏi phạm vi

Nếu bạn quên rằng danh sách được lập chỉ mục từ 0 hoặc vì lý do nào đó cố gắng truy cập vào một mục của danh sách tại một chỉ mục nằm ngoài cuối danh sách, Python sẽ hủy bỏ chương trình của bạn và in thông báo lỗi. Đoạn mã sau không thành công, vì chỉ có các mục tại các chỉ số 0, 1 và 2

Đây là một loại lỗi lập trình rất phổ biến. Nếu bạn gặp lỗi như

worst_things_about_cs1 = []
0

từ Python, duyệt mã của bạn bằng tay gần dòng nơi Python báo lỗi và tìm hiểu cách bạn quản lý để yêu cầu chỉ mục danh sách không có trong danh sách. Có hai trường hợp

  1. Bạn đã yêu cầu một mặt hàng ở chỉ mục bạn dự định, nhưng bằng cách nào đó ban đầu không đưa mặt hàng đó vào danh sách
  2. Bạn đưa đúng mục vào danh sách, nhưng tính toán sai hoặc chọn chỉ mục

Độ dài của một danh sách

Bạn có thể biết có bao nhiêu mục trong một danh sách bằng cách sử dụng hàm có sẵn trong Python

worst_things_about_cs1 = []
01. Đây là một ví dụ

Lặp lại danh sách với vòng lặp while

Danh sách là một cách tổ chức hoặc cấu trúc dữ liệu mà chương trình của bạn sẽ sử dụng. Chúng ta nói rằng danh sách là một cấu trúc dữ liệu và chúng ta sẽ thấy nhiều ví dụ khác về cấu trúc dữ liệu ở phần sau của khóa học. Một trong những nguyên tắc chính của cấu trúc dữ liệu là cấu trúc dữ liệu cho phép bạn áp dụng các thao tác cho một số hoặc tất cả dữ liệu theo một cách thống nhất

Hãy lấy một ví dụ. Bạn quyết định bắt đầu một trang web mới,

worst_things_about_cs1 = []
02. Ban đầu, nhiệt độ hàng ngày được ghi lại bằng Fahrenheit

worst_things_about_cs1 = []
4

Nhưng sau đó vào tháng tới, Hoa Kỳ quyết định chuyển đổi sang thang đo độ C, khiến Bahamas, Belize, Quần đảo Cayman và Jamaica trở thành những quốc gia duy nhất sử dụng thang đo độ F. Bạn quyết định chuyển đổi tất cả nhiệt độ của mình sang độ C. Bạn có thể làm theo cách này

[Lưu ý sự không chính xác của dấu phẩy động. Tôi đã nói rồi mà. ]

Bạn đang làm đi làm lại cùng một loại thao tác. Chuyển đổi

worst_things_about_cs1 = []
03. Chuyển đổi
worst_things_about_cs1 = []
04. Chuyển đổi
worst_things_about_cs1 = []
05. Và như thế. Bạn có thể sử dụng một vòng lặp và thay thế sáu câu lệnh như vậy,

Vòng lặp trong khi này sẽ hoạt động ngay cả trong một danh sách nhiệt độ rất dài

Tập thể dục. ngôi sao rơi

Khách quan. Sửa đổi dữ liệu trong danh sách bằng vòng lặp while

Đoạn mã dưới đây vẽ một ngôi sao ở giữa màn hình. Viết lại đoạn mã sao cho ngôi sao rơi từ từ từ vị trí ban đầu xuống dưới

Đây là một giải pháp

Ví dụ thiết kế và triển khai thuật toán. đảo ngược một danh sách

Hãy xem một ví dụ mà chúng ta muốn đảo ngược một danh sách. Nhớ lại từ chương đầu tiên rằng một chiến lược từng bước được chỉ định đầy đủ để giải quyết vấn đề trong khoa học máy tính được gọi là thuật toán. Bước đầu tiên để giải quyết vấn đề là suy nghĩ về cách chúng ta có thể giải quyết nó như một con người, càng chính xác càng tốt. Khi mỗi bước đã được chỉ định đầy đủ, chúng tôi đã thiết kế một thuật toán. Sau đó, chúng tôi dịch thuật toán đó thành mã có thể chạy được, từ đó triển khai thuật toán

Có hai lựa chọn cho thuật toán Reverse_list của chúng tôi

  1. Tạo một bản sao mới, đảo ngược danh sách, giữ nguyên danh sách ban đầu

  2. Đảo ngược danh sách “tại chỗ. ” Nếu làm theo cách này thì chỉ có một danh sách và khi kết thúc thao tác, các mục của danh sách bị đảo ngược thứ tự. Chúng tôi nói rằng hoạt động này được thực hiện bởi vì các mục không bao giờ rời khỏi danh sách mà chúng đã bắt đầu

Chúng tôi sẽ sử dụng phương pháp thứ hai và đảo ngược danh sách tại chỗ, vì tôi chưa cho bạn biết cách tạo một danh sách mới có kích thước chính xác

Bây giờ hãy nghĩ về cách đảo ngược danh sách tại chỗ. Mục tiêu của chúng ta là gì?

Chúng tôi muốn mục đầu tiên ở vị trí của mục cuối cùng và ngược lại. Chúng tôi muốn mục thứ hai ở vị trí của mục thứ hai đến mục cuối cùng hiện tại và ngược lại. Vì vậy, đây là nỗ lực đầu tiên về đặc tả thuật toán của chúng tôi, bằng tiếng Anh [hoặc mã giả]

worst_things_about_cs1 = []
8

nó sẽ làm việc? . Bắt đầu bằng cách hoán đổi mục đầu tiên với mục thứ sáu. Tốt. Hoán đổi mục thứ hai với mục thứ năm. Tốt. Hoán đổi mục thứ ba với mục thứ tư. Tốt. Mục tiếp theo là mục thứ tư. Houston chúng ta có một vấn đề. Sau khi hoán đổi mục thứ ba với mục thứ tư, chúng tôi thực sự đã hoàn thành—danh sách đã bị đảo ngược. Sau đó, nếu chúng tôi hoán đổi cái thứ tư với cái thứ ba, vì lần thử đầu tiên của chúng tôi đối với một thuật toán dường như chỉ định, chúng tôi sẽ đặt chúng trở lại vị trí ban đầu khi chúng tôi bắt đầu. Chúng tôi đã bắt đầu hoàn tác việc đảo ngược các mục trong danh sách. Chúng tôi cần sửa đổi thuật toán của mình để nó dừng lại sau khi chỉ hoán đổi một nửa số mục trong danh sách

worst_things_about_cs1 = []
9

Có một điều nữa chúng ta nên lo lắng về. Một danh sách có độ dài 6 có nửa đầu và nửa sau, mỗi kích thước 3. Nếu chúng ta có một danh sách dài 7 thì sao? . Vì vậy, đối với danh sách có độ dài 7, chúng ta chỉ cần thực hiện 3 lần hoán đổi. Nếu độ dài danh sách là số lẻ, số lần hoán đổi là độ dài của danh sách, chia cho 2 và làm tròn xuống. Nếu độ dài danh sách là số chẵn, số lần hoán đổi là độ dài của danh sách chia cho 2. Vì vậy, thiết kế thuật toán cuối cùng của chúng tôi là

worst_things_about_cs1 = []
0

Bây giờ hãy triển khai thuật toán Reverse_list trong mã Python. Chúng ta cần lặp qua nửa đầu [làm tròn xuống] của danh sách. Chúng ta có thể sử dụng vòng lặp while cho việc đó

Có một vài điều khó khăn để nhận thấy. Đầu tiên, chúng ta có thể hoàn thành việc làm tròn xuống chỉ mục của mục ở giữa danh sách chỉ bằng cách sử dụng phép chia số nguyên [

worst_things_about_cs1 = []
06]. Trong Python 2, chúng ta có thể chỉ sử dụng toán tử
worst_things_about_cs1 = []
07, nhưng toán tử chia số nguyên
worst_things_about_cs1 = []
08 làm cho nó cụ thể hơn và cũng hoạt động với Python 3

Ngoài ra, vì các chỉ mục trong danh sách bắt đầu từ 0, nên chúng ta phải cẩn thận khi tính toán chỉ mục vào nửa sau của danh sách. Thật tốt khi kiểm tra một ví dụ. Giả sử danh sách

worst_things_about_cs1 = []
09 có độ dài 8. Sau đó, chỉ mục của mục cuối cùng phải là 7. Vì vậy, chúng ta nên sử dụng
worst_things_about_cs1 = []
40, sau đó trừ chỉ mục hiện tại để đưa chỉ mục vào nửa sau của danh sách. Giải quyết. nếu chỉ số là 0, thì
worst_things_about_cs1 = []
41 cho 7. Nếu chỉ số là 1, thì
worst_things_about_cs1 = []
42 cho 6. Nếu chỉ số là 2, thì
worst_things_about_cs1 = []
43 cho 5. Và như thế. Vì vậy, nó hoạt động ra

Điều cuối cùng cần lưu ý là cách chúng tôi hoán đổi vật phẩm. Chúng ta cần một biến tạm thời để giữ một trong các giá trị. Giả sử bạn đã thử một cái gì đó như thế này

worst_things_about_cs1 = []
9

Cả hai mục của danh sách sẽ có cùng giá trị sau dòng đầu tiên và giá trị ban đầu của

worst_things_about_cs1 = []
44 đã bị mất vĩnh viễn

Nếu cần một biến tạm thời làm bạn bối rối, hãy nghĩ về nó theo cách này. Giả sử rằng Nicole và Tom muốn hoán đổi vị trí của hai chiếc ô tô trong nhà để xe hai ô tô của họ. Tom's Chevy bắt đầu ở bên trái và Nicole's Honda bắt đầu ở bên phải. Tom không thể cứ lái chiếc Chevy của mình đi về phía bên phải. Không, anh ta phải để chiếc Chevy của mình ở lối vào [nhà kho tạm thời], sau đó đưa chiếc Honda của Nicole vào bên trái, và cuối cùng chuyển chiếc Chevy của mình sang bên phải

Thêm vào một danh sách hiện có

Nếu bạn có một danh sách hiện có và muốn thêm một mục vào cuối, bạn có thể làm điều đó với hàm

worst_things_about_cs1 = []
45

Cú pháp của

worst_things_about_cs1 = []
45 có thể không như bạn mong đợi. Bạn có thể đã mong đợi điều gì đó giống như
worst_things_about_cs1 = []
47, vì rõ ràng
worst_things_about_cs1 = []
45 cần hai điều. biến đề cập đến danh sách,
worst_things_about_cs1 = []
49 và dữ liệu để nối thêm,
worst_things_about_cs1 = []
80

Khoảng thời gian làm gì trong

worst_things_about_cs1 = []
81? . Các phương thức thay đổi những thứ được gọi là đối tượng. Chúng ta sẽ thấy các đối tượng một cách chi tiết trong chương sắp tới và cú pháp gọi
worst_things_about_cs1 = []
45 này chỉ ra rằng danh sách là một loại đối tượng. Trong trường hợp này, chúng tôi đang gọi phương thức
worst_things_about_cs1 = []
45 trong danh sách
worst_things_about_cs1 = []
49, truyền cho phương thức tham số
worst_things_about_cs1 = []
80. Nếu cuộc thảo luận này không có ý nghĩa với bạn bây giờ, đừng sợ. nó sẽ. Trong khi chờ đợi, chỉ cần nghĩ rằng cách để thêm một mục, chẳng hạn như
worst_things_about_cs1 = []
86, vào một danh sách, chẳng hạn như
worst_things_about_cs1 = []
87, là gọi
worst_things_about_cs1 = []
88

Tập thể dục. nghệ thuật vòng tròn

Khách quan. Nối các mục vào danh sách để đáp ứng với đầu vào của người dùng

Sửa đổi chương trình sau để nó cho phép người dùng vẽ các vòng tròn trên màn hình trong khi kéo chuột bằng cách nhấn nút. Không xóa hoặc bằng bất kỳ cách nào khác ngăn không cho hàm

worst_things_about_cs1 = []
89 được gọi mỗi khi hàm
worst_things_about_cs1 = []
90 được gọi

Đây là một giải pháp

Chèn vào và xóa khỏi danh sách

Có một vài hoạt động danh sách mà bạn nên biết về

Bạn có thể chèn một mục vào danh sách và xóa một mục khỏi danh sách bằng cách sử dụng phương thức

worst_things_about_cs1 = []
91 và thao tác
worst_things_about_cs1 = []
92, như minh họa trong

Để xóa một mục, bạn chỉ cần viết

worst_things_about_cs1 = []
92 theo sau là tên của danh sách và chỉ mục của mục bạn muốn xóa, để dòng
worst_things_about_cs1 = []
94 xóa mục ở chỉ mục 1. Bạn cũng có thể xóa một phần liền kề của danh sách, sử dụng ký hiệu dấu hai chấm. Trong ví dụ của chúng tôi,
worst_things_about_cs1 = []
95 xóa các mục bắt đầu từ chỉ mục 1 và đi lên—nhưng không bao gồm—chỉ mục 4. Nói chung, nếu bạn viết
worst_things_about_cs1 = []
96, bạn sẽ xóa các mục từ chỉ mục i đến chỉ mục j − 1

Để chèn vào một danh sách, bạn gọi phương thức

worst_things_about_cs1 = []
91. Phương thức này nhận hai tham số. chỉ mục của mục bạn muốn chèn trước đó và mục cần chèn. Vì vậy, khi chúng tôi gọi
worst_things_about_cs1 = []
98, chúng tôi đang chèn trước mục ở chỉ số 3 [
worst_things_about_cs1 = []
99]. Nếu bạn đưa cho
worst_things_about_cs1 = []
91 một chỉ mục nằm ngoài cuối danh sách, như trong
worst_things_about_cs1 = []
01, thì nó giống như một phép toán của
worst_things_about_cs1 = []
45

Chúng ta thường sử dụng vòng lặp để làm việc với các phần tử của danh sách khi lập trình. Phần này giới thiệu một loại vòng lặp mới, được gọi là vòng lặp for, đặc biệt phù hợp để xử lý các phần tử của danh sách. Bất cứ điều gì bạn có thể hoàn thành với vòng lặp for thì bạn cũng có thể hoàn thành với vòng lặp while, vì vậy chúng tôi sẽ không lấy thêm bất kỳ sức mạnh nào từ vòng lặp for. Nhưng chúng ta sẽ thấy rằng chúng dễ đọc và dễ gõ hơn. Các cách thay thế, ngắn gọn hơn để diễn đạt cùng một điều trong mã được gọi là đường cú pháp, bởi vì chúng chỉ là một phần bổ sung ngọt ngào.

Trước khi chúng ta đến với vòng lặp for, hãy xem một ví dụ khác với vòng lặp while. Một trường hợp đặc biệt phổ biến là khi bạn muốn sử dụng từng mục trong danh sách nhưng không thực sự muốn thay đổi danh sách. Dưới đây là một ví dụ về việc chỉ cần in ra tất cả các mục của danh sách

Bạn có thể nhận thấy rằng trong vòng lặp trên, biến

worst_things_about_cs1 = []
03 không bao giờ được sử dụng riêng lẻ; . Bạn không bao giờ in ra
worst_things_about_cs1 = []
03, bạn không tính toán bất cứ thứ gì với nó và bạn thực sự không quan tâm giá trị của nó là bao nhiêu. Bạn chỉ muốn lấy từng mục của danh sách
worst_things_about_cs1 = []
05 và in nó. Bạn cũng không thực sự quan tâm đến ________ 206. Vâng, bạn cần sử dụng nó để biết khi nào kết thúc vòng lặp while, nhưng ai quan tâm giá trị thực tế là bao nhiêu? . Không có lý do thực sự nào để không in trực tiếp
worst_things_about_cs1 = []
08, nhưng biến tạm thời này sẽ giúp làm rõ lời giải thích về các vòng lặp for. ]

Nếu bạn đang mô tả phương pháp in ra tên của các mặt trăng ở cấp độ cao, bạn có thể nói [bằng tiếng Anh] đại loại như, “For every item of the

worst_things_about_cs1 = []
05 list, print out that item. ” Bạn có thể không cho tôi biết về việc khởi tạo
worst_things_about_cs1 = []
03, về chi tiết cơ học của việc tăng
worst_things_about_cs1 = []
03 mỗi lần qua vòng lặp hoặc về việc so sánh
worst_things_about_cs1 = []
03 với
worst_things_about_cs1 = []
06. Con người không nghĩ như vậy. Chúng ta có thể ẩn các chi tiết này bằng vòng lặp for

Vòng lặp for lặp lại các mục trong danh sách, làm cho mỗi mục có sẵn theo thứ tự. Đây là một ví dụ, trong moons_for. py, hoạt động giống như ví dụ với vòng lặp while

Với vòng lặp for, bạn không cần tạo biến chỉ mục, tăng biến chỉ mục hoặc so sánh biến chỉ mục với độ dài của danh sách. Python thực hiện công việc đó cho bạn trong nội bộ, đằng sau hậu trường. Có một vài điều quan trọng cần chú ý

  1. Nếu bạn thực sự muốn giá trị của chỉ mục, bạn không thể xác định nó trong vòng lặp for. Bạn sẽ cần sử dụng vòng lặp while

  2. Bạn không thể thay đổi danh sách

    worst_things_about_cs1 = []
    05 trong vòng lặp for. Mỗi mục được sao chép vào biến tạm thời
    worst_things_about_cs1 = []
    07. Bạn có thể thay đổi
    worst_things_about_cs1 = []
    07 nếu muốn, nhưng điều đó sẽ không thay đổi danh sách. Nếu bạn muốn thay đổi danh sách, bạn sẽ cần sử dụng vòng lặp while

Bởi vì vòng lặp for đơn giản và dễ đọc hơn, bạn nên sử dụng vòng lặp for trong mã của mình ở bất cứ nơi nào mục tiêu là tham chiếu đến các mục của danh sách nhưng không thay đổi danh sách. Nếu bạn muốn thay đổi các mục trong danh sách, bạn nên sử dụng vòng lặp while

Sử dụng
worst_things_about_cs1 = []
97 để tạo danh sách các giá trị
worst_things_about_cs1 = []
98

Một số hàm trả về danh sách. Ví dụ: hàm Python tích hợp sẵn

worst_things_about_cs1 = []
97 cung cấp int trong một phạm vi được chỉ định. [Được tích hợp sẵn, ý tôi là bạn thậm chí không phải nhập nó từ bất cứ đâu. ] Ví dụ,
worst_things_about_cs1 = []
60 đưa ra danh sách

worst_things_about_cs1 = []
6

Lưu ý rằng số cuối cùng trong danh sách là 9, không phải 10

worst_things_about_cs1 = []
97 có thể giúp bạn tiết kiệm một số thao tác gõ nếu bạn muốn đếm các số nguyên. Đây là một ví dụ

Nếu bạn chỉ cung cấp cho hàm

worst_things_about_cs1 = []
97 chỉ một tham số, thì danh sách sẽ bắt đầu từ 0

Bằng cách gọi

worst_things_about_cs1 = []
01 và
worst_things_about_cs1 = []
97, bạn có thể sử dụng vòng lặp for để lập chỉ mục cho danh sách. Sau đó, bạn có thể thay đổi các giá trị trong danh sách, vì bạn có một chỉ mục. Ví dụ: đây là hai cách để nhân đôi mỗi số trong danh sách

Tập thể dục. bong bóng

Khách quan. Truy cập và sửa đổi danh sách trong vòng lặp for bằng biến chỉ mục

Chương trình sau thêm tọa độ x và y vào danh sách để biểu thị bong bóng trong nước. Viết một vòng lặp for vẽ tất cả các bong bóng và di chuyển mọi bong bóng lên trên một pixel sau khi nó được vẽ. Lưu ý rằng vì các bong bóng ban đầu được đặt ở dưới cùng của màn hình nên ban đầu bạn sẽ không nhìn thấy gì; . Để gỡ lỗi, bạn có thể tăng tần suất bong bóng và đặt chúng ở vị trí cao hơn trên màn hình

Đây là một giải pháp

Bạn có thể coi một chuỗi giống như một danh sách [đại loại là]

Bạn có thể lấy một ký tự từ một chuỗi gần như thể chuỗi đó là một danh sách

Bạn thậm chí có thể lặp qua các ký tự trong một chuỗi,

Bạn có thể nghĩ rằng bạn cũng có thể thay đổi một ký tự trong chuỗi theo cách này. Nó sẽ không hoạt động.

worst_things_about_cs1 = []
65 sẽ báo lỗi. Chuỗi Python là bất biến;

Nếu bạn muốn làm điều gì đó như thay đổi chữ cái thứ ba thành r, bạn sẽ phải tạo một chuỗi hoàn toàn mới, sử dụng chuỗi cũ và chữ cái mới. Chúng ta sẽ xem cách thực hiện điều đó sau trong khóa học

Làm thế nào nó hoạt động. Danh sách trong bộ nhớ

Cân nhắc khi lần đầu tiên chúng ta gán cho một biến, chẳng hạn như

worst_things_about_cs1 = []
66. Python biết rằng
worst_things_about_cs1 = []
67 là một số nguyên và Python biết rằng bốn byte bộ nhớ thường đủ để lưu trữ số nguyên đó. Python phân bổ bốn byte đó và nó sao chép mã nhị phân tương ứng với giá trị 5 vào các byte đó. Chúng tôi nói rằng giá trị 5 được lưu trữ trong biến

Điều gì đó khác xảy ra khi bạn tạo danh sách. Không gian trong bộ nhớ được phân bổ cho danh sách ở đâu đó khác với địa chỉ của biến. Biến chỉ lưu trữ địa chỉ của danh sách. Hãy xem một ví dụ

worst_things_about_cs1 = []
5

Đây là những gì xảy ra. Đầu tiên, Python nhìn thấy một danh sách theo nghĩa đen ở phía bên tay phải của dấu bằng. Python tìm không gian bộ nhớ cho dữ liệu danh sách

worst_things_about_cs1 = []
68 trong một vùng bộ nhớ được gọi là heap. Danh sách mới này hiện có một địa chỉ. Giả sử địa chỉ của dữ liệu danh sách đó là 1000

Bây giờ Python nhìn vào phía bên trái của toán tử gán. Python phải tạo một biến mới,

worst_things_about_cs1 = []
69. Python sao chép giá trị 1000—địa chỉ của danh sách—vào biến
worst_things_about_cs1 = []
69. Đây là cách bạn nên nghĩ về nó

Tôi đã vẽ mũi tên để chỉ ra rằng biến

worst_things_about_cs1 = []
69 thực sự chỉ cho chúng ta biết rằng bản thân danh sách nằm ở một nơi khác, trong trường hợp này là tại địa chỉ 1000

Lưu ý quan trọng. Sẽ không chính xác nếu nói rằng biến

worst_things_about_cs1 = []
69 chứa danh sách. Trong ví dụ trước của chúng tôi,
worst_things_about_cs1 = []
66, biến
worst_things_about_cs1 = []
67 thực sự chứa giá trị 5 [hoặc ít nhất là biểu diễn nhị phân của nó], không phải địa chỉ hay bất kỳ thứ gì khác. Tuy nhiên, đối với danh sách, biến đặt tên cho danh sách—
worst_things_about_cs1 = []
69 trong ví dụ này—chỉ chứa địa chỉ của dữ liệu danh sách, không chứa chính dữ liệu danh sách

Chúng tôi không thể lưu trữ một danh sách trong một biến, bởi vì danh sách có thể có kích thước bất kỳ. Nhưng cũng giống như các giá trị số nguyên, tất cả các địa chỉ đều có cùng kích thước, vì vậy chúng tôi biết có bao nhiêu khoảng trống trong một biến để sử dụng cho một địa chỉ

Bí danh và toán tử gán

Bởi vì địa chỉ của một danh sách được lưu trữ trong một biến, thay vì thực sự lưu trữ chính dữ liệu danh sách đó trong biến, một thuộc tính quan trọng theo sau. bất kỳ biến nào lưu trữ địa chỉ đó đều có thể được sử dụng để thay đổi danh sách. Nhìn vào ví dụ này

Chương trình này in

worst_things_about_cs1 = []
0

Lưu ý rằng

worst_things_about_cs1 = []
56 không còn là
worst_things_about_cs1 = []
57;

Điều gì đã xảy ra ở đây?

Toán tử gán luôn sao chép giá trị của một biến. Nhưng trong trường hợp này, giá trị của biến

worst_things_about_cs1 = []
01 là một địa chỉ nào đó [có lẽ là 2000], chứ không phải chính danh sách đó. Danh sách không được sao chép bởi toán tử gán trong
worst_things_about_cs1 = []
02. Chỉ địa chỉ được sao chép. Không có hai danh sách khác nhau trong đống;

Bây giờ, khi mục ở chỉ mục 3 trong danh sách có địa chỉ được lưu giữ tại

worst_things_about_cs1 = []
04 được thay đổi thành
worst_things_about_cs1 = []
06, thì danh sách duy nhất tại địa chỉ 2000 sẽ thay đổi

Tôi đã viết mục ở chỉ số 3 bằng chữ in nghiêng chỉ để làm nổi bật nó. Khi chúng ta in danh sách bằng cách sử dụng biến

worst_things_about_cs1 = []
01 [chứa địa chỉ của cùng một danh sách], chúng ta thấy rằng danh sách đã thay đổi

Bạn có thể nghĩ về nó như thế này. Giả sử bạn có số tài khoản tiết kiệm. Bạn có thể coi con số đó là địa chỉ được sử dụng để chỉ một đống tiền trong kho tiền ngân hàng ở đâu đó. Bây giờ nếu ngân hàng chỉ định cho tôi cùng một địa chỉ [số tài khoản tiết kiệm] thì tôi có thể sử dụng số đó để rút một nửa số tiền. Khi bạn nhìn vào tài khoản, một nửa số tiền đã biến mất

Khi hai tên gọi cùng một thứ, những tên đó được gọi là bí danh của nhau. Tiến sĩ. Dre và Andre Ramelle Young đều đề cập đến cùng một người. Bí danh có thể là một nguồn gây ra các lỗi khó tìm. [Bạn có thể coi đó là lỗi nếu tôi rút một nửa số tiền từ tài khoản tiết kiệm của bạn và bạn thậm chí không biết rằng chúng ta có cùng số tài khoản. ]

Đối với số nguyên, số float hoặc booleans, toán tử gán tạo một bản sao mới của dữ liệu, không phải bản sao của địa chỉ, vì vậy đối với các kiểu nguyên thủy này, việc thay đổi giá trị của một biến không bao giờ ảnh hưởng đến giá trị của biến khác. Đối với các chuỗi, toán tử gán sao chép địa chỉ, nhưng vì các chuỗi là bất biến nên bạn sẽ không bao giờ nhận thấy rằng răng cưa đang xảy ra

Tại sao sự khác biệt giữa cách xử lý các loại và danh sách nguyên thủy? . Sao chép địa chỉ của danh sách có thể là đủ. Sau này chúng ta sẽ thấy rằng chúng ta vẫn có thể nói với Python rằng chúng ta thực sự muốn sao chép chính danh sách chứ không chỉ địa chỉ, bằng cách sử dụng một hàm đặc biệt

worst_things_about_cs1 = []
08

Truyền danh sách cho các chức năng [và răng cưa]

Nếu bạn chuyển địa chỉ của danh sách cho một hàm, thì hàm đó có thể thay đổi dữ liệu tại địa chỉ đó. Hàm không thay đổi giá trị của tham số được truyền cho nó, đây chỉ là một số địa chỉ của danh sách. Nhưng dữ liệu chứa trong danh sách bị thay đổi

Tập thể dục. chức năng để đảo ngược một danh sách

Khách quan. Thực hiện triển khai thuật toán danh sách và gói nó trong một hàm lấy danh sách làm tham số

Đảo ngược một danh sách có vẻ như là một điều hữu ích để làm; . Bí danh cho phép chúng tôi di chuyển mã đó vào một chức năng. Viết hàm

worst_things_about_cs1 = []
09 nhận vào một tham số là địa chỉ của một danh sách để đảo ngược và đảo ngược danh sách đó tại chỗ. Kiểm tra chức năng của bạn bằng cách gọi
worst_things_about_cs1 = []
09 trên danh sách kiểm tra các số

Đây là một giải pháp

Sao chép danh sách với
worst_things_about_cs1 = []
08

Đôi khi, bạn thực sự muốn có một bản sao của một danh sách. Bạn có thể sử dụng chức năng

worst_things_about_cs1 = []
08 để tạo một bản sao của danh sách. Hàm
worst_things_about_cs1 = []
08 sao chép tất cả dữ liệu trong danh sách vào một vùng mới trong heap và trả về địa chỉ của dữ liệu mới

Sắp xếp danh sách với
worst_things_about_cs1 = []
14

Python chứa một hàm tích hợp hữu ích,

worst_things_about_cs1 = []
14, tạo một bản sao được sắp xếp của danh sách gốc và trả về danh sách đó. Hàm
worst_things_about_cs1 = []
14 không thay đổi danh sách ban đầu. Nhìn vào ví dụ này

Chạy nó và nhìn vào đầu ra

Chức năng

worst_things_about_cs1 = []
14 hoạt động như thế nào? . Lát nữa chúng ta sẽ thấy một thuật toán sắp xếp đơn giản được gọi là sắp xếp lựa chọn

Có thể lưu trữ các loại mặt hàng khác nhau trong một danh sách. Tuy nhiên, bạn nên tránh làm như vậy hầu hết thời gian

worst_things_about_cs1 = []
1

Vấn đề là nếu bạn muốn áp dụng một thao tác nào đó cho tất cả các mục trong danh sách, bạn không thể chắc chắn rằng làm như vậy có hợp lý hay không. Hãy tưởng tượng bạn đã cố gắng sắp xếp

worst_things_about_cs1 = []
18 bằng cách sử dụng hàm
worst_things_about_cs1 = []
14. Kết quả sẽ là gì? . Việc lập trình dựa vào hành vi đáng ngạc nhiên mà bạn không thể dự đoán là một điều tồi tệ

Bạn có thể khởi tạo danh sách trong vòng lặp for không?

3. Khởi tạo danh sách bằng phương pháp hiểu danh sách. Trong phương thức này, chúng ta thấy phương thức phạm vi trong vòng lặp for để tạo và khởi tạo danh sách . Phương thức này có thể được sử dụng để tạo bất kỳ danh sách có thể lặp lại nào khác bằng cách sử dụng đối tượng có thể lặp lại hiện có, chẳng hạn như phạm vi [].

Bạn có thể đặt vòng lặp for trong danh sách Python không?

1. Một vòng lặp đơn giản. Sử dụng vòng lặp for trong Python là một trong những phương pháp đơn giản nhất để lặp qua một danh sách hoặc bất kỳ chuỗi nào khác [e. g. bộ dữ liệu, bộ hoặc từ điển].

Chủ Đề