Тизме генераторундагы шарттуу оператор
Тизме генераторундагы шарттуу оператор
Тизме генераторлорунда шарттуу конструкцияларды да колдонсоңуз болот. Бул учурда шаблон болуп саналат:
[выражение for переменная in последовательность if условие]
Биз a тизмеден b тизмесине жуп болгон бардык элементтерди өткөрүп беришибиз керек дейли:
@A@from random import randint
a = [randint(-10, 10)for i in range(10)]
print(a)
b = [elem for elem in a if elem%2==0]
print(b)@A@
@T@[-5, -4, 0, 6, -3, -10, 2, -2, 4, 2]
[-4, 0, 6, -10, 2, -2, 4, 2]@T@
Ошондой эле татаал шарттарды кошууга болот: ал 2ге бөлүнөт жана терс эмес дейли:
@A@b = [elem for elem in a if elem%2==0 and elem >= 0]
print(b)@A@
@T@[8, 0, 6]@T@
Көрүнүп тургандай, бардык так жана терс сандар тизмеден алынып салынды.
Эми input() киргизүү аркылуу боштук менен бөлүнгөн бир өзгөрмөгө бир нече сандарды киргизген мисалды карап көрөлү. Натыйжада сан эмес, сап болот. Бул учурда сиз жөн гана = int(input()) жаза албайсыз, анткени бул катага алып келет, бирок, сиз split() ыкмасын колдонуп сапты компоненттерге бөлсөңүз болот:Тизме генератору менен маалыматтарды окуу
@A@a = input()
print(a, type(a))
a= a.split()
print(a, type(a))@A@
@T@[8, 0, 6]
[8, 0, 6] <class 'str'>
['[8,', '0,', '6]'] <class 'list'>@T@
Көрүнүп тургандай, тизмедеги элементтер дагы эле сап маалымат түрү болуп саналат, бирок бул генератор менен оңой эле оңдоого болот. Көрүнүп тургандай, бизде азыр бүтүн сан түрүнүн элементтеринин тизмеси бар.
Тизме генераторундагы уяланган циклдер
@A@a = [(i, j)for i in 'abc' for j in [1, 2, 3]]
print(a)@A@
@T@[('a', 1), ('a', 2), ('a', 3), ('b', 1), ('b', 2), ('b', 3), ('c', 1), ('c', 2), ('c', 3)]@T@
Иштөө принциби кадимки уя илмектерди айланып өтүү менен бирдей. Сырткы циклден биринчи өзгөрмөнү алып, аны менен ички циклдин бардык өзгөрмөлөрүнөн өтөбүз, андан кийин тышкы циклдин экинчи өзгөрмөсү алынат ж.б.у.с.
Генератордун ичиндеги мындай уячалар ар кандай шарттар менен коштолушу мүмкүн:
@A@a = [i*j for i in [2, 3, 4, 5] for j in [1, 2, 3] if i*j >= 10]
print(a)@A@
@T@[12, 10, 15]@T@