2.3. การดำเนินการทางคณิตศาสตร์

Python ทำงานเป็นเครื่องคิดเลขได้ทันที หน้านี้ครอบคลุมตัวดำเนินการที่คุณจะใช้บ่อยที่สุด: การคำนวณตัวเลข การเปรียบเทียบที่ผลิตค่าบูลีน ตัวดำเนินการตรรกะที่รวมเงื่อนไข และตัวดำเนินการระดับบิตสำหรับการทำงานระดับฮาร์ดแวร์

2.3.1. เลขคณิต

ตัวดำเนินการเลขคณิตมาตรฐานบนค่า int และ float:

  • + -- การบวก

  • - -- การลบ (หรือการนิเสธ เมื่อใช้เป็น prefix: -x)

  • * -- การคูณ

  • / -- การหาร เสมอ คืนค่า float แม้ว่าตัวถูกดำเนินการทั้งสองจะเป็นจำนวนเต็ม

  • // -- การหารแบบพื้น คืนค่าผลหารจำนวนเต็มที่ปัดลงไปทางอินฟินิตี้ลบ

  • % -- โมดูโล (เศษ)

  • ** -- การยกกำลัง (2 ** 10 คือ 1024)

>>> 7 / 2
3.5
>>> 7 // 2
3
>>> -7 // 2
-4
>>> 7 % 2
1
>>> 2 ** 16
65536

การคำนวณแบบผสมชนิดจะโปรโมตจำนวนเต็มเป็น float โดยอัตโนมัติ:

>>> 3 + 0.5
3.5

การกำหนดค่าแบบเพิ่มรวมตัวดำเนินการกับ = เพื่ออัปเดตแบบกระชับ:

counter = 0
counter += 1                # equivalent to counter = counter + 1
counter *= 2                # works for *= /= //= %= **= too

ลำดับความสำคัญของตัวดำเนินการเป็นไปตามลำดับตามแบบแผน: ** ก่อน จากนั้น unary - จากนั้น *, /, // และ % จากนั้น + และ - ใช้วงเล็บเมื่อไม่แน่ใจ -- วงเล็บไม่มีต้นทุนขณะรันไทม์

2.3.2. การเปรียบเทียบ

ตัวดำเนินการเปรียบเทียบคืนค่า bool (True หรือ False):

  • == และ != -- เท่ากัน / ไม่เท่ากัน

  • <, <=, >, >= -- การเรียงลำดับ

>>> 3 == 3
True
>>> 3 == 3.0
True
>>> 3 < 5 <= 5
True

ตัวอย่างสุดท้ายเป็นการเปรียบเทียบแบบ ลูกโซ่ และเทียบเท่ากับ 3 < 5 and 5 <= 5 อย่างแน่นอน

Warning

= กำหนดค่า; == เปรียบเทียบ นิพจน์ if x = 5: เป็นข้อผิดพลาดทางไวยากรณ์อย่างแน่นอนเพราะ Python ปฏิเสธการสับสนทั้งสองโดยไม่แสดงเตือน

2.3.3. ตรรกะบูลีน

มีตัวดำเนินการสามตัวสำหรับรวมค่าบูลีน:

  • and -- True เฉพาะเมื่อทั้งสองด้านเป็นจริง

  • or -- True เมื่อด้านใดด้านหนึ่งเป็นจริง

  • not -- กลับค่าบูลีนเดี่ยว

and และ or ทำงานแบบ short-circuit: หยุดการประเมินทันทีที่ทราบผลลัพธ์ False and slow_check() จะไม่เรียก slow_check เลย

and และ or ยังคืนค่าตัวถูกดำเนินการตัวหนึ่งแทนที่จะเป็น True หรือ False ตามตัวอักษร ซึ่งช่วยให้เขียนค่าเริ่มต้นแบบกระชับได้:

name = user_name or "anonymous"   # "" / 0 / None are falsy

2.3.4. ตัวดำเนินการระดับบิต

สำหรับงานฮาร์ดแวร์ -- การบรรจุฟิลด์รีจิสเตอร์ การกาก bitmask การแยกวิเคราะห์ส่วนหัวโพรโทคอล -- คุณจะใช้ตัวดำเนินการระดับบิต ซึ่งทำงานบนการแสดงผลแบบไบนารีของ int:

  • & -- AND ระดับบิต

  • | -- OR ระดับบิต

  • ^ -- XOR ระดับบิต

  • ~ -- NOT ระดับบิต (one's complement)

  • << -- เลื่อนบิตซ้าย

  • >> -- เลื่อนบิตขวา

รูปแบบ literal ในรูปฐานสิบหกและไบนารีสะดวกสำหรับการอ่านและเขียนค่าเหล่านี้:

>>> 0b1100 & 0b1010
8                              # 0b1000
>>> 0b1100 | 0b1010
14                             # 0b1110
>>> 0xFF ^ 0x0F
240                            # 0xF0
>>> 1 << 8
256
>>> (0xABCD >> 8) & 0xFF
171                            # extract the high byte

มีรูปแบบแบบเพิ่มสำหรับแต่ละตัว: |=, &=, ^=, <<=, >>=

Note

and / or ทำงานบนค่าบูลีน (หรือบนความจริง); & / | ทำงานบนบิต อย่าสับสนกัน 0b1100 and 0b1010 ประเมินเป็น 0b1010 เพราะตัวถูกดำเนินการทั้งสองเป็น truthy -- ไม่ใช่สิ่งที่คุณต้องการเมื่อจัดการบิต

2.3.5. ฟังก์ชันตัวเลขในตัวที่มีประโยชน์

มีฟังก์ชันในตัวไม่กี่ตัวที่ครอบคลุมการดำเนินการตัวเลขทั่วไปที่ตัวดำเนินการเพียงอย่างเดียวไม่ครอบคลุม:

  • round() -- จำนวนเต็มที่ใกล้เคียงที่สุด หรือตำแหน่งทศนิยม ndigits ที่ใกล้เคียงที่สุดเมื่อให้อาร์กิวเมนต์ที่สอง คืนค่า int สำหรับ round(x) และ float สำหรับ round(x, n) ค่ากลาง (0.5, 1.5, ...) จะปัดไปหาเลขคู่ที่ใกล้ที่สุด ไม่ใช่ปัดขึ้นเสมอ

  • divmod() -- คืนค่า (quotient, remainder) ในการเรียกครั้งเดียว มีประโยชน์สำหรับการแบ่งปริมาณหนึ่งออกเป็นหน่วย (วินาทีเป็นนาที-และ-วินาที, bytes เป็นหน้า-และ-offset)

  • pow() -- เหมือนกับ ** ในรูปแบบสองอาร์กิวเมนต์ รูปแบบสามอาร์กิวเมนต์ pow(base, exp, mod) คำนวณ (base ** exp) % mod โดยไม่สร้างค่ากลางขนาดใหญ่ ซึ่งเป็นวิธีปฏิบัติเพียงอย่างเดียวสำหรับการยกกำลังแบบ modular สำหรับ exponent ขนาดใหญ่

>>> round(3.7)
4
>>> round(3.14159, 2)
3.14
>>> round(0.5)               # ties go to even, not always up
0
>>> round(1.5)
2

>>> divmod(125, 60)          # 125 seconds = 2 min, 5 sec
(2, 5)
>>> minutes, seconds = divmod(125, 60)

>>> pow(3, 4)                # same as 3 ** 4
81
>>> pow(3, 100, 7)           # (3 ** 100) mod 7, efficient
4

การแปลงจำนวนเต็มเป็น string ฐานต่างๆ (bin, oct, hex) ครอบคลุมใน String methods and formatting

2.3.6. โมดูล math

ฟังก์ชันทางคณิตศาสตร์ทั่วไปอยู่ใน math โมดูล นำเข้าครั้งเดียวและเรียกฟังก์ชันผ่านชื่อแบบจุด:

import math

print(math.sqrt(2))              # 1.4142135
print(math.sin(math.pi / 2))     # 1.0
print(math.floor(3.7))           # 3
print(math.log(100, 10))         # 2.0

MicroPython math โมดูลครอบคลุมฟังก์ชันทั่วไป (sqrt, exp, log, sin, cos, tan, atan2, floor, ceil, pi, e, ...) สำหรับตัวเลขสุ่ม ดู random โมดูล; สำหรับการจัดการบิตแบบ fixed-point ตัวดำเนินการข้างต้นมักเพียงพอ

2.3.7. จำนวนเชิงซ้อน

สำหรับงานตัวเลขที่ต้องการส่วนประกอบจินตภาพ Python มีชนิด complex พร้อม literal ด้วย suffix j (1 + 2j) โมดูล cmath ทำงานคู่ขนานกับ math สำหรับอินพุตเชิงซ้อน ทั้งสองมีอยู่ใน MicroPython ส่วนใหญ่แต่แทบไม่จำเป็นสำหรับงานกล้อง กล่าวถึงเพื่อให้ไม่ประหลาดใจหากคุณพอร์ตโค้ดที่ใช้มัน