Bitta funksiyadan boshqasiga opsional va nomlangan para-metrlarni qanday uzatish mumkin?
Bunday parametrlarni funksiya argumentlari hamda * va ** spetsifikatorlari yordamida hosil qilish mumkin, ular pozitsiyali argumentlardan iborat kortejni hamda nomlangan parametrlardan iborat lug‘atlarni qaytaradi. Shundan keyin siz ularni murojaatdagi * va ** dan foydalangan holda boshqa funksiyaga uzatishingiz mumkin:
def f(x, *args, **kwargs):
...
kwargs['width'] = '14.3c'
...
g(x, *args, **kwargs)
127
Nima uchun y ro‘yxatning ozgartirilishi x ro‘yxatning ham o‘zgar-ishiga olib keladi?
Agar siz quyidagi kodni yozsangiz:
[10]
y ga nimaningdir qo‘shilishi x ning ham o‘zgarishiga olib kelishini ko‘rasiz, bunga hayron qolishin-giz ham mumkin.
Bunday natijaga kelishimizning 2 ta asosiy sababi bor:
o‘zgaruvchilar – shunchaki obyektlarga bo‘lgan havolalar. y = x ro‘yxatning nusxasini yaratmaydi, bu buyruq yana bitta xuddi shu obyektga yo‘naltirilgan havolaga ega x o‘zgaru-vchini yaratadi;
ro‘yxatlarning o‘zgaruvchanligi.
append chaqirilganidan keyin, obyektning tarkibi [] dan [10] ga o‘zgardi. x va y aynan bitta obyektga havolaga ega bo‘lganligi sababli, ulardan har birining qo‘llanilishi bizga 10 ni qaytaradi.
Agar biz o‘zgarmaydigan obyektlarni qo‘llaydigan bo‘lsak:
x = 5 # sonlar o`zgarmas ob`yektlardir
x = x + 1 # 5 ni o`zgartirish mumkin emas. Biz yangi bir ob`yekt yaratamiz.
6
5
Bu yerda biz x va y endi o‘zaro teng emasligini ko‘rishimiz mumkin, chunki sonlar o‘zgarmas, x =
+ 1 5 sonini o‘shirish bilan o‘zgartirish mumkin emas. Buning o‘rniga yangi 6 obyekti yaratiladi va x o‘zgaruvchiga o‘zlashtirilad i(ya’ni x ning yo‘naltirilgan obyekti havolasi o‘zgartiriladi). Shun-dan keyin bizda 2 ta (5 va 6) obyekt hamda ularga havola sifatida 2 ta (x va y) o‘zgaruvchi hosil bo‘ladi.
Ba’zi operatsiyalar [masalan, y.append(10) va y.sort() kabilar] obyektni o‘zgartirishish bilan birga, ularga tashqi jihatdan o‘xshash bo‘lib ko‘ringan operatsiyalar [masalan, y = y + [10] va sorted(y) kabi] yangi obyekt yaratadi. Umuman, Pythonda (standart kutubxonaning barcha ho-latlarida ham) obyektni o‘zgartiradigan metodlar xatoliklardan xoli bo‘lish uchun Noneni qaytaradi. Deylik, siz quyidagicha yozgangiz:
128
y = y.sort()
U sizga y ning tartiblashtirilgan nusxasini qaytaradi, deb o‘ylayotgan bo‘lsangiz, uning o‘rniga Nonega ega bo‘lasiz, bu esa oson tahlil qilish mumkin bo‘lgan xatolikka olib keladi.
Yana bitta operatsiyalar klassi mavjudki, unda aynan bitta operatsiya turli tiplar bilan turlicha ishlaydi. U ham bo‘lsa, o‘zlashtirishning kengaytirilgan operatsiyalaridir. Masalan, += ro‘yxatlarni o‘zgartiradi, ammo kortej yoki sonlarni emas. (a_list += [1, 2, 3]) hamda a_list.extend([1, 2, 3]) lar o‘zaro ekvivalent) ro‘yxatni o‘zgartiradi. some_tuple += (1, 2, 3) va some_int += 1 esa yangi obyekt yaratadi.
Agar ikkita o‘zgaruvchi aynan bitta obyektga havolaga ega yoki ega emasligini bilmoqchi bo‘lsan-giz, u holda siz is operatori yoki id tarkibiy funksiyasidan foydalanishingiz mumkin.
Do'stlaringiz bilan baham: |