ساختمان داده tuple که در این نوشتار چندتایی نامیده می شود یکی دیگر ازپرکاربردترین ساختمان داده های موجود در پایتون است و همانندlist کاربرد اصلی آن ذخیره چند مقدارمختلف در یک متغیر واحد و دسترسی به همه آنها تنها با یک نام مشخص است. به زبان ساده تر به جای آنکه برای ذخیره موقت هر مقدار، یک متغیر جداگانه تعریف شود ، تنها یک متغیر تعریف و تمامی مقادیر مورد نیاز در آن ذخیره و از آن بازیابی می شوند.
در پایتون یک tuple به دو روش زیر ساخته می شود :
1- مقدار دهی مستقیم به یک متغیر
در این روش مقادیر مورد نظر که با نویسه , از هم جدا می شوند درون یک جفت کمانک باز و بسته () قرار می گیرند و سپس با استفاده از عملگر جایگزینی = در متغیر مورد نظر ذخیره می شوند.
مثال : چندتایی شرکت های فعال در صتعت خودروسازی که دارای چهار مقدار است.
cars = ("Toyota", "Peugeot" ,"Mercedes Benz", "Hundai")
print(cars)
مثال : چندتایی نمرات درس ریاضی دانش آموزان یک کلاس که دارای 10 عنصر است.
grades = (18,18.30,12,17.5,16,19,17,14.5,13,15)
print(grades)
برای ساخت یک چندتایی تک عنصری یعنی چندتایی که تنها یک مقدار را در خود نگه می دارد باید پس از نخستین عنصر آن یک نویسه , نوشته شود در غیر این صورت پایتون نمی تواند تشخیص دهد که هدف شما ساخت یک tuple است :
مثال :
thistuple = ("apple",)
print(type(thistuple)) # output <class 'tuple'>
thistuple = ("apple")
print(type(thistuple)) # output <class 'str'>
2- استفاده از سازنده[1] کلاس tuple
مثال : چندتایی نام دانش آموزان یک کلاس
student = tuple(("Arash" , "Arman", "Mina" ,"Darush", "Sepideh"))
print(student)
مثال : چندتایی نمرات درس ریاضی تعدادی از دانشجویان
grades = tuple((18,18.30,12,17.5,16,19,17,14.5,13,15))
print(grades)
چندتایی ها دارای ویژگی های زیر هستند :
1-عناصردرون یک tuple دارای ترتیب[2] و نظم خاصی هستند نه به این معنی که عناصر از کوچکترین مقدار به بزرگترین مقدار و یا برعکس مرتب شده اند بلکه به این معنی که عناصردرون آن دارای ترتیب قرار گیری مشخصی هستند به زبان ساده تر محل قرار گرفتن عناصر یک چندتایی بر اساس ترتیب درج آنها در tuple و یا به هنگام تعریف و مقدار دهی اولیه به آن تعیین می شود به عددی که نشان دهنده محل قرارگرفتن هر عنصر درون چندتایی است شاخص[3] گفته می شود. شاخص گذاری عناصر موجود در یک tuple از عدد صفر شروع می شود یعنی نخستین عنصر دارای شاخص صفر ، دومین عنصر دارای شاخص یک و به همین ترتیب آخرین عنصر دارای شاخص n-1 است کهn طول چندتایی یا همان تعداد عناصر موجود در چندتایی است. ناگفته نماند که کلاس tuple دارای شگردهایی[4] است که می توانند ترتیب قرار گرفتن عناصر در یک چندتایی را برهم بزنند اما در حالت کلی یک چندتایی دارای ویژگی ترتیب است.
2- چندتایی یک شی غیرقابل تغییر[5] است به این معنی که پس از تعریف و مقدار دهی اولیه به آن نمی توان عناصر موجود در آن را حذف کرد ، تغییر داد و یا عناصری جدیدی به آن افزود.
3- عناصر درون یک چندتایی می توانند تکراری باشند. توانایی چندتایی ها در پذیرش مقادیر تکراری مرهون شاخصگذاری عناصر موجود درآن است ، تا زمانی که هر دو مقدار یکسان شاخص متفاوتی داشته باشند هیچ مشکلی پیش نخواهد آمد.
مثال : چندتایی زیردارای دوعنصر با مقدار تکراری"Blue"و شاخص های متفاوت 0 و4 است
colorList = ("Blue", "Red", "Purple", "Green", "Blue")
print(colorList)
4- هر یک از عناصر موجود در یک چندتایی می توانند نوع داده متفاوتی داشته باشند
مثال: در چندتایی myFavoritWords نخستین عنصر از نوع رشته ، دومین عنصر یک عدد صحیح و سومین عنصر یک عدد اعشاری است.
myFavoritWords = ("Hundai",20,56.5)
print(myFavoritWords)
همانگونه که گفته شد عناصر موجود در چندتایی شاخصگذاری میشوند یعنی محل قرارگیری عناصر موجود در آن به ترتیب و با شروع از عدد صفر شماره گذاری می شود بنا براین می توان با قراردادن شاخص هر عنصر درون عملگر انتخاب (جفت علامت [] که پس از نام چندتایی می آید) به مقدارآن دست یافت برای نمونه درمثال زیر student[0] نخستین عنصر چندتایی یعنی “Arash” و student[3] چهارمین عنصر چندتایی یعنی “Bahram” را بازیابی می کند.
مثال :
student = ("Arash" , "Arman", "Mina" ,"Bahram", "Sepideh")
print(student[0])
print(student[1])
print(student[2])
print(student[3])
print(student[4])
چندتایی ها از شاخص گذاری منفی هم پشتیبانی می کنند بدین معنی که آخرین عنصر یک چندتایی یعنی نخستین عنصر از انتها دارای شاخص -1 دومین عنصر از انتهادارای شاخص -2 و به همین ترتیب تا آخرین عنصر از انتهای چندتایی که دارای شاخص –n است که n تعداد کل عناصر موجود در چندتایی است.
مثال:
student = ("Arash" , "Arman", "Mina" ,"Bahram", "Sepideh")
1- |
2- |
3- |
4- |
5- |
شاخص گذاری منفی |
4 |
3 |
2 |
1 |
0 |
شاخص گذاری مثبت |
Sepideh |
Bahram |
Mina |
Arman |
Arash |
Student List |
مثال: دستور print(thistuple[-1]) در کد زیر عنصر “Third” را چاپ خواهد کرد.
thistuple = ("First", "Second", "Third")
print(thistuple[-1])
دیگر روش دستیابی به عناصر موجود دریک چندتایی استفاده از حلقه for به همراه عملگر in است.
مثال :
student = ("Arash" , "Arman", "Mina" ,"Darush", "Sepideh")
for itm in student:
print(itm)
به تعدادعناصر موجود در یک چندتایی طول آن گفته می شود برای بدست آوردن طول یک چندتایی می توانید از تابع len() استفاده کنید.
مثال :
grades = (18,18.30,12,17.5,16,19,17,14.5,13,15)
length = len(grades)
print(length) #OutPut is 10
مثال : کد زیر عناصر موجود در چندتایی student را از انتها به ابتدا چاپ می کند. برای درک بهتر کد دوباره یادآوری می شود که چندتایی ها از شاخص گذاری منفی عناصر پشتیبانی می کنند بدین معنی که آخرین عنصر دارای شاخص -1 دومین عنصر از انتهادارای شاخص -2 و به همین ترتیب تا آخرین عنصر از انتهای چندتایی که دارای شاخص –n است که n تعداد کل عناصر موجود در چندتایی است.
student = tuple(("Arash" , "Arman", "Mina" ,"Bahram", "Sepideh"))
end = -1
start = -len(student)
while end >= start:
print(student[end])
end += -1
می توان محدوده ای از عناصر موجود در یک چندتایی را انتخاب کرد برای این کار باید شاخص عناصرموجود درمحدوده مورد نظر را به صورتStart:End درون عملگر انتخاب ([]) قرار دهید با مشخص کردن محدوده مورد نظر به صورت [Start:End ] عناصری که دارای شاخص Start تا End-1 هستند انتخاب می شوند. به یاد داشته باشید که شاخص End را یک واحد بیش از شاخص آخرین عنصر مورد نظر انتخاب کنید. مقدار پیش فرض شاخص Start صفر است پس اگر مقدارآن خالی رها شود محدوده انتخاب از نخستین عنصر موجود در چندتایی شروع می شود همچنین مقدارپیش فرض شاخص End برابر با طول چندتایی است پس چنانچه مقدار آن خالی رها شود محدوده انتخاب از شاخص Start آغاز و تا آخرین عنصر موجود در چندتایی که دارای شاخص n-1 است ادامه خواهد یافت. (n طول چندتایی است)
مثال:
thistuple = ("Arash" , "Arman", "Mina" ,"Bahram", "Sepideh")
print(thistuple [2:4])
خروجی کد بالا "Mina" ,"Bahram" است
مثال:
tuple1 = (10,20,30,40,50)
tuple2 = tuple1[:]
print(tuple2)
#output is : (10, 20, 30, 40, 50)
کد بالا تمامی عناصر موجود در tuple1 را انتخاب و در tuple2 قرار می دهد
مثال:
thistuple = ("Arash" , "Arman", "Mina" ,"Bahram", "Sepideh")
partuple = thistuple [:4]
print(partuple)
کد بالا عناصر "Arash" , "Arman", "Mina" ,"Bahram" را چاپ می کند
مثال :
thistuple = ("Arash" , "Arman", "Mina" ,"Bahram", "Sepideh")
print(thistuple[2:])
مثال : کد زیر عناصر "Mina" ,"Bahram" را چاپ می کند
thistuple = ("Arash" , "Arman", "Mina" ,"Bahram", "Sepideh")
part1 = thistuple [-3:-1]
print(part1)
برای اطمینان از موجود بودن عنصر مورد نظر در یک چندتایی مشخص می توانید از دستور if به همراه عملگر in استفاده کنید
مثال:
thistuple = ("Arash" , "Arman", "Mina" ,"Bahram", "Sepideh")
if "Arman" in thistuple:
print("Arman is in the tuple")
برای اطمینان از اینکه عنصر مورد نظر در چندتایی وجود ندارد می توانید از دستور if به همراه عملگر not in استفاده کنید
مثال :
thistuple = ["Arash" , "Arman", "Mina" ,"Bahram", "Sepideh"]
if "Amir" not in thistuple:
print("Amir is not in the tuple")
همانگونه که گفته شد چندتایی یک شی غیرقابل تغییراست به این معنی که پس از تعریف و مقدار دهی اولیه به tuple نمی توان عناصر موجود در آن را حذف کرد ، تغییر داد و یا عناصری جدیدی به آن افزود. از این رو تنها راه باقی مانده برای به روزرسانی مقادیر موجود در آن این است که ابتدا tuple به یک list تبدیل شود ، تغییرات مورد نظر در list داده شود و سرانجام list ویرایش شده دوباره به tuple تبدیل گردد :
مثال:
averages = (19, 18, 16 , 18.8, 17, 15.5, 19.8 , 20 , 14)
list2 = list(averages)
list2[0] = 19.7
list2[2] = 17
averages = tuple(list2)
print(averages)
چندتایی یک ساختمان داده تغییرناپذیر است از این رو همانند list شگردی به نام append() برای آن پیش بینی نشده است بنابراین برای افزودن یک مقدار جدید به آن دو راه وجود دارد :
1- تبدیل tuple به list ، افزودن مقدار مورد نظر به list و تبدیل دوباره آن به tuple
مثال:
averages = (19, 18, 16)
list2 = list(averages)
list2.append(25)
averages = tuple(list2)
print(averages)
2- کلاس tuple از عملگر الحاق (+) پشتیبانی می کند بنابراین برای افزودن یک عنصر به یک tuple می توانید یک چندتایی تک عنصری بسازید و آنرا به tuple مورد نظر الحاق کنید.
مثال :
tpl1 = (5,6,7)
tpl2 = (9,)
tpl1 += tpl2
print(tpl1)
با توجه به تغییرناپذیربودن چندتایی ها ، تنها راه باقی مانده برای حذف یک عنصر از آن این است که ابتدا tuple به یک list تبدیل شود ، عنصر مورد نظر از list حذف شود و سرانجام list ویرایش شده دوباره به tuple تبدیل گردد :
مثال :
tpl1 = (5,6,7,10)
list1 = list(tpl1)
list1.remove(10)
tpl1 = tuple(list1)
print(tpl1)
برای حذف تمام یک tuple می توانید از دستور del استفاده کنید :
مثال :
tpl1 = (5,6,7,10)
del(tpl1)
print(tpl1)
در کد بالا چندتایی tpl1 به وسیله دستور del حذف می شود بنابراین با رسیدن اجرا به دستور print(tpl1) خطای زیر توسط مفسر پایتون اعلام خواهد شد :
NameError: name 'tpl1' is not defined
به ساخت یک tuple از راه تعیین یکایک عناصر آن بسته بندی[6] tuple گفته می شود
مثال:
tuple1 = (5, 6, 7, 10, 12)
در پایتون با استفاده از عملگر جایگزینی = می توانید عناصر موجود در یکtuple را به دسته ای از متغیرها اختصاص دهید. که به این کار توزیع یا بازپخش و یا بازکردن[7] بسته بندی یک tuple گفته می شود.
مثال:
tuple1 = (5, 6, 7, 10)
a, b, c, d = tuple1
print(a)
print(b)
print(c)
print(d)
مثال:
fruits = ("apple", "banana", "cherry")
(green, yellow, red) = fruits
print(green)
print(yellow)
print(red)
به هنگام بازپخش یک tuple تعداد متغیرها باید برابربا تعداد عناصر موجود در چندتایی باشند. در غیر این صورت مفسر پایتون خطا اعلام خواهد کرد. برای پیشگیری از این وضعیت می توانید پیش از نام یکی از متغیرها علامت * قرار دهید در این حالت دیگر عناصر موجود در tuple که متغیری متناظر با آنها وجود ندارد در قالب یک list در آن قرار خواهند گرفت.
مثال :
fruits = ("apple", "banana", "cherry" ,"orange" , "tomato")
(green, yellow, *red) = fruits
print(green)
print(yellow)
print(red) # output ['cherry', 'orange', 'tomato']
به یاد داشته باشید که اختصاص مقادیر موجود در tuple به متغیر ها بر اساس ترتیب آنها و با رعایت برابری تعداد متغیرها و تعداد عناصر tuple است بنابراین اگر علامت * در کنارمتغیری به جز آخرین متغیر قرار گیرد رفتار بازپخشی از این اصول پیروی خواهد کرد
مثال: در کد زیر علامت * در کنار دومین متغیر قرارگرفته است
fruts = ("apple","banana", "cherry" ,"orange" , "tomato")
(green, *yellow, red) = fruts
print(green)
print(yellow)
print(red)
# output is :
# apple
# ['banana', 'cherry', 'orange']
# tomato
مثال: در کد زیر علامت * در کنار نخستین متغیر قرارگرفته است
fruts = ("apple","banana", "cherry" ,"orange" , "tomato")
(*green, yellow, red) = fruts
print(green)
print(yellow)
print(red)
#output :
#['apple', 'banana', 'cherry']
#orange
#tomato
پیمایش یک چندتایی به معنای حرکت در میان عناصر موجود در آن و خواندن مقدار هر یک از آنها به ترتیب ملاقات است. پیمایش می تواند از یک نقطه دلخواه آغاز و در یک نقطه دلخواه دیگر به پایان برسد. در بسیاری ازکاربردها نخستین عنصر چندتایی نقطه آغاز پیمایش است و آخرین عنصر موجود در چندتایی نقطه پایان، جهت پیمایش می تواند از ابتدا به انتهای چندتایی و یا برعکس باشد. پیمایش یک چندتایی با استفاده از حلقه ها انجام می شود:
مثال: پیمایش چندتایی Customers با استفاده از حلقه for
Customers = ("arash" , "Arman", "Farhad", "Kaveh")
for itm in Customers:
print(itm)
مثال: پیمایش چندتایی Customers با استفاده از حلقه while
Customers = ("arash" , "Arman", "Farhad", "Kaveh")
i=0
while i < len(Customers):
print(Customers[i])
i += 1
مثال: پیمایش چندتاییCustomers بابهرهگیری از حلقه for ، مفهوم شاخص و دستورrange()
Customers = ("arash" , "Arman", "Farhad", "Kaveh")
for i in range(len(Customers)):
print(Customers[i])
برای به هم پیوستن دو یا چند tuple به یکدیگر می توانید از عملگر الحاق ( + ) استفاده کنید
مثال:
tuple1 = (10, 15, 20, 18)
tuple2 = (7, 5, 9, 17, 22)
tuple3 = (12, 14, 15)
tuple4 = tuple1 + tuple2 + tuple3
print(tuple4)
#outputis : (10, 15, 20, 18, 7, 5, 9, 17, 22, 12, 14, 15)
می توان یک tuple را در یک عدد ضرب کرد نتیجه یک tuple است که اعضای آن به تعداد عدد ضرب شده تکرار شده اند.
مثال:
tuple1 = (5,6,7)
tuple2 = tuple1 * 3
print(tuple2) #outputis : (5, 6, 7, 5, 6, 7, 5, 6, 7)
مقداری به عنوان ووردی می پذیرد و تعداد تکرار آن در tuple را برمیگرداند اگرمقدار ارسال شده به شگرد در چندتایی مورد نظر وجود نداشته باشد مقدار برگشتی عدد صفر خواهد بود.
مثال:
tuple1 = (5,6,7,6,7,8,6,5,6)
cnt = tuple1.count(6)
print(cnt)
#output is : 4
مقداری به عنوان ورودی می پذیرد و نخستین محل قرارگیری آن در tuple یا همان شاخص عنصر را برمی گرداند. به یاد داشته باشید که شاخص گذاری عناصر یک tuple از عدد صفر شروع می شود. اگر مقدار ارسال شده به شگرد در چندتایی مورد نظر وجود نداشته باشد مفسر پایتون خطای ValueError: tuple.index(x): x not in tuple را صادر خواهد کرد.
مثال:
tuple1 = (5,6,7,6,7,8,6,5,6)
pos = tuple1.index(6)
print(pos)
#outputis : 1
گاهی نیاز است که عناصرنظیر به نظیر موجود در دو یا چند شی قابل پیمایش(list ،tuple،set) را در قالب یک tuple ترکیب و تمامی چند تایی های بدست آمده را در یک شی قابل پیمایش دیگر ذخیره کنیم برای مثال فرض کنید list1 در بردارنده نام دانش آموزان و list2 در بردارنده معدل همان دانش آموزان به ترتیب نام آنها در list1 باشد. می خواهیم فهرستی از tuple های در بردارنده نام و معدل هردانش آموز را در list3 ذخیره کنیم به این منظور می توان کدی همانند زیر نوشت :
list1 = ['arash' , 'arman', 'sepideh', 'dariush']
list2 = [19.5, 19, 18, 17.5]
list3 = []
i = 0
for x in list1:
name,avrg = x,list2[i]
t = tuple((name,avrg))
list3.append(t)
i += 1
print(list3)
خروجی کد بالا همانند زیر است :
[('arash', 19.5), ('arman', 19), ('sepideh', 18), ('dariush', 17.5)]
راه حل ساده تری هم برای انجام این کار وجود دارد و آن بکارگیری تابع zip() است ، این تابع چندین شی مختلف از انواع داده قابل پیمایش[8] مانند list ، tuple و set را به عنوان ورودی می پذیرد و یک شی واحد قابل پیمایش از نوع zip برمی گرداند که دربردارنده تعدادی tuple است هر tuple حاوی عناصر متناظرموجود در هر یک از اشیای قابل پیمایش ورودی به تابع zip() است . برای نمونه مثال بالا با استفاده از این تابع به شکل زیر برنامه نویسی می شود :
list1 = ['arash' , 'arman', 'sepideh', 'dariush']
list2 = [19.5, 19, 18, 17.5]
list3 = list(zip(list1, list2))
print(list3)
خروجی کد بالا همانند زیر است :
[('arash', 19.5), ('arman', 19), ('sepideh', 18), ('dariush', 17.5)]
مثال : فرض کنید سه فهرست به نام های raining99 ، raining400 و raining401 که به ترتیب دربردارنده میزان فرضی بارش باران در 12 ماه سالهای 1399 ، 1400و 1401در استان خراسان شمالی هستند را در اختیار دارید و می خواهید جمع ماهانه بارش باران در سه سال یاد شده را محاسبه و در فهرست چهارمی به نام totalRaining وارد کنید کد نویسی مسئله بدون استفاده از تابع zip() همانند زیر است :
raining99 = [66.1,67,67.2,60,59,50,49,48,50,47.3,38.3,37]
raining400 = [65.1,66,68.2,57,55,51,47,48,46,46.3,39.1,36]
raining401 = [66.5,68,66.7,61.1,56,44.2,44,45,47,47.3,38.3,33]
totalRaining = []
i = 0
while i < 12:
totalRaining.append(raining99[i] + raining400[i] + raining401[i])
i += 1
print(totalRaining)
کد نویسی مسئله با استفاده از تابع zip() همانند زیر خواهد بود:
raining99 = [66.1,67,67.2,60,59,50,49,48,50,47.3,38.3,37]
raining400 = [65.1,66,68.2,57,55,51,47,48,46,46.3,39.1,36]
raining401 = [66.5,68,66.7,61.1,56,44.2,44,45,47,47.3,38.3,33]
temp = list(zip(raining99, raining400, raining401))
totalRaining = [sum(x) for x in temp]
print(totalRaining)