Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม

วิธีการใช้โครงสร้างข้อมูลที่ไม่เปลี่ยนรูปใน Python?


ปัญหา

คุณต้องใช้โครงสร้างข้อมูลที่ไม่เปลี่ยนรูปใน 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


<ก่อนหน้า>------------------------------------------------------------- ---------------------------- AttributeError Traceback (การโทรล่าสุดล่าสุด) ใน 10 พิมพ์ (f" *** สถิติมีรายละเอียดเป็น {สถิติ .player} - {stats.titles}")11---> 12 stats.player ='Djokovic'13 พิมพ์ (f" *** สถิติมีรายละเอียดเป็น {stats.player} - {stats.titles}")AttributeError :ตั้งค่าแอตทริบิวต์ไม่ได้

ดูเหมือน 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$