Các khái niệm chính trong Python là gì?
Cập nhật ngày 18 tháng 5 năm 2017. Đã gần bốn năm kể từ khi tôi viết bài đăng gốc trên blog này. Theo Google Analytics, nó đã trở thành bài đăng blog phổ biến nhất mà tôi từng viết. Ngoài ra, trong khoảng thời gian bốn năm đó, tôi đã có nhiều kinh nghiệm lập trình hơn bằng Python như một phần của chuyên ngành đại học khoa học máy tính của tôi sau bằng Tiến sĩ của tôi. D. nghiên cứu, vì vậy tôi nghĩ đã đến lúc tôi cung cấp thông tin cập nhật sớm. Hãy theo dõi một bài viết blog mới. (Bài đăng này sẽ vẫn được lưu trữ vì lý do lịch sử và vì tôi muốn nhìn lại bài viết trước đây của mình. ) Tôi đã từng lập trình bằng Java trước khi chuyển đổi sang Python. Và bây giờ tôi đã trở thành một người hâm mộ cuồng nhiệt của Python, tôi nghĩ mình sẽ cung cấp 10 sự thật hoặc khái niệm cơ bản nhưng quan trọng về Python. Tất cả những thứ này đều hữu ích với tôi trong năm qua khi tôi chọn Python làm ngôn ngữ lập trình chính của mình. Nếu bạn mới bắt đầu làm quen với Python hoặc quan tâm đến những gì ngôn ngữ này cung cấp, bạn có thể thấy phần tổng quan này hữu ích. Mục nhập này giả định rằng bạn cảm thấy thoải mái với thuật ngữ lập trình cơ bản và cú pháp Python, chẳng hạn như hiểu vai trò của khoảng trắng trong Python Tôi cũng sử dụng mã một cách đáng kể trong suốt bài đăng này, vì vậy hãy lưu ý rằng các nhận xét một dòng trong Python được đặt trước thẻ bắt đầu bằng # 9. Để nhận xét một khối văn bản trong Python, chúng ta có thể bao quanh văn bản bằng ba dấu ngoặc kép 0 ở đầu và cuối. Phương pháp này giúp việc nhận xét nhiều dòng trở nên dễ dàng hơn vì chúng ta không phải đặt dấu gạch chéo ở đầu mỗi dòngCuối cùng, trước khi chúng ta đi vào nội dung chính của bài đăng, nếu một người có kế hoạch sử dụng Python một cách nghiêm túc, thì điều cần thiết là phải tự làm quen với các trang web sau
Tôi bao gồm cả Stack Overflow vì kể từ khi nó mở ra, mọi người đã hỏi vô số câu hỏi về lập trình Python ở đó. Nếu bạn gặp lỗi cú pháp cơ bản, hãy cố gắng tránh đặt câu hỏi trên Stack Overflow vì có thể ai đó đã làm rồi. Trên thực tế, trong nhiều trường hợp, Stack Overflow đã trở thành tài liệu. (Nhưng đó là một câu chuyện cho một ngày khác. ) Điều đó nói rằng, hãy thảo luận về mười trong số một số khái niệm quan trọng mà các lập trình viên Python nên biết 1. Số phiên bản Python Mặc dù về mặt kỹ thuật, đây không phải là một tính năng lập trình, nhưng điều quan trọng là phải biết các phiên bản hiện tại của Python để tất cả chúng ta đều ở trên cùng một trang. Các phiên bản Python được đánh số là A. B. C. , trong đó ba chữ cái biểu thị (theo thứ tự giảm dần) những thay đổi quan trọng trong ngôn ngữ. Vì vậy, ví dụ, đi từ 2. 7. 3 đến 2. 7. 4 có nghĩa là bản dựng Python đã thực hiện một số sửa lỗi nhỏ, trong khi chuyển từ 2. xx đến 3. xx đại diện cho một sự thay đổi lớn. Lưu ý 'x' ở đây, đây là cố ý; . 7. C cho bất kỳ giá trị 'C' hợp lệ nào, sau đó chúng tôi nhập 'x' và tham khảo Python 2. 7. x. Chúng ta cũng có thể bỏ hoàn toàn chữ 'x' và chỉ sử dụng 2. 7 Tính đến thời điểm viết bài này (tháng 7 năm 2013), Python có hai phiên bản ổn định thường được sử dụng. 2. 7 và 3. 3. Ít quan trọng hơn là nhân vật thứ ba, nhưng ngay bây giờ 2. 7. 5 và 3. 3. 2 là phiên bản hiện tại, cả hai đều được phát hành vào ngày 15 tháng 5 năm 2013. Câu trả lời ngắn gọn là, trong khi cả 2. 7 và 3. 3 là hoàn toàn tốt để sử dụng, 3. 3 là tương lai của ngôn ngữ này và ai đó mới bắt đầu học Python hôm nay có lẽ nên sử dụng Python 3. 3 trên 2. 7. Tất nhiên, nếu một người đang ở giữa một dự án nghiên cứu sâu rộng sử dụng nhiều 2. 7, thì việc nâng cấp lên 3 có thể không hợp lý. 3 ngay. Điều này thực sự khá giống với tình huống hiện tại của tôi, vì tôi đang sử dụng khá nhiều Python 2 của riêng mình. 7 script giúp tôi phân tích thuật toán tổ hợp trên word. Khi tháng 8 đến, tôi sẽ chuyển đổi hoàn toàn sang Python 3. 3. Tuy nhiên, trong thời gian chờ đợi, tôi đã đọc khá nhiều về các phiên bản mới của Python 3 và tôi có 3. 3. 2 đã cài đặt (ngoài 2. 7. 4) trên máy tính xách tay của tôi, vì vậy bài đăng này và cú pháp mã của nó sẽ cho rằng chúng tôi đang sử dụng Python 3 Tuy nhiên, một điều quan trọng cần lưu ý là Python 3 cố tình không tương thích ngược. Khả năng tương thích ngược thường là một tính năng mong muốn của các ngôn ngữ lập trình và phần mềm thường xuyên trải qua các phiên bản, vì điều đó có nghĩa là đầu vào từ các phiên bản cũ hơn (e. g. các chương trình Python cũ hơn) vẫn có thể chạy trong các bản dựng mới nhất. Trong trường hợp này, mã Python 2 sẽ không được đảm bảo chạy thành công nếu sử dụng Python 3, vì vậy có thể cần một số chuyển đổi để cho phép mã chạy đúng cách. Tính không tương thích ngược là cần thiết để cho phép Python 3 rõ ràng hơn, ngắn gọn hơn và sử dụng các tính năng bổ sung Trong khi chờ đợi, sự khác biệt giữa Python 2 và 3 là gì, dù sao thì Điều đó nằm ngoài phạm vi của bài đăng này, nhưng tôi đã thêm vào các tài liệu tham khảo ở cuối phần dựa trên tài liệu chính thức của Python. Tôi cho rằng cải tiến chính là hỗ trợ Unicode tốt hơn, nhưng cũng có một số sửa lỗi nhỏ ở đây và ở đó, cải thiện một số tính năng khó chịu của 2. 7. Tuy nhiên, trong khi có đủ thay đổi để đảm bảo 2. x đến 3. x thay đổi, Guido van Rossum nói trong phần tổng quan của mình rằng
Một lưu ý. Guido van Rossum là người tạo ra Python và vẫn duy trì vai trò lãnh đạo của mình đối với sự phát triển của ngôn ngữ lập trình, vì vậy nếu có điều gì đó ông ấy nói về Python, thì điều đó thường có thể được coi là đúng Nhân tiện, nếu bạn tò mò muốn xem phiên bản Python của mình, bạn chỉ cần dán đoạn mã sau vào chương trình
Ở đây, văn bản bên trong dấu ngoặc kép được in như vốn có, ngoại trừ dấu ngoặc kép 1 và 2, biến thành 3 hay nói cách khác, phiên bản Python. Đây là định dạng chuỗi cổ điểnNgoài ra, nếu bạn đang sử dụng máy tính Linux hoặc Mac, bạn có thể thực hiện trực tiếp công việc tương tự trong trình thông dịch Python trên trình thông dịch dòng lệnh (i. e. Unix Shell) hoặc Mac OS X Terminal. Người dùng Windows sẽ cần cài đặt phần mềm của bên thứ ba, chẳng hạn như Cygwin, vì không có giao diện dòng lệnh tích hợp. Nhưng trong khi chờ đợi, Terminal cực kỳ hữu ích này đưa chúng ta đến điểm tiếp theo… 2. Sử dụng vỏ Python Không còn nghi ngờ gì nữa, một trong những khía cạnh hữu ích nhất của Python là nó được cài đặt tự động với shell của chính nó. Python Shell có thể được thực thi bằng cách nhập 4 từ dòng lệnh (trong Windows, sẽ có một ứng dụng mà bạn chỉ cần nhấp đúp vào). Bằng cách đó, bạn sẽ thấy số phiên bản mặc định, thông báo bản quyền và ba mũi tên (hoặc “r-angles” trong LaTeX-speak) 5 yêu cầu bạn cung cấp thông tin đầu vào. Nếu bạn đã cài đặt nhiều phiên bản Python, bạn có thể cần thêm số phiên bản 6 để có phiên bản chính xácVậy tại sao trình bao Python lại hữu ích như vậy? . Trong nhiều trường hợp, bạn sẽ có thể phát hiện liệu có lỗi cú pháp hoặc lỗi logic trong một số lệnh mà bạn muốn sử dụng hay không trước khi lệnh đó được kiểm tra trong một số tập lệnh khổng lồ có thể tiêu tốn bộ nhớ hoặc tốn nhiều thời gian Dưới đây, tôi đã đính kèm một ảnh chụp màn hình về việc tôi thực hiện một số lệnh trên Terminal của Macbook Pro, sử dụng 3. 3 vỏ trăn Nhóm lệnh này thiết lập một danh sách trống ( 7) và thêm vào đó tất cả các số nguyên chẵn trong phạm vi \([2, 16)\)Để cho thấy lý do tại sao trình bao này có thể hữu ích, giả sử tôi đã quên nhập tham số cuối cùng của 8 nên tôi đã nhập vào 9 thay thế. Sau đó, khi tôi in nội dung của danh sách sau vòng lặp for, tôi sẽ thấy tất cả các số từ 2 đến 15, thay vì chỉ các số chẵn. Nhưng vì tôi chỉ muốn các số chẵn trong chương trình “thực” mà tôi đang làm việc, điều này sẽ nhắc tôi thêm vào tham số cuối cùng đó. Đó là một ví dụ ngớ ngẩn, nhưng nó thực sự cho thấy việc kiểm tra những gì bạn làm trong trình bao trước khi bạn chèn nó vào một chương trình thực có thể mang lại lợi ích như thế nào. Tôi sẽ sử dụng trình bao trong một số bit mã khác trong bài đăng này, mà bạn có thể nhận ra bằng ba “r-angle” 5Các ngôn ngữ phổ biến khác như C++ và Java có phiên bản trình bao Python của riêng chúng, nhưng tôi tin rằng bạn sẽ cần phải cài đặt một cái gì đó. Và việc cài đặt các chương trình kiểu Linux có thể không hề đơn giản vì thường không có GUI đẹp mắt có thể nhấp được để có thể thực hiện cài đặt ngay lập tức 3. Sử dụng 'os' và 'sys' Tôi thấy cả hai mô-đun os và sys đều cực kỳ hữu ích đối với tôi vì mục đích tiện lợi và tổng quát Trước tiên, hãy xem qua mô-đun 31. Có thể lợi thế lớn nhất mà nó mang lại cho lập trình viên là việc sử dụng các đầu vào dòng lệnh cho chương trình. Giả sử bạn đã xây dựng một chương trình lớn sẽ thực hiện một số tác vụ phụ thuộc vào đầu vào từ người dùng. Chẳng hạn, trong lớp học máy của tôi vào học kỳ trước, tôi đã triển khai thuật toán phân cụm k-means. Đây là một thuật toán học tập được cung cấp dữ liệu và có thể phân loại nó thành các nhóm tùy thuộc vào số lượng cụm được cung cấp làm đầu vào. Rõ ràng là điều này có thể hữu ích trong nhiều ứng dụng cuộc sống. Một người có dữ liệu chuẩn hóa về hồ sơ bệnh nhân y tế (e. g. lượng đường trong máu, chiều cao, cân nặng, v.v. ) có thể muốn phân loại bệnh nhân thành hai "nhóm", có thể là (1) khỏe mạnh hoặc (2) ốm yếu. Hoặc có lẽ có thể có n cụm, trong đó bệnh nhân được phân loại vào các cụm có số lượng thấp hơn có triển vọng tốt hơn so với những cụm có số lượng caoSau đó, để thực hiện phân cụm k-means, về mặt logic, chúng ta cần hai đầu vào. (1) bản thân dữ liệu và (2) số lượng cụm. Một ý tưởng là đưa những thứ này trực tiếp vào chương trình, rồi chạy nó. Nhưng điều gì sẽ xảy ra nếu chúng tôi muốn tiếp tục thay đổi tệp dữ liệu mà chúng tôi đang sử dụng hoặc số lượng cụm? Một cách tốt hơn là sử dụng các đối số dòng lệnh. Thay đổi đầu vào trên dòng lệnh thường nhanh hơn mở trình soạn thảo văn bản và nhập lại các biến. Chúng ta có thể làm điều này với sys. argv, nhận đầu vào từ dòng lệnh. Là một biện pháp bảo vệ bổ sung, người ta cũng có thể đảm bảo rằng người dùng nhập đúng số tham số. Tôi đã thực hiện việc này trong đoạn mã sau từ thuật toán phân cụm k-means của mình
Ở đây, 32 đại diện cho danh sách các đối số dòng lệnh, với tên của mã là phần tử đầu tiên. Nếu tôi đã nhập các tham số chính xác, thì chương trình sẽ diễn ra suôn sẻ, với 33 và 34 được kết hợp liền mạchNgoài tốc độ, một ưu điểm khác của đối số dòng lệnh là chúng có thể được sử dụng như một phần của quy trình để tự động hóa lặp đi lặp lại cùng một tập lệnh. Giả sử tôi muốn chạy đi chạy lại tập lệnh 35 của mình với giá trị cụm nằm trong khoảng từ 2 đến 100. Một cách là gọi một cách tẻ nhạt 35 trên dòng lệnh với tham số cuối cùng là '2', sau đó thực hiện tương tự với '3' sau khi lần chạy đầu tiên kết thúc, sau đó thực hiện '4', v.v. Nói cách khác, tôi phải gọi chương trình 99 lầnCách tốt hơn là tạo một tập lệnh Python khác và sử dụng os. hệ thống gọi 35 bao nhiêu lần tôi muốn. Và điều này dễ như thay đổi đầu vào thành 38. Nó nhận vào một chuỗi, vì vậy tôi sẽ đặt một vòng lặp for sẽ tạo ra chuỗi duy nhất của nó, chuỗi này sau đó sẽ đóng vai trò là đầu vào cho dòng lệnh. Xem mã sau để biết ví dụ, trong đó 39 là tệp tạo sẵn mà tôi đang sử dụng làm ví dụ
Vì vậy, bây giờ chương trình này sẽ tự động gọi kmeans_clustering 99 lần, mỗi lần có một tham số khác nhau cho số lượng cụm. Khá hữu ích phải không? . Chỉ cần cảnh giác rằng nếu bạn thực hiện thay đổi đối với một chương trình trong khi một tập lệnh khác đang gọi nó, thì những thay đổi đó sẽ được phản ánh vào lần tiếp theo khi chương trình được gọi 4. Danh sách hiểu Theo tôi, việc hiểu danh sách hoặc quá trình hình thành danh sách từ các danh sách hoặc cấu trúc khác là thứ thể hiện vẻ đẹp và sự đơn giản của lập trình Python. Hãy nhớ mã tôi đã viết trước đó để thiết lập một danh sách chứa tất cả các số nguyên chẵn trong \([2,16)\)? 3Để hiểu cú pháp, thật hữu ích khi tham khảo Python 2 (cũ). 7. 5, trong đó có một lời giải thích hay (nhấn mạnh của tôi)
Nói cách khác, chúng tôi sẽ cung cấp một số biểu thức trở thành một phần tử của danh sách và nó sẽ phải chịu một số hạn chế dựa trên chuỗi nguyên nhân for hoặc if của chúng tôi. Đôi khi, nếu có nhiều vòng lặp và điều kiện để đánh giá, nó có thể dễ dàng xem hơn nếu được chia thành nhiều phần. Tôi làm điều này trong phần nhận xét trong ví dụ mã bên dưới. (Nếu thực sự cần thiết phải giới thiệu ngắt dòng để hiểu rõ hơn về cách hiểu danh sách, thì mã có thể hơi phức tạp, nhưng tôi tin rằng hoàn toàn ổn khi sử dụng tính năng hiểu danh sách trong ví dụ mà tôi cung cấp này. ) 5Như tài liệu nêu rõ, bạn cũng có thể tạo danh sách lồng nhau thông qua khả năng hiểu danh sách. Điều này có thể hữu ích nếu một người muốn khởi tạo thứ gì đó như bảng hoặc ma trận. Khi tôi viết chương trình Python đầu tiên của mình một năm trước, tôi thực sự đã sử dụng khả năng hiểu danh sách để xây dựng một bảng các phần tử mà tôi sẽ cập nhật như một phần của thuật toán lập trình động. 65. cắt lát Cắt lát là quá trình lấy một tập hợp con của một số dữ liệu. Nó được áp dụng phổ biến nhất cho chuỗi và danh sách. Câu chuyện cơ bản của tôi về lần đầu tiên tôi học về cắt lát là khi tôi phải lặp lại nhiều lần qua một danh sách và áp dụng một hàm cho tất cả trừ phần tử cuối cùng của nó. Tôi tiếp tục sử dụng một vòng lặp xấu lặp đi lặp lại qua các chỉ số của danh sách và thực hiện kiểm tra mỗi lần để đảm bảo rằng tôi không ở phần tử cuối cùng đó Cuối cùng tôi nhận ra rằng đây là một trong những điều ngu ngốc nhất mà tôi đang làm, vì vậy tôi đã tìm kiếm cách lấy mọi thứ trừ nguyên tố cuối cùng. Và đó là lúc tôi bắt đầu hành trình cắt lát của mình. Đối với ví dụ cụ thể này, chúng tôi chỉ có thể sử dụng 50 để lấy mọi thứ trừ phần tử có chỉ số âm, đây sẽ là phần tử cuối cùng. (Nếu một người tạo một danh sách có \(N\) phần tử, thì phần tử nằm ở chỉ mục \(N-1\) cũng có chỉ số tương đương là \(-1\), và tương tự đối với các chỉ số \(N-2 . ) 8May mắn thay, việc cắt lát không chỉ giới hạn ở việc loại bỏ một yếu tố. Đặt 7 là một danh sách tùy ý, chúng ta có thể biến 52 thành một danh sách mới lấy một tập hợp con cụ thể các giá trị của 7 bằng cách sử dụng cú pháp chung sau 2Ở đây, 54 là chỉ mục của phần tử đầu tiên mà chúng ta muốn, 55 là chỉ mục của phần tử đầu tiên mà chúng ta không muốn (hãy nhớ rằng trong Python, các chỉ số kết thúc thường là loại trừ hơn là bao gồm) và 56 đại diện cho số \(k . Nó cũng có thể là số âm, điều này cho thấy rằng chúng ta đang đi ngược lại danh sách. Không phải tất cả các giá trị này đều cần thiết; . Và như ví dụ trước đó sẽ làm rõ, nếu một trong hai 54 hoặc 55 bị bỏ qua, thì chúng nên mặc định là 0 và độ dài của danh sách, tương ứngĐể có được trực giác tốt hơn về việc cắt lát, nó cũng giúp biết cách thức hoạt động của quy trình lập chỉ mục đối với các số âm. Trong tài liệu chính thức, có một sơ đồ kiểu ASCII đẹp mắt (có dòng chữ “Python” trong đó) trong phần Chuỗi gợi ý bạn nghĩ về các chỉ số Python khi trỏ giữa các phần tử dữ liệu Điều quan trọng là phải hiểu vai trò của dấu hai chấm trong cú pháp nối. Trong đoạn mã trên, tôi đã sử dụng 50 để chỉ tất cả trừ phần tử cuối cùng trong danh sách. Nếu tôi đã bỏ qua dấu hai chấm trước đó, điều đó sẽ dẫn đến việc chỉ nhận được phần tử cuối cùng của danh sách. Nếu tôi đặt dấu hai chấm ở bên phải của -1, thì tôi vẫn chỉ nhận được phần tử cuối cùng, vì phần tử đó bắt đầu từ phần tử được lập chỉ mục cuối cùng và nhận tất cả các giá trị ngoài phần tử đó (không có phần tử nào). Đoạn mã sau cho thấy sự khác biệt về vị trí đặt dấu hai chấm và số lượng tham số hiện tại ảnh hưởng đến việc ghép nối. Một cách dễ dàng để hiểu vị trí nên đặt dấu hai chấm là chỉ cần đặt cả ba giá trị bắt đầu, dừng và bước và xóa những giá trị được đặt ở giá trị mặc định của chúng (tương ứng là 0, độ dài danh sách và +1). Điều còn lại là cách định dạng dấu hai chấm, mặc dù nếu 'bước' ở giá trị mặc định của nó, thì chúng ta không cần dấu hai chấm trước nó ở cuối. Chẳng hạn, 61 giống với 62 và 63 giống với 64 4(Vâng, thật thú vị khi 65 đảo ngược một danh sách. )Tôi khuyên mọi người nên chơi với kỹ thuật cắt lát bán phức tạp trước khi sử dụng nó trong mã. Đây là nơi trình bao Python trở nên cực kỳ hữu ích. (Xem #2 trên bài đăng này. ) 6. Từ điển và Bộ Cho đến nay, danh sách là cấu trúc dữ liệu phổ biến nhất mà tôi sử dụng khi lập trình Python, nhưng tôi vẫn sử dụng rộng rãi từ điển, bộ và các cấu trúc dữ liệu khác vì chúng có những ưu điểm riêng Bộ chỉ đơn giản là một vùng chứa chứa các mục, như danh sách, nhưng chỉ chứa các phần tử riêng biệt. Nghĩa là, nếu bạn thêm phần tử 66 vào một tập hợp đã chứa sẵn 66, thì tập hợp đó không thay đổi. Đây có thể là một lợi thế của bộ so với danh sách, vì tôi thường cần bỏ qua các mục trùng lặp khi quản lý danh sách và việc tạo một bộ dựa trên danh sách có sẵn dễ dàng như gõ vào 68Nhưng có thể một lợi thế thậm chí còn lớn hơn với các bộ là tra cứu siêu nhanh của chúng. Kiểm tra xem một phần tử có trong danh sách hay không mất thời gian \(O(n)\). Tuy nhiên, với các bộ, kiểm tra tư cách thành viên là không đổi, \(O(1)\)-thời gian. Tất nhiên, điều này yêu cầu các phần tử tập hợp phải có thể băm được, có nghĩa là các mục cần được liên kết với một số hằng số (i. e. “giá trị băm”) để có thể tra cứu chúng trong bảng một cách nhanh chóng 9Tất nhiên, nhược điểm của tập hợp trên danh sách là chúng không hỗ trợ lập chỉ mục các phần tử, vì vậy không có thứ tự. Đây là một nhược điểm khá lớn, nhưng dù sao đi nữa, nếu bạn không quan tâm đến thứ tự và trùng lặp, đồng thời muốn thử nghiệm thành viên nhanh chóng, thì các bộ là cách tốt nhất Ngoài các bộ, tôi thấy từ điển là một cấu trúc dữ liệu cực kỳ hữu ích. Từ điển là thứ liên kết với mỗi khóa một giá trị, do đó, về cơ bản, nó là một chức năng ghép các phần tử lại với nhau 0Có nhiều tình huống mà từ điển hữu ích. Là một lợi ích bổ sung, việc tìm kiếm các giá trị theo khóa được thực hiện hiệu quả trong thời gian cố định, giống như trong các bộ. Do được sử dụng rộng rãi, từ điển là một trong những cấu trúc dữ liệu được tối ưu hóa nhiều nhất trong Python cơ bản 7. Sao chép cấu trúc (và Quản lý bộ nhớ cơ bản) Vì rất dễ tạo một danh sách trong Python, người ta có thể nghĩ rằng việc sao chép nó cũng đơn giản. Khi tôi lần đầu tiên bắt đầu với ngôn ngữ này, tôi thường cố gắng tạo các bản sao danh sách riêng biệt bằng cách sử dụng các toán tử gán đơn giản 1Chú ý những gì xảy ra? . Nhưng nếu tôi sửa đổi 52, chẳng hạn như bằng cách thêm vào số 6, thì nó cũng sửa đổi 7. Đây là một điểm lừa dối nhưng quan trọng. Tạo danh sách bằng danh sách khác về cơ bản sẽ tạo hai tên biến trỏ đến cùng một danh sách trong bộ nhớ. Điều này sẽ áp dụng cho bất kỳ mục 'vùng chứa' nào, chẳng hạn như từ điểnVì phép gán đơn giản không tạo ra các bản sao riêng biệt, nên Python có một câu lệnh danh sách tích hợp, cũng như các thao tác sao chép chung. Cũng có thể thực hiện các bản sao bằng cách cắt. Một số giải pháp được hiển thị dưới đây 2Ngoài ra còn có một điều khác cần lo lắng — nếu bạn có các thùng chứa bên trong các thùng chứa thì sao? . Tôi nghĩ rằng tôi ổn khi sử dụng thao tác đọc chính tả đơn giản, nhưng tôi nhận ra rằng nếu tôi thay đổi một từ điển trong một trong những từ điển đó, sự thay đổi đó sẽ được phản ánh trong cả hai từ điển lớn hơn Một ví dụ về lỗi này được hiển thị bên dưới, trong đó tôi sửa đổi từ điển đầu tiên của 83 bằng cách thêm vào ánh xạ 84. Cặp khóa-giá trị đó cũng sẽ được phản ánh trong từ điển đầu tiên của 85 3Giải pháp cho vấn đề này là sử dụng phương pháp deepcopy, phương pháp này sẽ sao chép mọi thứ. Đây là thao tác sử dụng nhiều bộ nhớ nhất trong các giải pháp sao chép mà tôi đã thảo luận ở đây, vì vậy chỉ sử dụng nó nếu các phương pháp khác không hoạt động 8. máy phát điện Bạn có nhớ tất cả những thứ về danh sách mà tôi đã nói không? . Đây là nơi máy phát điện phát huy tác dụng Các trình tạo trong Python cung cấp cho chúng ta khái niệm thuận lợi về đánh giá lười biếng, vì vậy khi chúng ta “xây dựng” các trình tạo, chúng ta không thực sự đánh giá một số giá trị bên trong nó trừ khi nó thực sự cần thiết. Một trong những lợi ích lớn nhất của đánh giá lười biếng là trong dung lượng bộ nhớ. Nếu chúng ta xây dựng một trình tạo bao gồm các số từ 1 đến N cho N lớn và mã của chúng ta chỉ cần ba số đầu tiên, thì Python không cần phải xây dựng và lưu trữ các số còn lại trong bộ nhớ như đối với một danh sách. (Tình huống giả định này có thể xảy ra vì có thể có một hàm với các giá trị N khác nhau cho mỗi lệnh gọi sử dụng trình tạo. ) Nếu bạn tò mò, trang Wikipedia có thêm thông tin về đánh giá lười biếng Lần đầu tiên tôi được giới thiệu về máy phát điện là khi tôi đọc một bài đăng trên Stack Overflow có nội dung là Python 2. các lập trình viên x nên luôn sử dụng 86 thay vì 87, bởi vì 86 là một trình tạo, hoặc ít nhất, có chất lượng đánh giá lười biếng giống như trình tạo. Đối với bản ghi, mặc dù tôi hầu như luôn sử dụng 86 trên 87 trong Python 2. 7, phạm vi () có công dụng của nó, chẳng hạn như nếu một người cần một danh sách thực tếVề cơ bản, 87 và 86 thực hiện cùng một nhiệm vụ, nhưng điểm khác biệt là 23 sẽ xây dựng một danh sách bao gồm các số từ 0 đến n-1 theo nghĩa đen, trong khi 24 chỉ cung cấp cho chúng tôi những số đó khi chúng tôi cần.Như một minh chứng cho tính hữu ích của trình tạo, Python 3 đã thay đổi 87 để giờ đây nó sở hữu phẩm chất 86. Hàm 86 đã bị bỏ qua, vì trình bao Python 3 chỉ ra 4Có những trang web khác có thể giải thích trình tạo tốt hơn tôi có thể, chẳng hạn như trang Python Wiki về trình tạo. Một điều cần lưu ý là nếu chúng ta cần một danh sách từ một trình tạo, thì chúng ta có thể gọi phương thức 28 mà tôi đã sử dụng trước đó (trong #7, về nội dung sao chép). Trình tạo cũng có phiên bản hiểu danh sách của riêng họ, được gọi là hiểu trình tạoVậy tại sao chúng ta thậm chí sử dụng danh sách? 5Tôi đã tạo một trình tạo, 29, từ danh sách chứa bốn tên tiếng Anh phổ biến, nhưng nếu tôi cố gắng in trình tạo, thay vào đó, tôi nhận được biểu thức "đối tượng trình tạo". Các giá trị trong trình tạo không “tồn tại” cho đến khi chúng cần thiết theo yêu cầuMột điểm khó khăn thứ hai về trình tạo là nếu chúng ta lặp qua nó, chúng ta không thể lặp lại nó như lần đầu tiên. Vòng lặp thứ hai không in được gì Vì vậy, các trình tạo có vị trí của chúng trong Python, nhưng các danh sách và các trình tạo khác cũng vậy. Để hiểu rõ hơn về trình tạo, có thể hữu ích khi kết hợp từ khóa suất trong Python. Câu hỏi và câu trả lời về Stack Overflow (tuyệt vời) này giải thích nó tốt hơn tôi có thể và tôi đã học được rất nhiều về trình tạo chỉ bằng cách đọc trang đó 9. Quản lý tập tin Với nhiều tập lệnh Python sử dụng tệp làm đầu vào, chẳng hạn như mã 35 của tôi mà tôi đã đăng trước đó, điều quan trọng là phải biết các cách chính xác để kết hợp tệp trong mã của một người. Tài liệu chính thức giải thích rằng từ khóa mở được sử dụng cho mục đích này. Nó khá đơn giản và chúng ta có thể lặp qua tệp để phân tích từng dòng một. Ngoài ra, chúng ta có thể sử dụng phương pháp 41 để tạo danh sách bao gồm từng dòng trong tệp, nhưng hãy cảnh giác nếu tệp lớn 6 42 rất quan trọng, vì nó được thực hiện để giải phóng bộ nhớ. Từ tài liệu chính thức
Tuy nhiên, tôi gần như không bao giờ sử dụng 42, vì tôi có thể sử dụng từ khóa 44, từ khóa này sẽ tự động đóng tệp cho tôi sau khi mã thoát khỏi khối của nó. Trên thực tế, tôi đã đăng một ví dụ về điều này trước đó khi tôi nói về mã kmeans_clustering của mình. Đây là những phần có liên quan của nó được sao chép bên dưới 7Bây giờ, trong hầu hết các trường hợp, tôi tin rằng bạn không nhất thiết phải tận dụng lợi thế của 42, vì nếu tập lệnh đang đọc trong tệp văn bản cơ bản (nhưng không đóng nó) kết thúc chạy, thì tệp văn bản đó sẽ tự động . Tôi có thể tưởng tượng rằng mọi thứ có thể trở nên phức tạp hơn khi nhiều tệp và tập lệnh chạy cùng nhau, vì vậy tôi có thói quen sử dụng 44 để đọc trong tệpNếu bạn quan tâm đến việc ghi tệp, bạn có thể thay đổi tham số 47 thành 48 (hoặc 49 sẽ cho phép cả đọc và ghi) và sử dụng phương thức 90. Điều này phổ biến trong cài đặt nghiên cứu, nơi bạn có thể phải sửa đổi tệp văn bản theo một số thử nghiệm10. Các lớp và chức năng Khá dễ dàng để xác định một hàm trong Python, sử dụng 91, chẳng hạn như ví dụ nhỏ sau đây, đếm số lượng số 0 trong đầu vào, sẽ là một chuỗi 8Các hàm đệ quy cũng đơn giản và hoạt động như trong hầu hết các ngôn ngữ lập trình hướng đối tượng chính So với Java, tôi chưa sử dụng quá nhiều lớp trong Chương trình Python của mình, vì vậy chuyên môn của tôi trong lĩnh vực này khá hạn chế. Tuy nhiên, các lớp là một phần quan trọng của các ngôn ngữ hướng đối tượng và Python (trái ngược với ý kiến của một số người) hướng đối tượng, vì vậy bạn nên đọc tài liệu về Lớp nếu có thời gian. Tuy nhiên, trang tài liệu tôi vừa liên kết khẳng định rằng
Một ví dụ thực sự đơn giản về lớp Python (với Python 2. 7 cú pháp) được hiển thị ở đây Phần kết luận Tôi hy vọng bạn tìm thấy tổng quan này toàn diện nhưng ngắn gọn. Rõ ràng, điều này sẽ phụ thuộc vào trình độ kỹ năng và kinh nghiệm lập trình trước đó của bạn. Tuy nhiên, để thực sự hiểu những khái niệm này, tôi khuyên bạn nên viết một số chương trình. Bạn không cần phải tạo mô-đun toàn diện của riêng mình; . Ngoài ra còn có một số khái niệm quan trọng mà tôi đã bỏ qua với mục đích giữ cho bài đăng này nhắm mục tiêu đến đối tượng hướng đến người mới bắt đầu hơn. Ví dụ, trình trang trí Python là thứ mà một lập trình viên nghiêm túc chắc chắn phải hiểu. Nếu có tham vọng, bạn cũng có thể xem câu hỏi Stack Overflow này và cố gắng làm theo một cách lỏng lẻo các đề xuất của câu trả lời được bình chọn nhiều nhất về cách chuyển từ người mới bắt đầu sang trung cấp/chuyên gia Nếu bạn có thêm bất kỳ câu hỏi hoặc nhận xét nào, vui lòng trả lời bài đăng này hoặc Google xung quanh. Chúc bạn vui vẻ khi lập trình bằng Python |