Pythonni o'rganish: noldan qahramongacha

Birinchidan, Python nima? Uni yaratuvchisi Gido van Rossumga ko'ra Python bu:

"Yuqori darajadagi dasturlash tili va uning asosiy dizayn falsafasi kodlarni o'qish va sintaksis bo'lib, dasturchilarga bir necha kod satrlarida tushunchalarni ifodalashga imkon beradi."

Men uchun Pythonni o'rganishning birinchi sababi, aslida bu chiroyli dasturlash tili edi. Unda kodlash va fikrlarimni ifoda etish tabiiy hol edi.

Yana bir sabab, biz Python-da kodlashni bir necha usuldan foydalanishimiz mumkin edi: ma'lumotlar ilmi, veb-ishlab chiqish va mashinalarni o'rganish bu erda hamma porlaydi. Quora, Pinterest va Spotify barchasi Python-dan o'zlarining veb-saytlarini yaratish uchun foydalanadilar. Keling, bu haqda biroz bilib olaylik.

Asoslar

1. O'zgaruvchilar

O'zgaruvchilar haqida qiymatni saqlaydigan so'zlar sifatida o'ylashingiz mumkin. Oddiy qilib aytganda.

Python-da o'zgaruvchini aniqlash va unga qiymat berish juda oson. Tasavvur qiling, siz 1 raqamini "bitta" deb nomlanuvchi o'zgaruvchiga saqlamoqchisiz.

Bu qanchalik sodda edi? Siz shunchaki "bitta" o'zgaruvchisiga 1 qiymatini tayinladingiz.

Siz istagan har qanday o'zgaruvchiga har qanday boshqa qiymatni belgilashingiz mumkin. Yuqoridagi jadvalda ko'rib turganingizdek, o'zgaruvchi "ikkita" butun sonni 2, "some_number" esa 10000 saqlaydi.

Butun sonlardan tashqari, booleans (True / False), satrlar, suzuvchi va boshqa ko'plab turdagi ma'lumotlardan ham foydalanishimiz mumkin.

2. Boshqarish oqimi: shartli gaplar

"Agar" iborasi to'g'ri yoki noto'g'ri bo'lsa, baholash uchun ifoda ishlatiladi. Agar u rost bo'lsa, u "if" iborasi ichidagi narsalarni bajaradi. Masalan:

2 1 dan katta, shuning uchun "print" kodi bajariladi.

Agar "if" ifoda noto'g'ri bo'lsa, "else" iborasi bajariladi.

1 2 dan katta emas, shuning uchun "else" bayonnomasidagi kod bajariladi.

Bundan tashqari, siz "elif" iborasidan foydalanishingiz mumkin:

3. Loop / Iterator

Pythonda biz turli shakllarda iteratsiya qilishimiz mumkin. Men ikkitasi haqida gaplashaman: vaqt va uchun.

Looping paytida: bayon to'g'ri bo'lsa, blok ichidagi kod bajariladi. Shunday qilib, ushbu kod 1 dan 10 gacha raqamni chiqaradi.

Davr uchun "pastadir" sharti kerak. Agar u to'g'ri bo'lsa, u iteratsiyani davom ettiradi. Ushbu misolda, 11 raqami bo'lganda, loop sharti False ga teng.

Uni yaxshiroq tushunish uchun yana bir asosiy kod biti:

Loop sharti True, shuning uchun uni False qilib qo'ygunimizcha takrorlaydi.

Loop uchun: blokga "num" o'zgaruvchisini qo'llaysiz va "for" iborasi buni sizga qaytaradi. Ushbu kod xuddi kod bilan bir xil chop etadi: 1 dan 10 gacha.

Ko'rasizmi? Bu juda sodda. Diapazon 1dan boshlanadi va 11-elementgacha davom etadi (10-element 10-element).

Ro'yxat: To'plam | Array | Ma'lumotlar tarkibi

Tasavvur qiling-a, siz 1 ni butun o'zgaruvchiga saqlamoqchisiz. Ehtimol, endi siz 2-ni saqlamoqchisiz. Va 3, 4, 5 ...

O'zim istagan butun sonlarni saqlashning boshqa usuli bormi, lekin millionlab o'zgaruvchilarda emas? Siz buni taxmin qildingiz - ularni saqlashning yana bir usuli bor.

List - bu qiymatlar ro'yxatini saqlash uchun ishlatilishi mumkin bo'lgan to'plam (kerakli sonlar kabi). Shunday qilib, foydalanaylik:

Bu, albatta, sodda. Biz massiv yaratdik va uni my_integer-da saqladik.

Ehtimol siz: "Ushbu qatordan qanday qilib qiymat olishim mumkin?"

Ajoyib savol. Ro'yxatda indeks deb nomlangan tushuncha mavjud. Birinchi element 0 (nol) indeksini oladi. Ikkinchisi 1 oladi va hokazo. Siz fikr olasiz.

Aniqroq qilish uchun biz massivni va har bir elementni indeks bilan ifodalashimiz mumkin. Men uni chizishim mumkin:

Python sintaksisidan foydalanib, tushunish ham oson:

Tasavvur qiling, siz butun sonlarni saqlamoqchi emassiz. Siz faqat satrlarni saqlamoqchisiz, masalan, qarindoshlaringizning ismlari ro'yxati. Meniki shunday ko'rinishga ega bo'lardi:

Butun sonlar bilan bir xil ishlaydi. Yaxshi.

Biz shunchaki ro'yxatlar ko'rsatkichlari qanday ishlashini bilib oldik. Ammo baribir sizga qanday qilib ro'yxatdagi ma'lumotlar tuzilmasiga (ro'yxatdagi element) element qo'shishimiz mumkinligini sizga ko'rsatishim kerak.

Ro'yxatga yangi qiymat qo'shishning eng keng tarqalgan usuli - bu qo'shimchalar. Bu qanday ishlashini ko'rib chiqaylik:

qo'shimchalar juda oddiy. Qo'shimcha parametr sifatida elementni qo'llash kerak (masalan. "Effektiv Engineer").

Yaxshi, ro'yxatlar haqida etarli. Keling, boshqa ma'lumotlar tarkibi haqida gaplashaylik.

Lug'at: Kalit-qiymat ma'lumotlari tarkibi

Endi biz bilamizki, ro'yxatlar butun sonlar bilan indekslanadi. Ammo butun sonlarni indeks sifatida ishlatishni istamasak nima bo'ladi? Biz foydalanishimiz mumkin bo'lgan ba'zi ma'lumotlar tuzilmalari raqamli, satr yoki boshqa turdagi indekslardir.

Lug'at ma'lumotlarining tuzilishi bilan tanishib chiqaylik. Lug'at bu kalit qiymat juftliklari to'plamidir. Bu quyidagicha ko'rinadi:

Kalit bu ko'rsatkichni ko'rsatadigan indeksdir. Lug'at qiymatiga qanday kiramiz? Siz buni taxmin qildingiz - kalit yordamida. Buni sinab ko'raylik:

Men haqimda lug'at yaratdim. Mening ismim, laqabim va millatim. Bu atributlar Lug'at kalitlari.

Ro'yxatga indeks yordamida qanday kirishni bilib olganimizdan so'ng, lug'atda saqlangan qiymatga kirish uchun indekslardan (Lug'at kontekstidagi kalitlardan) foydalanamiz.

Masalan, Lug'atda saqlangan barcha qiymatlardan foydalangan holda men haqimda bir ibora chop etdim. Juda oddiy, to'g'rimi?

Lug'atning yana bir yoqimli jihati shundaki, biz har qanday narsadan qiymat sifatida foydalanishimiz mumkin. Men yaratgan lug'atda "yoshi" kalitini va uning haqiqiy sonini qo'shmoqchiman:

Bu erda biz kalit (stranitsa) qiymatiga egamiz (24), bunda simni kalit sifatida va qiymat sifatida butun sonni ishlatamiz.

Biz Ro'yxatlarni qilganimizdek, lug'atga qanday elementlar qo'shish kerakligini bilib olaylik. Qiymatga ishora qiluvchi kalit bu Lug'at nima ekanligini katta qismidir. Bunga elementlarni qo'shish haqida gap ketganda ham to'g'ri:

Biz faqat Lug'at kalitiga qiymat berishimiz kerak. Bu erda hech qanday murakkab narsa yo'q, to'g'rimi?

Iteratsiya: Ma'lumot tuzilmalari orqali aylanish

Python asoslarida bilib olganimizdek, ro'yxat iteratsiyasi juda oddiy. Biz Python dasturchilaridan tez-tez For Loop-ni ishlatamiz. Qani buni bajaraylik:

Shunday qilib, kitob javonidagi har bir kitob uchun biz uni chop etamiz. Juda oddiy va sezgir. Bu Python.

Hesh ma'lumotlarning tuzilishi uchun biz ham loopdan foydalanishimiz mumkin, ammo biz kalitni qo'llaymiz:

Bu uni qanday ishlatishga misol. Lug'atdagi har bir kalit uchun biz kalitni va unga mos keladigan qiymatni chop etamiz.

Buning yana bir usuli - iteritems usulidan foydalanish.

Biz ikkita parametrni kalit va qiymat deb nomladik, ammo bu kerak emas. Biz ularga biron bir narsani nomlashimiz mumkin. Qani ko'raylik:

Biz atributni Lug'at tugmachasi uchun parametr sifatida ishlatganimizni ko'rishimiz mumkin va u to'g'ri ishlaydi. Ajoyib!

Sinflar va ob'ektlar

Bir oz nazariya:

Ob'ektlar bu avtomobil, it yoki velosiped kabi haqiqiy dunyo ob'ektlarining tasviridir. Ob'ektlar ikkita asosiy xususiyatga ega: ma'lumot va xulq.

Avtomobillar g'ildiraklar soni, eshiklar soni va o'tirish sig'imi kabi ma'lumotlarga ega, ular shuningdek o'zini tutish xususiyatiga ega: ular tezlashishi, to'xtashi, qancha yoqilg'i qolganligini ko'rsatishi mumkin va hokazo.

Ma'lumotni atribut va xulq sifatida ob'ektga yo'naltirilgan dasturlash usullari sifatida aniqlaymiz. Yana:

Ma'lumotlar → Xususiyatlar va xatti-harakatlar → Usullar

Sinf - bu alohida ob'ektlar yaratiladigan reja. Haqiqiy hayotda biz ko'pincha bir xil turdagi ko'plab ob'ektlarni topamiz. Mashinalar kabi. Hammasi bir xil tuzilish va model (va ularning barchasida dvigatel, g'ildiraklar, eshiklar va boshqalar mavjud). Har bir mashina bir xil loyihalar to'plamidan qurilgan va bir xil tarkibiy qismlarga ega.

Python ob'ektga yo'naltirilgan dasturlash rejimi: ON

Python, ob'ektga yo'naltirilgan dasturlash tili sifatida quyidagi tushunchalarga ega: sinf va ob'ekt.

Sinf - bu reja, uning ob'ektlari uchun namuna.

Shunday qilib, yana bir sinf, bu shunchaki namuna yoki atributlar va xulq-atvorni aniqlash usulidir (biz bu haqda nazariya bo'limida gaplashdik). Misol tariqasida, transport vositasi sinfining o'ziga xos xususiyatlari bor, ular transport vositalarining qaysi ob'ektlari ekanligini belgilaydi. G'ildiraklar soni, idish turi, o'tirish sig'imi va maksimal tezlik - bu barcha transport vositalarining xususiyatlari.

Shuni yodda tutgan holda, sinflar uchun Python sintaksisini ko'rib chiqaylik:

Biz sinf bayoni bilan sinflarni aniqlaymiz - va shu. Oson, shunday emasmi?

Ob'ektlar sinf namunalari. Biz sinfga nom berib, misol yaratamiz.

Bu erda mashina - bu transport vositasining sinf ob'ekti (yoki namunasi).

Avtotransport sinfimiz to'rtta xususiyatga ega ekanligini unutmang: g'ildiraklar soni, idish turi, o'tirish hajmi va maksimal tezlik. Biz ushbu xususiyatlarning barchasini transport vositasi ob'ektini yaratishda o'rnatamiz. Shunday qilib, bu erda biz uni ishga tushirganda ma'lumotlarni olish uchun o'z sinfimizni aniqlaymiz:

Biz tashabbus usulidan foydalanamiz. Biz uni konstruktor usuli deb ataymiz. Shunday qilib, biz transport vositasini yaratishda ushbu xususiyatlarni aniqlashimiz mumkin. Tasavvur qiling, biz Tesla Model S-ni yaxshi ko'ramiz va bunday ob'ektni yaratmoqchimiz. U to'rt g'ildirakka ega, elektr energiyasi bilan ishlaydi, besh o'ringa joy bor va maksimal tezligi soatiga 250 km (155 milya). Ushbu ob'ektni yarataylik:

To'rt g'ildirak + elektr "tank turi" + besh o'rindiq + 250 km / soat maksimal tezlik.

Barcha atributlar o'rnatildi. Ammo bu sifatlarning qadriyatlariga qanday kirishimiz mumkin? Ob'ektga ular haqida so'rab xabar yuboramiz. Biz buni usul deb ataymiz. Bu ob'ektning harakati. Uni amalga oshiraylik:

Bu ikkita usulning bajarilishi: number_of_wheels va set_number_of_wheels. Biz buni oluvchi va sozlovchi deb ataymiz. Chunki birinchisi atribut qiymatini oladi, ikkinchisi esa atribut uchun yangi qiymatni o'rnatadi.

Python-da, biz oluvchilar va to'suvchilarni aniqlash uchun @property (dekorativlar) yordamida buni amalga oshirishimiz mumkin. Uni kod bilan ko'raylik:

Va biz ushbu usullardan atributlar sifatida foydalanishimiz mumkin:

Bu aniqlash usullaridan biroz farq qiladi. Usullar atributlar sifatida ishlaydi. Masalan, biz yangi g'ildiraklar sonini o'rnatganimizda, biz ikkitasini parametr sifatida ishlatmaymiz, lekin 2 qiymatini number_of_wheels ga o'rnatamiz. Bu pifonik olter va setter kodini yozishning bir usuli.

Ammo biz boshqa usullar uchun ham "make_noise" usuli kabi usullardan foydalanishimiz mumkin. Qani ko'raylik:

Ushbu usul deb ataganimizda, u faqat "VRRRUUUUM" satrini qaytaradi.

Enkapsülasyon: ma'lumotni yashirish

Enkapsulatsiya - bu ob'ektlarning ma'lumotlari va usullariga to'g'ridan-to'g'ri kirishni cheklaydigan mexanizm. Ammo shu bilan birga, ushbu ma'lumotlarning ishlashini osonlashtiradi (ob'ektlarning usullari).

«Enkapsülasyon ma'lumotlar va a'zolar funktsiyalarini yashirish uchun ishlatilishi mumkin. Ushbu ta'rifga ko'ra, kapsülasyon, ob'ektning ichki ko'rinishi odatda ob'ektning ta'rifidan tashqarida ko'rinmasligini anglatadi. "- Vikipediya

Ob'ektning barcha ichki namoyishi tashqi tomondan yashiringan. Faqatgina ob'ekt o'zining ichki ma'lumotlari bilan o'zaro ta'sir qilishi mumkin.

Birinchidan, ommaviy va nodavlat nodavlat o'zgaruvchilar va usullar qanday ishlashini tushunishimiz kerak.

Jamiyatning o'zgaruvchan o'zgarishlari

Python sinfi uchun biz konstruktor usulimiz doirasida umumiy namuna o'zgaruvchisini ishga tushirishimiz mumkin. Buni ko'raylik:

Konstruktor usuli doirasida:

Bu erda biz public_name o'zgaruvchisiga argument sifatida first_name qiymatini qo'llaymiz.

Sinf ichida:

Bu erda biz birinchi ismni argument sifatida qo'llashimiz shart emas va barcha misol ob'ektlari TK bilan sozlangan sinf atributiga ega bo'ladi.

Salqin. Endi biz jamoat namunalari o'zgaruvchilari va sinf atributlaridan foydalanishimiz mumkinligini bilib oldik. Umumiy qismning yana bir qiziq tomoni shundaki, biz o'zgaruvchan qiymatni boshqarishimiz mumkin. Men nimani nazarda tutyapman? Bizning ob'ekt o'zgaruvchan qiymatini boshqarishi mumkin: o'zgaruvchi qiymatlarni oling va o'rnating.

Shaxslar sinfini yodda tutgan holda, biz birinchi_name o'zgaruvchisiga boshqa qiymatni o'rnatishni xohlaymiz:

Biz boramiz. Biz birinchi_name nusxasi o'zgaruvchisiga yana bir qiymatni (kaio) o'rnatdik va u qiymatni yangiladi. Oddiy qilib aytganda. Umumiy o'zgaruvchi bo'lganligi sababli biz buni qila olamiz.

Nodavlat instansiya o'zgaruvchisi

Biz bu erda "shaxsiy" atamasini ishlatmaymiz, chunki Python-da biron bir atribut haqiqatan ham shaxsiy emas (odatda keraksiz ish hajmisiz). - PEP 8

Umumiy namuna o'zgaruvchisi sifatida biz nodavlat bo'lmagan misol o'zgaruvchisini ham konstruktor usulida, ham sinf ichida aniqlashimiz mumkin. Sintaksis farqi: ommaviy bo'lmagan o'zgaruvchilar uchun o'zgaruvchi nomdan oldin pastki qavat (_) dan foydalaning.

"Xususiy" misol o'zgaruvchilari Python-da mavjud emas, faqat ob'ekt ichidan kirish mumkin emas. Shu bilan birga, Python-ning ko'p kodi amal qiladigan konventsiya mavjud: pastki chiziq (masalan, _spam) bilan berilgan nom API-ning nodavlat qismi sifatida ko'rib chiqilishi kerak (bu funktsiya, usul yoki ma'lumotlar a'zosi bo'lsin). "- Python Software Foundation

Bunga misol:

Elektron pochta o'zgaruvchanligini ko'rdingizmi? Nodavlat o'zgaruvchini shunday aniqlaymiz:

Biz unga kirishimiz va yangilashimiz mumkin. Nodavlat o'zgaruvchilar shunchaki bir konventsiya bo'lib, uni API nodavlat qismi sifatida ko'rib chiqish kerak.

Shunday qilib, biz buni sinf ta'rifi ichida bajarishga imkon beradigan usuldan foydalanamiz. Buni tushunish uchun ikkita usulni (elektron pochta va update_email) amalga oshiraylik:

Endi biz ushbu usullardan foydalangan holda umumiy bo'lmagan parametrlarni yangilashimiz va ularga kirishimiz mumkin. Ko'ramiz:

  1. First_name TK va tk@mail.com elektron pochta manzillari yordamida yangi ob'ektni yaratdik
  2. Usul bilan nodavlat o'zgaruvchiga kirish orqali elektron pochtani chop etdi
  3. Sinfimizdan tashqarida yangi elektron pochta xabarlarini o'rnatishga harakat qildingiz
  4. Nodavlat o'zgaruvchini API nodavlat qismi sifatida ko'rib chiqishimiz kerak
  5. Bizning namunaviy usuli bilan nodavlat o'zgaruvchini yangiladi
  6. Muvaffaqiyat! Buni sinfimiz ichida yordamchi usul bilan yangilashimiz mumkin

Xalq usuli

Xalq usullari bilan biz ularni sinfimizdan tashqarida ham foydalanishimiz mumkin:

Buni sinab ko'raylik:

Ajoyib - biz hech qanday muammosiz foydalanishimiz mumkin.

Nodavlat usul

Ammo ommaviy bo'lmagan usullar bilan biz buni qila olmaymiz. Kelinglar, xuddi shu Shaxslar sinfini yarataylik, lekin pastki chiziq (_) yordamida show_age nodavlat usulida.

Va endi biz ushbu nodavlat usulni o'z ob'ekti bilan chaqirishga harakat qilamiz:

Biz unga kirishimiz va yangilashimiz mumkin. Nodavlat usullar - bu shunchaki bir konventsiya va API ning nodavlat qismi sifatida ko'rib chiqilishi kerak.

Buni qanday ishlatishimiz uchun misol:

Bu erda bizda _get_age nodavlat usuli va show_age ommaviy usuli mavjud. Show_age-dan ob'ektimiz (bizning sinfimizdan tashqari) va _get_age-dan faqat bizning sinfimiz ichida (show_age usuli ichida) foydalanish mumkin. Ammo yana: konventsiya masalasi sifatida.

Encapsulation xulosasi

Inkapsulatsiya yordamida biz ob'ektning ichki ko'rinishini tashqi tomondan yashirishni ta'minlashimiz mumkin.

Meros: xatti-harakatlar va xususiyatlar

Ba'zi ob'ektlarda umumiy narsalar mavjud: ularning harakati va xususiyatlari.

Masalan, men ba'zi xususiyatlar va xatti-harakatlarimni otamdan meros qilib oldim. Men uning ko'zlari va sochlarini o'ziga xos xususiyatlar sifatida, uning sabrsizligi va introversiyasini xulq-atvor sifatida meros qilib oldim.

Ob'ektga yo'naltirilgan dasturlashda sinflar umumiy xususiyatlarni (ma'lumotlar) va xatti-harakatlarni (usullarni) boshqa sinfga ega bo'lishlari mumkin.

Keling, yana bir misolni ko'rib chiqamiz va uni Python-da amalga oshiramiz.

Avtomobilni tasavvur qiling. G'ildiraklar soni, o'rindiq sig'imi va maksimal tezlik - bularning barchasi avtomobil xususiyatidir. Aytishimiz mumkinki, ElectricCar klassi ushbu xususiyatlarni odatiy Avtomobil sinfidan meros qilib oladi.

Bizning "Avtomobil" sinfimiz:

Boshlangandan so'ng, biz yaratilgan barcha namuna o'zgaruvchilardan foydalanishimiz mumkin. Yaxshi.

Pythonda biz parametr sifatida ota-ona sinfini bolalar sinfiga qo'llaymiz. ElectricCar klassi bizning Car sinfimizdan meros olishi mumkin.

Oddiy qilib aytganda. Boshqa biron bir usulni amalga oshirishning hojati yo'q, chunki bu sinf allaqachon mavjud (Car sinfidan meros qolgan). Buni isbot qilaylik:

Chiroyli.

Bo'ldi shu!

Python asoslari haqida ko'p narsalarni bilib oldik:

  • Python o'zgaruvchilari qanday ishlaydi
  • Python shartli bayonnomalari qanday ishlaydi
  • Python aylanishi qanday ishlaydi (while & for)
  • Ro'yxatlarni qanday ishlatish: To'plam | Array
  • Lug'at kalitlari qiymati to'plami
  • Ushbu ma'lumotlar tuzilmalari orqali qanday qilib iteratsiya qilishimiz mumkin
  • Ob'ektlar va sinflar
  • Ob'ektlarning ma'lumotlari sifatida atributlar
  • Usullar ob'ektlarning harakati sifatida
  • Python tozalovchilaridan va to'suvchilardan foydalanish
  • Enkapsulatsiya: ma'lumotni yashirish
  • Meros: xatti-harakatlar va xususiyatlar

Tabriklaymiz! Siz Python haqidagi ushbu zich tarkibni tayyorladingiz.

Agar siz Python-ning to'liq kursini xohlasangiz, ko'proq haqiqiy kodlash ko'nikmalarini o'rganing va loyihalarni yarating, Bir oylik Python Bootcamp-ni sinab ko'ring. U erda ko'rishguncha ☺

Mening sayohatimni o'rganish va dasturlashni o'zlashtirish haqida ko'proq hikoyalar va postlarni ko'rish uchun mening Renaissance Developer nashrini kuzatib boring.

Xursand bo'ling, o'rganishni davom eting va har doim kodlashni davom eting.

Ushbu tarkib sizga yoqdi degan umiddaman. Ko-Fi-dagi ishlarimni qo'llab-quvvatlang

Mening Twitter va Github. ☺