سلام دوستان ...در قسمت قبل آموزش پایتون مفاهیم زیر را یاد دادیم
دیدیم که لیست ها و رشته ها خصیصه های مشترک بسیاری داشتند، مانند عملیات اندیس گذاری و بخش بندی (slicing) . آنها دو مثال از انواع داده دنباله هستند
از آنجایی که پایتون یک زبان در حال تحول است، سایر انواع داده دنباله ممکن است اضافه شود. همچنین یک نوع داده دنباله استاندارد دیگر به نام چندتایی وجود دارد. یک چندتایی شامل تعدادی مقدار است که به وسیله ویرگول از هم جدا شده اند. برای مثال:
>>> t = 12345, 54321, 'hello!'
>>> t[0]
12345
>>> t
(12345, 54321, 'hello!')
>>> # Tuples may be nested:
... u = t, (1, 2, 3, 4, 5)
>>> u
((12345, 54321, 'hello!'), (1, 2, 3, 4, 5))
>>> # Tuples are immutable:
... t[0] = 88888
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
>>> # but they can contain mutable objects:
... v = ([1, 2, 3], [3, 2, 1])
>>> v
([1, 2, 3], [3, 2, 1])
</module></stdin>
همانطور که می بینید ، چندتایی ها در خروجی همیشه در پرانتز قرار دارند، بنابراین چندتایی های تو در تو به درستی تفسیر می شوند. آنها ممکن است در ورودی با یا بدون پرانتز باشند، هرچند اغلب، پرانتز ها ضروری هستند (اگر چندتایی بخشی از یک عبارت بزرگتر باشد). امکان تخصیص به عناصر یک چندتایی به صورت مجزا وجود ندارد، هرچند می توان چندتایی هایی ساخت که شامل اشیای قابل تغییر باشند، مانند لیست ها.
اگرچه ممکن است چندتایی ها شبیه لیست ها به نظر برسند، اما اغلب در موقعیت های مختلف و برای اهداف متفاوتی از چندتایی ها استفاده می شود. چندتایی ها غیر قابل تغییر هستند، و معمولا در بر دارنده دنباله ای از عناصر نا همگن هستند که به وسیله باز کردن (unpacking- در ادامه این بخش می بینیم) یا اندیس گذاری (یا حتی توسط ویژگی در صورت namedtuples) قابل دسترسی هستند.
لیست ها قابل تغییر هستند، و عناصر آنها معمولا همگن هستند و با گردش و تکرار روی لیست قابل دسترسی هستند. مشکل ویژه ساختار چندتایی ها در شرایطی است که شامل صفر یا یک عنصر هستند. نحوه نگارش، تعدادی جایگزین برای اصلاح این مشکل دارد. چندتایی های خالی به وسیله یک جفت پرانتز خالی ساخته می شوند. چندتایی با یک عنصر ، به وسیله یک مقدار و یک ویرگول پس از آن ساخته می شود ( قرار دادن یک مقدار در پرانتز کارآمد نیست). زشت اما موثر. برای مثال:
>>> empty = ()
>>> singleton = 'hello', # <-- note trailing comma
>>> len(empty)
0
>>> len(singleton)
1
>>> singleton
('hello',)
عبارت t = 12345, 54321, 'hello!' یک مثال از بسته بندی چندتایی است. مقادیر 12345 ، 54321 و 'hello!' با هم در یک چندتایی بسته بندی شده اند. عملیات عکس آن نیز امکان پذیر است:
>>> x, y, z = t
این باز کردن دنباله (sequence unpacking) نام دارد و برای هر دنباله در سمت راست (right-hand side) کار می کند. باز کردن دنباله نیازمند این است که به تعداد عناصر موجود در دنباله، متغیر در سمت چپ علامت مساوی باشد. توجه کنید که تخصیص های متعدد فقط ترکیبی از بسته بندی چندتایی و باز کردن دنباله است.
همچنین پایتون شامل یک نوع داده برای مجموعه ها است.
کاربردهای اصلی شامل تست عضویت و حذف ورودی های تکراری است. همچنین اشیای مجموعه از عملیات ریاضی مانند اجتماع, اشتراک, تفاضل و تفاضل متقارن پشتیبانی می کند. از پرانتز {} یا تابع set() برای ساخت مجموعه می توان استفاده کرد. نکته: برای ایجاد یک مجموعه خالی باید از set() استفاده کنید نه {}. دومی یک دیکشنری خالی می سازد، ساختار داده ای که در بخش بعدی درباره آن بحث می کنیم. در اینجا یک نمایش مختصر داریم:
>>> basket = {'apple', 'orange', 'apple', 'pear', 'orange', 'banana'}
>>> print(basket) # show that duplicates have been removed
{'orange', 'banana', 'pear', 'apple'}
>>> 'orange' in basket # fast membership testing
True
>>> 'crabgrass' in basket
False
>>> # Demonstrate set operations on unique letters from two words
...
>>> a = set('abracadabra')
>>> b = set('alacazam')
>>> a # unique letters in a
{'a', 'r', 'b', 'c', 'd'}
>>> a - b # letters in a but not in b
{'r', 'd', 'b'}
>>> a | b # letters in a or b or both
{'a', 'c', 'r', 'd', 'b', 'm', 'z', 'l'}
>>> a & b # letters in both a and b
{'a', 'c'}
>>> a ^ b # letters in a or b but not both
{'r', 'd', 'b', 'm', 'z', 'l'}
مشابه درک مطلب لیست، درک مطلب مجموعه ها نیز پشتیبانی می شود:
>>> a = {x for x in 'abracadabra' if x not in 'abc'}
>>> a
{'r', 'd'}
نوع داده مفید دیگری که درون پایتون ساخته شده دیکشنری است
بعضی اوقات در سایر زبان ها مانند “associative memories” و “associative arrays” نیز دیکشنری پیدا می شود. برخلاف دنباله ها که با بازه ای از اعداد اندیس گذاری می شوند، دیکشنری ها با کلیدها اندیس گذاری می شوند که این کلیدها می توانند هر نوع غیر قابل تغییری باشند. رشته ها و اعداد همیشه می توانند کلید باشند. چندتایی ها در زمانی که تنها شامل رشته ها، اعداد و چندتایی های دیگر باشند، می توانند کلید باشند.
اگر چندتایی شامل هر گونه شی قابل تغییر ، مستقیم یا غیر مستقیم باشد، نمیتواند به عنوان کلید مورد استفاده قرار گیرد. از لیست ها نمی توان به عنوان کلید استفاده کرد زیرا آنها با استفاده از تخصیص اندیس، تخصیص بخش (slice) یا با استفاده از متدهای append() و extend() می توانند تغییر کنند.
بهتر است به دیکشنری به عنوان مجموعه ای از جفت "کلید:مقدار" نگاه کنیم با این شرط که کلید ها (درون یک دیکشنری) یکتا هستند. یک جفت پرانتز {} یک دیکشنری خالی ایجاد می کند. قرار دادن لیستی از جفت کلید:مقدار که با ویرگول از هم جداشده اند درون پرانتز ها ، کلید:مقدار اولیه را به دیکشنری اضافه می کند. همچنین دیکشنری ها در خروجی به این روش نوشته می شوند.
عملیات اصلی روی یک دیکشنری، ذخیره یک مقدار با یک کلید و استخراج آن مقدار با دادن کلید است. همچنین می توان با del یک جفت کلید:مقدار را پاک کرد. اگر یک مقدار را با استفاده از یک کلیدی که در حال حاضر موجود و در حال استفاده است ذخیره کنید، مقدار قبلی مربوط به آن کلید فراموش می شود. استخراج یک مقدار توسط کلیدی که وجود ندارد خطا است.
اگر list(d) را روی یک دیکشنری اعمال کنید، یک لیست از تمامی کلیدهای موجود در دیکشنری به ترتیب درج باز می گرداند ( اگر میخواهید که مرتب شود به جای آن از sorted(d) استفاده کنید). برای بررسی اینکه آیا یک کلید در دیکشنری وجود دارد از کلمه کلیدی in استفاده کنید. در اینجا مثالی کوچک که از دیکشنری استفاده کرده است را می بینیم:
>>> tel = {'jack': 4098, 'sape': 4139}
>>> tel['guido'] = 4127
>>> tel
{'jack': 4098, 'sape': 4139, 'guido': 4127}
>>> tel['jack']
4098
>>> del tel['sape']
>>> tel['irv'] = 4127
>>> tel
{'jack': 4098, 'guido': 4127, 'irv': 4127}
>>> list(tel)
['jack', 'guido', 'irv']
>>> sorted(tel)
['guido', 'irv', 'jack']
>>> 'guido' in tel
True
>>> 'jack' not in tel
False
سازنده dict() مستقیما از دنباله های جفت کلید:مقدار دیکشنری می سازد.
>>> dict([('sape', 4139), ('guido', 4127), ('jack', 4098)])
{'sape': 4139, 'guido': 4127, 'jack': 4098}
علاوه بر آن از درک مطلب دیکشنری (dict comprehensions) برای ساخت دیکشنری ها از عبارات کلید:مقدار دلخواه می توان استفاده کرد.
>>> {x: x**2 for x in (2, 4, 6)}
{2: 4, 4: 16, 6: 36}
گاهی ساده تر است، زمانی که کلیدها رشته های ساده هستند، جفت ها را با آرگومان های کلمه کلیدی مشخص کنیم:
>>> dict(sape=4139, guido=4127, jack=4098)
{'sape': 4139, 'guido': 4127, 'jack': 4098}
هنگامی که در دیکشنری ها از حلقه استفاده شود، می توان با استفاده از متد items() کلید و مقدار متناظر با آن را به طور همزمان بازیابی کرد.
>>> knights = {'gallahad': 'the pure', 'robin': 'the brave'}
>>> for k, v in knights.items():
... print(k, v)
...
gallahad the pure
robin the brave
هنگامی که در یک دنباله از حلقه استفاده شود، با استفاده از تابع enumerate() میتوان اندیس مکان و مقدار متناظر با آن را به صورت همزمان بازیابی کرد.
>>> for i, v in enumerate(['tic', 'tac', 'toe']):
... print(i, v)
...
0 tic
1 tac
2 toe
برای حلقه زدن روی دو یا بیشتر دنباله به صورت همزمان، ورودی ها با استفاده از تابع zip() می توانند جفت شوند.
>>> questions = ['name', 'quest', 'favorite color']
>>> answers = ['lancelot', 'the holy grail', 'blue']
>>> for q, a in zip(questions, answers):
... print('What is your {0}? It is {1}.'.format(q, a))
...
What is your name? It is lancelot.
What is your quest? It is the holy grail.
What is your favorite color? It is blue.
برای حلقه زدن روی یک دنباله به صورت معکوس، ابتدا دنباله را در جهت رو به جلو مشخص کنید، سپس تابع reversed() را فراخوانی کنید.
>>> for i in reversed(range(1, 10, 2)):
... print(i)
...
9
7
5
3
1
برای حلقه زدن روی یک دنباله به صورت مرتب شده، از تابع sorted() استفاده کنید که یک لیست جدید مرتب شده را باز می گرداند و در دنباله اولیه تغییری ایجاد نمی کند.
>>> basket = ['apple', 'orange', 'apple', 'pear', 'orange', 'banana']
>>> for f in sorted(set(basket)):
... print(f)
...
apple
banana
orange
pear
گاهی اوقات تغییر یک لیست زمانی که در حال استفاده از حلقه روی آن هستید، تحریک کننده است. هر چند اغلب ایجاد یک لیست جدید به جای آن ساده تر و امن تر است.
>>> import math
>>> raw_data = [56.2, float('NaN'), 51.7, 55.3, 52.5, float('NaN'), 47.8]
>>> filtered_data = []
>>> for value in raw_data:
... if not math.isnan(value):
... filtered_data.append(value)
...
>>> filtered_data
[56.2, 51.7, 55.3, 52.5, 47.8]
شروط استفاده شده در عبارات while و if می تواند شامل هر عملگری باشد، نه فقط مقایسه. عملگرهای مقایسه ای in و not in وجود و عدم وجود یک مقدار درون یک دنباله را بررسی می کنند.
عملگرهای is و is not مقایسه می کنند که آیا دو شی واقعا مشابه هستند یا خیر، این تنها برای اشیای قابل تغییر مانند لیست ها اهمیت دارد. تمامی عملگرهای مقایسه ای اولویت یکسانی دارند، که از عملگرهای عددی پایین تر است. مقایسه ها می توانند به طور زنجیره ای به هم متصل شوند.
برای مثال a < b == c بررسی می کند که آیا a کمتر از b است و علاوه بر آن b مساوی c است. مقایسه ها ممکن است با استفاده از عملگرهای بولی (Boolean) مانند and و or ترکیب شوند، و خروجی مقایسه (یا هر عبارت بولی دیگر) با استفاده از not منفی شود. اینها نسبت به عملگرهای مقایسه ای اولویت پایین تری دارند.
بین آنها، not بالاترین اولویت و or پایین ترین اولویت را دارد، بنابراین A and not B or C برابر است با (A and (not B)) or C. مثل همیشه، از پرانتز ها برای بیان ترکیب بندی دلخواه می توان استفاده کرد. عملگرهای بولی and و or عملگرهای مدار کوتاه نیز نامیده می شوند. آرگومان های آنها از چپ به راست بررسی می شوند، و به محض تعیین خروجی، بررسی متوقف می شود.
برای مثال، اگر a و c صحیح (true) باشند اما b غلط باشد (false)،A and B and C عبارت c را بررسی نمی کند. زمانی که به عنوان یک مقدار عمومی نه بولی مورد استفاده قرار می گیرد، مقدار بازگشتی یک عملگر مدار کوتاه، آخرین آرگومان بررسی شده است. می توان نتیجه یک مقایسه یا سایر عبارات بولی را به یک متغیر، تخصیص داد. برای مثال:
>>> string1, string2, string3 = '', 'Trondheim', 'Hammer Dance'
>>> non_null = string1 or string2 or string3
>>> non_null
'Trondheim'
توجه داشته باشید که در پایتون، بر خلاف C ، تخصیص درون عبارات باید صراحتا توسط عمگر =: انجام شود. با این کار از یک کلاس مشترک از اشتباهات مواجه شده در برنامه نویسی C جلوگیری می شود. نوشتن = در یک عبارت، در حالی که منظور == بوده است.
آموزش پایتون ادامه دارد