Số nguyên là một đối tượng hay lớp Python?

Một đối tượng số nguyên trong Python được biểu diễn bên trong bởi cấu trúc PyIntObject. Giá trị của nó là thuộc tính kiểu long

typedef struct {
    PyObject_HEAD
    long ob_ival;
} PyIntObject;

Để tránh cấp phát một đối tượng số nguyên mới mỗi khi cần một đối tượng số nguyên mới, Python sẽ cấp phát trước một khối các đối tượng số nguyên chưa sử dụng

Cấu trúc sau được Python sử dụng để phân bổ các đối tượng số nguyên, còn được gọi là PyIntObjects. Khi cấu trúc này được khởi tạo, các đối tượng số nguyên sẵn sàng được sử dụng khi các giá trị số nguyên mới được gán cho các đối tượng trong tập lệnh Python. Cấu trúc này được gọi là “PyIntBlock” và được định nghĩa là

struct _intblock {
    struct _intblock *next;
    PyIntObject objects[N_INTOBJECTS];
};
typedef struct _intblock PyIntBlock;

Khi một khối đối tượng số nguyên được phân bổ bởi Python, các đối tượng chưa có giá trị được gán cho chúng. Chúng tôi gọi chúng là các đối tượng số nguyên miễn phí sẵn sàng để sử dụng. Một giá trị sẽ được gán cho đối tượng tự do tiếp theo khi một giá trị số nguyên mới được sử dụng trong chương trình của bạn. Không cần cấp phát bộ nhớ khi giá trị của một đối tượng số nguyên miễn phí được đặt để nó sẽ nhanh

Các đối tượng số nguyên bên trong khối được liên kết với nhau từ trước ra sau bằng cách sử dụng con trỏ bên trong của chúng được gọi là ob_type. Như đã lưu ý trong mã nguồn, đây là sự lạm dụng con trỏ bên trong này, vì vậy đừng quá chú ý đến tên

Mỗi khối số nguyên chứa số đối tượng số nguyên có thể vừa với khối 1K byte, khoảng 40 đối tượng PyIntObject trên máy 64 bit của tôi. Khi tất cả các đối tượng số nguyên bên trong một khối được sử dụng, một khối mới được phân bổ với một danh sách mới các đối tượng số nguyên có sẵn

Một danh sách liên kết đơn được sử dụng để theo dõi các khối số nguyên được phân bổ. Nó được gọi là “block_list” trong nội bộ

Một cấu trúc cụ thể được sử dụng để chỉ các số nguyên nhỏ và chia sẻ chúng để truy cập nhanh. Nó là một mảng gồm 262 con trỏ tới các đối tượng số nguyên. Các đối tượng số nguyên đó được phân bổ trong quá trình khởi tạo trong một khối các đối tượng số nguyên mà chúng ta đã thấy ở trên. Phạm vi số nguyên nhỏ là từ -5 đến 256. Nhiều chương trình Python dành nhiều thời gian để sử dụng các số nguyên trong phạm vi đó, vì vậy đây là một quyết định thông minh

#define NSMALLPOSINTS           257
#define NSMALLNEGINTS           5
static PyIntObject *small_ints[NSMALLNEGINTS + NSMALLPOSINTS];

Đối tượng số nguyên đại diện cho số nguyên -5 nằm ở phần bù 0 bên trong mảng số nguyên nhỏ. Đối tượng số nguyên đại diện cho -4 ở độ lệch 1 …

Điều gì xảy ra khi một số nguyên được xác định trong tập lệnh Python như thế này?

>>> a=1
>>> a
1

Khi bạn thực thi dòng đầu tiên, hàm PyInt_FromLong được gọi và logic của nó như sau

if integer value in range -5,256:
    return the integer object pointed by the small integers array at the offset [value + 5].
else:
    if no free integer object available:
        allocate new block of integer objects
    set value of the next free integer object in the current block
of integers.
    return integer object

Với ví dụ của chúng tôi. đối tượng số nguyên 1 được trỏ bởi mảng số nguyên nhỏ ở phần bù. 1+5 = 6. Một con trỏ tới đối tượng số nguyên này sẽ được trả về và biến “a” sẽ trỏ tới đối tượng số nguyên đó

Hãy xem một ví dụ khác

>>> a=300
>>> a
300

300 không nằm trong phạm vi của mảng số nguyên nhỏ nên giá trị của đối tượng số nguyên tự do tiếp theo được đặt thành 300

Nếu bạn xem tập tin intobject. c trong Python 2. 6, bạn sẽ thấy một danh sách dài các hàm đảm nhận các phép toán như cộng, nhân, chuyển đổi… Hàm so sánh trông như thế này

static int
int_compare[PyIntObject *v, PyIntObject *w]
{
    register long i = v->ob_ival;
    register long j = w->ob_ival;
    return [i < j] ? -1 : [i > j] ? 1 : 0;
}

Giá trị của một đối tượng số nguyên được lưu trữ trong thuộc tính ob_ival thuộc loại long. Mỗi giá trị được đặt trong một thanh ghi để tối ưu hóa truy cập và so sánh được thực hiện giữa 2 thanh ghi đó. -1 được trả về nếu đối tượng số nguyên được trỏ bởi v nhỏ hơn đối tượng được trỏ bởi w. 1 được trả về cho điều ngược lại và 0 được trả lại nếu chúng bằng nhau

Trong Python, dữ liệu có dạng đối tượng hoặc đối tượng tích hợp sẵn mà Python cung cấp hoặc đối tượng chúng ta tạo bằng Python hoặc các công cụ ngôn ngữ bên ngoài, chẳng hạn như thư viện tiện ích mở rộng X. Bởi vì các đối tượng là khái niệm cơ bản nhất trong lập trình Python, nên chúng ta sẽ bắt đầu với các loại đối tượng tích hợp sẵn


Loại đối tượngVí dụ chữ/sáng tạoNumbers1234, 3. 1415, 3+4j, Decimal, FractionStrings'python', "Jupiter's", b'a\x01c'Lists[1, [2, 'three'], 4]Dictionaries{'Apple'. 'iPhone', 'Google'. 'Android'}Tuples{1, 'php', 3, 'Y'}FilesmyFile = open['java', 'r']Setsset['xyz'], {'x', 'y', 'z'}

Không có khai báo kiểu trong Python. Cú pháp của các biểu thức chúng tôi chạy xác định các loại đối tượng chúng tôi tạo và sử dụng. Trong Python, mỗi giá trị đều có một kiểu dữ liệu, nhưng chúng ta không cần khai báo kiểu dữ liệu của biến. Nó hoạt động như thế nào?

Tất nhiên, có nhiều loại hơn những loại trong bảng trên. Mọi thứ đều là một đối tượng trong Python, do đó, có các loại như mô-đun, hàm, lớp, phương thức, tệp và thậm chí cả mã được biên dịch

Khi chúng tôi tạo một đối tượng, chúng tôi sẽ liên kết bộ hoạt động của nó mọi lúc. Chúng ta chỉ có thể thực hiện các thao tác chuỗi trên một chuỗi và liệt kê các thao tác trên một danh sách. Python được gõ động, tuy nhiên, nó cũng được gõ mạnh, tôi. e. , chúng ta chỉ có thể thực hiện trên một đối tượng các thao tác hợp lệ cho loại của nó

Mọi thứ trong Python đều là đối tượng và mọi thứ đều có thể có thuộc tính và phương thức. Tất cả các hàm đều có thuộc tính tích hợp __doc__, trả về chuỗi tài liệu được xác định trong mã nguồn của hàm. Ví dụ: mô-đun sys là một đối tượng có thuộc tính được gọi là đường dẫn, v.v.

Đối tượng là gì?
Các ngôn ngữ lập trình khác nhau định nghĩa đối tượng theo những cách khác nhau. Trong một số, điều đó có nghĩa là tất cả các đối tượng phải có các thuộc tính và phương thức; . Trong Python, định nghĩa lỏng lẻo hơn. Một số đối tượng không có thuộc tính cũng như phương thức, nhưng chúng có thể. Không phải tất cả các đối tượng đều có thể phân lớp. Nhưng mọi thứ đều là một đối tượng theo nghĩa là nó có thể được gán cho một biến hoặc được truyền dưới dạng đối số cho một hàm

Bạn có thể đã nghe thuật ngữ đối tượng hạng nhất trong các bối cảnh lập trình khác. Trong Python, hàm là đối tượng hạng nhất. Bạn có thể chuyển một hàm làm đối số cho một hàm khác. Các mô-đun là các đối tượng hạng nhất. Bạn có thể chuyển toàn bộ mô-đun làm đối số cho hàm. Các lớp là các đối tượng hạng nhất và các thể hiện riêng lẻ của một lớp cũng là các đối tượng hạng nhất

Điều này rất quan trọng, vì vậy tôi sẽ lặp lại nó trong trường hợp bạn bỏ lỡ vài lần đầu tiên. mọi thứ trong Python là một đối tượng. Chuỗi là đối tượng. Danh sách là đối tượng. Chức năng là đối tượng. Các lớp là các đối tượng. Các thể hiện của lớp là các đối tượng. Ngay cả các mô-đun là đối tượng

Phần này về đối tượng là từ "Dive into Python 3" của Mark Pilgrim

Trăn 3. Loại số nguyên của 0 tự động cung cấp thêm độ chính xác cho các số lớn như hình bên dưới

>>> 
>>> 2 ** 100
1267650600228229401496703205376
>>> # How many digits?
>>> len[str[2 ** 100]]
31
>>> 

Hãy chuyển sang số nổi

nhàn rỗi 2. 6. 2

________số 8

Có hai cách để in mọi đối tượng. với độ chính xác đầy đủ và ở dạng thân thiện với người dùng.
Dạng đầu tiên được gọi là mã repr của đối tượng và dạng thứ hai là str thân thiện với người dùng. Nhưng trong 3. 2, chúng tôi không thấy sự khác biệt trong đầu ra.

nhàn rỗi 3. 2. a3

>>> 3.1415 * 2
6.283
>>> print[3.1415 *2]
6.283
>>> 

Có các mô-đun số hữu ích đi kèm với Python

struct _intblock {
    struct _intblock *next;
    PyIntObject objects[N_INTOBJECTS];
};
typedef struct _intblock PyIntBlock;
0

Mô-đun toán học chứa các công cụ số nâng cao dưới dạng hàm, trong khi mô-đun ngẫu nhiên thực hiện tạo số ngẫu nhiên và lựa chọn ngẫu nhiên

Chuỗi - Hoạt động trình tự

Chuỗi là tập hợp các đối tượng có thứ tự. Trình tự duy trì thứ tự từ trái sang phải giữa các mục. Các mặt hàng của họ được lưu trữ và tìm nạp theo vị trí tương đối của họ. Trên thực tế, chuỗi là chuỗi các chuỗi một ký tự. Các loại trình tự khác bao gồm danh sách và bộ dữ liệu

Theo trình tự, các chuỗi hỗ trợ các hoạt động giả định thứ tự theo vị trí giữa các mục. Chúng ta có thể xác minh độ dài của nó bằng hàm len tích hợp và tìm nạp các thành phần của nó bằng các biểu thức lập chỉ mục

struct _intblock {
    struct _intblock *next;
    PyIntObject objects[N_INTOBJECTS];
};
typedef struct _intblock PyIntBlock;
1

Chúng ta có thể lập chỉ mục ngược, từ cuối. Các chỉ số tích cực được tính từ bên trái và các chỉ số tiêu cực được tính từ bên phải

struct _intblock {
    struct _intblock *next;
    PyIntObject objects[N_INTOBJECTS];
};
typedef struct _intblock PyIntBlock;
2

Trên thực tế, một chỉ mục tiêu cực chỉ đơn giản là được thêm vào kích thước của chuỗi

Trình tự cũng hỗ trợ một hình thức lập chỉ mục tổng quát hơn được gọi là cắt. Đó là một cách để trích xuất toàn bộ phần [lát] trong một bước

struct _intblock {
    struct _intblock *next;
    PyIntObject objects[N_INTOBJECTS];
};
typedef struct _intblock PyIntBlock;
3

Dạng tổng quát,X[I. J], có nghĩa là cung cấp cho tôi mọi thứ trong X từ phần bù I cho đến nhưng không bao gồm phần bù J. Kết quả được trả về trong một đối tượng mới. Hoạt động thứ hai cung cấp cho chúng ta tất cả các ký tự trong chuỗi S từ hiệu số 1 đến 3 [là 4-1] dưới dạng một chuỗi mới. Tác dụng là cắt hoặc phân tích hai ký tự ở giữa

Trong một lát cắt, giới hạn bên trái mặc định bằng 0 và giới hạn bên phải mặc định theo độ dài của chuỗi được cắt. Điều này dẫn đến một số biến thể sử dụng phổ biến

struct _intblock {
    struct _intblock *next;
    PyIntObject objects[N_INTOBJECTS];
};
typedef struct _intblock PyIntBlock;
4

Là các chuỗi, các chuỗi cũng hỗ trợ nối với dấu cộng bằng cách nối hai chuỗi thành một chuỗi mới và lặp lại bằng cách tạo một chuỗi mới bằng cách lặp lại một chuỗi khác

struct _intblock {
    struct _intblock *next;
    PyIntObject objects[N_INTOBJECTS];
};
typedef struct _intblock PyIntBlock;
5

Mỗi hoạt động chuỗi tạo ra một chuỗi mới là kết quả của nó. Điều này là do các chuỗi là bất biến trong Python. Chúng không thể được thay đổi tại chỗ sau khi chúng được tạo. Chẳng hạn, chúng ta không thể thay đổi một chuỗi bằng cách gán cho một trong các vị trí của nó, nhưng chúng ta luôn có thể tạo một chuỗi mới và gán cho nó cùng tên. Bởi vì Python dọn dẹp các đối tượng cũ khi chúng ta thực hiện, điều này không hiệu quả như nó có vẻ

struct _intblock {
    struct _intblock *next;
    PyIntObject objects[N_INTOBJECTS];
};
typedef struct _intblock PyIntBlock;
6

Mọi đối tượng trong Python được phân loại là bất biến hoặc không. Về các loại cốt lõi, số, chuỗi và bộ dữ liệu là không thay đổi; . Trong số những thứ khác, tính bất biến có thể được sử dụng để đảm bảo rằng một đối tượng không đổi trong suốt chương trình của chúng tôi

Chuỗi - Phương thức dành riêng cho loại

Phương thức tìm chuỗi là hoạt động tìm kiếm chuỗi con cơ bản và phương thức thay thế chuỗi thực hiện tìm kiếm và thay thế toàn cục

>>> 
>>> # repr: as code
>>> 3.1415 *2
6.2830000000000004
>>> # str: user-friendly
>>> print[3.1415 * 2]
6.283
>>> 
0

Mặc dù tên của các phương thức chuỗi này, chúng tôi không thay đổi các chuỗi ban đầu ở đây, nhưng tạo các chuỗi dưới dạng kết quả vì chuỗi là bất biến. Các phương thức chuỗi là dòng đầu tiên của công cụ xử lý văn bản trong Python. Các phương pháp khác tách một chuỗi thành các chuỗi con trên dấu phân cách, thực hiện chuyển đổi trường hợp, kiểm tra nội dung của chuỗi và loại bỏ các ký tự khoảng trắng khỏi các đầu của chuỗi

>>> 
>>> # repr: as code
>>> 3.1415 *2
6.2830000000000004
>>> # str: user-friendly
>>> print[3.1415 * 2]
6.283
>>> 
1

Chuỗi cũng hỗ trợ thay thế nâng cao được gọi là định dạng, có sẵn dưới dạng cả biểu thức và lệnh gọi phương thức chuỗi

>>> 
>>> # repr: as code
>>> 3.1415 *2
6.2830000000000004
>>> # str: user-friendly
>>> print[3.1415 * 2]
6.283
>>> 
2

Lưu ý rằng mặc dù các hoạt động theo trình tự là chung chung, các phương thức không. Mặc dù một số loại chia sẻ một số tên phương thức, hoạt động của phương thức chuỗi thường chỉ hoạt động trên chuỗi và không có gì khác. Theo nguyên tắc thông thường, bộ công cụ của Python được phân lớp. các hoạt động chung bao gồm nhiều loại hiển thị dưới dạng các hàm hoặc biểu thức tích hợp sẵn [e. g. , len[X], X[0]]. nhưng các hoạt động dành riêng cho loại là các cuộc gọi phương thức [e. g. , một chuỗi. phía trên[]]

Để có thêm thông tin về các phương thức đối tượng, chúng ta luôn có thể gọi hàm dir tích hợp sẵn. Nó trả về một danh sách tất cả các thuộc tính có sẵn cho một đối tượng nhất định. Vì các phương thức là thuộc tính của hàm nên chúng sẽ hiển thị trong danh sách này. Giả sử S vẫn là chuỗi, đây là các thuộc tính của nó trên Python 3. 2

>>> 
>>> # repr: as code
>>> 3.1415 *2
6.2830000000000004
>>> # str: user-friendly
>>> print[3.1415 * 2]
6.283
>>> 
3

Ở đây, các tên có dấu gạch dưới trong danh sách thể hiện việc triển khai đối tượng chuỗi và có sẵn để hỗ trợ tùy chỉnh. Nói chung, dấu gạch dưới kép ở đầu và cuối là kiểu đặt tên mà Python sử dụng để triển khai chi tiết. Các tên không có dấu gạch dưới trong danh sách là các phương thức có thể gọi được trên các đối tượng chuỗi

Hàm dir chỉ đơn giản là cung cấp tên của các phương thức. Để có được thông tin về những gì họ làm, chúng ta có thể chuyển chúng đến chức năng trợ giúp

>>> 
>>> # repr: as code
>>> 3.1415 *2
6.2830000000000004
>>> # str: user-friendly
>>> print[3.1415 * 2]
6.283
>>> 
4

trợ giúp là một trong những giao diện của hệ thống mã đi kèm với Python được gọi là PyDoc, một công cụ để trích xuất tài liệu từ các đối tượng

Python cung cấp một số cách để chúng ta viết mã chuỗi. Ví dụ: các ký tự đặc biệt có thể được biểu diễn dưới dạng chuỗi thoát dấu gạch chéo ngược

>>> 
>>> # repr: as code
>>> 3.1415 *2
6.2830000000000004
>>> # str: user-friendly
>>> print[3.1415 * 2]
6.283
>>> 
5

Python cho phép các chuỗi được đặt trong các ký tự trích dẫn đơn hoặc kép. Nó cũng cho phép các chuỗi ký tự có nhiều dòng được đặt trong dấu ngoặc kép. Khi biểu mẫu này được sử dụng, tất cả các dòng được nối với nhau và các ký tự cuối dòng được thêm vào nơi xuất hiện dấu ngắt dòng. Điều này hữu ích để nhúng những thứ như mã HTML và XML vào tập lệnh Python

>>> 
>>> # repr: as code
>>> 3.1415 *2
6.2830000000000004
>>> # str: user-friendly
>>> print[3.1415 * 2]
6.283
>>> 
6

Không có hằng số đặc biệt nào trong Python. Nó là một giá trị null. Không có gì không giống như Sai. Không có không phải là 0. Không có gì không phải là một chuỗi rỗng. So sánh Không có gì khác với Không có gì sẽ luôn trả về Sai

Không có giá trị null duy nhất. Nó có kiểu dữ liệu riêng [NoneType]. Chúng ta có thể gán Không cho bất kỳ biến nào, nhưng bạn không thể tạo các đối tượng Không có Loại khác. Tất cả các biến có giá trị là Không đều bằng nhau

Là một số nguyên một đối tượng Python?

Như đã nói, có nhiều loại đối tượng khác nhau. Python coi số nguyên là một loại đối tượng khác với chuỗi , chẳng hạn.

Số Python có phải là đối tượng không?

Mọi thứ trong Python đều là đối tượng và bao gồm các số . Không có loại "nguyên thủy", chỉ có loại tích hợp. Tuy nhiên, các con số là bất biến. Khi bạn thực hiện thao tác với một số, bạn đang tạo một đối tượng số mới.

Loại dữ liệu nào là số nguyên trong Python?

Số nguyên – Loại dữ liệu này được biểu diễn với sự trợ giúp của lớp int . Nó bao gồm các số nguyên dương hoặc âm [không có phân số hoặc số thập phân]. Trong Python, không có giới hạn về độ dài của các giá trị số nguyên.

Loại lớp nào là int?

Ví dụ int là kiểu nguyên thủy và Integer là kiểu lớp.

Chủ Đề