ปัญหา
คุณต้องใช้โครงสร้างข้อมูลที่ไม่เปลี่ยนรูปใน Python
แนะนำตัว..
โครงสร้างข้อมูลที่ไม่เปลี่ยนรูปจะมีประโยชน์มากเมื่อคุณต้องการป้องกันไม่ให้บุคคลหลายคนแก้ไขข้อมูลในการเขียนโปรแกรมแบบขนานพร้อมกัน โครงสร้างข้อมูลที่เปลี่ยนแปลงได้ (เช่น Array) สามารถเปลี่ยนแปลงได้ตลอดเวลาในขณะที่โครงสร้างข้อมูลที่ไม่เปลี่ยนรูปแบบไม่สามารถเปลี่ยนแปลงได้
ทำอย่างไร..
ให้ฉันแสดงให้คุณเห็นทีละขั้นตอนถึงวิธีจัดการกับโครงสร้างข้อมูลที่ไม่เปลี่ยนรูปแบบและเปลี่ยนแปลงได้
ตัวอย่าง
# ขั้นตอนที่ 01 - สร้างอาร์เรย์ที่ไม่แน่นอน# กำหนด arrayatp_players =['Murray', 'Nadal', 'Djokovic']print(f" *** ข้อมูลดั้งเดิมในอาร์เรย์ของฉันคือ - {atp_players}")
*** ข้อมูลดั้งเดิมในอาร์เรย์ของฉันคือ -
['Murray', 'Nadal', 'Djokovic']
# การเปลี่ยนชื่อผู้เล่นจาก Murray เป็น Federeratp_players[0] ='Federer'print(f" *** ข้อมูลที่แก้ไขในอาร์เรย์ของฉันคือ - {atp_players}")
*** ข้อมูลที่แก้ไขในอาร์เรย์ของฉันคือ -
['เฟเดอเรอร์', 'นาดาล', 'ยอโควิช']
บทสรุป
เราสามารถเปลี่ยนค่าอาร์เรย์ได้เช่นเดียวกับที่อาจเป็นประโยชน์หากคุณเป็นผู้ใช้เฉพาะของอาร์เรย์นี้ อย่างไรก็ตาม ในการผลิตแบบเรียลไทม์ หลายโปรแกรมอาจใช้อาร์เรย์นี้สำหรับการเปลี่ยนแปลงและอาจส่งผลให้เกิดข้อมูลที่ไม่คาดคิด
ในทางกลับกัน Tuples มีพฤติกรรมแตกต่างกันเล็กน้อย ดูตัวอย่างด้านล่าง
# ขั้นตอนที่ 02 - ลองเปลี่ยน Tupletry:atp_players_tuple =('Murray', 'Nadal', 'Djokovic')print(f" *** ข้อมูลดั้งเดิมใน tuple ของฉันคือ - {atp_players_tuple}")atp_players_tuple[0] ='Federer' ยกเว้นข้อยกเว้นเป็น error:print(f" *** พยายามแก้ไขข้อมูลแต่ลงเอยด้วย - {error}")
*** ข้อมูลดั้งเดิมในทูเพิลของฉันคือ - ('Murray', 'Nadal', 'Djokovic')*** พยายามแก้ไขข้อมูลแต่ลงเอยด้วย - วัตถุ 'tuple' ไม่รองรับการกำหนดไอเท็ม
บทสรุป :
สิ่งที่คุณเห็นด้านบนคือ tuple ไม่สามารถแก้ไขได้ใช่ไหม . อย่างไรก็ตาม มีข้อยกเว้นประการหนึ่ง หากมีอาร์เรย์ที่มีทูเพิล ค่าสามารถเปลี่ยนแปลงได้
atp_players_array_in_tuple =(['Murray'], ['Nadal'], ['Djokovic'])print(f" *** ข้อมูลดั้งเดิมใน tuple ของฉันที่มีอาร์เรย์คือ - {atp_players_array_in_tuple}")atp_players_array_in_tuple[0][ 0] ='Federer'print(f" *** ข้อมูลที่แก้ไขใน tuple ของฉันด้วยอาร์เรย์คือ - {atp_players_array_in_tuple}")
*** ข้อมูลดั้งเดิมใน tuple ของฉันที่มีอาร์เรย์คือ - (['Murray'], ['Nadal'], ['Djokovic'])*** ข้อมูลที่แก้ไขใน tuple ของฉันที่มีอาร์เรย์คือ - (['Federer '], ['นาดาล'], ['ยอโควิช'])
แล้วจะปกป้องข้อมูลได้อย่างไร ? อืม แค่แปลงอาร์เรย์เป็นทูเพิล
try:atp_players_tuple_in_tuple =(('Murray'), ('Nadal'), ('Djokovic'))print(f" *** ข้อมูลดั้งเดิมใน tuple ของฉันคือ - {atp_players_tuple_in_tuple}")atp_players_tuple_in_tuple[0] ='Federer' ยกเว้นข้อยกเว้นเป็น error:print(f" *** พยายามแก้ไขข้อมูลใน tuple ของฉัน แต่ลงเอยด้วย - {error}")
*** ข้อมูลดั้งเดิมในทูเพิลของฉันคือ - ('Murray', 'Nadal', 'Djokovic')*** พยายามแก้ไขข้อมูลใน tuple ของฉัน แต่ลงเอยด้วย - วัตถุ 'tuple' ไม่รองรับการกำหนดรายการ
ยังมีอีกมาก.. Python มีเครื่องมือที่ชื่อว่า NamedTuple ในตัว เป็นคลาสที่คุณสามารถขยายเพื่อสร้างคอนสตรัคเตอร์ ให้เราเข้าใจแบบเป็นโปรแกรม
# สร้างคลาสอย่างง่ายบนชื่อ Grandslam ใน pythons way.class GrandSlamsPythonWay:def __init__(ตัวเอง ผู้เล่น ชื่อ):self.player =playerself.titles =titlesstats =GrandSlamsPythonWay("Federer", 20)print(f" *** สถิติมีรายละเอียดเป็น {stats.player} - {stats.titles}")
*** สถิติมีรายละเอียดว่าเฟเดอเรอร์ - 20
คุณคิดอย่างไรกับคลาสนี้ มันเปลี่ยนไม่ได้ ? ให้เราตรวจสอบโดยเปลี่ยนเฟเดอเรอร์เป็นนาดาล
stats.player ='Nadal'print(f" *** Stats มีรายละเอียดเป็น {stats.player} - {stats.titles}")
*** สถิติมีรายละเอียดเป็น นาดาล - 20
จึงไม่แปลกใจเลยที่โครงสร้างข้อมูลจะเปลี่ยนแปลงไม่ได้ เนื่องจากเราสามารถอัปเดตเฟเดอเรอร์เป็นนาดาลได้ ตอนนี้ให้เราสร้างชั้นเรียนด้วย NamedTuple และดูว่ามีพฤติกรรมเริ่มต้นอย่างไร
จากการพิมพ์นำเข้า NamedTupleclass GrandSlamsWithNamedTuple(NamedTuple):player:strtitles:intstats =GrandSlamsWithNamedTuple("Federer", 20)print(f" *** สถิติมีรายละเอียดเป็น {stats.player} - {stats.titles}") stats.player ='Djokovic'print(f" *** Stats มีรายละเอียดเป็น {stats.player} - {stats.titles}")
*** สถิติมีรายละเอียดว่าเฟเดอเรอร์ - 20
ดูเหมือน Djokovic ต้องรออีกสักพักกว่าจะถึง 20 รายการ Grandslam
อย่างไรก็ตาม เราสามารถใช้วิธี _replace เพื่อคัดลอกและอัปเดตค่าระหว่าง _replace ได้
djokovic_stats =stats._replace(player="Djokovic", titles=17)print(f" *** djokovic_stats มีรายละเอียดเป็น {djokovic_stats.player} - {djokovic_stats.titles}")
*** djokovic_stats มีรายละเอียดว่า Djokovic - 17
ตัวอย่าง
สุดท้ายนี้ ผมจะยกตัวอย่างหนึ่งตัวอย่างที่ครอบคลุมทุกอย่างที่อธิบายไว้ข้างต้น
สำหรับตัวอย่างนี้ สมมติว่าเรากำลังเขียนซอฟต์แวร์สำหรับร้านขายผัก
จากการพิมพ์ นำเข้า Tuple# สร้างคลาสเพื่อเป็นตัวแทนระดับการซื้อหนึ่งรายการ ราคา(NamedTuple):id:intname:strprice:int # ราคาเป็นดอลลาร์# สร้างคลาสเพื่อติดตามการซื้อคลาส การซื้อ (NamedTuple):purchase_id:intitems:Tuple[ ราคา]# สร้างรายการผักและราคาที่เกี่ยวข้องcarrot =ราคา (1, "แครอท", 2)มะเขือเทศ =ราคา(2, "มะเขือเทศ", 3)มะเขือยาว =ราคา(3, "มะเขือยาว", 5)# ทีนี้ลองพูดว่าของเรา ลูกค้ารายแรกที่คุณต้อมซื้อแครอทและ Tomatotom_order =ซื้อ (1, (แครอท, มะเขือเทศ))# ทราบต้นทุนทั้งหมดที่เราจำเป็นต้องเรียกเก็บ Mr.Tomtotal_cost =sum(item.price for item in tom_order.items)print(f" *** ค่าใช้จ่ายทั้งหมดจากคุณต้อมคือ - {total_cost}$")
ผลลัพธ์
*** ค่าใช้จ่ายทั้งหมดจาก Mr.Tom คือ - 5$