logo

בשם Tuple בפייתון

ב-Python, סוג 'מיוחד' של tuple נקרא 'שם tuple'. מתחילים ב-Python מבולבלים ממנו לעתים קרובות, במיוחד מתי ולמה עלינו ליישם אותו.

מכיוון ש-NamedTuple הוא tuple, הוא יכול לבצע את כל הפונקציות ש-tuple יכול. עם זאת, זה יותר מ-Python tuple פשוט. בשפות מחשב אחרות, בדיוק כמו ב-C++, זה הרבה יותר דומה ל'class'. זהו תת-סוג של tuple עם שדות מוגדרים ואורך מוגדר שנבנה באופן פרוגרמטי לפי המפרטים שלנו. מדריך זה יסביר את Python NamedTuples ויראה כיצד להשתמש בהם ומתי ולמה עלינו להשתמש בהם.

מהו Python Tuple?

אנו מאמינים שעלינו לבקר שוב ב-tuples ב-Python לפני שנמשיך.

tuple ב- Python הוא מיכל שיכול לאחסן ערכים רבים. שקול את המקרה הבא.

קוד

 numbers = (34, 32, 56, 24, 75, 24) 

כפי שאנו יכולים לראות, אנו משתמשים בסוגריים כדי להגדיר זאת. אינדקסים משמשים לגישה לאלמנטים. (זכור שהאינדקס ב-Python מתחיל באפס.)

קוד

 numbers[1] 

תְפוּקָה:

 32 

מספרים [1] פייתון tuple מופרד על ידי העובדה שאנחנו לא יכולים לשנות את האלמנטים שלו, כלומר, אלמנטים של tuple הם בלתי ניתנים לשינוי.

תחביר Python NamedTuple

ראשית עלינו לייבא NamedTuple מהמודול המובנה של Python הנקרא אוספים, כפי שמוצג:

 from collections import namedtuple 

להלן התחביר הבסיסי לבניית NamedTuple:

 namedtuple(Name,[Names of Values]) 

שֵׁם זה הפרמטר של הכותרת שאנו רוצים לתת ל-NamedTuple שלנו, ו

[שמות ערכים] הוא מציין מיקום עבור הרשימה המכילה את שמות הערכים או המאפיינים השונים.

דוגמה של Python NamedTuple

הצעד הראשון, כפי שנאמר בעבר, הוא לייבא את NamedTuple.

 from collections import namedtuple 

כעת נוכל להשתמש בתחביר מהחלק הקודם כדי לבנות NamedTuple:

 Student = namedtuple('Student',['Name','Class','Age','Subject','Marks']) 

בדוגמה זו,

שמירה של gimp כ-jpeg

אנו בוחרים לקרוא ל-NamedTuple Student ולהזכיר את שמות הערכים, 'שם', 'כיתה', 'גיל', 'נושא' ו'סימנים' ברשימה. ויצרנו את NamedTuple הראשון שלנו - Student.

כעת, אנו יכולים ליצור בית Student1 עם המפרטים הנדרשים באמצעות Student באופן הבא:

פיתון או
 Studnet1 = Student('Itika', 11, 15, 'English', 79) 

נדרשים רק הערכים או התוכן הספציפיים שהתוויות או השדות ב-[שמות הערכים] שלנו חייבים לקבל.

כדי להזין תלמיד חדש, נניח Student2, העתק את הערכים שלו והדבק אותם בשדות של המשתנה החדש.

 Studnet2 = Student('Arshia', 12, 17, 'Maths', 93) 

נראה שאנו יכולים להשתמש ב- Student כשרטוט לתיעוד של תלמידים חדשים כפי שאנו רוצים מבלי שנצטרך לקרוא את התוויות של השדות בכל פעם.

כיצד לקבל את הערכים של NamedTuple באמצעות סימון נקודות

אנו יכולים להשתמש בשיטת הנקודה כדי להשיג את הערכים של מופעי NamedTuple Student1 ו- Student2. להלן התחביר:

 . 

דוגמת הקוד הבאה מדגים זאת:

קוד

 print (Student1.Age) print (Student1.Class) print (Student1.Subject) print (Student1.Marks) print (Student1.Name) 

תְפוּקָה:

 15 11 'English' 79 'Itika' 

באופן דומה, אנו עשויים לאחזר את המשתנים הקשורים ל-NamedTuple Student2 באמצעות Student2.Age, Student2.Class, וכן הלאה.

שיטות הגישה של NamedTuple

אנו עשויים לאחזר את הערכים מ-NamedTuple באמצעות מדדים, מילות מפתח והפונקציה getattr(). ערכי השדה של NamedTuple מסודרים בקפדנות. כתוצאה מכך, אנו עשויים להשתמש במדדים כדי למצוא אותם.

שמות השדות מומרים לתכונות על ידי ה-NamedTuple. כתוצאה מכך, ניתן להשתמש ב-getattr() כדי לאחזר נתונים מאותו שדה.

קוד

 import collections #create employee NamedTuple Participant = collections.namedtuple('Participant', ['Name', 'Age', 'Country']) #Adding two participants p1 = Participant('Itika', '21', 'India') p2 = Participant('Arshia', '19', 'Australia') #Accessing the items using index print( 'The name and country of the first participant are: ' + p1[0] + ' and ' + p1[2]) #Accessing the items using name of the field print( 'The name and country of the second participant are: ' + p2.Name + ' and ' + p2.Country) #Accessing the items using the method: getattr() print( 'The Age of participant 1 and 2 are: ' + getattr(p1, 'Age') + ' and ' + getattr(p2, 'Age')) 

תְפוּקָה:

 The name and country of the first participant are: Itika and India The name and country of the second participant are: Arshia and Australia The Age of participant 1 and 2 are: 21 and 19 

הליכי המרה של NamedTuple

ניתן להמיר אוספים שונים ל-NamedTuple באמצעות מספר טכניקות. אנו יכולים גם להשתמש בפונקציה _make() כדי להפוך רשימה, tuple או אובייקטים אחרים שניתנים לחזרה למופע NamedTuple.

אנו יכולים גם להמיר אובייקט מסוג נתונים של מילון לאוסף NamedTuple. מפעיל ** נדרש עבור טרנספורמציה זו.

כפריט מסוג נתונים מסוג OrderedDict, NamedTuple יכול להניב פריטים עם המפתחות שלו. אנו יכולים לקרוא לפונקציה _asdict() כדי להמיר אותה ל-OrderedDict.

קוד

 import collections #create employee NamedTuple Participant = collections.namedtuple('Participant', ['Name', 'Age', 'Country']) #List to Participants list_ = ['Itika', '21', 'India'] p1 = Participant._make(list_) print(p1) #Dict to convert Employee dict_ = {'Name':'Arshia', 'Age' : '19', 'Country' : 'Australia'} p2 = Participant(**dict_) print(p2) #Displaying the namedtuple as dictionary participant_dict = p1._asdict() print(participant_dict) 

תְפוּקָה:

 Participant(Name='Itika', Age='21', Country='India') Participant(Name='Arshia', Age='19', Country='Australia') {'Name': 'Itika', 'Age': '21', 'Country': 'India'} 

פעולות נוספות ב-NamedTuple

שיטות אחרות, כגון _fields() ו-_replace, זמינות. אנו עשויים לקבוע אילו שדות יש ל-NamedTuple על ידי קריאה לפונקציה _fields() . הפונקציה _replace() משמשת להחלפת ערך אחד באחר.

קוד

cast int ל-Java מחרוזת
 import collections #create employee NamedTuple Participant = collections.namedtuple('Participant', ['Name', 'Age', 'Country']) #List to Participants p1 = Participant('Itika', '21', 'India') print(p1) print('The fields of Participant: ' + str(p1._fields)) #updating the country of participant p1 p1 = p1._replace(Country = 'Germany') print(p1) 

תְפוּקָה:

 Participant(Name='Itika', Age='21', Country='India') The fields of Participant: ('Name', 'Age', 'Country') Participant(Name='Itika', Age='21', Country='Germany') 

כיצד פועל NamedTuple של Python?

בואו נסתכל על התוספת שאנחנו יכולים להשיג עם NamedTuple ב-Python.

1. NamedTuple ב-Python הוא בלתי ניתן לשינוי.

לא ניתן לשנות את NamedTuple ב-Python, בדומה לגרסה הרגילה שלו. איננו מסוגלים לשנות את המאפיינים שלו.

ננסה לשנות את אחד המאפיינים של טופלה בשם 'סטודנט' כדי להדגים זאת.

קוד

 from collections import namedtuple Student = namedtuple('Student',['Name','Class','Age','Subject','Marks']) Student1 = Student('Arshia', 12, 17, 'Maths', 93) Student1.Class = 11 

תְפוּקָה:

 AttributeError Traceback (most recent call last) Input In [41], in () 2 Student = namedtuple('Student',['Name','Class','Age','Subject','Marks']) 3 Student1 = Student('Arshia', 12, 17, 'Maths', 93) ----> 4 Student1.Class = 11 AttributeError: can't set attribute 

כפי שניתן לראות, הוא זורק AttributeError. כתוצאה מכך, אנו יכולים להסיק כי NamedTuple אינו ניתן לשינוי.

2. יצירת מילון Python מ-Python NamedTuple

ב-Python, NamedTuple דומה למילון, ונוכל להפוך אותו למילון על ידי:

קוד

 from collections import namedtuple Student = namedtuple('Student',['Name','Class','Age','Subject','Marks']) Student1 = Student('Arshia', 12, 17, 'Maths', 93) print ( Student1._asdict() ) 

תְפוּקָה:

 {'Name': 'Arshia', 'Class': 12, 'Age': 17, 'Subject': 'Maths', 'Marks': 93} 

אנו מנצלים את. שיטת asdict() עבור זה. זה גם מייצר Python OrderedDict.

3. NamedTuple עם ערכי ברירת מחדל

ניתן להגדיר מחלקה בשם tuple עם פרמטרים של ברירת מחדל באותו אופן שבו אנו יכולים להגדיר ערכים ראשוניים עבור תכונות במחלקה רגילה. ברירות המחדל מוקצות למאפיינים הימניים ביותר מכיוון ששדות בעלי ערך ברירת מחדל צריכים להופיע אחרי כל שדה ללא ברירת מחדל.

בואו נגדיר מחדש את כיתת הסטודנטים עם ערך ברירת מחדל אחד בלבד.

קוד

 from collections import namedtuple Student = namedtuple('Student', ['Name','Class','Age','Subject','Marks'], defaults = [100]) Student1 = Student('Arshia', 12, 17, 'Maths') print ( Student1 ) 

תְפוּקָה:

 Student(Name='Arshia', Class=12, Age=17, Subject='Maths', Marks=100) 

נתון ברירת המחדל 100 יוחל עבור הסימנים, שהוא השדה הימני ביותר בהצהרה שלנו אם ניצור את NamedTuple עם ערך אחד בלבד.

האם ערך ברירת המחדל של הגיל יוחל אם נציין במפורש שהשדה הוא הגיל?

קוד

 from collections import namedtuple Student = namedtuple('Student', ['Name','Class','Age','Subject','Marks'], defaults = [100]) Student1 = Student('Arshia', 12, 17, 'Maths') Student1 = Student(Age = 18) print ( Student1 ) 

תְפוּקָה:

 TypeError: Student.__new__() missing 3 required positional arguments: 'Name', 'Class', and 'Subject' 

התשובה היא לא. ב-NamedTuple, סדר השדות נוקשה מאוד. גם אם אנו מצהירים במפורש משהו, ערכי ברירת המחדל חייבים להיות הימניים ביותר כדי למנוע אי בהירות וקשיים פוטנציאליים.

היתרונות של Python Namedtuple

כמובן, אף אחד לא ישתמש ב-NamedTuple אם הוא לא רואה יתרונות. אז הנה מה שיש לנו:

execlp

1. שלא כמו tuple סטנדרטי, NamedTuple ב-Python יכול לאחזר משתנים לפי הכותרות שלהם.

קוד

 from collections import namedtuple Student = namedtuple('Student', ['Name','Class','Age','Subject','Marks'], defaults = [100]) Student1 = Student('Arshia', 12, 17, 'Maths') print ( Student1.Age ) 

תְפוּקָה:

 17 

2. מכיוון שהוא לא כולל מילונים לכל מופע, Python NamedTuple יעיל בזיכרון בדיוק כמו tuple רגיל. זה גם מהיר יותר ממילון בגלל זה.

סיכום

למדנו כיצד NamedTuples מאפשרים לנו לשלב את היתרונות של tuples ושל מילונים, כיצד לבנות את NamedTuples וכיצד להשתמש בהם במדריך זה. כיצד לאחזר את הערכים של NamedTuples באמצעות סימון נקודות ב-Python, כיצד הם פועלים

אם הקורא מכיר את OOP של Python, הוא יראה שזה זהה לאופן שבו מחלקות Python מתפקדות. מחלקה והתכונות שלה פועלות כשרטוט ליצירת אובייקטים או מופעים רבים נוספים, כל אחד עם ערכי תכונות משלו.

עם זאת, כדי להגביר את הבהירות של הקוד שלנו, הגדרת מחלקה ומתן המאפיינים החיוניים היא בדרך כלל מוגזמת, והרבה יותר מהיר לבנות את NamedTuples במקום זאת.