วิธีการดำเนินการส่วนพื้นใน Python

เผยแพร่แล้ว: 2022-11-02

ในบทช่วยสอนนี้ คุณจะได้เรียนรู้วิธีดำเนินการแบ่งพื้นใน Python คุณจะใช้ตัวดำเนินการ // ของ Python ฟังก์ชัน floor จากโมดูลคณิตศาสตร์ของ Python และอื่นๆ พร้อมตัวอย่างโค้ด

เราจะเริ่มต้นด้วยภาพรวมของตัวดำเนินการเลขคณิตใน Python และเรียนรู้วิธีการทำงานของตัวดำเนินการหารพื้น // จากนั้น เราจะเรียนรู้วิธีการใช้วิธีการอื่นๆ ที่เทียบเท่ากัน รวมถึงฟังก์ชันจากโมดูลคณิตศาสตร์และตัวดำเนินการเพื่อดำเนินการแบ่งพื้น

มาเริ่มกันเลย…

ตัวดำเนินการเลขคณิตใน Python

ใน Python คุณสามารถใช้ตัวดำเนินการเลขคณิตเพื่อดำเนินการทางคณิตศาสตร์อย่างง่ายกับตัวเลขประเภทข้อมูล int และ float ตัวดำเนินการเหล่านี้ดำเนินการกับตัวถูกดำเนินการ (ตัวเลข) และส่งคืนผลลัพธ์ของการดำเนินการ

เลขคณิต-ตัวดำเนินการใน Python

ตารางต่อไปนี้สรุปตัวดำเนินการเลขคณิตใน Python และวิธีการทำงาน:

โอเปอเรเตอร์ ไวยากรณ์ ผลลัพธ์
บวก (+) num1+num2 ส่งกลับผลรวมของ num1 และ num2
การลบ (-) num1-num2 ส่งกลับค่าความแตกต่างระหว่าง num1 และ num2
การคูณ (*) num1*num2 ส่งกลับผลคูณของ num1 และ num2
การยกกำลัง (**) num1**num2 ส่งกลับผลลัพธ์ของ num1 ยกกำลัง num2 ; num1 num2
แผนก (/) num1/num2 ส่งกลับผลลัพธ์เมื่อ num1 ถูกหารด้วย num2 – รวมทั้งเศษส่วนด้วย
แบ่งชั้น (/) num1//num2 ส่งกลับผลหารเมื่อ num1 ถูกหารด้วย num2
โมดูโล (%) num1 % num2 ส่งคืนค่าที่เหลือเมื่อ num1 หารด้วย num2

ลองมาดูตัวอย่างที่ใช้ตัวดำเนินการเลขคณิตเหล่านี้กัน คุณสามารถลองใช้ตัวอย่างเหล่านี้ได้ใน Python REPL หรือในตัวแก้ไข Python ออนไลน์ของ Geekflare

 >>> num1 = 18 >>> num2 = 5 >>> num1 + num2 23 >>> num1 - num2 13 >>> num1 * num2 90 >>> num1 ** num2 1889568

ในตัวอย่างนี้ num1 คือ 18 และ num2 คือ 5 การดำเนินการหาร num1/num2 จะส่งกลับผลลัพธ์รวมถึงส่วนที่เป็นเศษส่วน

เลข 5 หาร 18 ได้สามครั้ง เหลือเศษสาม ดังนั้น การดำเนินการแบ่งพื้น num1//num2 ให้ผลหาร 3 ในขณะที่โอเปอเรเตอร์โมดูโลให้ส่วนที่เหลือ – เช่นกัน 3 ในกรณีนี้

 >>> num1/num2 3.6 >>> num1//num2 3 >>> num1 % num2 3

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

️ ใน Python 2 การดำเนินการหาร (/) จะตัดผลลัพธ์ให้เป็นจำนวนเต็มที่ใกล้เคียงที่สุด—คล้ายกับการดำเนินการหารพื้นใน Python 3 บทช่วยสอนนี้จะกล่าวถึงวิธีการทำงานของการแบ่งพื้นใน Python 3.x

การแบ่งชั้นโดยใช้ // Operator

ชั้น-ส่วน-ใช้-ตัวดำเนินการ

พิจารณาการดำเนินการหารด้วยเงินปันผลและตัวหาร ใน num1/num2 , num1 คือเงินปันผล และ num2 เป็นตัวหาร ในการแบ่งชั้นของ num1 และ num2 ให้ใช้ num1//num2

ตัว ดำเนินการหารพื้น (//) ส่งคืนผลหารของการดำเนินการหาร—เป็นจำนวนเต็มหรือเลขทศนิยม—ขึ้นอยู่กับชนิดข้อมูลของตัวถูกดำเนินการ

ตัวดำเนินการแบ่งพื้นไม่รับรองว่าคำตอบจะเป็นจำนวนเต็มเสมอ หากเงินปันผล ( num1 ) หรือตัวหาร ( num2 ) เป็นทศนิยม ผลลัพธ์ของ num1//num2 จะเป็นทศนิยม นี่คือตัวอย่างบางส่วน

 >>> 18.0//5 3.0 >>> 10.0//4 2.0 >>> 15//4.0 3.0

หากคุณต้องการให้ผลลัพธ์เป็นจำนวนเต็ม คุณต้องแปลงเป็นจำนวนเต็มอย่างชัดเจนโดยใช้ int()

 >>> int(18.0//5) 3 >>> int(10.0//4) 2 >>> int(15//4.0) 3

เกิดอะไรขึ้นภายใต้ประทุน?

เมื่อคุณใช้ตัวดำเนินการแบ่งพื้น // วิธีการพิเศษ (หรือที่เรียกว่าวิธี dunder) __floordiv__() จะถูกเรียก ดังนั้น คุณยังสามารถใช้ __floordiv__() กับจำนวนเต็มหรือเลขทศนิยมใดก็ได้ ดังที่แสดงด้านล่าง:

 num1 = 18 num2 = 5 num1.__floordiv__(num2) # Output: 3

การแบ่งชั้นโดยใช้ตัวดำเนินการ.floordiv()

Floor-Division-Using-operator.floordiv

ในการดำเนินการแบ่งพื้นใน Python คุณยังสามารถใช้ floordiv() ในโมดูล operator

โมดูลตัวดำเนินการของ Python มีคำจำกัดความของฟังก์ชันที่มีประสิทธิภาพซึ่งสามารถดำเนินการทางคณิตศาสตร์ทั้งหมดได้ ดังนั้น ในการแบ่งส่วนพื้น คุณสามารถใช้ floordiv() จากโมดูลตัวดำเนินการ แทนตัวดำเนินการ //

การใช้ floordiv() จากโมดูลตัวดำเนินการจะเทียบเท่ากับการใช้ตัวดำเนินการการแบ่งพื้น

 >>> import operator >>> operator.floordiv(18,5) # Output: 3 >>> operator.floordiv(12,5.0) # Output: 2.0

การแบ่งชั้นโดยใช้ math.floor()

ฟังก์ชั่นพื้นทำงานอย่างไร?

ในวิชาคณิตศาสตร์ ฟังก์ชัน floor() ใช้จำนวนจริง x ใดๆ เป็นอินพุตและส่งกลับจำนวนเต็ม (ผลลัพธ์) ผลลัพธ์นี้เป็น จำนวนเต็มที่มากที่สุด ที่ น้อยกว่าหรือเท่ากับ จำนวนจริง x

เพื่อให้เข้าใจได้ดีขึ้น ให้เรายกตัวอย่างสองสามตัวอย่างและนึกภาพตัวเลขเหล่านี้บนเส้นจำนวน

ตัวอย่างที่ 1 : พิจารณาหมายเลข 2.3 จำนวนเต็มที่มากที่สุดที่น้อยกว่าหรือเท่ากับ 2.3 คือ 2; ดังนั้น floor(2.3) จะกลับมา 2

python-floordivision-tutorial-ex1

ตัวอย่าง ที่ 2: คุณสามารถใช้คำจำกัดความเดียวกันนี้เมื่อทำงานกับตัวเลขติดลบได้เช่นกัน พิจารณาตัวเลข -1.7 จำนวนเต็มที่มากที่สุดที่น้อยกว่าหรือเท่ากับ -1.7 คือ -2; ดังนั้น floor(-1.7) จะกลับมา -2

python-floordivision-tutorial-ex2

มาตรวจสอบผลลัพธ์ข้างต้นโดยใช้ฟังก์ชัน floor() จากโมดูลคณิตศาสตร์

 >>> from math import floor >>> floor(2.3) 2 >>> floor(-1.7) -2

ในการแบ่งชั้น คุณสามารถเรียกใช้ฟังก์ชัน floor() โดยใช้ num1/num2 เป็นอาร์กิวเมนต์ เมื่อตัดทอนหรือปัดเศษผลลัพธ์ให้เป็นจำนวนเต็มที่ใกล้เคียงที่สุด จะเทียบเท่ากับการดำเนินการหารพื้น

คุณสามารถนำเข้าฟังก์ชัน floor() ได้อย่างชัดเจนจากโมดูล math ดังที่แสดง:

 from math import floor num1 = 18 num2 = 5 floor(num1/num2) # Output: 3

หรือคุณสามารถนำเข้าเฉพาะโมดูล math แล้วเข้าถึงฟังก์ชัน floor() โดยใช้ math.floor()

 import math num1 = 18 num2 = 5 math.floor(num1/num2) # Output: 3

ต่างจาก floordiv() จากโมดูลตัวดำเนินการและตัวดำเนินการส่วนพื้น // การใช้ math.floor(num1/num2) จะทำให้แน่ใจว่าผลลัพธ์เป็นจำนวนเต็ม วิธีนี้ทำให้โค้ดอ่านได้และขจัดขั้นตอนการส่งแบบพิมพ์

 import math num1 = 18.0 num2 = 5 math.floor(num1/num2) # Output: 3

ตัวอย่างการแบ่งชั้นใน Python

ตัวอย่างของชั้น-Division-in-Python

มาสรุปการสนทนาของเราด้วยตัวอย่างที่ใช้งานได้จริง: การค้นหาแบบไบนารี

การค้นหาแบบไบนารีเป็นอัลกอริธึมการค้นหาที่มีประสิทธิภาพที่ช่วยให้คุณสามารถค้นหาองค์ประกอบเป้าหมายผ่านอาร์เรย์ที่เรียงลำดับในเวลา O (บันทึก n) โดยที่ n คือขนาดของอาร์เรย์

อัลกอริทึมนี้ทำงานโดยแบ่งช่วงการค้นหาออกเป็นครึ่งหนึ่งในแต่ละขั้นตอน ซึ่งทำได้โดยขึ้นอยู่กับว่าจุดกึ่งกลางของช่วงนั้นตรงกับเป้าหมายหรือไม่ (การค้นหาสิ้นสุดลงเมื่อพบว่าตรงกัน!) หรือน้อยกว่าหรือมากกว่าเป้าหมาย เนื่องจากขนาดของอาร์เรย์ลดลงครึ่งหนึ่งในแต่ละขั้นตอน จุดกึ่งกลางจึงไม่ได้ประเมินเป็นจำนวนเต็มเสมอไป

 itemlist = [5,7,18,21,34,45] item = 7

พิจารณาการใช้งานอัลกอริธึมการค้นหาแบบไบนารีต่อไปนี้ ฟังก์ชัน binary_search() ใช้ตัวเลข ( item ) และ list ( itemlist ) และค้นหา item ใน itemlist

  • หากพบ item ฟังก์ชันจะส่งกลับดัชนีที่เกิด item
  • มิฉะนั้นจะส่งคืน None
 def binary_search(item, itemlist): # get the list size listsize = len(itemlist) - 1 # start at the two ends of the list lowerIdx = 0 upperIdx = listsize while lowerIdx <= upperIdx: # calculate the middle point # use normal division instead of floor division midPt = (lowerIdx + upperIdx)/ 2 # if item is found, return the index if itemlist[midPt] == item: return midPt # otherwise get the next midpoint if item > itemlist[midPt]: lowerIdx = midPt + 1 else: upperIdx = midPt - 1 if lowerIdx > upperIdx: return None

การใช้งานนี้ถูกต้องตามหน้าที่ ยกเว้นว่าเรายังไม่ได้พิจารณา midPt ที่ไม่ได้ประเมินเป็นจำนวนเต็มในขณะที่การค้นหาดำเนินการ

 binary_search(item,itemlist)

หากเราเรียกใช้ฟังก์ชัน เราจะพบ TypeError โดยระบุว่าดัชนีรายการต้องเป็นจำนวนเต็มหรือสไลซ์ ไม่ใช่ลอย

 --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-3-a5f12ebc3145> in <module> ----> 1 binary_search(item,itemlist) <ipython-input-2-524ef6900b1f> in binary_search(item, itemlist) 12 13 # if item is found, return the index ---> 14 if itemlist[midPt] == item: 15 return midPt 16 # otherwise get the next midpoint TypeError: list indices must be integers or slices, not float

เราแก้ไขนิยามฟังก์ชันเพื่อใช้ตัวดำเนินการแบ่งพื้น:

 def binary_search(item, itemlist): # get the list size listsize = len(itemlist) - 1 # start at the two ends of the list lowerIdx = 0 upperIdx = listsize while lowerIdx <= upperIdx: # calculate the middle point # use floor division midPt = (lowerIdx + upperIdx)// 2 # if item is found, return the index if itemlist[midPt] == item: return midPt # otherwise get the next midpoint if item > itemlist[midPt]: lowerIdx = midPt + 1 else: upperIdx = midPt - 1 if lowerIdx > upperIdx: return None

ฟังก์ชันส่งคืนดัชนีที่พบรายการ 7 ซึ่งเป็นดัชนีหนึ่ง

 binary_search(item,itemlist) # Output: 1

บทสรุป

ฉันหวังว่าบทช่วยสอนนี้จะช่วยให้คุณเข้าใจวิธีการแบ่งส่วนพื้นใน Python นี่คือบทสรุปของวิธีการต่างๆ ที่คุณได้เรียนรู้:

  • ใน Python ตัวดำเนินการ b ดำเนินการตามที่กำหนดโดยตัวดำเนินการ โดยมี a และ b เป็นตัวถูกดำเนินการและส่งกลับผลลัพธ์ของการดำเนินการ
  • คุณสามารถใช้ตัวดำเนินการหารพื้นของ Python //; a//b ส่งกลับผลหารของการดำเนินการหาร a/b
  • หรือคุณสามารถใช้ ฟังก์ชัน floordiv() ที่เทียบเท่าที่กำหนดไว้ในโมดูลตัวดำเนินการของ Python ด้วยไวยากรณ์: operator.floordiv(a,b) เพื่อรับผลลัพธ์ของ a//b
  • เมธอดทั้งหมดข้างต้นส่งคืนผลหาร แต่ชนิดข้อมูลอาจเป็นแบบทศนิยมหรือแบบ int ขึ้นอยู่กับค่าของ a และ b ดังนั้นคุณจะต้องแปลงค่าที่ส่งคืนเป็นจำนวนเต็ม
  • ฟังก์ชัน floor() จากโมดูลคณิตศาสตร์ของ Python สามารถใช้ในการแบ่งชั้นได้: math.floor(a,b) เทียบเท่ากับ a//b และคืนค่าเป็นจำนวนเต็ม เมื่อคุณต้องการให้ผลลัพธ์เป็นจำนวนเต็ม ให้พิจารณาใช้ฟังก์ชันพื้นจากโมดูลคณิตศาสตร์

ต่อไป เรียนรู้วิธีการทำงานกับ defaultdict ใน Python