Qanday qilib satr oxiridagi yangi satr belgilarini o`chirish mumkin?
>>> lines = ("line 1 \r\n"
... "\r\n"
... "\r\n")
>>> lines.rstrip("\r\n")
'line 1 '
Yakuniy bo`sh joylarni o`chirmagan holda, yangi satr belgilarini o`chirish uchun S.rstrip(“\r\n”) dan foydalanish mumkin:
Qanday qilib, ro`yxatdagi takrorlanuvchi elementlarni o`chirish mumkin?
Bir mechta usullari mavjud: http://code.activestate.com/recipes/52560/
Qanday qilib ko`p o`lchovli ro`yxat yaratish mumkin?
>>> A = [[None] * 2] * 3
Siz mana bu natija bermaydigan variantni sinab ko`rgandirsiz:
>>> A
[[None, None], [None, None], [None, None]]
Bu quyidagicha chiqarish holatida to`g`ri bo`lishi mumkin:
>>> A[0][0] = 5
>>> A
[[5, None], [5, None], [5, None]]
Lekin siz biror qiymatni o`zlashtirsangiz, u bir nechta turli joylarda hosil bo`ladi:
Buning sababi shundaki, * operatori nusxalarni emas, faqatgina mavjud ob`yektlarga havolalarni yaratadi. *3 ayni bitta ro`yxatga 3 ta havolarni yaratadi. Bu satrlardan bittasining o`zgartirilishi boshqalarining ham o`zgarishiga olib keladi. Bu esa biz istagan vaziyat emas.
A = [None] * 3
for i in range(3):
A[i] = [None] * 2
Yechimlari:
w, h = 2, 3
A = [[None] * w for i in range(h)]
Yoki matritsalardan foydalanish imkoniyatini beriuvchi maxsus modullardan foydalanish mumkin. Ulardan eng ommaviysi – NumPydir.
Nega a_tuple[i] += [‘item’] ishlamaydi, qo`shish esa ishlayapti?
Buning sababi shuki, kangaytirilgan o`zlashtirish operatori – o`zlashtirish operatoridir, va shu bilan birga Pythondagi o`zgaruvchi va o`zgarmas ob`yektlar orasidagi farq sababli.
Umuman bu muhokamamiz o`zlashtirishning kengaytirilgan operatorlari o`zgaruvchi ob`yektlar bilan ishlayotgan kortej elementlariga nisbatan qo`llanilishiga haqida bo`lib, lekin shunday bo`lsada, biz misol tariqasida ro`yxatlar va += dan foydalanamiz.
Agar siz quyidagi misoldagi kabi yozsangiz xatolikka ega bo`lasiz:
>>> a_tuple = (1, 2)
>>> a_tuple[0] += 1
Traceback (most recent call last):
...
TypeError: 'tuple' object does not support item assignment
Noodatiy holatning sababi tushunarli bo`lsa kerak, 1 a_tuple[0] ob`yektga qo`shiladi, lekin biz kortejning birinchi elementiga 2 qiymatni o`zlashtirishga harakat qilganimizda, biz xatoga duch kelamiz, chunki biz kortej elementini o`zgartira olmaymiz.
>>> result = a_tuple[0] + 1
>>> a_tuple[0] = result
Traceback (most recent call last):
...
TypeError: 'tuple' object does not support item assignment
Ya`ni ushbu ifoda quyidagi amalni bajaradi:
Biz quyidagi misoldagilarni yozganimizda:
>>> a_tuple = (['foo'], 'bar')
>>> a_tuple[0] += ['item']
Traceback (most recent call last):
...
TypeError: 'tuple' object does not support item assignment
Biz kutmagan noodatiy holat yuzaga kelgan bo`lsa ham, undan ham qiziqarlisi shundaki, element qo`shildi!
>>> a_tuple[0]
['foo', 'item']
Nima hodisa ro`y berganligini tushunish uchun quyidagilarni bilish kerak:
Agar ob`yektni __iadd__ metodi aniqlaydigan bo`lsa, u += bajarilganda chaqiriladi va qaytariladigan qiymat o`zlashtirish uchun ishlatiladi.
Ro`yxatlar uchun __iadd__ ro`yxatlar uchun extendni chaqirilgani bilan teng kuchlidir.
>>> a_list = []
>>> a_list += [1]
>>> a_list
[1]
Shunday qilib,
>>> result = a_list.__iadd__([1])
>>> a_list = result
Ekvivalent:
>>> result = a_list.__iadd__([1])
>>> a_list = result >>> result = a_tuple[0].__iadd__(['item'])
>>> a_tuple[0] = result
Traceback (most recent call last):
...
TypeError: 'tuple' object does not support item assignment
Shunday qilib, bizning kortejli misolimiz quyidagiga ekvivalentdir:
__iadd__ samarali yakunlandi va ro`yxat kattalashdi, lekin, o`zlashtirish xatolik bilan yakunlandi.
34-bob
Dostları ilə paylaş: |