ไดนามิกอาเรย์
ใน python รายการ ชุด และพจนานุกรมเป็นอ็อบเจ็กต์ที่ไม่แน่นอน ในขณะที่ number, string และ tuple เป็นอ็อบเจกต์ที่ไม่เปลี่ยนรูป ออบเจ็กต์ที่ไม่แน่นอนหมายความว่าเราเพิ่ม/ลบรายการจากรายการ ชุด หรือพจนานุกรม ซึ่งไม่เป็นความจริงในกรณีที่อ็อบเจ็กต์ที่ไม่เปลี่ยนรูป เช่น ทูเพิลหรือสตริง
ใน python รายการคือไดนามิกอาร์เรย์ มาลองสร้างรายการไดนามิกกันเถอะ -
>>> #Create an empty list, named list1 >>> list1 = [] >>> type (list1) <class 'list'>
เพิ่มบางรายการลงในรายการว่างของเรา list1 -
>>> # Add items >>> list1 =[2, 4, 6] >>> list1 [2, 4, 6] >>> # Another way to add items, using append. >>> list1.append('Tutorialspoint') >>> list1 [2, 4, 6, 'Tutorialspoint']
ลบบางรายการออกจากรายการ -
>>> # deleting item from a list >>> list1.pop() 'Tutorialspoint' >>> list1 [2, 4, 6]
จากด้านบน เราจะเห็นว่ารายการนั้นเป็นส่วนขยายของอาร์เรย์จริงๆ ซึ่งเราสามารถแก้ไข (เพิ่มหรือลด) ขนาดรายการได้ เราเริ่มต้นด้วยรายการขนาด "ศูนย์" แล้วเพิ่ม "สี่" รายการลงไป
พื้นฐานของการนำอาร์เรย์ไดนามิกไปใช้
ลองพิจารณาตัวอย่างที่มีรายการ .i.e. list1 จะถูกต่อท้ายเมื่อขนาดของอาร์เรย์เต็มแล้ว เราจำเป็นต้องดำเนินการตามขั้นตอนด้านล่างเพื่อเอาชนะข้อบกพร่องข้อจำกัดด้านขนาด นี่คือพื้นฐานเบื้องหลังการนำอาร์เรย์ไดนามิกไปใช้ -
- จัดสรรอาร์เรย์ list2 ใหม่ที่มีความจุมากขึ้น
- ตั้งค่า list2[i] =list1[i] สำหรับ i =0,1….n-1 โดยที่ n คือหมายเลขปัจจุบันของรายการ
- ตั้งค่า list1=list2 เนื่องจากตอนนี้ list2 กำลังอ้างอิงรายการใหม่ของเรา
- จากนั้น เพียงแค่แทรก (ผนวก) รายการใหม่ในรายการของเรา (list1)
มาสร้างโค้ดง่ายๆ เกี่ยวกับวิธีใช้แนวคิดไดนามิกอาร์เรย์ในการเขียนโปรแกรมหลาม เราจะสร้างคลาสอาร์เรย์ไดนามิกของเราเองโดยใช้คลาสไลบรารีในตัวใน python ที่เรียกว่า ctypes ซึ่งจะใช้เป็นอาร์เรย์ดิบจากโมดูล ctypes
dynamicArray.py
import ctypes class DynamicArray(object): #Initialize it def __init__(self): #We'll have three attributes self.n = 0 # by default self.capacity = 1 # by default self.A = self.make_array(self.capacity) # make_array will be defined later #Length method def __len__(self): #It will return number of elements in the array return self.n def __getitem__(self, k): #it will return the elements at the index k if not 0 <=k <self.n: return IndexError('k is out of bounds') return self.A[k] def append(self, element): #checking the capacity if self.n == self.capacity: #double the capacity for the new array i.e self.resize(2*self.capacity) # _resize is the method that is defined later # set the n indexes of array A to elements self.A[self.n] = element self.n += 1 def _resize(self, new_cap): #new_cap is for new capacity #declare array B B = self.make_array(new_cap) for k in range(self.n): B[k] = self.A[k] # referencing the elements from array A to B #ones refered then self.A = B # A is now the array B self.capacity = new_cap # resets the capacity #making the make-array method using ctypes def make_array(self,new_cap): return (new_cap * ctypes.py_object)() arr = DynamicArray()
ในขณะที่คลาสไดนามิกของเราพร้อมใช้งานแล้ว ให้ลองทำอะไรบางอย่างกับมัน -
>>> len(arr) 0 >>> arr.append(1) >>> #First item entered >>> len(arr) 1 >>> arr.append('Tutorialspoint') >>> #second item entered >>> len(arr) 2 >>> arr[1] 'Tutorialspoint'
เพียงเท่านี้ เราได้สร้างอาร์เรย์ไดนามิกของเราเอง และเราสามารถปรับขนาดอาร์เรย์ที่เป็นรายการในไพ ธ อนได้