1. Trang chủ
  2. » Công Nghệ Thông Tin

Những hiểu biết cơ bản về Python cho người mới bắt đầu

23 330 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 23
Dung lượng 38,78 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Tại sao Python lại được dùng trong lĩnh vực AI?,sự khác biệt giữa C và Python là gì?,những kiến thức cơ bản về Python ,các cú pháp cơ bản trong Python cho người mới bắt đầu,Hiểu về các thư viện các Class cơ bản trong Python

Trang 1

1 Classes

-Các Class cung cấp một phương tiện kết hợp dữ liệu và chức năng với nhau Tạo một Class mới sẽ tạo ra một kiểu Object mới, cho phép tạo ra các cá thể mới của kiểu đó Mỗi cá thể Class có thể có các thuộc tính gắn liền với nó để duy trì trạng thái của nó.

-So với các ngôn ngữ lập trình khác, cơ chế Class của Python bổ sung các Class với tối thiểu cú pháp và ngữ nghĩa mới Nó là một hỗn hợp của các cơ chế Class được tìm thấy trong C và Modula-3 Các Class Python cung cấp tất cả các tính năng tiêu chuẩn của Lập trình hướng Object: cơ chế thừa kế Class cho phép nhiều Class cơ sở, một Class dẫn xuất có thể ghi đè lên bất kỳ phương thức nào của Class cơ sở hoặc các Class cơ sở của nó, và một phương thức có thể gọi phương thức của một Class cơ sở có cùng tên Object có thể chưa số lượng tùy ý các loại

dữ liệu Như là đúng đối với các mô-đun, các Class tham gia vào bản chất động của Python: chúng được tạo ra trong thời gian chạy, và có thể được sửa đổi thêm sau khi tạo.

Trong thuật ngữ C , các thành viên Class thông thường (bao gồm các thành viên

dữ liệu) là công khai (ngoại trừ xem dưới các Biến riêng), và tất cả các hàm thành viên đều là ảo Như trong Modula-3, không có viết tắt để tham chiếu các thành viên của Object từ các phương thức của nó: hàm phương thức được khai báo với một đối số đầu tiên rõ ràng đại diện cho Object,được cung cấp ngầm bởi cuộc gọi.

(Thiếu thuật ngữ được chấp nhận phổ biến để nói về các lớp học, tôi sẽ thỉnh thoảng sử dụng các thuật ngữ Smalltalk và C++.Tôi sẽ sử dụng các thuật ngữ Modula-3, vì ngữ nghĩa hướng Object của nó gần gũi hơn với ngữ nghĩa của Python so với C , nhưng tôi mong rằng ít người đọc đã nghe về nó.)

1.1 Vấn đề về Names và Object

Các Object có tính cá nhân và nhiều tên (trong nhiều phạm vi) có thể bị ràng buộc vào cùng một Object Điều này được gọi là răng cưa trong các ngôn ngữ khác Điều này thường không được đánh giá cao trên một cái nhìn đầu tiên tại Python,

và có thể được bỏ qua một cách an toàn khi giao dịch với các loại cơ bản không thay đổi (số, chuỗi, bộ dữ liệu) Tuy nhiên, răng cưa có tác dụng đáng ngạc nhiên đối với ngữ nghĩa của mã Python liên quan đến các Object có thể thay đổi được như danh sách, từ điển và hầu hết

Trang 2

các loại khác Điều này thường được sử dụng vì lợi ích của các chương trình ,vì bí danh hoạt động như con trỏ ở một số khía

cạnh Ví dụ, việc truyền một Object là rẻ vì chỉ có một con trỏ được thực thi; và nếu một hàm sửa đổi một Object được truyền vào như một đối số, người gọi sẽ thấy sự thay đổi-điều này loại bỏ

sự cần thiết của hai cơ chế truyền tham số khác nhau như trong pascal.

1.2 Python phạm vi và khoảng tên trống

Trước khi giới thiệu các Class, trước tiên tôi phải nói cho bạn điều gì đó về các quy tắc phạm vi của Python Định nghĩa Class phát một số thủ thuật gọn gàng với không gian tên và bạn cần biết cách phạm vi và không gian hoạt động để hiểu đầy

đủ những gì đang diễn ra Ngẫu nhiên, kiến thức về chủ đề này là hữu ích cho bất

kỳ lập trình viên Python tiên tiến nào.

chúng ta hãy bắt đầu bằng một số định nghĩa.

Một không gian tên là một ánh xạ từ các tên đến các Object Hầu hết các không gian tên hiện được triển khai dưới dạng từ điển Python, nhưng thường không đáng chú ý theo bất kỳ cách nào (ngoại trừ hiệu suất )và nó có thể thay đổi trong tương lai Ví dụ về các không gian tên là: tập hợp các tên dựng sẵn (chứa các hàm như abs () và các tên ngoại lệ có sẵn); tên toàn cầu trong một mô-đun; và tên địa phương trong lời gọi hàm Trong một nghĩa nào đó,tập các thuộc tính của một Object cũng tạo thành một vùng tên Điều quan trọng cần biết về không gian tên là hoàn toàn không có mối quan hệ giữa các tên trong các không gian tên khác nhau;

ví dụ: hai mô-đun khác nhau có thể vừa định nghĩa một hàm tối đa mà không có sự nhầm lẫn - người dùng của các mô-đun phải đặt tiền tố nó với tên mô-đun.

Nhân tiện, tôi sử dụng thuộc tính word cho bất kỳ tên nào sau một dấu chấm - ví

dụ, trong biểu thức z.real, real là một thuộc tính của Object z Nói đúng ra, các tham chiếu đến các tên trong các mô-đun là các tham chiếu thuộc tính: trong biểu thức modname.funcname, modname là một Object mô-đun và funcname là một thuộc tính của nó Trong trường hợp này,sẽ xảy ra một cách đơn giản.

Thuộc tính có thể là chỉ đọc hoặc có thể ghi Trong trường hợp sau, việc gán cho các thuộc tính là có thể Các thuộc tính mô-đun có thể ghi được: bạn có thể viết

Trang 3

modname.the_answer = 42 Các thuộc tính có thể ghi cũng có thể xóa với câu lệnh del Ví dụ: del modname.the_answer sẽ xóa thuộc tính the_answer khỏi Object có tên là modname.

Không gian tên được tạo ra ở những thời điểm khác nhau và có thời gian sống khác nhau Không gian tên chứa các tên dựng sẵn được tạo khi trình thông dịch Python khởi động và không bao giờ bị xóa Không gian tên chung cho mô-đun được tạo khi định nghĩa mô-đun được đọc; thông thường, các không gian tên mô- đun cũng kéo dài cho đến khi thông dịch viên thoát Các câu lệnh được thực hiện bởi lời gọi cao cấp nhất của trình thông dịch hoặc đọc từ một tập tin kịch bản hoặc tương tác, được coi là một phần của một mô-đun gọi là main , do đó, họ

có không gian tên chung của riêng họ (Tên được xây dựng trong thực tế cũng sống trong một môdun,điều này gọi là builtins).

Không gian tên cục bộ cho một hàm được tạo ra khi hàm được gọi, và bị xóa khi hàm trả về hoặc đặt ra một ngoại lệ không được xử lý trong hàm (Trên thực tế, quên đi sẽ là một cách tốt hơn để mô tả những gì thực sự xảy ra.) Tất nhiên,

invocations đệ quy từng có không gian tên địa phương riêng của họ.

Phạm vi là vùng văn bản của chương trình Python, trong đó không gian tên có thể truy cập trực tiếp "Trực tiếp truy cập" ở đây có nghĩa là một tham chiếu không đủ tiêu chuẩn cho một tên cố gắng tìm tên cho không gian tên

Mặc dù phạm vi được xác định tĩnh, chúng được sử dụng động Bất cứ lúc nào trong quá trình thực hiện, có ít nhất ba phạm vi lồng nhau có các không gian tên có thể truy cập trực tiếp:

• phạm vi bên trong nhất, được tìm kiếm đầu tiên, chứa các tên địa phương

• phạm vi của bất kỳ chức năng kèm theo nào, được tìm kiếm bắt đầu bằng gần nhất

• phạm vi tiếp theo đến cuối cùng chứa các tên toàn cục của mô-đun hiện tại

• phạm vi ngoài cùng (tìm kiếm cuối cùng) là vùng tên chứa các tên dựng sẵn

Trang 4

Nếu tên được khai báo toàn cục, thì tất cả các tham chiếu và bài tập sẽ chuyển trực tiếp đến phạm vi giữa chứa tên toàn cầu của mô-đun Để khôi phục lại các biến được tìm thấy bên ngoài pham vi bên trong nhât,câu lệnh nonlocal có thể được sử dụng ; nếu không khai báo nonlocal, các biến đó là read-only (một nỗ lực

để ghi vào một biến như vậy sẽ chỉ tạo một biến cục bộ mới trong phạm vi bên trong nhất, để biến không thay đổi được được đặt tên giống hệt nhau)

Thông thường, phạm vi cục bộ tham chiếu đến tên cục bộ của hàm hiện tại (văn bản) Các hàm bên ngoài, phạm vi cục bộ tham chiếu cùng một không gian tên như phạm vi toàn cục: không gian tên của mô dun.Các định nghĩa Class đặt một không gian khác cho phạm vi cục bộ

Điều quan trọng là nhận ra rằng phạm vi được xác định bằng văn bản: phạm vi toàn cầu của hàm được định nghĩa trong mô-đun là không gian tên của mô-đun, bất kể từ đâu hoặc bằng bí danh mà hàm được gọi Mặt khác, tìm kiếm thực tế tên được thực hiện động, vào thời gian chạy - tuy nhiên, định nghĩa ngôn ngữ đang phát triển theo độ phân giải tên tĩnh, vào thời gian "biên dịch", do đó, không dựa vào độ phân giải tên động!(thực tế,các biến cục bộ đã được xác định tĩnh)

Một điều kỳ quặc đặc biệt của Python là - nếu không có câu lệnh chung nào có hiệu lực - việc gán cho các tên luôn đi vào phạm vi bên trong nhất Các bài tập không sao chép dữ liệu - chúng chỉ liên kết các tên với các Object Điều tương tự cũng đúng đối với việc xóa: câu lệnh del x loại bỏ ràng buộc của x từ không gian tên được tham chiếu bởi phạm vi cục bộ Trên thực tế, tất cả các hoạt động giới thiệu tên mới đều sử dụng phạm vi địa phương cụ thể, các câu lệnh nhập khẩu và các định nghĩa hàm liên kết tên mô-đun hoặc hàm trong phạm vi cục bộ.

.

Câu lệnh chung có thể được sử dụng để chỉ ra rằng các biến cụ thể sống trong phạm vi toàn cầu và sẽ được hồi phục ở đó; câu lệnh nonlocal cho biết rằng các biến cụ thể sống trong một phạm vi kèm theo và sẽ được phục hồi ở đó

1.2.1 Phạm vi và khoảng tên trống ví dụ

Trang 5

Đây là một ví dụ minh họa cách tham khảo các phạm vi và không gian tên khác nhau và mức độ ảnh hưởng của biến toàn cầu và không liên quan đến biến:

spam = "global spam"

spam = "test spam"

After local assignment: test spam

After nonlocal assignment: nonlocal spam

After global assignment: nonlocal spam

In global scope: global spam

Lưu ý cách gán địa phương (mặc định) đã không thay đổi tính ràng buộc spam của scope_test Nhiệm vụ không tập trung đã thay đổi ràng buộc của scope_test về spam và nhiệm vụ toàn cục đã thay đổi ràng buộc cấp modun

Bạn cũng có thể thấy rằng không có sự ràng buộc trước đó cho spam trước khi gán toàn cầu.

1.3 A First Look at Classes

Trang 6

Các Class giới thiệu một chút cú pháp mới, ba kiểu Object mới và một số ngữ nghĩa mới.

1.3.1 Class Definition Syntax

Dạng định nghĩa Class đơn giản nhất trông giống như sau:

Trong thực tế, các câu lệnh bên trong định nghĩa Class thường sẽ là định nghĩa chức năng, nhưng các câu lệnh khác được cho phép và đôi khi hữu ích - chúng ta

sẽ quay lại sau này Các định nghĩa hàm bên trong một Class thường có một dạng danh sách đối số đặc biệt, được quyết định bởi các quy ước gọi cho các phương thức - một lần nữa, điều này được giải thích sau

Khi một định nghĩa Class được nhập vào, một vùng tên mới được tạo ra, và được

sử dụng như là phạm vi cục bộ - do đó, tất cả các gán cho các biến cục bộ đi vào không gian tên mới này Đặc biệt,nghĩa của hàm liên kết tên của hàm mới ở đây

Khi một định nghĩa Class được để lại bình thường (thông qua kết thúc), một

Object Class được tạo ra Về cơ bản, đây là một trình bao bọc xung quanh nội dung của không gian tên được tạo bởi định nghĩa Class;chúng ta sẽ tìm hiểu thêm

về các Object Class trong phần tiêp theo

1.3.2 Class Objects

Các Object Class hỗ trợ hai loại hoạt động: tham chiếu thuộc tính và sự thuyết trình

Trang 7

Tham chiếu thuộc tính sử dụng cú pháp tiêu chuẩn được sử dụng cho tất cả các tham chiếu thuộc tính trong Python: obj.name Tên thuộc tính hợp lệ là tất cả các tên trong không gian tên của Class khi Object Class được tạo.vì vậy nếu định nghĩa Class trông như thế này:

class MyClass:

"""A simple example class"""

i = 12345

def f(self):

return 'hello world'

sau đó MyClass.i và MyClass.f là các tham chiếu thuộc tính hợp lệ, trả về một số nguyên và một Object hàm tương ứng Các thuộc tính Class cũng có thể được gán cho, vì vậy bạn có thể thay đổi giá trị Myclass.i bằng cách gán _doc_ cũng là thuộc tính hợp lệ ,trả về chuỗi tài liệu thuộc về Class:

Class instantiation sử dụng ký hiệu hàm Chỉ cần giả vờ rằng Object Class là một hàm không tham số trả về một cá thể mới của Class đó Ví dụ (giả sử Class trên):

x = MyClass()

tạo một thể hiện mới của Class và gán Object này cho biến cục bộ x.

Thao tác khởi tạo ("gọi" một Object Class) tạo ra một Object trống Nhiều Class muốn tạo Object với các cá thể được tùy chỉnh theo trạng thái ban đầu cụ thể Do

đó một Class có thể định nghĩa một phương thức đặc biệt có tên_init_(),như sau

def init (self):

self.data = []

Khi một Class định nghĩa một phương thức init (), Class instantiation sẽ tự động gọi init () cho cá thể Class mới được tạo ra Vì vậy, trong ví dụ này, một thể hiện khởi tạo mới có thể thu được bằng cách:

x = MyClass()

Tất nhiên, phương thức init () có thể có các đối số cho tính linh hoạt cao hơn Trong trường hợp đó, các đối số được đưa ra cho toán tử instantiation class được truyền vào init () Ví dụ,

Trang 8

các thuộc tính dữ liệu tương ứng với "các biến cá thể" trong Smalltalk và "các thành viên dữ liệu" trong C Các thuộc tính dữ liệu không cần khai báo; giống như các biến cục bộ, chúng xuất hiện khi chúng được gắn cho, Ví dụ, nếu x là cá thể của MyClass được tạo ở trên, đoạn mã sau đây sẽ in giá trị 16, mà không để lại dấu vết:

Các tên phương thức hợp lệ của một Object thể hiện phụ thuộc vào Class của nó Theo định nghĩa, tất cả các thuộc tính của một Class là các Object hàm xác định các phương thức tương ứng của các cá thể của nó.vì vậy,trong ví dụ của chúng tôi, x.f là một tham chiếu phương thức hợp lệ, vì MyClass.f là một hàm, nhưng x.i thì

Trang 9

không, vì MyClass.i thì không Nhưng x.f không giống với MyClass.f - nó là một Object phương thức, không phải là một Object hàm

xf = x.f

while True:

print(xf())

sẽ tiếp tục in thế giới hello cho đến cuối thời gian.

What exactly happens when a method is called? You may have noticed that x.f() was called without an argument above, even though the function definition for f() specified an argument Điều gì chính xác xảy ra khi một phương pháp được gọi là? Bạn có thể nhận thấy rằng x.f () được gọi mà không có một đối số ở trên, mặc

dù định nghĩa hàm cho f () đã chỉ định một đối số.điều gì xày ra với đối số? ? Chắc chắn Python đặt ra một ngoại lệ khi một hàm yêu cầu đối số được gọi mà không cần bất kỳ - ngay cả khi đối số không thực sự được sử dụng…

Trên thực tế, bạn có thể đoán câu trả lời: điều đặc biệt về các phương thức là Object thể hiện được chuyển như đối số đầu tiên của hàm Trong ví dụ của chúng

ta, hàm x.f () chính xác tương đương với MyClass.f(x) Nói chung, gọi một phương thức với một danh sách n đối số tương đương với việc gọi hàm tương ứng với một danh sách đối số được tạo bằng cách chèn Object Object của phương thức trước đối số đầu tiên

Nếu bạn vẫn không hiểu các phương thức hoạt động như thế nào, thì việc xem xét triển khai có thể làm rõ các vấn đề Khi một thuộc tính thể hiện được tham chiếu không phải là thuộc tính dữ liệu,Class của nó được tìm kím Nếu tên biểu thị một Object hàm, , một Object phương thức được tạo ra bằng cách đóng gói (con trỏ đến) Object thể hiện và Object hàm chỉ tìm thấy cùng nhau trong một Object trừu tượng: đây là

Object phương thức.khi Object method được gọi với một danh

Trang 10

sách tham số, , một danh sách đối số mới được xây dựng từ

Object thể hiện và danh sách đối số, và Object hàm được gọi với danh sách đối số mới này.

1.3.5 Class and Instance Variables

Nói chung, các biến cá thể là dữ liệu duy nhất cho mỗi biến thể hiện và Class là cho các thuộc tính và các phương thức được chia sẻ bởi tất cả các cá thể của Class:

class Dog:

kind = 'canine' # class variable shared by all instances

def init (self, name):

self.name = name # instance variable unique

Như đã thảo luận trong A Word Giới thiệu về Tên và Object, dữ liệu được chia sẻ

có thể có tác dụng đáng ngạc nhiên với các Object có thể thay đổi như danh sách

và từ điển Ví dụ, danh sách các thủ thuật trong đoạn mã sau không nên được sử dụng như một biến Class vì chỉ một danh sách duy nhất sẽ được chia sẻ bởi tất cả các cá thể Dog:

class Dog:

Trang 11

tricks = [] # mistaken use of a class variable

def init (self, name):

['roll over', 'play dead']

Thiết kế chính xác của Class nên sử dụng mẫu thay đổi thay vì :

Ngày đăng: 16/06/2018, 23:39

TỪ KHÓA LIÊN QUAN

w