- Python menawarkan jenis numerik teras (int, float, complex, bool) serta pembantu yang berkuasa seperti math, cmath, decimal dan random untuk pengiraan harian.
- Modul numbers mentakrifkan kelas asas abstrak supaya banyak jenis terbina dalam, NumPy dan jenis numerik tersuai boleh dianggap seragam sebagai tika Number.
- Mod pembundaran, nilai khas (NaN, infiniti) dan aritmetik perpuluhan tepat melalui perpuluhan adalah penting untuk kod saintifik dan kewangan yang teguh.
- Ekosistem Python berangka yang lebih luas, terutamanya NumPy, melanjutkan jenis teras dengan integer lebar tetap dan tatasusunan berprestasi tinggi untuk pengiraan yang berat.
Bekerja dengan nombor adalah teras kebanyakan program Python, sama ada anda membina skrip mudah, memproses data saintifik atau membuat prototaip algoritma. Memahami cara Python mewakili dan memanipulasi nilai berangka adalah langkah pertama untuk menulis kod yang andal dan cekap yang bertindak seperti yang anda harapkan.
Apabila orang bercakap tentang "Python berangka", mereka sering bermaksud dua perkara: di satu sisi, jenis nombor terbina dalam dan alat perpustakaan standard seperti math, cmath, decimal, random dan numbers; di pihak yang lain, ekosistem yang lebih luas di sekitar pengkomputeran berangka, dengan perpustakaan seperti NumPy yang melanjutkan bahasa dengan jenis berangka tambahan dan operasi vektor. Panduan ini membimbing anda melalui asas tersebut secara terperinci, daripada jenis asas kepada abstraksi lanjutan.
Jenis numerik teras dalam Python
Python mentakrifkan beberapa kategori berangka terbina dalam yang meliputi kebanyakan keperluan harian: integer untuk nombor bulat, nombor titik apungan untuk nilai nyata dengan perpuluhan, nombor kompleks untuk nilai dengan bahagian nyata dan khayalan, dan jenis Boolean khas yang bertindak seperti ahli keluarga integer yang sangat kecil. Kesemuanya disepadukan dengan lancar dengan operator aritmetik Python.
Nombor bulat (int) mewakili nombor bulat, positif atau negatif, tanpa titik perpuluhanTiada had atas tetap pada saiznya dalam Python standard; selagi anda mempunyai memori, integer anda boleh berkembang. Nilai seperti 1, -5 or 20234567890123456789 semuanya sah int contoh, dan anda boleh mengesahkannya dengan type(1) or type(-5), yang akan kembali <class 'int'>.
Nombor titik apungan (float) digunakan untuk nombor nyata dengan komponen pecahan. Ia ditulis dengan titik perpuluhan, seperti 2.0, -7.823457 or 0.5, atau dengan notasi saintifik seperti 1e8 (yang bermaksud 100,000,000). Apabila anda melakukan operasi seperti pembahagian, walaupun antara integer, Python sering mempromosikan hasilnya kepada float; sebagai contoh, 9 / 2 hasil 4.5, dan type(4.5) is <class 'float'>.
Nombor kompleks (complex) menggabungkan bahagian nyata dan bahagian khayalan, ditulis dengan tanda belakang j untuk unit khayalan. Nilai seperti 2 + 3j mempunyai komponen nyata 2 dan komponen khayalan 3. Anda boleh membinanya secara langsung (cth. 3.14j) dan periksa mereka dengan atribut seperti .real dan .imag, atau panggilan .conjugate() untuk mendapatkan konjugat kompleks. Ini amat popular dalam kejuruteraan, pemprosesan isyarat dan pengkomputeran saintifik.
Boolean (bool) secara teknikalnya juga berangka, Kerana True dan False berkelakuan seperti integer 1 dan 0 dalam ungkapan aritmetik. Contohnya, True + 2 menilai untuk 3Secara dalaman, bool adalah subkelas dari int, itulah sebabnya nilai boolean disepadukan dengan lancar ke dalam pengiraan dan perbandingan.
Python membolehkan anda mencampurkan jenis angka ini secara bebas dalam ungkapan, mempromosikan kepada jenis yang lebih umum apabila diperlukan. Menambah int kepada float menghasilkan a float, dan menggabungkan apungan dengan nombor kompleks menghasilkan hasil yang kompleks: ungkapan seperti 1 + 1.0, 2.0 + (3 + 5j) or 6 / (5 + 8j) semua kerja tanpa upacara tambahan.

Operator aritmetik dan tingkah laku pembahagian
Sebaik sahaja anda mempunyai nilai berangka, anda menggunakan operator aritmetik biasa untuk menggunakannya: penambahan (+), penolakan (-), pendaraban (*), pembahagian (/), pembahagian lantai (//), eksponensial (**) dan modulo (%Python menggunakan ini merentasi integer, float dan nombor kompleks, melaksanakan promosi jenis seperti yang diperlukan.
Pembahagian adalah satu bidang di mana reka bentuk Python sangat disengajakan. Menggunakan / sentiasa menghasilkan hasil titik apungan apabila kedua-dua argumen adalah angka, walaupun kedua-duanya adalah integer. Jadi 9 / 2 hasil dalam 4.5, Tidak 4Ini menggalakkan anda untuk berfikir dari segi pembahagian nombor nyata secara lalai, yang biasanya merupakan apa yang anda mahukan dalam pengiraan saintifik atau kewangan.
Jika anda memerlukan pembahagian integer yang membuang bahagian pecahan, anda menggunakan operator pembahagian lantai //. Sebagai contoh, 9 // 2 menghasilkan 4, dan -9 // 2 hasil -5, kerana hasilnya diratakan (dibulatkan ke bawah ke arah infiniti negatif). Di samping itu, divmod(a, b) memberikan anda kedua-dua hasil bahagi dan baki sekaligus, mengembalikan pasangan yang mencerminkan (a // b, a % b).
Di sebalik tabir, Python dengan teliti menyelaraskan bagaimana perisa numerik yang berbeza berinteraksiCorak dalaman yang boleh anda lihat dalam pustaka standard ialah idea "fallback operator": fungsi yang pertama sekali mencuba pelaksanaan khusus jenis, contohnya untuk nombor nisbah, kemudian kembali kepada operator terbina dalam apabila satu operan ialah operator biasa int, float or complexInilah yang membolehkan jenis angka tersuai berinteraksi dengan sistem aritmetik Python menggunakan kaedah khas seperti __add__ dan __radd__.
Kod perpustakaan untuk aritmetik rasional, seperti Fraction jenis, menggambarkan strategi ini dengan jelasApabila menambah dua Fraction Dalam contoh tertentu, ia mengira pecahan baharu dengan mendarab silang pengangka dan penyebut. Jika anda menambah Fraction kepada integer biasa atau contoh bagi numbers.Rational, ia menggunakan algoritma rasional yang tepat. Jika operan yang lain ialah a float or complex, ia akan menukar kepada jenis yang lebih luas dan mewakilkan kepada operator biasa, memastikan tingkah laku konsisten dan intuitif.
Fungsi berangka terbina dalam
Selain operator mentah, Python dilengkapi dengan satu set fungsi terbina dalam yang tahu cara mengendalikan nomborFungsi-fungsi ini sentiasa tersedia tanpa mengimport apa-apa dan berfungsi merentasi jenis angka standard, serta sebarang objek tersuai yang melaksanakan kaedah khas yang betul.
abs(x) mengembalikan nilai mutlak argumennya, menjadikan nombor negatif positif dan meninggalkan nilai positif tidak berubah. Jika anda memasukkan objek yang mentakrifkan __abs__(), Python akan mewakilkan kepada kaedah tersebut. Untuk nombor kompleks, abs() mengembalikan magnitud (jarak dari asalan dalam satah kompleks).
round(x, ndigits) memberi anda nilai yang dibundarkan kepada bilangan tempat perpuluhan yang diberikan. Jika ndigits ditinggalkan atau None, ia mengembalikan integer terdekat. Tidak seperti peraturan "bundarkan separuh ke atas" buku sekolah, terbina dalam Python round menggunakan strategi “bulat separuh kepada genap” untuk seri bagi mengurangkan bias statistik dalam pengiraan berulang.
Fungsi penukaran seperti int() dan float() bina nombor daripada objek lainMemanggil int(x) pada apungan membuang bahagian pecahan (contohnya, int(1.9) is 1), Dan float(x) menghasilkan perwakilan titik apungan daripada integer, rentetan atau objek yang serasi. Apabila anda menukar daripada apungan kepada int, tiada pembundaran berlaku; bahagian perpuluhan hanya dipenggal.
Terbina dalam lain memainkan peranan perwakilan dan pengagregatan. Fungsi seperti hex() dan oct() mengembalikan perwakilan rentetan integer dalam heksadesimal atau oktal dengan awalan yang sesuai (0x dan 0o). Pembantu pengagregatan seperti max() dan min() imbas argumen boleh lelaran atau siri untuk mencari nilai terbesar atau terkecil, manakala pow() dan ** pengendali mengira kuasa dan secara pilihan menerima hujah ketiga untuk eksponensial modular.
Alat berangka lanjutan: matematik, cmath dan perpuluhan
Untuk pengiraan yang lebih canggih, Python menyediakan modul perpustakaan standard khusus bukannya membengkakkan bahasa teras. Yang paling penting untuk kerja berangka ialah math, cmath dan decimal, setiap satunya menyasarkan subset masalah tertentu.
. math modul memberi tumpuan kepada matematik titik apungan bernilai nyataSelepas mengimportnya dengan import math, anda mendapat akses kepada fungsi dan pemalar yang biasa diperlukan dalam kejuruteraan, fizik dan analitik harian, semuanya dilaksanakan dalam kod C yang cekap dan beroperasi pada float nilai-nilai.
math merangkumi alat teori dan perwakilan nombor seperti math.ceil() untuk membundarkan ke atas kepada integer terdekat, math.floor() untuk pembundaran ke bawah, math.modf() untuk membahagikan apungan kepada bahagian pecahan dan integer, dan math.frexp() / math.ldexp() untuk berfungsi dengan perwakilan binari dalaman. Ia juga menyediakan rutin kuasa dan logaritma seperti math.exp(), math.log(), math.log10(), math.pow() dan math.sqrt(), serta fungsi trigonometri dan hiperbolik seperti math.sin(), math.cos(), math.tan(), math.asin(), math.acos(), math.atan(), math.atan2(), math.sinh(), math.cosh() dan math.tanh().
Untuk kemudahan, math mengeksport pemalar asas seperti math.pi dan math.eIni berguna apabila anda mengira luas, sudut atau pertumbuhan eksponen dan mahukan nilai yang konsisten dengan ketepatan yang baik merentasi asas kod anda.
Apabila anda perlu bekerja dengan nombor kompleks, cmath modul memainkan peranan yang sama untuk satah kompleks. Cermin APInya math tetapi menggunakan argumen kompleks dan mengembalikan hasil yang kompleks, jadi anda boleh mengira eksponen, logaritma dan fungsi trigonometri kompleks tanpa menguraikan nombor secara manual kepada bahagian nyata dan khayalan.
. decimal modul menyasarkan titik kesakitan yang berbeza: aritmetik asas-10 yang tepatTitik apungan binari piawai tidak dapat mewakili banyak pecahan perpuluhan dengan tepat, jadi pengiraan seperti 0.1 + 0.2 memberikan hasil yang sedikit berbeza. decimal.Decimal mengelak perkara ini dengan menggunakan aritmetik asas-10 ketepatan sewenang-wenangnya, menjadikannya sesuai untuk aplikasi kewangan dan di mana-mana sahaja anda mesti mengawal tingkah laku pembundaran dengan sangat ketat.
Secara lalai, operasi titik apungan Python mengikuti tingkah laku IEEE-754 dan menggunakan perwakilan asas-2Apabila nilai terletak betul-betul di tengah-tengah antara dua nombor yang boleh diwakili, "bulat separuh kepada genap" digunakan, bermakna separuh daripada seri dibundarkan ke bawah dan separuh dibundarkan ke atas. Ini mengelakkan hanyutan sistematik dalam pengiraan yang besar. Jika anda mahukan semantik komersial "bulat separuh ke atas", anda boleh mengkonfigurasi decimal konteks untuk digunakan ROUND_HALF_UP, yang sentiasa mendorong nilai .5 menjauhi sifar.
Bekerja dengan jenis berangka dalam amalan
Meneroka bagaimana nombor bertindak secara interaktif adalah cara yang bagus untuk membina intuisi. Hidupkan penterjemah Python dan cipta campuran integer, apungan dan nilai kompleks, kemudian cuba operasi asas merentasinya. Menambah dan mendarab adalah mudah, tetapi amat berguna untuk bereksperimen dengan pembahagian, pembahagian lantai, pembundaran dan penukaran, sambil memerhatikan bagaimana jenis hasil berubah.
Penukaran antara jenis angka kadangkala perlu untuk memadankan jangkaan API atau untuk memudahkan logikJika anda mempunyai apungan dan hanya mahukan bahagian nombor bulatnya, tetapkannya kepada pembolehubah seperti my_float = 1.9 dan kemudian hubungi my_int = int(my_float)Percetakan my_int memberikan 1, dan type(my_int) mengesahkan bahawa ia adalah intPerlu diingat bahawa bahagian pecahan dibuang dan bukannya dibundarkan.
Arah sebaliknya—menggalakkan kepada jenis yang lebih umum—sering berlaku secara tersiratApabila anda menambah integer dan float, Python mengembalikan float tanpa bertanya, kerana sistem nombor nyata mengandungi integer. Promosi yang sama berlaku apabila anda menggabungkan float dan nombor kompleks: nilai titik apungan dianggap mempunyai bahagian khayalan sifar, dan hasilnya adalah kompleks.
Nombor kompleks merangkumi beberapa kemudahan terbina dalam yang menjadikannya terasa semula jadiAnda boleh memeriksa secara langsung a.real dan a.imag untuk mendapatkan komponen, hubungi a.conjugate() untuk membalikkan tanda bahagian khayalan, dan menyerahkannya kepada fungsi dalam cmath tanpa penukaran manual. Walaupun anda jarang menggunakannya, mengetahui kewujudan dan bagaimana ia berfungsi membantu apabila anda menemui kod saintifik.
Ketepatan dan ketepatan sentiasa penting apabila berurusan dengan data titik apunganKetepatan berkesan Python standard float adalah kira-kira 15 digit perpuluhan; selain itu, digit ke-16 boleh menjadi tidak boleh dipercayai. Untuk banyak tugasan, ini boleh diterima sepenuhnya, tetapi jika anda memerlukan aritmetik perpuluhan yang tepat atau pembundaran yang lebih boleh diramal, decimal modul memberi anda kawalan yang anda perlukan dengan mengorbankan beberapa prestasi.
Nombor rawak dan nilai angka khas
Menjana nombor rawak merupakan satu lagi tugasan kerap dalam aliran kerja Python berangka, sama ada anda membina permainan mudah, menjalankan simulasi Monte Carlo atau menulis kes ujian yang melaksanakan keadaan pinggir. Pustaka standard random modul menyediakan asas untuk senario sedemikian.
random.randint(a, b) menghasilkan integer pseudo-rawak antara a dan b, inklusifIni memudahkan untuk mensimulasikan lambungan dadu atau memilih indeks rawak dalam senarai. Untuk nilai titik apungan, fungsi seperti random.random() dan pembantu berkaitan menjana nombor rawak seragam dalam julat seperti [0.0, 1.0), sedia untuk diskalakan atau diubah untuk taburan tertentu anda.
Python juga mendedahkan beberapa nilai angka yang mewakili kuantiti luar biasa atau "kes pinggir"Satu ialah NaN (“Bukan Nombor”), yang diperoleh contohnya dengan memanggil float('nan'). NaN menunjukkan hasil yang tidak tertakrif atau tidak boleh diwakili, seperti hasil membahagi sifar dengan sifar atau menghuraikan medan berangka yang rosak daripada data input.
Selain NaN, Python menyokong infiniti positif dan negatif, dibina menggunakan float('inf') dan float('-inf')Ini berguna sebagai nilai sentinel apabila memulakan pembolehubah untuk algoritma yang mencari nilai minimum atau maksimum atau apabila memodelkan julat tak terbatas dalam kaedah berangka.
Bekerja dengan NaN memerlukan penjagaan khusus kerana ia tidak bertindak seperti nombor biasaPerbandingan yang melibatkan NaN sentiasa palsu (walaupun nan == nan), dan aritmetik dengan NaN cenderung untuk menyebarkan NaN melalui hasilnya. Walaupun panduan ini tidak menyelidiki semantik NaN secara mendalam, menyedari keanehannya membantu anda menyahpepijat saluran data dan algoritma berangka dengan lebih berkesan.
Hierarki numerik abstrak dengan modul nombor
Apabila kod anda menjadi lebih canggih, anda mungkin memerlukan cara yang fleksibel untuk mengenali nilai "angka" tanpa menyemak secara manual terhadap setiap jenis konkrit (seperti int, float, complex dan skalar NumPy). Di sinilah numbers modul ini datang, menyediakan hierarki abstrak jenis berangka.
. numbers modul mentakrifkan kelas asas abstrak (ABC) yang menggambarkan tingkah laku berangka, Seperti Number, Complex, Real, Rational dan IntegralKelas-kelas ini tidak bertujuan untuk diinstansiasi secara langsung. Sebaliknya, jenis angka konkrit mewarisi daripadanya untuk memberi isyarat bahawa ia melaksanakan operasi dan sifat yang diperlukan.
ABC yang paling umum ialah numbers.Number, mewakili “sebarang jenis angka”Jika anda ingin menguji sama ada pembolehubah harus dianggap sebagai angka—mungkin semasa penyahpepijatan atau semasa menulis skrip utiliti kecil—anda boleh menggabungkan isinstance dengan ABC ini. Contohnya, isinstance(x, Number) pulangan True untuk jenis berangka terbina dalam dan banyak jenis berangka luaran, seperti pelbagai skalar NumPy.
Ilustrasi praktikal menggunakan jenis NumPy bersama-sama dengan terbina dalam PythonJika anda mengimport NumPy sebagai np dan kemudian gelungkan nilai seperti 1, 1., -0.2, 1e8, np.int64(1), np.int0(10), np.int16(2), np.float64(10), np.complex64(10) dan np.int32(89), memanggil isinstance(value, Number) untuk setiap satu, anda akan melihat bahawa semuanya dikira sebagai angka. Ini menjimatkan anda daripada menulis rantaian semakan jenis yang panjang untuk setiap kelas tertentu.
Perlu diperhatikan bahawa isinstance itu sendiri dianggap sebagai "bau" kod apabila digunakan secara berlebihan. Kebergantungan berlebihan pada pemeriksaan jenis eksplisit boleh menandakan isu reka bentuk yang lebih mendalam dalam program berorientasikan objek. Walau bagaimanapun, untuk penyahpepijatan pantas, skrip penerokaan atau utiliti kecil, pemeriksaan terhadap numbers.Number merupakan alat yang ampuh dan pragmatik untuk mengesahkan bahawa pembolehubah anda benar-benar berkelakuan seperti nombor.
Ekosistem numerik lanjutan: NumPy dan jenis tersuai
Walaupun Python teras hanya mendedahkan satu set kecil jenis numerik tujuan umum, ekosistem yang lebih luas meluaskan pilihan anda dengan ketaraNumPy, khususnya, memperkenalkan lebih banyak perisa berangka yang direka untuk pengiraan yang cekap ke atas tatasusunan dan matriks yang besar.
NumPy mentakrifkan jenis integer lebar tetap seperti numpy.int64, numpy.int32, numpy.int16 dan alias khusus seperti numpy.int0Ini menyerupai jenis jenis yang terdapat dalam bahasa berorientasikan berangka peringkat rendah seperti Fortran dan C, yang mana mengetahui saiz storan dan tingkah laku nombor anda yang tepat adalah penting untuk prestasi dan kebolehkendalian.
Selain integer, NumPy menawarkan jenis seperti numpy.float64 dan numpy.complex64, bersama-sama dengan banyak lagi, yang disepadukan dengan kemas dengan tatasusunan dan ufunc (fungsi universal). Jenis ini biasanya mendaftar sebagai contoh ABC yang sesuai daripada numbers modul, itulah sebabnya pemeriksaan terhadap numbers.Number kerja seperti yang digambarkan sebelum ini.
Reka bentuk Python sengaja memastikan model berangka teras mudah dan mudah diaksesDaripada memaksa setiap pengguna untuk mengurus berpuluh-puluh perisa angka yang berbeza, ia memberi tumpuan kepada tiga jenis angka asas (tambah boolean), sambil memudahkan pustaka khusus untuk melanjutkan repertoir ini mengikut keperluan. Persekitaran yang berfokus pada kejuruteraan, seperti yang dibina oleh syarikat perisian simulasi, secara semula jadi akan banyak bergantung pada jenis dan pustaka lanjutan ini.
Jika anda membina kelas berangka anda sendiri, mengikuti corak daripada numbers dan fractions membantu anda menyesuaikan diri dengan ekosistemDengan mengsubkelaskan ABC yang sesuai dan melaksanakan kaedah khas yang diperlukan (__add__, __radd__, __mul__, dan sebagainya), jenis tersuai anda boleh berinteraksi secara semula jadi dengan operator Python, fungsi berangka terbina dalam dan pustaka berangka lain.
Secara keseluruhannya, Python berangka menggabungkan sistem jenis teras yang bersih, modul perpustakaan standard yang berkuasa dan ekosistem perpustakaan yang kaya. seperti NumPy, mewujudkan persekitaran di mana anda boleh beralih dengan selesa daripada aritmetik mudah kepada pengiraan kejuruteraan lanjutan. Sebaik sahaja anda menginternalisasikan bagaimana integer, apungan, nombor kompleks, nilai khas, peraturan pembundaran dan kelas numerik abstrak semuanya sesuai, anda boleh membuat penaakulan dengan lebih yakin tentang kod anda, mengelakkan pepijat halus dan memilih alat yang betul untuk setiap tugasan berangka yang anda hadapi.