Hướng dẫn data structures and algorithms in python 2nd edition - cấu trúc dữ liệu và thuật toán trong phiên bản thứ 2 của python

Nhập các ký tự bạn thấy bên dưới

Xin lỗi, chúng tôi chỉ cần đảm bảo rằng bạn không phải là một robot. Để có kết quả tốt nhất, vui lòng đảm bảo trình duyệt của bạn đang chấp nhận cookie.

Nhập các ký tự bạn nhìn thấy trong hình ảnh này:

Hãy thử hình ảnh khác nhau

Điều kiện sử dụng Chính sách bảo mật Privacy Policy

© 1996-2014, Amazon.com, Inc. hoặc các chi nhánh của nó

Nhập các ký tự bạn thấy bên dưới

Xin lỗi, chúng tôi chỉ cần đảm bảo rằng bạn không phải là một robot. Để có kết quả tốt nhất, vui lòng đảm bảo trình duyệt của bạn đang chấp nhận cookie.

Nhập các ký tự bạn nhìn thấy trong hình ảnh này:

Hãy thử hình ảnh khác nhau

Điều kiện sử dụng Chính sách bảo mật Privacy Policy

© 1996-2014, Amazon.com, Inc. hoặc các chi nhánh của nó

Cấu trúc dữ liệu và thuật toán là hai trong số các yếu tố cốt lõi của một dự án phần mềm lớn và phức tạp. Chúng là một cách có hệ thống để lưu trữ và tổ chức dữ liệu trong phần mềm để nó có thể được sử dụng hiệu quả. Python có cấu trúc dữ liệu cấp cao hiệu quả và ngôn ngữ lập trình hướng đối tượng hiệu quả. Python là ngôn ngữ được lựa chọn cho nhiều tác vụ dữ liệu nâng cao, vì một lý do rất chính đáng. Đây là một trong những ngôn ngữ lập trình nâng cao dễ dàng nhất để học. Cấu trúc trực quan và ngữ nghĩa có nghĩa là đối với những người không phải là nhà khoa học máy tính, nhưng có thể các nhà sinh học, nhà thống kê hoặc giám đốc của một công ty khởi nghiệp, Python là một cách đơn giản để thực hiện nhiều nhiệm vụ dữ liệu khác nhau. Nó không chỉ là một ngôn ngữ kịch bản, mà là một ngôn ngữ lập trình hướng đối tượng đầy đủ tính năng.

Trong Python, có nhiều cấu trúc dữ liệu và thuật toán hữu ích được tích hợp vào ngôn ngữ. Ngoài ra, vì Python là ngôn ngữ dựa trên đối tượng, nên việc tạo các đối tượng dữ liệu tùy chỉnh tương đối dễ dàng. Trong cuốn sách này, chúng tôi sẽ kiểm tra các thư viện nội bộ của Python và một số thư viện bên ngoài và chúng tôi sẽ học cách xây dựng các đối tượng dữ liệu của riêng bạn từ các nguyên tắc đầu tiên.

Trong chương này, chúng tôi sẽ xem xét các chủ đề sau:

  • Có được kiến ​​thức làm việc chung về cấu trúc dữ liệu và thuật toán
  • Hiểu các loại dữ liệu cốt lõi và chức năng của chúng
  • Khám phá các khía cạnh hướng đối tượng của ngôn ngữ lập trình Python

Để cài đặt Python, chúng tôi sử dụng phương pháp sau.

Python là một ngôn ngữ được giải thích và các câu lệnh được thực hiện từng dòng. Một lập trình viên thường có thể viết ra chuỗi lệnh trong tệp mã nguồn. Đối với Python, mã nguồn được lưu trữ trong một tệp có phần mở rộng tệp .py.

Python được tích hợp đầy đủ và thường đã được cài đặt trên hầu hết các hệ điều hành Linux và Mac. Nói chung, phiên bản Python được cài đặt sẵn là 2,7. Bạn có thể kiểm tra phiên bản được cài đặt trên hệ thống bằng các lệnh sau:

>>> import sys
>>> print[sys.version]
3.7.0 [v3.7.0:1bf9cc5093, Jun 27 2018, 04:06:47] [MSC v.1914 32 bit [Intel]]

Bạn cũng có thể cài đặt một phiên bản Python khác bằng các lệnh sau trên Linux:

  1. Mở thiết bị đầu cuối
  2. Cập nhật sudo apt-get
  3. sudo apt-get install -y python3-pip
  4. Cài đặt PIP3

Python phải được cài đặt trên các hệ thống với các hệ điều hành Windows, vì nó không được cài đặt sẵn, không giống như Linux/MacOS. Bất kỳ phiên bản nào của Python đều có thể được tải xuống từ liên kết này: //www.python.org/doads/. Bạn có thể tải xuống trình cài đặt phần mềm và chạy nó cài đặt chọn cho tất cả người dùng và sau đó nhấp vào tiếp theo. Bạn cần chỉ định vị trí mà bạn muốn cài đặt gói, sau đó nhấp vào Tiếp theo. Sau đó, chọn tùy chọn Thêm Python vào các biến môi trường trong hộp thoại Tùy chỉnh Python, sau đó chỉ cần nhấp vào tiếp theo để cài đặt cuối cùng. Khi cài đặt kết thúc, bạn có thể xác nhận cài đặt bằng cách mở dấu nhắc lệnh và nhập lệnh sau:Install for all users and then click on Next. You need to specify the location where you want to install the package, then click Next. After that, select the option Add Python to environment variables in the Customize Python dialog box, then just click Next again for final installation. When the installation is finished, you can confirm the installation by opening up Command Prompt and typing the following command:

python -V

Phiên bản Python ổn định mới nhất là Python 3.7.0. Chương trình Python có thể được thực thi bằng cách nhập các mục sau trong dòng lệnh:the following in the command line:

python .py

Thuật toán và cấu trúc dữ liệu là các khái niệm cơ bản nhất trong điện toán. Chúng là các khối xây dựng chính mà từ đó phần mềm phức tạp được xây dựng. Có sự hiểu biết về các khái niệm nền tảng này là vô cùng quan trọng trong thiết kế phần mềm và điều này liên quan đến ba đặc điểm sau:

  • Cách các thuật toán thao túng thông tin có trong cấu trúc dữ liệu
  • Cách sắp xếp dữ liệu trong bộ nhớ
  • Các đặc điểm hiệu suất của các cấu trúc dữ liệu cụ thể là gì

Trong cuốn sách này, chúng tôi sẽ kiểm tra chủ đề từ một số quan điểm. Đầu tiên, chúng ta sẽ xem xét các nguyên tắc cơ bản của ngôn ngữ lập trình Python từ quan điểm của cấu trúc dữ liệu và thuật toán. Thứ hai, điều quan trọng là chúng ta có các công cụ toán học chính xác. Chúng ta cần hiểu các khái niệm cơ bản của khoa học máy tính và vì điều này chúng ta cần toán học. Bằng cách thực hiện một cách tiếp cận heuristic, phát triển một số nguyên tắc hướng dẫn có nghĩa là, nói chung, chúng ta không cần nhiều hơn là toán học trung học để hiểu các nguyên tắc của những ý tưởng chính này.

Một khía cạnh quan trọng khác là một đánh giá. Đo lường hiệu suất của các thuật toán đòi hỏi sự hiểu biết về cách tăng kích thước dữ liệu ảnh hưởng đến hoạt động trên dữ liệu đó. Khi chúng tôi đang làm việc trên các bộ dữ liệu lớn hoặc các ứng dụng thời gian thực, điều cần thiết là các thuật toán và cấu trúc của chúng tôi có hiệu quả như chúng có thể..

Cuối cùng, chúng ta cần một chiến lược thiết kế thử nghiệm mạnh mẽ. Có thể dịch một vấn đề trong thế giới thực thành các thuật toán và cấu trúc dữ liệu của ngôn ngữ lập trình liên quan đến việc có thể hiểu các yếu tố quan trọng của một vấn đề và phương pháp lập bản đồ các yếu tố này thành các cấu trúc lập trình..

Để hiểu rõ hơn về tầm quan trọng của tư duy thuật toán, hãy xem xét một ví dụ trong thế giới thực. Hãy tưởng tượng chúng tôi đang ở một thị trường xa lạ và chúng tôi được giao nhiệm vụ mua một danh sách các mặt hàng. Chúng tôi giả định rằng thị trường được đặt ngẫu nhiên, mỗi nhà cung cấp bán một tập hợp ngẫu nhiên các mặt hàng và một số mặt hàng này có thể nằm trong danh sách của chúng tôi. Mục đích của chúng tôi là giảm thiểu giá cho từng mặt hàng chúng tôi mua, cũng như giảm thiểu thời gian dành cho thị trường. Một cách để tiếp cận vấn đề này là viết một thuật toán như sau:

1. Nhà cung cấp có các mặt hàng trong danh sách của chúng tôi và chi phí ít hơn một chi phí dự đoán cho mặt hàng đó không?

2. Nếu có, mua và loại bỏ khỏi danh sách; Nếu không, chuyển sang nhà cung cấp tiếp theo.

3. Nếu không có nhiều nhà cung cấp, kết thúc.

Đây là một trình lặp đơn giản, với một quyết định và một hành động. Nếu chúng tôi phải thực hiện điều này bằng ngôn ngữ lập trình, chúng tôi sẽ cần các cấu trúc dữ liệu để xác định và lưu trữ trong bộ nhớ cả danh sách các mặt hàng chúng tôi muốn mua và danh sách các mặt hàng mà nhà cung cấp đang bán. Chúng tôi sẽ cần xác định cách tốt nhất để phù hợp với các mục trong mỗi danh sách và chúng tôi cần một số loại logic để quyết định có nên mua hay không.

Có một số quan sát mà chúng ta có thể thực hiện liên quan đến thuật toán này. Thứ nhất, vì tính toán chi phí dựa trên dự đoán, chúng tôi không biết chi phí thực sự là bao nhiêu. Do đó, chúng tôi không mua một mặt hàng vì chúng tôi đã đánh giá thấp chi phí của mặt hàng và chúng tôi đi đến cuối thị trường với các mặt hàng còn lại trong danh sách của chúng tôi. Để xử lý tình huống này, chúng tôi cần một cách hiệu quả để lưu trữ dữ liệu để chúng tôi có thể quay lại hiệu quả cho nhà cung cấp với chi phí thấp nhất.

Ngoài ra, chúng tôi cần hiểu thời gian để so sánh các mặt hàng trong danh sách mua sắm của chúng tôi với các mặt hàng được bán bởi mỗi nhà cung cấp. Điều này rất quan trọng bởi vì số lượng mặt hàng trong danh sách mua sắm của chúng tôi hoặc số lượng mặt hàng được bán bởi mỗi nhà cung cấp, tăng, tìm kiếm một mặt hàng mất nhiều thời gian hơn. Thứ tự chúng tôi tìm kiếm thông qua các mục và hình dạng của các cấu trúc dữ liệu có thể tạo ra sự khác biệt lớn cho thời gian cần thiết để thực hiện tìm kiếm. Rõ ràng, chúng tôi muốn sắp xếp danh sách của chúng tôi cũng như đơn đặt hàng mà chúng tôi truy cập từng nhà cung cấp theo cách mà chúng tôi giảm thiểu thời gian tìm kiếm.

Ngoài ra, hãy xem xét những gì xảy ra khi chúng tôi thay đổi điều kiện mua để mua với giá rẻ nhất, không chỉ là giá dự đoán dưới mức trung bình. Điều này thay đổi hoàn toàn vấn đề. Thay vì tuần tự đi từ nhà cung cấp này sang nhà cung cấp tiếp theo, chúng tôi cần đi qua thị trường một lần và với kiến ​​thức này, chúng tôi có thể đặt hàng danh sách mua sắm của mình liên quan đến các nhà cung cấp mà chúng tôi muốn ghé thăm.visit.

Rõ ràng, có nhiều sự tinh tế hơn liên quan đến việc chuyển một vấn đề trong thế giới thực thành một cấu trúc trừu tượng như ngôn ngữ lập trình. Ví dụ, khi chúng tôi tiến bộ qua thị trường, kiến ​​thức của chúng tôi về chi phí của một sản phẩm được cải thiện, do đó, biến giá trung bình dự đoán của chúng tôi trở nên chính xác hơn cho đến khi, theo gian hàng cuối cùng, kiến ​​thức của chúng tôi về thị trường là hoàn hảo. Giả sử bất kỳ loại thuật toán quay lại nào phải chịu một chi phí, chúng ta có thể thấy nguyên nhân để xem xét toàn bộ chiến lược của chúng ta. Các điều kiện như biến đổi giá cao, kích thước và hình dạng của các cấu trúc dữ liệu của chúng tôi và chi phí quay lại đều xác định giải pháp phù hợp nhất. Toàn bộ cuộc thảo luận cho thấy rõ tầm quan trọng của cấu trúc dữ liệu và thuật toán trong việc xây dựng một giải pháp phức tạp.solution.

Python có một số cấu trúc dữ liệu tích hợp, bao gồm danh sách, từ điển và bộ mà chúng tôi sử dụng để xây dựng các đối tượng tùy chỉnh. Ngoài ra, có một số thư viện nội bộ, chẳng hạn như bộ sưu tập và đối tượng toán học, cho phép chúng tôi tạo ra các cấu trúc nâng cao hơn cũng như thực hiện các tính toán trên các cấu trúc đó. Cuối cùng, có các thư viện bên ngoài như các thư viện được tìm thấy trong các gói SCIPY. Chúng cho phép chúng tôi thực hiện một loạt các tác vụ dữ liệu nâng cao như hồi quy logistic và tuyến tính, trực quan hóa và tính toán toán học, chẳng hạn như các hoạt động trên ma trận và vectơ. Các thư viện bên ngoài có thể rất hữu ích cho một giải pháp vượt trội. Tuy nhiên, chúng ta cũng phải lưu ý rằng thường có một hình phạt hiệu suất so với việc xây dựng các đối tượng tùy chỉnh từ đầu. Bằng cách học cách mã hóa các đối tượng này, chúng ta có thể nhắm mục tiêu chúng vào các nhiệm vụ cụ thể, làm cho chúng hiệu quả hơn. Điều này không phải là để loại trừ vai trò của các thư viện bên ngoài và chúng tôi sẽ xem xét điều này trong Chương 12, các kỹ thuật và chiến lược thiết kế.

Để bắt đầu, chúng tôi sẽ có một cái nhìn tổng quan về một số tính năng ngôn ngữ chính làm cho Python trở thành một lựa chọn tuyệt vời cho lập trình dữ liệu.

Python là một trong những ngôn ngữ lập trình phổ biến và được sử dụng rộng rãi nhất trên toàn thế giới do tính dễ đọc và tính linh hoạt của nó. Một tính năng của môi trường Python là bảng điều khiển tương tác của nó, cho phép bạn sử dụng Python như một máy tính lập trình máy tính để bàn và cũng là Môi trường để viết và kiểm tra các đoạn mã.readability and flexibility.A feature of the Python environment is its interactive console, allowing you to both use Python as a desktop-programmable calculator and also as an environment to write and test snippets of code.

Việc đọc ... Đánh giá ... Vòng in của bảng điều khiển là một cách rất thuận tiện để tương tác với cơ sở mã lớn hơn, chẳng hạn như chạy các chức năng và phương thức hoặc để tạo các phiên bản của các lớp. Đây là một trong những ưu điểm chính của Python so với các ngôn ngữ được biên dịch như C/C ++ hoặc Java, trong đó ghi ... Biên dịch ... Kiểm tra ... Chu kỳ biên dịch lại có thể làm tăng thời gian phát triển đáng kể so với lần đọc của Python ... đánh giá. .. Vòng lặp dấu. Có thể gõ các biểu thức và nhận được phản hồi ngay lập tức có thể tăng tốc đáng kể các nhiệm vụ khoa học dữ liệu.read...evaluate...print loop. Being able to type in expressions and get an immediate response can greatly speed up data science tasks.

Có một số phân phối tuyệt vời của Python ngoài phiên bản Cpython chính thức. Hai trong số những thứ phổ biến nhất có sẵn tại: Anaconda [//www.continuum.io/doads] và tán [//www.enthing.com/products/canopy/]. Hầu hết các phân phối đi kèm với môi trường phát triển của riêng họ. Cả Canopy và Anaconda đều bao gồm các thư viện cho khoa học, học máy và các ứng dụng dữ liệu khác. Hầu hết các phân phối đi kèm với một biên tập viên.

Ngoài ra còn có một số triển khai của bảng điều khiển Python, ngoài phiên bản Cpython. Đáng chú ý nhất trong số này là nền tảng IPYTHON/JUPYTER dựa trên môi trường tính toán dựa trên web.

Để giải quyết vấn đề trong thế giới thực thông qua việc thực hiện thuật toán, trước tiên chúng tôi phải chọn các biến và sau đó áp dụng các hoạt động trên các biến này. Các biến là nhãn được gắn vào các đối tượng. Các biến không phải là đối tượng cũng như không phải là container cho các đối tượng; Họ chỉ hoạt động như một con trỏ hoặc tham chiếu đến đối tượng. Ví dụ, hãy xem xét mã sau:

Ở đây, chúng tôi đã tạo một biến, a, chỉ vào một đối tượng danh sách. Chúng tôi tạo một biến khác, B, chỉ vào cùng đối tượng danh sách này. Khi chúng ta nối một phần tử vào đối tượng danh sách này, thay đổi này được phản ánh trong cả a và b.

Trong Python, các tên biến được gắn vào các loại dữ liệu khác nhau trong quá trình thực hiện chương trình; Trước tiên không bắt buộc phải khai báo kiểu dữ liệu cho các biến. Mỗi giá trị là một loại [ví dụ: một chuỗi hoặc số nguyên]; Tuy nhiên, tên biến trỏ đến giá trị này không có loại cụ thể. Cụ thể hơn, các biến trỏ đến một đối tượng có thể thay đổi loại của chúng tùy thuộc vào loại giá trị được gán cho chúng. Xem xét ví dụ sau:

Trong ví dụ mã trước, loại A được thay đổi từ int sang float, tùy thuộc vào giá trị được lưu trữ trong biến.

Quy tắc phạm vi của các biến bên trong các hàm là quan trọng. Bất cứ khi nào một hàm thực thi, môi trường cục bộ [không gian tên] được tạo. Không gian tên cục bộ này chứa tất cả các biến và tên tham số được gán bởi các hàm. Bất cứ khi nào một hàm được gọi, trình thông dịch Python trước tiên nhìn vào không gian tên cục bộ là chức năng của chính mình nếu không tìm thấy trận đấu nào, thì nó nhìn vào không gian tên toàn cầu. Nếu tên vẫn chưa được tìm thấy, thì nó sẽ tìm kiếm trong không gian tên tích hợp. Nếu nó không được tìm thấy, thì thông dịch viên sẽ tăng ngoại lệ tên. Xem xét mã sau:a NameError exception. Consider the following code:

a=15;b=25
def my_function[]:
global a
a=11;b=21

my_function[]
print[a] #prints 11
print[b] #prints 25

Trong mã trước, chúng tôi xác định hai biến toàn cầu. Chúng ta cần nói với trình thông dịch, sử dụng từ khóa toàn cầu, rằng bên trong hàm chúng ta đang đề cập đến một biến toàn cầu. Khi chúng tôi thay đổi biến này thành 11, những thay đổi này được phản ánh trong phạm vi toàn cầu. Tuy nhiên, biến B mà chúng tôi đặt thành 21 là cục bộ cho hàm và bất kỳ thay đổi nào được thực hiện đối với nó bên trong hàm không được phản ánh trong phạm vi toàn cầu. Khi chúng tôi chạy chức năng và in B, chúng tôi thấy rằng nó giữ lại giá trị toàn cầu của nó.

Ngoài ra, hãy xem xét một ví dụ thú vị khác:

>>> a = 10
>>> def my_function[]:
... print[a]
>>> my_function []
10

Mã hoạt động và cung cấp đầu ra 10, nhưng hãy xem mã sau:

>>> a = 10 
>>> def my_function[]:
... print[a]
... a= a+1
>>> my_function[]

UnboundLocalError: local variable 'a' referenced before assignment

Mã trước đưa ra một lỗi vì việc gán cho một biến trong một phạm vi làm cho biến đó trở thành một biến cục bộ cho phạm vi đó. Trong ví dụ trước, trong gán my_function [] cho biến A, trình biên dịch giả định là một biến cục bộ và đó là lý do tại sao hàm in [] trước đó cố gắng in biến cục bộ A, không được khởi tạo như một cục bộ Biến đổi; Vì vậy, nó gây ra một lỗi. Nó có thể được giải quyết bằng cách truy cập biến phạm vi bên ngoài bằng cách khai báo nó là toàn cầu:

>>> a = 10
>>> def my_function[]:
... global a
... print[a]
... a = a+1
>>> my_function[]
10

Vì vậy, trong Python, các biến được tham chiếu bên trong một hàm là toàn cầu và nếu biến A được gán một giá trị ở bất cứ đâu bên trong cơ thể của hàm, thì nó được coi là biến cục bộ trừ khi được tuyên bố rõ ràng là toàn cầu.

Các chương trình Python bao gồm một chuỗi các câu lệnh. Thông dịch viên thực hiện từng câu lệnh theo thứ tự cho đến khi không còn câu nữa. Điều này đúng nếu các tệp chạy như chương trình chính, cũng như nếu chúng được tải qua nhập. Tất cả các câu lệnh, bao gồm gán biến, định nghĩa chức năng, định nghĩa lớp và nhập mô -đun, có trạng thái bằng nhau. Không có tuyên bố đặc biệt nào có mức độ ưu tiên cao hơn bất kỳ tuyên bố nào khác và mọi tuyên bố có thể được đặt ở bất cứ đâu trong một chương trình. Tất cả các hướng dẫn/câu lệnh trong chương trình được thực thi theo trình tự nói chung. Tuy nhiên, có hai cách chính để kiểm soát luồng thực thi chương trình Các câu lệnh và vòng lặp điều kiện.

Các câu lệnh IF ... khác và Elif kiểm soát việc thực thi có điều kiện các câu lệnh. Định dạng chung là một loạt các câu lệnh IF và ELIF theo sau là một tuyên bố cuối cùng khác:

x='one' 
if x==0:
print['False']
elif x==1:
print['True']
else: print['Something else']

#prints'Something else'

Lưu ý việc sử dụng toán tử == để so sánh hai giá trị. Điều này trả về đúng nếu cả hai giá trị đều bằng nhau; nó trả về sai nếu không. Cũng lưu ý rằng việc cài đặt X thành một chuỗi sẽ trả về một thứ khác thay vì tạo lỗi loại vì có thể xảy ra trong các ngôn ngữ không được gõ động. Các ngôn ngữ được gõ động, chẳng hạn như Python, cho phép gán linh hoạt các đối tượng với các loại khác nhau.

Cách khác để kiểm soát luồng chương trình là với các vòng lặp. Python cung cấp hai cách xây dựng vòng lặp, chẳng hạn như trong thời gian và cho các câu lệnh Loop. Một vòng lặp trong khi lặp lại thực thi các câu lệnh cho đến khi một điều kiện boolean là đúng. A For Loop cung cấp một cách lặp lại việc thực hiện vào vòng lặp thông qua một loạt các yếu tố. Đây là một ví dụ:example:

Trong ví dụ này, vòng lặp trong khi thực hiện các câu lệnh cho đến khi điều kiện x >>words = ['cat', 'dog', 'elephant']
>>> for w in words:
... print[w]
...

cat
dog
elephant

Trong ví dụ này, FOR LOOP thực thi lặp lại cho tất cả các mục trong danh sách. for loop executes iterating for all the items over the list.

Python chứa các loại dữ liệu tích hợp khác nhau. Chúng bao gồm bốn loại số [int, float, phức tạp, bool], bốn loại chuỗi [str, list, tuple, phạm vi], một loại ánh xạ [dict] và hai loại đặt. Cũng có thể tạo các đối tượng do người dùng xác định, chẳng hạn như các chức năng hoặc lớp. Chúng tôi sẽ xem xét chuỗi và các loại dữ liệu danh sách trong chương này và các loại tích hợp còn lại trong chương tiếp theo.

Tất cả các loại dữ liệu trong Python là đối tượng. Trên thực tế, hầu hết mọi thứ đều là một đối tượng trong Python, bao gồm các mô -đun, lớp học và các chức năng, cũng như các nghĩa đen như chuỗi và số nguyên. Mỗi đối tượng trong Python có một loại, một giá trị và một danh tính. Khi chúng ta viết Greet = "Helloworld", chúng ta đang tạo một thể hiện của một đối tượng chuỗi với giá trị "Hello World" và danh tính của lời chào. Danh tính của một đối tượng hoạt động như một con trỏ đến vị trí của đối tượng trong bộ nhớ. Loại đối tượng, còn được gọi là lớp của đối tượng, mô tả biểu diễn bên trong của đối tượng, cũng như các phương thức và hoạt động mà nó hỗ trợ. Khi một thể hiện của một đối tượng được tạo, danh tính và loại của nó không thể được thay đổi.objects. In fact, pretty much everything is an object in Python, including modules, classes, and functions, as well as literals such as strings and integers. Each object in Python has a type, a value, and an identity. When we write greet= "helloworld", we are creating an instance of a string object with the value "hello world" and the identity of greet. The identity of an object acts as a pointer to the object's location in memory. The type of an object, also known as the object's class, describes the object's internal representation, as well as the methods and operations it supports. Once an instance of an object is created, its identity and type cannot be changed.

Chúng ta có thể nhận được danh tính của một đối tượng bằng cách sử dụng ID hàm tích hợp []. Điều này trả về một số nguyên nhận dạng và trên hầu hết các hệ thống, điều này đề cập đến vị trí bộ nhớ của nó, mặc dù bạn không nên dựa vào điều này trong bất kỳ mã nào của bạn.

Ngoài ra, có một số cách để so sánh các đối tượng; Ví dụ: xem như sau:

if a==b:    # a and b have the same value

if a is b: # if a and b are the same object

if type[a] is type[b]: #a and b are the same type

Một sự khác biệt quan trọng cần được thực hiện giữa các đối tượng có thể thay đổi và bất biến. Các đối tượng có thể thay đổi như danh sách có thể thay đổi giá trị của chúng. Chúng có các phương thức, chẳng hạn như chèn [] hoặc append [], thay đổi giá trị của một đối tượng. Các đối tượng bất biến như chuỗi không thể thay đổi giá trị của chúng, vì vậy khi chúng ta chạy các phương thức của chúng, chúng chỉ cần trả về một giá trị thay vì thay đổi giá trị của một đối tượng cơ bản. Tất nhiên, chúng ta có thể sử dụng giá trị này bằng cách gán nó cho một biến hoặc sử dụng nó làm đối số trong một hàm. Ví dụ, lớp INT là bất biến khi một thể hiện của nó được tạo ra, giá trị của nó không thể được thay đổi, tuy nhiên, một định danh tham chiếu đối tượng này có thể được chỉ định lại một giá trị khác.mutable and immutable objects. Mutable objects such as lists can have their values changed. They have methods, such as insert[] or append[], that change an object's value. Immutable objects such as strings cannot have their values changed, so when we run their methods, they simply return a value rather than change the value of an underlying object. We can, of course, use this value by assigning it to a variable or using it as an argument in a function. For example, the int class is immutable—once an instance of it is created, its value cannot be changed, however, an identifier referencing this object can be reassigned another value.

Chuỗi là các đối tượng chuỗi bất biến, với mỗi ký tự đại diện cho một phần tử trong chuỗi. Như với tất cả các đối tượng, chúng tôi sử dụng các phương thức để thực hiện các hoạt động. Chuỗi, là bất biến, không thay đổi ví dụ; Mỗi phương thức chỉ đơn giản là trả về một giá trị. Giá trị này có thể được lưu trữ dưới dạng một biến khác hoặc được đưa ra như một đối số cho một hàm hoặc phương thức.

Bảng sau đây là danh sách một số phương thức chuỗi được sử dụng phổ biến nhất và mô tả của chúng:

Phương phápSự mô tả
s.capitalizeTrả về một chuỗi chỉ có nhân vật đầu tiên được viết hoa, phần còn lại còn lại.
s.count[substring,[start,end]] Số lượng xảy ra của một chuỗi con.
s.expandtabs[[tabsize]] Thay thế các tab bằng khoảng trắng.
S.endswith [Substring, [Bắt đầu, kết thúc]Trả về true nếu một chuỗi kết thúc với một chuỗi con được chỉ định.
S.Find [Subring, [bắt đầu, kết thúc]]Trả về chỉ số sự hiện diện đầu tiên của một chuỗi con.
s.isalnum []Trả về đúng nếu tất cả các ký tự là chữ và số của chuỗi s.True if all chars are alphanumeric of string s.
s.isalpha []Trả về đúng nếu tất cả các ký tự là chữ cái của chuỗi s.
s.isdigit []Trả về true nếu tất cả các ký tự là các chữ số trong chuỗi.True if all chars are digits in the string.
S.Split [[phân tách], [MaxSplit]]Chia một chuỗi được phân tách bằng khoảng trắng hoặc một dấu phân cách tùy chọn. Trả về một danh sách.
s.join [t]Tham gia các chuỗi theo trình tự t.
Chậm hơn[]Chuyển đổi chuỗi thành tất cả các chữ thường.
s.replace [cũ, mới [maxreplace]]Thay thế chất nền cũ bằng một chuỗi con mới.
S.StartSwith [Substring, [bắt đầu, kết thúc]]]]Trả về true nếu chuỗi bắt đầu với một chuỗi con được chỉ định.
s.swapcase []Trả về một bản sao của chuỗi với trường hợp hoán đổi trong chuỗi.
s.strip [[ký tự]]Loại bỏ khoảng trắng hoặc các ký tự tùy chọn.
s.lstrip [[ký tự]]Trả về một bản sao của chuỗi với các ký tự hàng đầu bị xóa.

Chuỗi, giống như tất cả các loại trình tự, hỗ trợ lập chỉ mục và cắt. Chúng ta có thể lấy bất kỳ ký tự nào từ một chuỗi bằng cách sử dụng chỉ mục của nó [i]. Chúng ta có thể lấy một lát của một chuỗi bằng cách sử dụng S [i: j], trong đó i và j là điểm bắt đầu và điểm cuối của lát cắt. Chúng ta có thể trả lại một lát cắt mở rộng bằng cách sử dụng sải chân, như trong các phần sau của S [I: J: sải bước]. Mã sau sẽ làm rõ điều này:

Hai ví dụ đầu tiên khá đơn giản, trả về ký tự nằm ở Index 1 và bảy ký tự đầu tiên của chuỗi. Lưu ý rằng việc lập chỉ mục bắt đầu từ 0. Trong ví dụ thứ ba, chúng tôi đang sử dụng sải chân 2. Điều này dẫn đến mỗi ký tự thứ hai được trả về. Trong ví dụ cuối cùng, chúng tôi bỏ qua chỉ mục cuối và lát cắt trả về từng ký tự thứ hai trong toàn bộ chuỗi.

Bạn có thể sử dụng bất kỳ biểu thức, biến hoặc toán tử nào làm chỉ mục miễn là giá trị là một số nguyên:

Một hoạt động phổ biến khác là đi qua một chuỗi với một vòng lặp:

Cho rằng các chuỗi là bất biến, một câu hỏi phổ biến đặt ra là cách chúng tôi thực hiện các hoạt động như chèn các giá trị. Thay vì thay đổi một chuỗi, chúng ta cần nghĩ cách xây dựng các đối tượng chuỗi mới cho kết quả chúng ta cần. Ví dụ: nếu chúng tôi muốn chèn một từ vào lời chào của chúng tôi, chúng tôi có thể gán một biến cho các biến sau:

Như mã này cho thấy, chúng tôi sử dụng toán tử lát cắt để phân chia chuỗi tại vị trí chỉ mục 5 và sử dụng + để kết hợp. Python không bao giờ diễn giải nội dung của một chuỗi dưới dạng một số. Nếu chúng ta cần thực hiện các hoạt động toán học trên một chuỗi, trước tiên chúng ta cần chuyển đổi chúng thành một loại số:

Danh sách là một trong những cấu trúc dữ liệu tích hợp được sử dụng phổ biến nhất, vì chúng có thể lưu trữ bất kỳ số loại dữ liệu khác nhau nào. Chúng là những biểu diễn đơn giản của các đối tượng và được lập chỉ mục bởi các số nguyên bắt đầu từ 0, như chúng ta đã thấy trong trường hợp chuỗi.

Bảng sau đây chứa các phương thức danh sách được sử dụng phổ biến nhất và mô tả của chúng:

Phương pháp

Sự mô tả

list[s]

Trả về một danh sách các chuỗi s.

s.append[x]

Phụ lục phần tử X ở cuối danh sách s.

s.extend[x]

Bổ sung danh sách x ở cuối danh sách s.

s.count[x]

Trả về số lượng xảy ra X trong danh sách s.

s.index[x,[start],[stop]]

Trả về chỉ số nhỏ nhất i, trong đó s [i] == x. Chúng tôi có thể bao gồm một chỉ số bắt đầu và dừng tùy chọn để tra cứu.

s.insert[i,e]

Chèn x tại chỉ mục i.

s.pop[i]

Trả về phần tử I và loại bỏ nó khỏi danh sách s.

s.remove[x]

Loại bỏ phần tử X khỏi danh sách s.

s.reverse[]

Đảo ngược thứ tự của danh sách s.

s.sort[key,[reverse]]

Sắp xếp danh sách s với khóa tùy chọn và đảo ngược nó.

Trong Python, việc thực hiện danh sách là khác nhau khi so sánh với các ngôn ngữ khác. Python không tạo ra nhiều bản sao của một biến. Ví dụ: khi chúng ta gán một giá trị của một biến trong một biến khác, cả hai biến đều chỉ vào cùng một địa chỉ bộ nhớ nơi giá trị được lưu trữ. Một bản sao sẽ chỉ được phân bổ nếu các biến thay đổi giá trị của chúng. Tính năng này làm cho bộ nhớ Python hiệu quả, theo nghĩa là nó chỉ tạo ra nhiều bản sao khi nó được yêu cầu.

Điều này có những hậu quả quan trọng đối với các đối tượng hợp chất có thể thay đổi như danh sách. Xem xét mã sau:

Trong mã trước, cả hai biến List1 và List2 đều chỉ vào cùng một vị trí bộ nhớ. Tuy nhiên, khi chúng tôi thay đổi Y qua List2 thành 4, chúng tôi thực sự đang thay đổi cùng một biến Y mà List1 cũng đang chỉ ra.

Một tính năng quan trọng của danh sách là nó có thể chứa các cấu trúc lồng nhau; Đó là, danh sách có thể chứa các danh sách khác. Ví dụ: trong mã sau, danh sách các mục chứa ba danh sách khác:

Chúng ta có thể truy cập các giá trị của danh sách bằng các toán tử khung và, vì các danh sách có thể thay đổi, chúng được sao chép tại chỗ. Ví dụ sau đây cho thấy cách chúng ta có thể sử dụng điều này để cập nhật các yếu tố; Ví dụ, ở đây chúng tôi đang tăng giá bột lên 20 phần trăm:

Chúng ta có thể tạo một danh sách từ các biểu thức bằng phương pháp rất phổ biến và trực quan; Đó là, danh sách toàn diện. Nó cho phép chúng tôi tạo một danh sách thông qua một biểu thức trực tiếp vào danh sách. Hãy xem xét ví dụ sau, trong đó danh sách L được tạo bằng cách sử dụng biểu thức này:list comprehensions. It allows us to create a list through an expression directly into the list. Consider the following example, where a list l is created using this expression:

Danh sách toàn diện có thể khá linh hoạt; Ví dụ, hãy xem xét các mã sau. Về cơ bản, nó hiển thị hai cách khác nhau để thực hiện thành phần hàm, trong đó chúng tôi áp dụng một hàm [x*4] cho một hàm khác [x*2]. Mã sau đây in hai danh sách biểu thị thành phần chức năng của F1 và F2, được tính toán đầu tiên bằng cách sử dụng vòng lặp và sau đó sử dụng danh sách hiểu:

python -V
0

Dòng đầu ra đầu tiên là từ cấu trúc vòng lặp. Thứ hai là từ biểu thức hiểu danh sách:

Danh sách toàn diện cũng có thể được sử dụng để tái tạo hành động của các vòng lặp lồng nhau ở dạng nhỏ gọn hơn. Ví dụ: chúng tôi nhân từng phần tử có trong List1 với nhau:

Chúng ta cũng có thể sử dụng các toàn bộ danh sách với các đối tượng khác như chuỗi, để xây dựng các cấu trúc phức tạp hơn. Ví dụ: mã sau đây tạo ra một danh sách các từ và số lượng chữ của chúng:

Như chúng ta sẽ thấy, danh sách tạo thành nền tảng của nhiều cấu trúc dữ liệu mà chúng ta sẽ xem xét. Tính linh hoạt của chúng, dễ tạo và sử dụng cho phép chúng xây dựng các cấu trúc dữ liệu phức tạp và chuyên biệt hơn.

Trong Python, không chỉ các loại dữ liệu được coi là đối tượng. Cả hai chức năng và các lớp đều được gọi là đối tượng hạng nhất, cho phép chúng được thao tác theo cách tương tự như các loại dữ liệu tích hợp. Theo định nghĩa, các đối tượng hạng nhất là như sau:

  • Được tạo vào thời gian chạy
  • Được chỉ định là một biến hoặc trong cấu trúc dữ liệu
  • Được truyền như một đối số cho một hàm
  • Trở lại là kết quả của một hàm

Trong Python, thuật ngữ đối tượng hạng nhất là một chút sai lầm, vì nó ngụ ý một số loại phân cấp, trong khi tất cả các đối tượng Python về cơ bản là hạng nhất.first class object is a bit of a misnomer, since it implies some sort of hierarchy, whereas all Python objects are essentially first class.

Để có một cái nhìn về cách thức hoạt động của nó, hãy xác định một chức năng đơn giản:

python -V
1

Vì các chức năng do người dùng xác định là đối tượng, chúng ta có thể làm những việc như bao gồm chúng trong các đối tượng khác, chẳng hạn như danh sách:

Các chức năng cũng có thể được sử dụng làm đối số cho các chức năng khác. Ví dụ: chúng ta có thể xác định chức năng sau:

Ở đây, callf [] lấy một hàm làm đối số, đặt một biến ngôn ngữ thành 'un', sau đó gọi hàm với biến ngôn ngữ làm đối số của nó. Chúng tôi có thể thấy điều này sẽ hữu ích như thế nào nếu, ví dụ, chúng tôi muốn tạo ra một chương trình trả về các câu cụ thể bằng nhiều ngôn ngữ khác nhau, có lẽ đối với một số loại ứng dụng ngôn ngữ tự nhiên. Ở đây, chúng tôi có một nơi trung tâm để thiết lập ngôn ngữ. Cũng như chức năng chào mừng của chúng tôi, chúng tôi có thể tạo các chức năng tương tự trả về các câu khác nhau. Bằng cách có một điểm mà chúng tôi đặt ngôn ngữ, phần còn lại của logic chương trình không phải lo lắng về điều này. Nếu chúng ta muốn thay đổi ngôn ngữ, chúng ta chỉ cần thay đổi biến ngôn ngữ và chúng ta có thể giữ mọi thứ khác giống nhau.

Các chức năng lấy các hàm khác làm đối số hoặc các hàm trả về, được gọi là các hàm bậc cao hơn. Python 3 chứa hai hàm bậc cao hơn tích hợp, bộ lọc [] và map []. Lưu ý rằng trong các phiên bản trước của Python, các chức năng này đã trả về danh sách; Trong Python 3, họ trả lại một iterator, làm cho chúng hiệu quả hơn nhiều. Hàm bản đồ [] cung cấp một cách dễ dàng để chuyển đổi từng mục thành một đối tượng có thể lặp lại. Ví dụ, đây là một cách hiệu quả, nhỏ gọn để thực hiện một thao tác trên một chuỗi. Lưu ý việc sử dụng chức năng ẩn danh Lambda:higher order functions. Python 3 contains two built-in higher order functions—filter[] and map[]. Note that in earlier versions of Python, these functions returned lists; in Python 3, they return an iterator, making them much more efficient. The map[] function provides an easy way to transform each item into an iterable object. For example, here is an efficient, compact way to perform an operation on a sequence. Note the use of the lambda anonymous function:

Tương tự, chúng ta có thể sử dụng chức năng tích hợp bộ lọc để lọc các mục trong danh sách:

Lưu ý rằng cả bản đồ và bộ lọc đều thực hiện cùng một hàm tương tự như những gì có thể đạt được bằng cách hiểu danh sách. Dường như không có sự khác biệt lớn trong các đặc điểm hiệu suất, ngoài lợi thế hiệu suất nhỏ khi sử dụng bản đồ và bộ lọc chức năng được xây dựng mà không có toán tử Lambda, so với toàn bộ danh sách. Mặc dù vậy, hầu hết các hướng dẫn phong cách đều đề xuất việc sử dụng toàn bộ danh sách trên các chức năng tích hợp, có thể vì chúng có xu hướng dễ đọc hơn.

Tạo các chức năng bậc cao của chúng tôi là một trong những đặc điểm nổi bật của phong cách lập trình chức năng. Một ví dụ thực tế về cách các hàm bậc cao hơn có thể hữu ích được thể hiện bằng cách sau đây. Ở đây, chúng tôi đang chuyển chức năng LEN làm khóa cho hàm sắp xếp. Bằng cách này, chúng ta có thể sắp xếp một danh sách các từ theo độ dài:higher order functions is one of the hallmarks of functional programming style. A practical example of how higher order functions can be useful is demonstrated by the following. Here, we are passing the len function as the key to the sort function. This way, we can sort a list of words by length:

Dưới đây là một ví dụ khác để phân loại không nhạy cảm trường hợp:

Lưu ý sự khác biệt giữa phương thức danh sách.sort [] và hàm tích hợp được sắp xếp. Phương thức list.sort [], một phương thức của đối tượng danh sách, sắp xếp thể hiện hiện tại của một danh sách mà không sao chép nó. Phương pháp này thay đổi đối tượng đích và không trả về không. Đó là một quy ước quan trọng trong Python rằng các chức năng hoặc phương thức thay đổi đối tượng trả về không, để làm rõ rằng không có đối tượng mới nào được tạo và chính đối tượng đã được thay đổi.

Mặt khác, chức năng tích hợp được sắp xếp trả về một danh sách mới. Nó thực sự chấp nhận bất kỳ đối tượng có thể lặp lại như một đối số, nhưng nó sẽ luôn trả về một danh sách. Cả hai danh sách sắp xếp và sắp xếp lấy hai đối số từ khóa tùy chọn làm khóa.

Một cách đơn giản để sắp xếp các cấu trúc phức tạp hơn là sử dụng chỉ mục của phần tử để sắp xếp, sử dụng toán tử Lambda, ví dụ:

Ở đây chúng tôi đã sắp xếp các mặt hàng theo giá.

Recursion là một trong những khái niệm cơ bản nhất của khoa học máy tính. Nó được gọi là đệ quy khi một hàm có một hoặc nhiều cuộc gọi đến chính nó trong quá trình thực thi. Vòng lặp lặp và đệ quy là khác nhau theo nghĩa các vòng lặp thực hiện các câu lệnh liên tục thông qua một điều kiện boolean hoặc thông qua một loạt các yếu tố, trong khi đệ quy liên tục gọi một hàm. Trong Python, chúng ta có thể thực hiện một chức năng đệ quy chỉ bằng cách gọi nó trong cơ thể chức năng của chính nó. Để dừng một hàm đệ quy biến thành một vòng lặp vô hạn, chúng ta cần ít nhất một đối số kiểm tra trường hợp chấm dứt để kết thúc đệ quy. Điều này đôi khi được gọi là trường hợp cơ sở. Cần chỉ ra rằng đệ quy khác với lặp lại. Mặc dù cả hai đều liên quan đến sự lặp lại, các vòng lặp lặp qua một chuỗi các hoạt động, trong khi đệ quy liên tục gọi một hàm. Về mặt kỹ thuật, đệ quy là một trường hợp đặc biệt của phép lặp được gọi là lặp đuôi, và thường luôn có thể chuyển đổi hàm lặp thành hàm đệ quy và ngược lại. Điều thú vị về các hàm đệ quy là chúng có thể mô tả một đối tượng vô hạn trong một tuyên bố hữu hạn.

Mã sau đây sẽ chứng minh sự khác biệt giữa đệ quy và lặp. Cả hai chức năng này chỉ đơn giản là in ra các số giữa thấp và cao, loại đầu tiên sử dụng phép lặp và thứ hai bằng cách sử dụng đệ quy:following code should demonstrate the difference between recursion and iteration. Both these functions simply print out numbers between low and high, the first one using iteration and the second using recursion:

Lưu ý rằng đối với ITERTEST, ví dụ lặp lại, chúng tôi sử dụng một câu lệnh ENDY để kiểm tra điều kiện, sau đó gọi phương thức in và cuối cùng tăng giá trị thấp. Các thử nghiệm ví dụ đệ quy cho điều kiện, bản in, sau đó tự gọi, tăng biến thấp trong đối số của nó. Nói chung, lặp lại hiệu quả hơn; Tuy nhiên, các hàm đệ quy thường dễ hiểu và viết hơn. Các hàm đệ quy cũng hữu ích để thao tác các cấu trúc dữ liệu đệ quy như danh sách và cây được liên kết, như chúng ta sẽ thấy.

Chúng ta có thể tạo các chức năng không chỉ trả về một kết quả mà là toàn bộ chuỗi kết quả, bằng cách sử dụng câu lệnh năng suất. Các chức năng này được gọi là máy phát điện. Python chứa các chức năng của máy phát, là một cách dễ dàng để tạo ra các trình lặp và đặc biệt hữu ích để thay thế cho các danh sách dài không thể làm việc. Một máy phát điện mang lại các mục thay vì xây dựng danh sách. Ví dụ: mã sau đây cho thấy lý do tại sao chúng ta có thể chọn sử dụng trình tạo, trái ngược với việc tạo danh sách:generators. Python contains generator functions, which are an easy way to create iterators and are especially useful as a replacement for unworkably long lists. A generator yields items rather than builds lists. For example, the following code shows why we might choose to use a generator, as opposed to creating a list:

python -V
2

Điều này in ra như sau:

Như chúng ta có thể thấy, xây dựng một danh sách để thực hiện tính toán này mất nhiều thời gian hơn. Việc cải thiện hiệu suất do sử dụng máy phát điện là vì các giá trị được tạo theo yêu cầu, thay vì được lưu dưới dạng danh sách trong bộ nhớ. Một tính toán có thể bắt đầu trước khi tất cả các yếu tố đã được tạo ra và các yếu tố chỉ được tạo ra khi chúng cần thiết.

Trong ví dụ trước, phương thức tổng tải mỗi số vào bộ nhớ khi cần thiết cho phép tính. Điều này đạt được bởi đối tượng Trình tạo liên tục gọi phương thức đặc biệt __next__ []. Máy phát điện không bao giờ trả về một giá trị khác ngoài không có.

Thông thường, các đối tượng máy phát được sử dụng trong các vòng lặp. Ví dụ: chúng ta có thể sử dụng chức năng Trình tạo OddLST được tạo trong mã trước để in ra các số nguyên lẻ trong khoảng từ 1 đến 10:

python -V
3

Chúng ta cũng có thể tạo một biểu thức máy phát, ngoài việc thay thế các dấu ngoặc vuông bằng dấu ngoặc đơn, sử dụng cùng một cú pháp và thực hiện hoạt động tương tự như các toàn bộ danh sách. Biểu thức tạo, tuy nhiên, không tạo một danh sách; Họ tạo một đối tượng máy phát. Đối tượng này không tạo dữ liệu, mà là tạo ra dữ liệu đó theo yêu cầu. Điều này có nghĩa là các đối tượng máy phát không hỗ trợ các phương thức trình tự như append [] và chèn [].generator expression, which, apart from replacing square brackets with parentheses, uses the same syntax and carries out the same operation as list comprehensions. Generator expressions, however, do not create a list; they create a generator object. This object does not create the data, but rather creates that data on demand. This means that generator objects do not support sequence methods such as append[] and insert[].

Tuy nhiên, bạn có thể thay đổi trình tạo thành một danh sách bằng hàm danh sách []:

Các lớp là một cách để tạo ra các loại đối tượng mới và chúng là trung tâm của lập trình hướng đối tượng. Một lớp xác định một tập hợp các thuộc tính được chia sẻ trên các trường hợp của lớp đó. Thông thường, các lớp là bộ hàm, biến và thuộc tính.

Mô hình hướng đối tượng là hấp dẫn bởi vì nó cho chúng ta một cách cụ thể để suy nghĩ và đại diện cho chức năng cốt lõi của các chương trình của chúng tôi. Bằng cách tổ chức các chương trình của chúng tôi xung quanh các đối tượng và dữ liệu thay vì hành động và logic, chúng tôi có một cách mạnh mẽ và linh hoạt để xây dựng các ứng dụng phức tạp. Tất nhiên, các hành động và logic vẫn còn hiện diện, nhưng bằng cách thể hiện chúng trong các đối tượng, chúng ta có một cách để gói gọn chức năng, cho phép các đối tượng thay đổi theo những cách rất cụ thể. Điều này làm cho mã của chúng tôi ít dễ bị lỗi, dễ dàng mở rộng và duy trì và có thể mô hình hóa các đối tượng trong thế giới thực.

Các lớp được tạo trong Python bằng cách sử dụng câu lệnh LỚP. Điều này xác định một tập hợp các thuộc tính được chia sẻ liên quan đến một tập hợp các phiên bản lớp. Một lớp thường bao gồm một số phương thức, biến lớp và các thuộc tính được tính toán. Điều quan trọng là phải hiểu rằng việc xác định một lớp không tự nó tạo ra bất kỳ trường hợp nào của lớp đó. Để tạo một thể hiện, một biến phải được gán cho một lớp. Cơ thể lớp bao gồm một loạt các tuyên bố thực thi trong quá trình định nghĩa lớp. Các chức năng được xác định bên trong một lớp được gọi là phương thức thể hiện. Họ áp dụng một số hoạt động cho phiên bản lớp bằng cách truyền một phiên bản của lớp đó làm đối số đầu tiên. Lập luận này được gọi là bản thân theo quy ước, nhưng nó có thể là bất kỳ định danh pháp lý nào. Đây là một ví dụ đơn giản:instance methods. They apply some operations to the class instance by passing an instance of that class as the first argument. This argument is called self by convention, but it can be any legal identifier. Here is a simple example:

python -V
4

Các biến lớp, chẳng hạn như Numemployee, chia sẻ giá trị giữa tất cả các trường hợp của lớp. Trong ví dụ này, Numemployee được sử dụng để đếm số lượng phiên bản nhân viên. Lưu ý rằng lớp nhân viên thực hiện các phương pháp đặc biệt __init__ và __del__, mà chúng ta sẽ thảo luận trong phần tiếp theo.

Chúng ta có thể tạo các thể hiện của các đối tượng nhân viên, chạy phương thức và trả về các biến lớp và thể hiện bằng cách thực hiện các như sau:

Chúng ta có thể sử dụng hàm Dir [đối tượng] để có được danh sách các thuộc tính của một đối tượng cụ thể. Các phương pháp bắt đầu và kết thúc với hai dấu gạch dưới được gọi là phương pháp đặc biệt. Ngoài ngoại lệ sau, các phương pháp đặc biệt thường được người phiên dịch Python gọi chứ không phải là lập trình viên; Ví dụ: khi chúng tôi sử dụng toán tử +, chúng tôi thực sự đang gọi một cuộc gọi đến _add_ []. Ví dụ: thay vì sử dụng my_object._len_ [], chúng ta có thể sử dụng len [my_object]; Sử dụng Len [] trên một đối tượng chuỗi thực sự nhanh hơn nhiều, bởi vì nó trả về giá trị biểu thị kích thước của đối tượng trong bộ nhớ, thay vì thực hiện cuộc gọi đến phương thức _len_ của đối tượng.special methods. Apart from the following exception, special methods are generally called by the Python interpreter rather than the programmer; for example, when we use the + operator, we are actually invoking a to _add_ [] call. For example, rather than using my_object._len_ [], we can use len[my_object]; using len[] on a string object is actually much faster, because it returns the value representing the object's size in memory, rather than making a call to the object's _len_ method.

Phương pháp đặc biệt duy nhất mà chúng tôi thực sự gọi trong các chương trình của chúng tôi, như thông lệ, là phương thức _init_, để gọi trình khởi tạo của siêu lớp trong các định nghĩa lớp của chúng tôi. Bạn nên không sử dụng cú pháp Double Undercore cho các đối tượng của riêng bạn vì xung đột tiềm năng hoặc tương lai với các phương pháp đặc biệt của Python.

Tuy nhiên, chúng tôi có thể muốn thực hiện các phương pháp đặc biệt trong các đối tượng tùy chỉnh, để cung cấp cho họ một số hành vi của các loại tích hợp. Trong mã sau, chúng tôi tạo một lớp thực hiện phương thức _REPR_. Phương pháp này tạo ra một biểu diễn chuỗi của đối tượng của chúng tôi hữu ích cho mục đích kiểm tra:

python -V
5

Khi chúng ta tạo một thể hiện của đối tượng này và kiểm tra nó, chúng ta có thể thấy chúng ta nhận được biểu diễn chuỗi tùy chỉnh của mình. Lưu ý việc sử dụng trình giữ chỗ định dạng %R để trả về biểu diễn tiêu chuẩn của đối tượng. Điều này rất hữu ích và tốt nhất bởi vì, trong trường hợp này, nó cho chúng ta thấy rằng đối tượng Greet là một chuỗi được biểu thị bằng dấu ngoặc kép:

Kế thừa là một trong những tính năng mạnh mẽ nhất của các ngôn ngữ lập trình hướng đối tượng. Nó cho phép chúng ta kế thừa chức năng từ các lớp khác. Có thể tạo một lớp mới sửa đổi hành vi của một lớp hiện có thông qua kế thừa. Kế thừa có nghĩa là nếu một đối tượng của một lớp được tạo bằng cách thừa hưởng một lớp khác, thì đối tượng sẽ có tất cả các chức năng, phương thức và biến của cả hai lớp; Đó là, lớp cha và lớp mới. Lớp hiện có mà chúng tôi thừa hưởng các chức năng được gọi là lớp cha/cơ sở và lớp mới được gọi là lớp dẫn xuất/con.

Kế thừa có thể được giải thích bằng một ví dụ rất đơn giản, chúng tôi tạo ra một lớp nhân viên với các thuộc tính như tên của nhân viên và tỷ lệ mà anh ta sẽ được trả tiền hàng giờ. Bây giờ chúng ta có thể tạo một lớp Đặc biệt mới kế thừa tất cả các thuộc tính từ lớp nhân viên.

Kế thừa trong Python được thực hiện bằng cách truyền lớp kế thừa như một đối số trong định nghĩa lớp. Nó thường được sử dụng để sửa đổi hành vi của các phương pháp hiện có.

Một thể hiện của lớp SpecialMployee giống hệt với một thể hiện của nhân viên, ngoại trừ phương thức thay đổi [] phương thức. Ví dụ: trong mã sau, chúng tôi tạo một lớp Đặc biệt mới kế thừa tất cả các chức năng của lớp nhân viên và cũng thay đổi phương thức Giờ []:For example, in the following code we create a new specialEmployee class that inherits all the functionalities of the Employee class, and also change the hours[] method:

python -V
6

Đối với một lớp con để xác định các biến lớp mới, nó cần xác định phương thức __init __ [], như sau:

python -V
7

Lưu ý rằng các phương thức của lớp cơ sở không được tự động gọi và cần phải gọi cho lớp có nguồn gốc. Chúng tôi có thể kiểm tra tư cách thành viên của lớp bằng cách sử dụng hàm isinstance [OBJ1, OBJ2] tích hợp. Điều này trả về đúng nếu OBJ1 thuộc nhóm OBJ2 hoặc bất kỳ lớp nào có nguồn gốc từ OBJ2. Chúng ta hãy xem xét ví dụ sau để hiểu điều này, trong đó OBJ1 và OBJ2 là đối tượng của các lớp nhân viên và nhân viên đặc biệt tương ứng:Employee classes respectively:

python -V
8

Nói chung, tất cả các phương thức hoạt động trên thể hiện của một lớp được xác định trong một lớp. Tuy nhiên, nó không phải là một yêu cầu. Có hai loại phương pháp Phương pháp phân tích và phương pháp lớp. Một phương thức tĩnh khá giống với phương thức lớp, chủ yếu bị ràng buộc với lớp và không bị ràng buộc với đối tượng của lớp. Nó được xác định trong một lớp và không yêu cầu một thể hiện của một lớp để thực thi. Nó không thực hiện bất kỳ hoạt động nào trên ví dụ và nó được xác định bằng cách sử dụng trình trang trí lớp @staticmethod. Các phương thức tĩnh không thể truy cập các thuộc tính của một thể hiện, vì vậy việc sử dụng phổ biến nhất của chúng là một sự tiện lợi cho các hàm tiện ích nhóm cùng nhau.static methods and class methods. A static method is quite similar to a class method, which is mainly bound to the class, and not bound with the object of the class. It is defined within a class and does not require an instance of a class to execute. It does not perform any operations on the instance and it is defined using the @staticmethod class decorator. Static methods cannot access the attributes of an instance, so their most common usage is as a convenience to group utility functions together.

Một phương thức lớp hoạt động trên chính lớp và không hoạt động với các trường hợp. Một phương thức lớp hoạt động giống như cách các biến lớp được liên kết với các lớp thay vì các trường hợp của lớp đó. Các phương thức lớp được xác định bằng cách sử dụng bộ trang trí @ClassMethod và được phân biệt với các phương thức thể hiện trong lớp. Nó được thông qua như là đối số đầu tiên, và điều này được đặt tên là CLS theo quy ước. Lớp EPRONIentialB kế thừa từ lớp theExponienta và thay đổi biến lớp cơ sở thành 4. Chúng ta cũng có thể chạy phương thức exp [] của lớp phụ huynh như sau:e @classmethod decorator and are distinguished from instance methods in the class. It is passed as the first argument, and this is named cls by convention. The exponentialB class inherits from theexponentialA class and changes the base class variable to 4. We can also run the parent class's exp[] method as follows:

python -V
9

Sự khác biệt giữa phương thức tĩnh và phương thức lớp là phương thức tĩnh không biết gì về lớp, nó chỉ liên quan đến các tham số, trong khi phương thức lớp chỉ hoạt động với lớp và tham số của nó luôn là bản thân lớp.

Có một số lý do tại sao các phương pháp lớp có thể hữu ích. Ví dụ, vì một lớp con kế thừa tất cả các tính năng giống nhau của cha mẹ của nó, có khả năng nó phá vỡ các phương pháp di truyền. Sử dụng các phương thức lớp là một cách để xác định chính xác phương thức nào được chạy.

Trừ khi có quy định khác, tất cả các thuộc tính và phương thức đều có thể truy cập mà không bị hạn chế. Điều này cũng có nghĩa là mọi thứ được xác định trong một lớp cơ sở có thể truy cập được từ một lớp dẫn xuất. Điều này có thể gây ra vấn đề khi chúng ta đang xây dựng các ứng dụng hướng đối tượng, nơi chúng ta có thể muốn che giấu việc triển khai nội bộ của một đối tượng. Điều này có thể dẫn đến xung đột không gian tên giữa các đối tượng được xác định trong các lớp dẫn xuất với lớp cơ sở. Để ngăn chặn điều này, các phương thức chúng tôi xác định các thuộc tính riêng tư có dấu gạch dưới kép, chẳng hạn như __privatemethod []. Các tên phương thức này được tự động thay đổi thành __ classname_privatemethod [] để ngăn chặn xung đột tên với các phương thức được xác định trong các lớp cơ sở. Xin lưu ý rằng điều này không hoàn toàn ẩn các thuộc tính riêng tư, thay vào đó nó chỉ cung cấp một cơ chế để ngăn chặn xung đột tên.

Nên sử dụng các thuộc tính riêng khi sử dụng thuộc tính lớp để xác định các thuộc tính có thể thay đổi. Một thuộc tính là một loại thuộc tính thay vì trả về giá trị được lưu trữ tính toán giá trị của nó khi được gọi. Ví dụ: chúng ta có thể xác định lại thuộc tính exp [] với các mục sau:property to define mutable attributes. A property is a kind of attribute that rather than returning a stored value computes its value when called. For example, we could redefine the exp[] property with the following:

python .py
0

Chương này đã cho chúng ta một cơ bản cơ bản và giới thiệu về chương trình Python. Chúng tôi đã mô tả các cấu trúc dữ liệu và thuật toán khác nhau được cung cấp bởi Python. Chúng tôi bao gồm việc sử dụng các biến, danh sách, một vài cấu trúc kiểm soát và học cách sử dụng câu lệnh có điều kiện. Chúng tôi cũng đã thảo luận về cách các chức năng được sử dụng trong Python. Các loại đối tượng khác nhau đã được thảo luận, cùng với một số tài liệu về các khía cạnh hướng đối tượng của ngôn ngữ Python. Chúng tôi đã tạo ra các đối tượng của riêng mình và được thừa hưởng từ chúng.

Vẫn còn nhiều hơn mà Python cung cấp. Khi chúng tôi chuẩn bị kiểm tra các chương sau về một số triển khai của các thuật toán, chương tiếp theo sẽ tập trung vào các số, trình tự, bản đồ và bộ. Đây cũng là những loại dữ liệu trong Python chứng minh hữu ích khi tổ chức dữ liệu cho một loạt các hoạt động.

  • Học Python của Fabrizio Romano: //www.packtpub.com/application-development/learning-python.Fabrizio Romano: //www.packtpub.com/application-development/learning-python.

Bài Viết Liên Quan

Chủ Đề