Ачааллж байна...
Set нь энэ курсэд аль хэдийн хоёр удаа гарч ирсэн. Бүлэг 2-ын dictionary comprehension хичээлийн төгсгөлд бид {len(ner) for ner in neres} гэсэн set comprehension-ыг товч харсан. Түвшин 1-ийн guided build-д бид len(set(ugs)) гэж бичээд өвөрмөц үгсийн тоог гаргасан. Хоёр тохиолдолд ч би "Бүлэг 5-д бүрэн үзнэ" гэж амласан.
Set бол list, tuple, dictionary-тэй зэрэгцэх Python-ы дөрөв дэх үндсэн бүтэц юм. Түүний гурван онцлог шинж бий:
Давхардал байхгүй. Ижил утга хоёр удаа орж чадахгүй.
Эрэмбэ байхгүй. Элементүүд ямар дарааллаар хадгалагдахыг та хянаж чадахгүй, index байхгүй.
in шалгалт МАШ хурдан. Энэ бол set-ийн хамгийн бага мэдэгддэг, гэхдээ хамгийн хүчирхэг шинж чанар.
Эхний хоёр шинжийг ойлгоход хялбар. Гурав дахь нь эхэндээ жижиг мэт санагдана — гэхдээ том өгөгдөл дээр ажиллахад тэр нь бүх ялгааг үүсгэдэг. Энэ хичээлийн гол зорилго бол тэр гуравдугаар шинжийн ач холбогдлыг танд мэдрүүлэх явдал юм.
List бол дараалал гэж бодоорой — хүмүүс эгнээнд зогсож байна. Хэн эхэнд, хэн хоёр дахь, хэн сүүлд — бүгд тодорхой. Нэг хүн хоёр удаа эгнээнд зогсож болно (хачирхалтай ч гэсэн боломжтой).
Set бол гишүүнчлэлийн жагсаалт гэж бодоорой — клубын гишүүдийн нэрс. Энд хоёр зүйл өөр байна.
Нэгдүгээрт, хүн бүр НЭГ л удаа жагсаалтад орно. Хэрэв та Болдыг хоёр удаа бүртгэх гэж оролдвол — тэр аль хэдийн гишүүн байна, юу ч өөрчлөгдөхгүй.
Хоёрдугаарт, "Болд бол гурав дахь гишүүн" гэж хэлэх нь утгагүй. Гишүүнчлэлд дараалал байхгүй. Асуулт нь зөвхөн нэг: тэр гишүүн үү, үгүй юу?
Гурав дахь, хамгийн чухал ялгаа нь: гишүүн эсэхийг ХЭРХЭН шалгаж байна вэ.
Хэрэв гишүүд эмх замбараагүй эгнээнд зогсож байвал (list), та "Болд энд байна уу" гэж мэдэхийн тулд эгнээний ЭХНЭЭС ЭХЭЛЖ хүн бүрийг харах хэрэгтэй. Мянган гишүүн байвал мянган нүүр харна.
Гэвч хэрэв гишүүд ЦАГААН ТОЛГОЙН дараалалтай, индексжүүлсэн бүртгэлд байвал (set), та шууд "Б" хэсэг рүү очиж, тэндээс шууд олно. Мянган гишүүн байсан ч ижил хугацаа зарцуулна.
Энэ бол set-ийн хурдны нууц. (Set нь үнэндээ цагаан толгойн дараалал ашигладаггүй — тэр илүү ухаалаг арга ашигладаг, гэхдээ санаа нь ижил: шууд очих, бүгдийг шалгахгүй.)
python
neres: set[str] = {"Болд", "Сараа", "Төмөр"}
print(neres)
print(len(neres))Үр дүн (дараалал нь өөр байж болно):
{'Сараа', 'Болд', 'Төмөр'}
3Буржгар хаалт нь set-ийн шинж. Бүлэг 2-ын dict comprehension хичээлээс санаж байгаа байх: буржгар хаалт дотор цэгтэй таслал байвал dictionary, байхгүй бол set.
Одоо давхардлыг оруулж үзье:
python
neres: set[str] = {"Болд", "Сараа", "Болд", "Төмөр", "Сараа"}
print(neres)
print(len(neres)){'Сараа', 'Болд', 'Төмөр'}
3Бид ТАВАН нэр бичсэн, гэхдээ set-д ГУРАВ л үлдсэн. Давхардлууд ЧИМЭЭГҮЙ устсан — алдаа гараагүй, анхааруулга байхгүй.
Энэ бол set-ийн эхний шинж. Тэр нь заримдаа яг таны хүссэн зүйл, заримдаа гэнэтийн — тиймээс анхаарч байх хэрэгтэй.
python
tootsuud: set[int] = {5, 1, 3, 2, 4}
print(tootsuud){1, 2, 3, 4, 5}Тоонууд эрэмбэлэгдсэн мэт харагдаж байна! Гэхдээ энэ бол ТОХИОЛДОЛ, амлалт БИШ. String-үүд дээр туршвал:
python
neres: set[str] = {"Төмөр", "Болд", "Сараа"}
print(neres){'Төмөр', 'Сараа', 'Болд'}Дараалал нь цагаан толгойн ч биш, оруулсан ч дараалал биш. Тэр нь Python-ы дотоод механизмаас хамаарч санамсаргүй мэт харагдана.
Тиймээс set-ийн дараалалд ХЭЗЭЭ Ч найдаж болохгүй. Хэрэв танд тодорхой дараалал хэрэгтэй бол sorted() ашиглана:
python
neres: set[str] = {"Төмөр", "Болд", "Сараа"}
for ner in sorted(neres):
print(ner)Болд
Сараа
Төмөрsorted() нь LIST буцаадаг (Бүлэг 5.1-ээс санаж байгаа байх) тул одоо дараалал тогтмол.
Эрэмбэ байхгүйгээс үүдэн index-ээр хандах боломжгүй:
python
neres: set[str] = {"Болд", "Сараа"}
print(neres[0])Traceback (most recent call last):
File "main.py", line 3, in <module>
print(neres[0])
TypeError: 'set' object is not subscriptableTypeError: 'set' object is not subscriptable гэдэг нь "set-д index-ээр хандаж болохгүй" гэсэн үг. Логиктой: "нэг дэх элемент" гэж юу вэ, хэрэв дараалал байхгүй бол?
Бүлэг 2-ын dict comprehension хичээлд яг ижил алдааг харсныг санаж байгаа байх — тэнд бид цэгтэй таслал мартаад санамсаргүй set үүсгэсэн байсан. Одоо тэр алдааны учир бүрэн тодорхой боллоо.
Slicing ч бас ажиллахгүй, sort() ч бас байхгүй. Set бол дараалал БИШ.
Set-ийн хамгийн энгийн, хамгийн олон ашиглагддаг хэрэглээ нь энэ.
python
def uvurmuts_avakh(neres: list[str]) -> list[str]:
return list(set(neres))
neres = ["Болд", "Сараа", "Болд", "Төмөр", "Сараа", "Болд"]
print(uvurmuts_avakh(neres))['Сараа', 'Төмөр', 'Болд']set(neres) нь жагсаалтыг set болгож хувиргаж, давхардлыг устгасан. Дараа нь list(...) нь буцаад жагсаалт болгосон.
Гэхдээ анхаараарай: ДАРААЛАЛ АЛДАГДЛАА. Анхны жагсаалтад Болд эхэнд байсан ч одоо тэр сүүлд байна.
Хэрэв дараалал чухал бол:
python
def uvurmuts_avakh_erembeltei(neres: list[str]) -> list[str]:
kharsan: set[str] = set()
ur_dun: list[str] = []
for ner in neres:
if ner not in kharsan:
kharsan.add(ner)
ur_dun.append(ner)
return ur_dun
neres = ["Болд", "Сараа", "Болд", "Төмөр", "Сараа", "Болд"]
print(uvurmuts_avakh_erembeltei(neres))['Болд', 'Сараа', 'Төмөр']Одоо дараалал хадгалагдлаа. Энд set нь "аль хэдийн харсан уу" гэсэн асуултад ХУРДАН хариулах туслах хэрэгсэл болж ажиллаж байна — тэр нь set-ийн жинхэнэ хүчийг ашиглаж эхэлж байгаа хэрэг.
Хоосон set үүсгэхийг анзаараарай: set() гэж бичсэн, {} ГЭЖ БИЧЭЭГҮЙ. Учир нь {} нь хоосон DICTIONARY үүсгэдэг:
python
a = {}
print(type(a))
b = set()
print(type(b))<class 'dict'>
<class 'set'>Энэ бол Python-ы жижиг ч гэсэн эвгүй байдал: буржгар хаалт нь хоёр бүтцээр хуваалцагддаг тул хоосон хэлбэрийг dictionary авчихсан. Хоосон set хэрэгтэй бол set() гэж бич.
python
neres: set[str] = {"Болд", "Сараа"}
neres.add("Төмөр")
print(neres)
neres.add("Болд") # аль хэдийн байгаа — юу ч болохгүй
print(neres)
neres.remove("Сараа")
print(neres)
neres.discard("Байхгүй") # байхгүй ч гэсэн алдаа гарахгүй
print(neres){'Сараа', 'Болд', 'Төмөр'}
{'Сараа', 'Болд', 'Төмөр'}
{'Болд', 'Төмөр'}
{'Болд', 'Төмөр'}.add(utga) — нэмнэ. Аль хэдийн байвал юу ч болохгүй, алдаа гарахгүй. (List-ийн .append() -тэй адилтгаж болно, гэхдээ давхардлыг зөвшөөрөхгүй.)
.remove(utga) — устгана. Байхгүй бол KeyError гаргана.
.discard(utga) — устгана. Байхгүй бол ЮУ Ч БОЛОХГҮЙ, алдаа гарахгүй.
remove ба discard -ийн ялгаа нь чухал:
python
neres: set[str] = {"Болд"}
neres.remove("Байхгүй")Traceback (most recent call last):
File "main.py", line 3, in <module>
neres.remove("Байхгүй")
KeyError: 'Байхгүй'Хэрэв та "байгаа эсэхээс үл хамааран устга" гэсэн санаатай бол discard ашигла. Хэрэв "байх ЁСТОЙ, байхгүй бол алдаа" гэсэн санаатай бол remove ашигла.
in шалгалт — хурдны нууцОдоо энэ хичээлийн ХАМГИЙН ЧУХАЛ хэсэг рүү орно.
Курс 1-ээс in оператор танил:
python
neres_list = ["Болд", "Сараа", "Төмөр"]
neres_set = {"Болд", "Сараа", "Төмөр"}
print("Болд" in neres_list)
print("Болд" in neres_set)True
TrueХоёулаа ажиллаж байна, ижил үр дүн. Тэгвэл ялгаа нь юунд байна вэ?
Ялгаа нь ХЭРХЭН ажиллаж байгаад л оршино.
List дээр in ажиллах үед Python нь эхний элементээс эхэлж, нэг нэгээр нь харьцуулна. "Болд" мөн үү? Үгүй. Дараагийнх? Гэх мэтчилэн. Хэрэв элемент нь СҮҮЛД байвал бүх жагсаалтыг гүйж дуусна. Хэрэв огт байхгүй бол — бүх жагсаалтыг гүйгээд, эцэст нь "үгүй" гэж хариулна.
Тэгэхээр: жагсаалт урт байх тусам in шалгалт удаан болно. Мянган элементтэй жагсаалтад дунджаар таван зуун харьцуулалт хийнэ.
Set дээр in ажиллах үед Python нь огт хайхгүй. Тэр нь утгыг ШУУД байрлал руу хөрвүүлж (энэ үйл явцыг hash гэж нэрлэдэг), тэр байрлалд юу байгааг харна. Нэг л алхам.
Тэгэхээр: set хэдий том байсан ч in шалгалт ИЖИЛ хурдтай. Мянган элемент ч, сая элемент ч — нэг л алхам.
Энэ бол ойлголтын түвшний тайлбар. Техникийн нарийвчлалыг мэдэх шаардлагагүй. Гол сургамж нь энгийн:
Хэрэв та "энэ зүйл байна уу" гэж ОЛОН УДАА асуух гэж байгаа бол — set ашигла.
Тоо ярихаас илүү харах нь дээр. Дараах кодыг өөрийн компьютер дээр ажиллуулж үзээрэй.
python
import time
hemjee = 100_000
davtalt = 10_000
tootsuud_list: list[int] = list(range(hemjee))
tootsuud_set: set[int] = set(range(hemjee))
ekhelsen = time.time()
for i in range(davtalt):
_ = (hemjee - 1) in tootsuud_list
list_khugatsaa = time.time() - ekhelsen
ekhelsen = time.time()
for i in range(davtalt):
_ = (hemjee - 1) in tootsuud_set
set_khugatsaa = time.time() - ekhelsen
print(f"List: {list_khugatsaa:.4f} секунд")
print(f"Set: {set_khugatsaa:.4f} секунд")Ойролцоогоор ийм үр дүн гарна (таны компьютерээс хамаарна):
List: 4.8213 секунд
Set: 0.0009 секундХэдэн МЯНГАН дахин хурдан. Энэ бол жижиг оптимизаци биш — энэ бол огт өөр ертөнц.
Кодыг тайлбарлая. time.time() нь одоогийн цагийг өгдөг; хоёр цагийн зөрүү нь зарцуулсан хугацаа. 100_000 гэсэн бичлэгт доогуур зураас байгааг анзаараарай — Python-д том тоог уншихад хялбар болгохын тулд доогуур зураас тавьж болно, тэр нь тоонд ямар ч нөлөө үзүүлэхгүй. _ гэсэн хувьсагчийн нэр нь "энэ утгыг ашиглахгүй" гэсэн заншлын тэмдэг.
Би зориудаар СҮҮЛЧИЙН элементийг хайсан — тэр бол list-ийн хамгийн муу тохиолдол. Гэхдээ бодит амьдрал дээр та юу хайхаа урьдчилан мэдэхгүй тул дунджаар хагасыг нь гүйнэ. Set-д тэр асуудал огт байхгүй.
Одоо энэ хурдыг хаана ашиглах вэ гэдгийг харъя.
Түвшин 1-ийн guided build-д бид "түгээмэл үгсийг хасах" гэсэн сонголтот өргөтгөл бичсэн:
python
TUGEEMEL: set[str] = {"бол", "юм", "нь", "ба", "энэ", "тэр"}
def tugeemel_shuukh(ugs: list[str]) -> list[str]:
return [ug for ug in ugs if ug not in TUGEEMEL]Яагаад TUGEEMEL нь set вэ, list биш?
Учир нь comprehension нь үг БҮРИЙН хувьд not in TUGEEMEL гэсэн шалгалт хийж байна. Хэрэв текстэд арван мянган үг байвал — арван мянган шалгалт. Хэрэв TUGEEMEL нь list байсан бол шалгалт бүр нь бүх жагсаалтыг гүйх байсан. Set бол шууд.
Энэ бол set-ийн ХАМГИЙН түгээмэл, хамгийн бодит хэрэглээ: "энэ зүйл миний мэдэх зүйлсийн дунд байна уу" гэсэн асуултыг олон удаа асуух.
Бусад жишээнүүд:
python
ZUVSHUURUGDSUN_UUSGEGCH: set[str] = {"admin", "moderator", "editor"}
def ereh_bolokh_uu(uuseg: str) -> bool:
return uuseg in ZUVSHUURUGDSUN_UUSGEGCHpython
KHORIGLOSON_UGS: set[str] = {"хараал1", "хараал2"}
def tsever_uu(mesej: str) -> bool:
ugs = set(mesej.lower().split())
return len(ugs & KHORIGLOSON_UGS) == 0Хоёр дахь жишээнд & гэсэн шинэ оператор гарч ирлээ — түүнийг одоо үзье.
Set-үүд хоорондоо математикийн үйлдэл хийж чадна. Энэ нь тэдгээрийн онцгой чадвар юм.
python
a: set[int] = {1, 2, 3, 4}
b: set[int] = {3, 4, 5, 6}
print(a | b) # union — нэгдэл
print(a & b) # intersection — огтлолцол
print(a - b) # difference — ялгавар
print(a ^ b) # symmetric difference — тэгш хэмт ялгавар{1, 2, 3, 4, 5, 6}
{3, 4}
{1, 2}
{1, 2, 5, 6}Тайлбарлая:
a | b (union, нэгдэл) — "хоёрын АЛЬ НЭГЭНД байгаа бүх зүйл." Босоо зураас нь Бүлэг 4-ийн str | None -той ижил тэмдэг — тэнд ч бас "эсвэл" гэсэн утгатай байсан.
a & b (intersection, огтлолцол) — "ХОЁУЛАНД нь байгаа зүйлс." Хамгийн түгээмэл, хамгийн хэрэгтэй.
a - b (difference, ялгавар) — "a -д байгаа, гэхдээ b -д БАЙХГҮЙ зүйлс."
a ^ b (symmetric difference) — "аль нэгэнд нь байгаа, гэхдээ ХОЁУЛАНД НЬ биш." Ховор ашиглагддаг.
Бодит жишээ — хоёр сурагчийн хичээлүүдийг харьцуулъя:
python
boldiin_khicheel: set[str] = {"математик", "физик", "англи", "түүх"}
saraagiin_khicheel: set[str] = {"математик", "хими", "англи", "газарзүй"}
print(f"Хоёулаа үздэг: {boldiin_khicheel & saraagiin_khicheel}")
print(f"Зөвхөн Болд: {boldiin_khicheel - saraagiin_khicheel}")
print(f"Зөвхөн Сараа: {saraagiin_khicheel - boldiin_khicheel}")
print(f"Нийт бүх хичээл: {boldiin_khicheel | saraagiin_khicheel}")Хоёулаа үздэг: {'математик', 'англи'}
Зөвхөн Болд: {'физик', 'түүх'}
Зөвхөн Сараа: {'хими', 'газарзүй'}
Нийт бүх хичээл: {'математик', 'физик', 'англи', 'түүх', 'хими', 'газарзүй'}Дөрвөн асуултын хариултыг дөрвөн мөрөөр гаргалаа. Хэрэв list ашигласан бол эдгээр тус бүр нь loop бичихийг шаардах байсан. Set нь тэдгээрийг НЭГ ОПЕРАТОР болгож хураангуйлсан.
Хэрэв та оператор тэмдгүүдийг санахад бэрх санагдвал, нэрлэсэн method-ууд ч бас байдаг:
python
print(boldiin_khicheel.intersection(saraagiin_khicheel))
print(boldiin_khicheel.difference(saraagiin_khicheel))
print(boldiin_khicheel.union(saraagiin_khicheel))Ижил үр дүн. Аль нь илүү тод байхаас хамаарч сонгоно — оператор нь богино, method нь тодорхой.
Бүлэг 2-ын мэдлэг одоо бүрэн ойлгомжтой болно:
python
neres: list[str] = ["Болд", "Сараа", "Төмөр", "Цэцэг", "Болд"]
urt_olonlog: set[int] = {len(ner) for ner in neres}
print(urt_olonlog){4, 5}Буржгар хаалт, цэгтэй таслал БАЙХГҮЙ → set. Дотор нь давхардал устсан: Болд ба Цэцэг хоёулаа 4 үсэгтэй, Сараа ба Төмөр хоёулаа 5 үсэгтэй.
Шүүлт ч бас ажиллана:
python
urt_neres: set[str] = {ner for ner in neres if len(ner) > 4}
print(urt_neres){'Сараа', 'Төмөр'}Set-д ямар утга хийж болох вэ?
python
zuv: set[str] = {"Болд", "Сараа"} # string — болно
zuv2: set[int] = {1, 2, 3} # тоо — болно
zuv3: set[tuple[int, int]] = {(1, 2), (3, 4)} # tuple — болноГэхдээ:
python
buruu = {[1, 2], [3, 4]}Traceback (most recent call last):
File "main.py", line 1, in <module>
buruu = {[1, 2], [3, 4]}
TypeError: unhashable type: 'list'TypeError: unhashable type: 'list' — Бүлэг 5.1-ээс танил алдаа! Тэнд бид list-ийг dictionary-ийн key болгож чадахгүй гэж үзсэн. Энд ижил шалтгаан: set-ийн элемент нь immutable байх ЁСТОЙ.
Яагаад? Учир нь set нь элементүүдийг hash хийж, байрлал тогтоодог. Хэрэв элемент нь өөрчлөгдвөл түүний hash өөрчлөгдөж, set түүнийг олохоо болино.
Тиймээс: string, тоо, tuple болно. List, dictionary, өөр set — болохгүй.
Энэ дүрэм нь dictionary-ийн key-ийн дүрэмтэй ЯГ ИЖИЛ. Санамсаргүй биш — хоёулаа ижил дотоод механизм (hash) дээр баригдсан. Тиймээс set нь үнэндээ "зөвхөн key-тэй, value-гүй dictionary" гэж бодож болно.
Хэрэв сонирхвол: дээрх хурдны туршилтын кодыг өөрийн компьютер дээр ажиллуулж үзээрэй. Тоог өөрөө нүдээрээ харах нь ямар ч тайлбараас илүү үнэмшилтэй.
Мөн хүсвэл: Түвшин 1-ийн guided build дээрээ буцаж очоод, "түгээмэл үгс" -ийг list болгож өөрчилж, дараа нь маш урт текст файл дээр ажиллуулаад хурдны ялгааг мэдрэх гэж оролдоод үзээрэй. Богино файл дээр ялгаа мэдэгдэхгүй — тэр нь өөрөө нэг сургамж юм: оптимизаци нь хэмжээ томрох үед л утга учиртай болдог.
1. Хоосон set-ийг {} гэж үүсгэх
python
neres = {}
neres.add("Болд")Traceback (most recent call last):
File "main.py", line 2, in <module>
neres.add("Болд")
AttributeError: 'dict' object has no attribute 'add'AttributeError: 'dict' object has no attribute 'add' — "dictionary-д add гэсэн method байхгүй." Учир нь {} нь хоосон DICTIONARY үүсгэсэн. Засвар: neres: set[str] = set().
2. Index-ээр хандах
TypeError: 'set' object is not subscriptableSet-д дараалал байхгүй тул index байхгүй. Хэрэв танд дараалал хэрэгтэй бол sorted(neres) ашиглаж list болго.
3. Дараалалд найдах
python
neres: set[str] = {"Болд", "Сараа", "Төмөр"}
for ner in neres:
print(ner)Ажиллана, гэхдээ дараалал нь урьдчилан таамаглах боломжгүй бөгөөд Python-ы хувилбар, ажиллуулах бүрд өөрчлөгдөж болно. Хэрэв тогтмол дараалал хэрэгтэй бол for ner in sorted(neres): гэж бич.
4. Давхардал алдагдсаныг анзаарахгүй байх
python
onoo: list[int] = [85, 92, 85, 78]
onoo_set = set(onoo)
print(f"Дундаж: {sum(onoo_set) / len(onoo_set)}")Дундаж: 85.0Алдаа гарахгүй, гэхдээ дундаж БУРУУ. Set нь давхардсан 85 -ыг устгасан тул гурван тоогоор дундаж бодогдсон, дөрөв биш. Зөв дундаж нь 85.0 биш, (85 + 92 + 85 + 78) / 4 = 85.0... энэ тохиолдолд санамсаргүйгээр ижил гарлаа, гэхдээ ерөнхийдөө ЗӨРНӨ.
Сургамж: тоо тоолох, дундаж бодох, нийлбэр гаргах үед set ашиглаж БОЛОХГҮЙ. Set нь мэдээлэл алддаг. Тэр нь зөвхөн "өвөрмөц зүйлс" эсвэл "харьяалал шалгах" хэрэгцээнд зориулагдсан.
5. List-ийг set-д хийх
TypeError: unhashable type: 'list'Set-ийн элемент нь immutable байх ёстой. Tuple болгож хувирга: {tuple(jagsaalt)}.
6. remove -ыг байхгүй элемент дээр дуудах
KeyError: 'Байхгүй'Хэрэв байгаа эсэх нь тодорхойгүй бол .discard() ашигла — тэр нь чимээгүй өнгөрдөг.
Set нь буржгар хаалттай ({...}), цэгтэй таслалгүй. Хоосон set нь set() — {} нь DICTIONARY.
Гурван шинж: давхардал байхгүй, эрэмбэ байхгүй (index байхгүй), in шалгалт маш хурдан.
Хамгийн энгийн хэрэглээ: давхардал устгах — list(set(neres)). Гэхдээ дараалал алдагдана.
Хамгийн ХҮЧИРХЭГ хэрэглээ: "энэ зүйл байна уу" гэж олон удаа асуух. Set дээр in нь хэмжээнээс үл хамааран НЭГ алхам; list дээр бүх жагсаалтыг гүйдэг.
Method-ууд: .add() (нэмнэ, давхардвал юу ч болохгүй), .remove() (байхгүй бол KeyError), .discard() (байхгүй бол чимээгүй).
Set үйлдлүүд: a | b (нэгдэл), a & b (огтлолцол), a - b (ялгавар). Эдгээр нь олон мөр loop-ыг нэг оператор болгож хураангуйлдаг.
Set-ийн элемент нь immutable байх ЁСТОЙ: string, тоо, tuple болно; list, dict болохгүй (TypeError: unhashable type: 'list').
Тоолох, дундаж бодох, нийлбэр гаргахад set ашиглаж БОЛОХГҮЙ — тэр нь давхардлыг устгаж, мэдээлэл алддаг.
Дараагийн хичээлд бид үүрлэсэн бүтэц рүү орно: dictionary доторх жагсаалт, жагсаалт доторх dictionary, тэдгээрийн хослолууд. Тэнд бид гүн бүтэцтэй өгөгдлийг яаж уншиж, яаж өөрчлөхийг удаан, тодорхой алхмаар үзнэ. Мөн би нэг зүйлийг чангаар хэлнэ: тэр бүтэц бол ЯГ JSON-ы хэлбэр — дараагийн бүлгийн сэдэв, мөн интернэтийн бүх программ хоорондоо ярихад ашигладаг формат юм.
Бүртгэлтэй болсноор энэ сургалтын бүх хичээлд хандах эрх авна.