[SKAN MŪZIKA]
DEIVIDS MALANS: Labi.
Tas ir CS50, un šī ir sestā nedēļa, kurā mēs beidzot pārejam no
Scratch uz C, un tagad uz Python.
Un patiesi, šī būs zināmā mērā unikāla pieredze, jo, tāpat kā pirms
dažām nedēļām — iespējams, pirmo reizi — un tagad, šodien, jūs
apgūsiet jaunu valodu.
Taču mērķis šeit nav tikai noslogot jūs ar saturu, sintaksi un ko tur
vēl, bet drīzāk - nodrošināt jums visiem zināšanas, lai nākotnē jūs
paši sev mācītu jaunas valodas.
Un tāpēc patiešām - tas, ko mēs darīsim šodien, tas, ko mēs darīsim
šonedēļ, ir - palīdzēt jums būt neatkarīgiem.
Un, kad Python būs pagātne un pasaule būs pārgājusi uz kādu citu
valodu, jūs būsiet labi sagatavoti, lai saprastu, kā apgūt kādu jaunu
sintaksi, jaunu valodu un risināt problēmas.
Tagad atcerieties, nulles nedēļā mēs sākām šeit — vienkārši sveicam
pasauli.
Un jau nedēļu vēlāk valodā C, viss strauji kļuva daudz, daudz
sarežģītāks.
Un, ja jums joprojām ir problēmas ar sintaksi, pārbaudāt savas
piezīmes vai iepriekšējo kodu, tas ir pilnīgi normāli.
Un tas ir viens no iemesliem, kāpēc bez C ir arī citas valodas,
tostarp šī valoda, ko sauc par Python.
Cilvēki gadu desmitu garumā ir sapratuši: jee, tas ne vienmēr bija
labākais dizaina risinājums, vai arī cilvēki ir sapratuši: oho, jūs
zināt ko?
Tagad, kad datori ir kļuvuši ātrāki ar lielāku atmiņu un ātrākiem
centrālajiem procesoriem, mēs faktiski ar mūsu programmēšanas valodām
varam paveikt vairāk.
Tātad, tāpat kā cilvēka valodas attīstās, attīstās arī faktiskās
programmēšanas valodas.
Un pat programmēšanas valodā parasti ir dažādas versijas.
Mēs, piemēram, esam izmantojuši valodas C C11 versiju, kas tika
atjaunināta 2011. gadā.
Taču pati Python valoda turpina attīstīties, un tagad tai ir 3 plus
versija.
Un arī tur šīs lietas attīstīsies tuvākajā nākotnē.
Par laimi, tas, ko jūs tūlīt redzēsiet, ir “Hello, World!” trešo
reizi, bet tas būs burtiski tā:
Nekādas trakās sintakses augšā vai lejā, mazāk semikolu, ja tādi ir,
mazāk iekavu.
Un patiešām daudzi traucējošie faktori pazūd.
Tātad, lai tur nokļūtu, apsvērsim, kā mēs līdz šim esam programmējuši.
Tātad jūs rakstāt programmu C valodā, un, cerams, jums nav sintakses
kļūdu, tāpēc esat gatavs to izveidot, tas ir - kompilēt.
Un tā: jūs palaižat make, un pēc tam palaižat programmu, piemēram,
./hello.
Vai, ja atcerēsieties otro nedēļu, kad mēs ielūkojāmies zem pārsega
tajā, ko dara make, tā tiešām palaiž faktisko kompilatoru — ko sauc
par clang — varbūt ar dažiem komandrindas argumentiem izveido
programmu ar nosaukumu hello.
Un tad jūs varētu izdarīt ./hello.
Tātad šodien jūs sāksiet darīt kaut ko līdzīgu pēc būtības, bet ar
mazākiem soļiem.
Jums vairs nebūs jākompilē savs kods un pēc tam tas jāpalaiž, un pēc
tam, iespējams, tas jālabo vai jāmaina, un pēc tam jāapkopo kods un
jāpalaiž tas, un tad atkārtot un atkārtot to atkal.
Koda palaišanas process tiks vienkāršots līdz tikai vienai darbībai.
Pagaidām par to var domāt, ka, lai gan C bieži tiek izmantota kā
kompilēta valoda, kurā jūs vispirms to konvertējat nullēs un
vieniniekos, Python ļaus jums paātrināt darbu, kurājums,
cilvēkprogrammētājiem, nav jākompilē.
Jūs vienkārši palaidīsiet tā saukto tulku — kas pēc konstrukcijas ir
nosaukts tieši tāpat kā pati valoda — un palaidīsiet šo programmu,
kas būs instalēta VS Code vai arī jūsu Mac datoros vai personīgajos
datoros.
Tas tikai liks jūsu datoram interpretēt šo kodu un izdomāt, kā nokļūt
līdz zemākajam 0 un 1 līmenim.
Bet kods vairs nav jākompilē pašam.
Ņemot to vērā, padomājiet, kā kods izskatīsies blakus.
Patiesībā, apskatīsim dažus Scratch blokus, tāpat kā mēs darījām
pirmajā nedēļā ar valodu C, un izpildīsim vēl dažus blakus.
Jo, lai gan dažas sintakses šonedēļ un turpmāk būs atšķirīgas, idejas
patiešām būs vienādas.
Pagaidām nav tik daudz kā intelektuāli jauna.
Tā kā nulles nedēļā mēs, iespējams, būtu sasveicinājušies ar pasauli
ar šo purpursarkano uzdevumu, šodien, protams, vai, pareizāk sakot,
pirmajā nedēļā, C valodā tas izskatījās šādi.
Bet šodien, virzoties uz priekšu, tas gluži vienkārši izskatīsies
šādi.
Un, ja mēs virzāmies turp un atpakaļ - tikai uz mirkli, šeit atkal ir
valodas C versija - pamanot C valodai līdzīgās īpašības.
Un tikai mazs ieskats šeit, Python valodā, es apgalvoju, ka tagad tas
ir šis.
Par ko jums šķietami vairs nav jāuztraucas?
Kas pazuda?
Tātad semikols ir pazudis.
Un tiešām, jums tie vairs nav vajadzīgi, lai pabeigtu lielāko savu
domu daļu.
Vēl kaut kas?
Mērķauditorija: slīpsvītra n.
DEIVIDS MALANS: Tātad slīpsvītras n nav.
Un tas ir interesanti, jo mēs joprojām iegūsim jaunu līniju, taču mēs
redzēsim, ka tā ir kļuvusi par noklusējuma līniju.
Un šī ir nedaudz smalkāka, taču tagad funkcija tiek saukta par print,
nevis par printf.
Tāpēc šajā ziņā tā ir nedaudz pazīstamāka.
Labi.
Tātad, runājot par bibliotēku izmantošanu — tas ir, kodu, ko citi
cilvēki ir uzrakstījuši, — mēs esam izdarījuši tādas darbības kā
#include cs50.h, lai izmantotu CS50 galvenes datni vai standarta I/O,
vai standarta lib, vai virkni, vai jebkuras citas galvenes datnes,
visas, ko esat izmantojuši.
Turpinot, šajā pirmajā nedēļā, mēs jums iedosim līdzīgu CS50
bibliotēku — tikai īsa apmācība, un mēs ātri izkustēsimies, jo
patiesībā strādāt Python valodā ir daudz vieglāk, kā mēs to vēlāk
redzēsim.
Bet sintakse tai darbībai tagad būs CS50 bibliotēkas importēšana šādā
veidā.
Un, kad mums ir šī iespēja, mēs faktiski uzreiz varam sākt rakstīt
kādu kodu.
Patiesībā ļaujiet man šeit pāriet uz VS kodu.
Un tāpat kā agrāk es izveidošu jaunu datni.
Bet tā vietā, lai izveidotu kaut ko ar nosaukumu .c, es iešu uz
priekšu un izveidošu savu pirmo programmu ar nosaukumu hello.py,
izmantojot koda vietu hello punkts py.
Tas, protams, dod man šo jauno cilni.
Un ļaujiet man, gluži vienkārši, darīt to, ko es ierosināju — print,
"Hello, world" bez /n, bez semikola, bez f komandā print.
Un tagad ļaujiet man doties uz savu termināļa logu.
Un man tas nav jākompilē.
Man nav jādara punktveida slīpsvītra.
Tā vietā es palaidu programmu ar nosaukumu python, kuras pastāvēšanas
mērķis tagad ir interpretēt manu kodu no augšas uz leju, no kreisās
puses uz labo.
Un, ja es palaistu python no hello.py, turot īkšķus, kā vienmēr -
voilà!
Tagad esmu izdrukājis "hello, world." Tāpēc šķiet, ka mēs esam
ieguvuši jaunu rindiņu bez maksas tādā nozīmē, ka tas notiek
automātiski.
Dolāra zīme nav dīvaini izvietota tajā pašā rindiņā, kā tas kādreiz
bija pirmajā nedēļā.
Bet tā šeit ir tikai neliela detaļa.
Ja tagad pārejam atpakaļ uz dažām citām iespējām — tiešām, ar CS50
bibliotēku, jūs varat arī ne tikai importēt pašu bibliotēku, bet arī
noteiktas funkcijas.
Un jūs redzēsiet, ka īslaicīgi mēs jums piešķirsim palīgfunkciju, ko
sauc par get_string, tāpat kā valodā C, kas liek tai darboties tieši
tāpat kā C valodā.
Un mēs redzēsim pāris citas funkcijas, kas primāri tikai atvieglos
dzīvi.
Bet, ātri, vai mēs ietrenēsimies tā, lai nekas patiešām nebūtu
līdzīgs CS50?
Labi.
Nu, kā Python vispārīgāk ir ar funkcijām?
Ja vēlaties, uztaisīsim ātru ievadu, līdzīgi kā mēs to darījām
pirmajā nedēļā ar valodu C, salīdzinot vienu ar otru.
Tātad mūsu Scratch pasaulē viena no pirmajām programmām, ko mēs
rakstījām, bija šī te, kur mēs prasījām cilvēkiem viņu vārdu.
Pēc tam mēs izmantojām atgriešanās vērtību, kas tika automātiski
saglabāta šajā atbildes mainīgajā kā otrs arguments, lai pievienojot,
lmēs varētu teikt "Hello, David" vai "Hello, Carter". Tātad, tas bija
nulles nedēļā.
Pirmajā nedēļā mēs to pārveidojām uz šo.
Un šeit ir lielisks piemērs tādām lietām kā ātrā eskalācija.
Un atkal tāpēc mēs sākām lietot Scratch.
Šeit ir tikai tik daudz traucēkļu tās pašas idejas sasniegšanā.
Un pat šodien mēs atteiksimies no daļas no šīs sintakses.
Tātad valodā C, mums bija jādeklarē mainīgais kā virkne, te.
Mums, protams, bija semikols un tā tālākk.
Nu, Python valodā salīdzināmais kods tagad izskatīsies vienkāršāk -
šādi.
Tātad semikols atkal pazudis abās rindās, tā iemesla dēļ.
Tātad tas ir labi.
Kas vēl, šķiet, ir mainījies vai pazudis?
Jā.
Mērķauditorija: [? Vai jums ir?]
tāda paša veida mainīgais?
DEIVIDS MALANS: Jā.
Tāpēc man nebija īpaši jāsaka, ka atbilde tagad ir virkne.
Un patiešām Python valoda ir dinamiski drukāta.
Un patiesībā tā no konteksta secinās, ko tieši jūs glabājat šajā
mainīgajā.
Citas detaļas, kas šķiet nedaudz atšķirīgas?
Mazliet savādākas.
Kas vēl jums iekrīt acīs?
es atgriezīšos.
Šī bija C versija.
Un varbūt tagad koncentrējieties uz otro rindiņu, jo mēs esam gana
izsmēluši pirmo.
Šeit ir Python versija.
Kas šeit atšķiras?
Jā?
Mērķauditorija: jums nav jāuztraucas par %s vai procentiem.
mainīgais pēc [? tiem. ?]
DEIVIDS MALANS: Jā.
Nav vairs neviena %s.
Patlaban nav otra argumenta, kā tāda, ko drukāt.
Tagad tas joprojām ir nedaudz dīvaini.
It kā es šeit būtu aritmētiski izvietojis kādu papildinājumu.
Bet tas tā nav.
Dažiem no jums jau ir bijusi programma.
Un daži no jums varētu zināt, ko nozīmē pluss šajā kontekstā?
Tātad, lai apvienotu vai, tehniskajā valodā, kāds zina šo žargonvārdu?
Jā.
Mērķauditorija: Konkatenēt.
DEIVIDS MALANS: Konkatenēt.
Tātad konkatenēt - ir stilīgs veids, ko Scratch sauc par
pievienošanu, proti, - paņemt vienu virkni kreisajā pusē, vienu
virkni labajā un savienot tās kopā.
Lai tos salīmētu kopā, ja vēlaties.
Tātad tas nav papildinājums.
Tā būtu, ja tā vietā būtu iesaistīti skaitļi.
Bet tāpēc, ka šajā mainīgajā mums ir virkne — Hello comma — un vēl
viena virkne, pamatojoties uz to, ko cilvēks ievadīja, reaģējot uz šo
get_string funkciju.
Tas konkatenēs Hello, komats, atstarpe, un pēc tam Deivids vai
Kārters vai ko citu, ko cilvēks ir ierakstījis.
Bet izrādās, ka Python valodā to var izdarīt savādākos veidos.
Un mēs jums parādīsim dažus no tiem.
Un arī šajā gadījumā mēģiniet nesatraukties vai neapjaukt no
dažnedažādiem veidiem, kā var atrisināt problēmas.
Izredzes ir tādas, ka jūs saņemsiet padomus un paņēmienus visam
mūžam, ja turpināsiet programmēt,.
Tāpēc sniegsim tikai dažus iespējamos veidus.
Tātad, šeit ir otrs veids, kā izdrukāt hello, komats, Deivids vai
hello, komats, Kārters.
Bet kas ir mainījies?
Iepriekšējā versijā es skaidri izmantoju konkatenēšanu.
Un atstarpe šeit ir gramatiski svarīga, lai mēs to iegūtu pēdējā
frāzē.
Tagad es ierosinu atbrīvoties no šīs atstarpes, lai pievienotu komatu
arī ārpus pēdiņām.
Bet, ja atcerēsieties C valodu, tas, iespējams, nozīmē tikai to, ka
print, kas pēc būtības ir līdzīga printf, var būt ne tikai viens
arguments, bet pat divi.
Un patiesībā šī komata dēļ pēdiņām pa vidu, tas ir hello, komats, un
pēc tam tas tiks automātiski konkatenēts ar — pat neizmantojot plusu,
neatkarīgi no atbildes vērtības.
Un pēc noklusējuma, tikai gramatikas skaistumam, print funkcija
vienmēr nodrošina atstarpi starp katru no vairākiem argumentiem, ko
ievadāt.
Mēs redzēsim, kā jūs varat to ignorēt.
Bet pagaidām tas ir tikai vēl viens veids, kā to izdarīt.
Tagad, iespējams, labāks, kaut arī nedaudz sarežģīts veids, kā to
izdarīt – vai tikai arvien biežāk sastopamais veids – iespējams, ir
trešā versija, kas arī izskatās nedaudz dīvaina.
Un, iespējams, dīvainības izlec.
Mēs pēkšņi esam ieviesuši šīs figūriekavas, kuru, es apsolīju,
lielākoties vairs nav.
Un tās ir.
Bet šīs virknes iekšpusē esmu izveidojis figūriekavas, ko tas varētu
nozīmēt?
Tikai intuitīvi.
Un šeit ir piemērs, kā jūs mācāties jaunu valodu.
Vienkārši no konteksta seciniet, kā Python, iespējams, darbojas.
Ko tas varētu nozīmēt?
Jā?
Mērķauditorija: [nesadzirdami]
DEIVIDS MALANS: Jā.
Tātad šī ir norāde, jo figūriekavas — jo tā tika izstrādāta Python
valoda — mēs vēlamies pievienot atbildes vērtību, nevis burtiski
ATBILDI.
Un stilīgais vārds šeit ir tāds, ka atbildes mainīgais tiks
interpolēts, tas ir - tiks aizstāts ar tā faktisko vērtību.
Bet, bet, bet-- un tas patiesībā izskatās dīvaini; tas tika ieviests
Python valodā pirms dažiem gadiem.
Acīmredzot kas man vēl bija jāmaina, lai šīs figūriekavas darbotos?
Jā?
Mērķauditorija: Nometiet f pirms... DEIVIDS MALANS: Jā.
Tur ir šis dīvainais f.
Un tā, tā ir kā daļa no printf.
Bet tagad tas ir iekavās.
Tas ir tikai veids, kā Python to izstrādāja.
Tāpēc pirms dažiem gadiem, kad viņi ieviesa tā sauktās formāta
virknes vai fstrings, jūs burtiski pievienojāt burtu f virknēm
pēdiņās.
Un pēc tam var izmantot šādas viltības, piemēram, ievietot
figūriekavas, lai vērtība tiktu automātiski aizstāta.
Ja aizmirstat f, jūs burtiski redzēsiet hello, komats, figūriekavas,
atbilde, aizverošās figūriekavas.
Ja pievienojat f, tas patiešām ir interpolēts.
Vērtība ir pievienota.
Labi.
Jautājumi par to, kā šajā gadījumā mēs varam vienkārši sasveicināties
ar pasauli, izmantojot Python.
Jā?
Mērķauditorija: Ja jūs to darītu bez f, kas notiktu?
Mērķauditorija: [? F. ?]
DEIVIDS MALANS: Bez f?
Ja izlaidīsiet f, jūs burtiski redzēsit HELLO, komats, figūriekavas,
ATBILDE, aizverošās figūriekavas.
Tad patiešām izdarīsim to.
Ļaujiet man ātri atgriezties pie VS Code šeit.
Man joprojām ir atvērta datne ar nosaukumu hello.py.
Un ļaujiet man iet uz priekšu un nedaudz mainīt to.
Tāpēc es iešu uz priekšu un, teiksim, no cs50 importēšu get_string.
Un tā ir tikai jaunā sintakse, ko es ierosinu izmantot, lai importētu
funkciju no kāda cita bibliotēkas.
Tagad es uzdošu jautājumu — izmantosim get_string, saglabājot
atbildes rezultātu.
Tātad get_string, pēdiņās "What's your name?" Un tad šajā rindā es
apzināti kļūdīšos, tieši kā jūsu jautājumā.
Ļaujiet man vienkārši pateikt hello, komats, atbilde, un tikai šo.
Pat ja atbilde ir mainīgais, Python nebūs tik pārgalvīga, lai
vienkārši pievienotu mainīgā, ko sauc par atbildi, vērtību.
Protams, ja es ierakstīšu savu vārdu, tas būs - ups!
Es rakstīju pārāk ātri.
Ļaujiet man turpināt un atkārtot to vēlreiz.
Ja es palaižu python ar hello.py, ierakstu savu vārdu un nospiežu
taustiņu Enter, es saņemu hello, komats, atbilde.
Nu, ļaujiet man izdarīt vienu labāk.
Ļaujiet man uzlikt šīs figūriekavas tāpat kā iepriekš.
Ļaujiet man atkārtoti palaist python no hello.py.
What's your name?
DAVID.
Un šeit atkal ir atbilde uz jūsu jautājumu.
Tagad mēs burtiski iegūstam figūriekavas.
Galu galā risinājums šeit ir tikai pievienot f, atkārtoti palaist
manu programmu kopā ar David.
Un tagad: hello, komats, David.
Tāpēc tas, protams, ir nedaudz sarežģītāks nekā tie, kuriem ir pluss
vai komats, taču tas kļūst par arvien biežāk izmantojamu.
Kāpēc?
jo jūs varat to lasīt no kreisās uz labo pusi.
Tas ir jauki un ērti.
Tas ir ne tik sarežģīts kā %s.
Tātad, ja vēlaties, tā ir jauna un uzlabota printf versija C valodā,
kas balstīta uz programmētāju gadu desmitiem ilgo pieredzi, veicot
šādas darbības.
Vai jums ir jautājumi par drukāšanu šādā veidā?
Tagad mēs esam ceļā uz programmēšanu Python valodā.
Jebko?
Labi.
Nu, ko mēs vēl varam darīt ar šo valodu?
Ļaujiet man ieteikt mums uzskatīt, ka mums, piemēram, ir arī dažas
citas funkcijas, kuras mēs varam pievienot kombinācijai, proti,
teiksim - arī daži datu veidi.
Ļaujiet man pāršķirstīt šeit, lai atgrieztos pie slaidiem.
Un Python valodā ir dažādi datu veidi, kā mēs drīz redzēsim.
Bet tie nav tik precīzi formulēti.
Kā mēs jau redzējām, izmantojot virkni no get_string, jums nav
skaidri jānorāda, kas tas ir.
Bet jūs redzējāt — atcerieties, C valodā — visus šos dažādos datu
tipus.
Un tad Python valodā šis saraksts būs patīkami īsāks.
Tātad, šeit ir mūsu saraksts C valodā.
Šeit ir saīsināts Python saraksts.
Tātad mums joprojām būs virknes, bet tās tagad tiks īsāk sauktas par
str - STR.
Mums joprojām būs int veseliem skaitļiem.
Mums joprojām būs float peldošā komata vērtībām.
Mums pat būs bool pateisam un nepatiesam.
Bet tas, kā tagad trūkst no saraksta ir - long un float.
Un kāpēc tā?
Pareizāk sakot, long un double.
Atgādināsim, ka C valodā tie izmantoja vairāk bitu.
Python valodā, savukārt, mazākie datu tipi (tie paši — int un float)
izmantoja vairāk bitu jūsu vietā.
Un tāpēc jums nav jānošķir mazi no lieliem.
Jūs izmantojat tikai vienu datu tipu, un valoda nodrošina lielāku
diapazonu nekā iepriekš.
Tomēr izrādās, ka būs arī dažas citas Python iespējas un šie datu
tipi: viens no tiem tiks saukts par diapazonu, bet otrs — par
sarakstu.
Tāpat pazudīs arī masīvi.
Mēs faktiski izmantosim kaut ko, ko burtiski sauc par sarakstu.
Kortēži — sava veida x, y pāri koordinātām un tamlīdzīgām lietām.
Dikti vārdnīcām — tāpēc mums būs iebūvētas iespējas atslēgu un
vērtību, kā arī komplektu glabāšanai.
Matemātiski - kopa ir vērtību kopums, taču tā automātiski atbrīvo jūs
no dublikātiem.
Tātad, ja mēs vēlētos, mēs pilnībā varētu visas šīs lietas ieviest C
valodā.
Patiešām, piektajā problēmu kopā jūs esat ieviesuši savu
pareizrakstības pārbaudītāju, izmantojot kāda veida jaucējtabulu.
Izrādās, ka Python jūs varat atrisināt tās pašas problēmas, tikai
nedaudz vieglāk.
Patiesībā ļaujiet man šeit atgriezties pie VS Code un ieteikt
rīkoties šādi.
Ļaujiet man turpināt un izveidot datni ar nosaukumu dictionary.py.
Ļaujiet man ierosināt, ka es mēģinu ieviest, teiksim - piektajā
problēmu kopā, - mūsu pareizrakstības pārbaudītāju Python valodai,
nevis C, un galu galā panākt tādu pašu uzvedību, ar kuru es varēšu
pārbaudīt veselas virknes vārdu pareizrakstību.
Tātad tas ir mazliet pārsteidzīgi, jo jūs redzēsiet, ka šodienas
laikā sintakse tiks pārskatīta.
Bet pagaidām man ir jauna datne ar nosaukumu dictionary.py.
Un ļaujiet man sākt veidot dažus vietturus funkcijām.
Mēs tūlīt redzēsim, ka Python valodā jūs varat definēt funkciju, ko
sauc par pārbaudi (check), un šī pārbaudes funkcija var izmantot
vārdu kā ievadi.
Un es atgriezīšos pie tā pēc brīža.
Python valodā es varu definēt otru funkciju, piemēram, ielādi (load),
kas pati paņems visu vārdnīcu, tāpat kā piektajā problēmu kopā.
Un es turpināšu, atgriežoties pie īstenošanas.
Tikmēr mēs līdzīgā veidā varētu ieviest funkciju, ko sauc par izmēru
(size), kas neprasa argumentus, bet galu galā atgriezīs manas vārdu
vārdnīcas lielumu.
Un tad, visbeidzot, lai nodrošinātu atbilstību piektajai problēmu
kopai, mēs varētu definēt izkraušanas (unload) funkciju, kuras mērķis
ir atbrīvot jebkuru izmantoto atmiņu un vienkārši atdot to datoram.
Tagad pastāv iespēja, ka neatkarīgi no tā, vai jūs joprojām strādājat
ar pareizrakstības pārbaudītāju vai esat pabeidzis to, jūs esat
uzrakstījuši pietiekami daudz koda rindiņu.
Un, patiešām, pēc dizaina tas ir bijis izaicinājums.
Bet viens no iemesliem šīm augstākā līmeņa valodām, tādām kā Python,
ir tas, ka jūs varat atskatīties uz priekšteču veikumiems un daudz
ātrāk atrisināt ļoti izplatītas problēmas.
Tā jūs varat koncentrēties uz savas jaunās lietotnes vai tīmekļa
lietojumprogrammas vai sava projekta izveidi, lai atrisinātu jūs
interesējošās problēmas.
Tāpēc, riskējot ar iespējamo vilšanos dažiem, ļaujiet man ierosināt,
ka Python, ja vēlaties vārdnīcu kaut kam kā pareizrakstības
pārbaudītājam, tad tas ir labi.
Dodieties uz priekšu un piešķiriet sev mainīgo - piemēram - vārdus,
lai saglabātu visus šos vārdus, un vienkārši piešķiriet to vārdnīcai
vai, saīsinājumā Python valodā, - diktam.
Tas dos jums jaucētabulu.
Tagad izrādās, ka, atsaucot pareizrakstības pārbaudītāju, jums nav
jāuztraucas par vārdiem un definīcijām.
Tas ir tikai par vārdu pareizrakstības pārbaudi.
Tātad, runājot nopietni, mums nav vajadzīgas atslēgas un vērtības.
Mums vajag tikai atslēgas.
Tāpēc es ietaupīšu vēl dažus taustiņsitienus, vienkārši sakot, ka
Python valodā tehniski pietiek ar komplekta izmantošanu.
Atkal: komplekts ir tikai vērtību kolekcija bez dublikātiem.
Bet tiem ne vienmēr ir atslēgas un vērtības.
Tas ir tikai viens vai otrs.
Bet tagad, kas man ir - pirmajā rindā, es Python valodā pieprasu
jaucējtabulas ekvivalentu, es faktiski varu izdarīt kaut ko līdzīgu
šim.
Lūk, kā es varētu ieviest pārbaudes funkciju Python.
Ja vārds, kas nodots šai funkcijai, ir manā mainīgajā, ko sauc par
vārdiem, atgrieziet True.
Citādi turpiniet un atgrieziet False.
Gatavs.
Nē, pagaidiet.
Jūs domājat, ja vispār tā ir, varbūt mēs vēlamies izmantot mazos
burtus, nevis tikai lielos un mazos burtus.
Nu, ziniet ko?
Python valodā, ja vēlaties ievadīt visu vārdu ar mazajiem burtiem,
jums tas nav jāatkārto ar cilpu.
Jums nav jāizmanto neviena no šīm C veida funkcijām vai kaut ko
līdzīgu.
Vienkārši sakiet word.lower, un tas visu pārveidos par mazajiem
burtiem, lai nodrošinātu paritāti ar vārdnīcu.
Labi.
Kā ir ar kaut ko līdzīgu Python ielādes funkcijai?
Nu, Python valodā varat atvērt datnes tāpat kā C valodā.
Piemēram, Python valodā Imight atver vārdnīcas argumentu lasīšanas
režīmā, tāpat kā fopen Python valodā.
Es varētu darīt kaut ko līdzīgu šim.
Katrai šīs datnes rindiņai, ļaujiet man iet uz priekšu un manam vārdu
mainīgajam pievienot šo rindiņu.
Un tad ļaujiet man iet uz priekšu un aizvērt šo datni.
Un es domāju, ka esmu pabeidzis.
Es tikai iešu uz priekšu un atgriezīšu True tikai tāpēc, ka domāju,
ka esmu jau pabeidzis.
Tagad arī šeit es varētu mazliet pasmelties.
Tehniski, ja es lasu katrā datnes rindiņā, katra vārdnīcas rindiņa
beidzas ar slīpsvītru n.
Bet ir vienkāršs veids, kā no tā atbrīvoties, tāpat kā jūs varētu
redzēt ar alternatīvu sintaksi.
Tas, ko es patiesībā darīšu, ir sekojošs.
Ļaujiet man paņemt no pašreizējās rindas, pašreizējo vārdu, noņemot
ar apgriezto joslu — rstrip; funkcija, ko mēs atkal redzēsim — tā
vienkārši atbrīvo no jaunās rindas sekošanas — reversās slīpsvītras n
šīs rindas beigās.
Un tas, ko es patiešām vēlos darīt, ir - pievienot šo vārdu šai
vārdnīcai.
Tikmēr, ja es vēlos noskaidrot, kāds ir manas vārdnīcas lielums, tad
- jūs, iespējams, rakstīsiet kodu, lai atkārtotu visas šīs rindas, un
jūs vienkārši saskaitīsiet tās, izmantojot mainīgo.
Python valodā tā nav.
Varat vienkārši atgriezt šo vārdu garumu.
Un vēl labāk, izmantojot Python, jums nav jāpārvalda sava atmiņa.
Vairs nav malloc funkcijas.
Vairs nav free funkcijas.
Vairs nav jādomā par atmiņu manuāli.
Valoda nodarbojas ar to visu jūsu vietā.
Tātad, zināt, ko?
Pietiek, ja atgriežu True un apgalvošu, ka izkraušana ir pabeigta.
Un viss.
Atkal, neatkarīgi no tā, vai esat procesā vai jau esat pabeidzis,
tas, iespējams, var koriģēt zināmu neapmierinātību, kā arī apgaismot,
jo tieši tāpēc pastāv augstāka līmeņa valodas.
Jūs varat balstīties uz tiem pašiem principiem, tām pašām idejām, ar
kurām jūs saskaraties, cīnoties arī pagājušajā nedēļā.
Bet tagad jūs varat izteikties vēl lakoniskāk.
Šajā vienā rindā ir ieviesta jaucējtabula, un tagad šī jaucējtabula
tiek izmantota vienkāršākā veidā.
Jebkuri jautājumi, tagad par šo, paturot prātā, ka 5. kopas
pareizrakstības pārbaudītājamērķis tomēr ir saprast, kas patiesībā
notiek zem pārsega, un, vēl labāk, to pamanīt.
Tas viss varētu šķist diezgan pārsteidzošs, bet ļaujiet man iet uz
priekšu un izdarīt šo.
Īstenībā man šeit ir uzrakstītas pāris pareizrakstības pārbaudītāja
versijas, un man ir versija, kas rakstīta C valodā, kuras avota kodu
es nerādīšu.
Bet es iešu uz priekšu un izveidošu šo pareizrakstības versiju C
valodā.
Un es turpināšu un, teiksim, sadalīšu šeit savu logu tikai uz brīdi.
Un es iedziļināšos Python pareizrakstības pārbaudītāja versijā, ko es
tikko uzrakstīju.
Kreisajā pusē ļaujiet man turpināt un palaist pareizrakstības
programmu — versiju, kuru es apkopoju C valodā, izmantojot lielu
tekstu, piemēram, Šerloka Holmsa tekstu, kurā ir daudz vārdu.
Un labajā pusē ļaujiet man palaist Python no speller.py, kas ir
atsevišķa datne, kuru es uzrakstīju iepriekš, tāpat kā mēs jums dodam
speller.c.
Un līdzīgi es to palaidīšu Šerloka Holmsa tekstā.
Un es darīšu visu iespējamo, lai vienlaikus nospiestu taustiņu Enter
ekrāna kreisajā un labajā pusē.
Un, cerams, mēs ieraudzīsim to pašu nepareizi uzrakstīto vārdu
sarakstu un to laiku.
Tātad, mēs ejam pa labi.
Šeit mēs ejam pa kreisi.
Labi.
Sacensības, lai noskaidrotu, kurš šeit uzvarēs.
C atrodas kreisajā pusē.
Python atrodas labajā pusē.
Labi.
Interesanti.
Cerams, ka Python ir tuvu aiz muguras.
Ņemiet vērā, ka daži no tiem ir interneta aizkave.
Tātad, tas neobligāti irneprātīgs sekunžu skaits.
Bet sistēma patiešām izmanto, ja mēs to izmērām, zemu līmeni.
Cik daudz laika CPU pavadīja, izpildot manu kodu?
C kopā aizņēma 1,64 sekundes.
Tas bija diezgan ātri, lai gan pagāja vēl brīdis, līdz visi baiti
nonāca internetā.
Python versija tomēr aizņēma cik?
2,44 sekundes.
Tātad, kāds varētu būt secinājums?
Viens, iespējams, es vienkārši labāk programmēju C valodā nekā
Python, kas, iespējams, nav taisnība.
Bet ko vēl jūs varētu secināt no šī piemēra?
Varbūt mums vajadzētu atteikties no Python un palikt pie C?
Nē?
Tātad, kas šeit varētu notikt?
Kāpēc Python versija ir pareiza, un es domāju, ka visi skaitļi
sakrīt, tikai ne laiki.
Kur šeit ir kompromiss?
Nu, šeit atkal ir šis dizaina kompromiss.
Jā?
programmētāja laiks, [nesadzirdami]..
DEIVIDS MALANS: Jā, tieši tā.
Lai ietaupītu programmētāja laiku, Python valodā ir iebūvēts daudz
vairāk funkciju — vairāk funkciju, automātiskāka atmiņas pārvaldība
un tā tālāk, un jums par to ir jāmaksā.
Kāda cita kods veic visu šo darbu jūsu vietā.
Bet, ja viņi ir uzrakstījuši noteiktukoda rindiņu skaitu, tas ir vēl
vairāk koda rindiņu, ko ir jāizpilda, turpretim te, palaižot tikai
manas koda rindiņas, dators riskē ar pārlieku vienkāršošanu..
Tātad šeit vienkārši ir mazāk izmaksu.
Un tā, tas ir mūžīgs kompromiss.
Parasti, izmantojot lietotājam draudzīgāku un modernāku valodu, viena
no cenām, ko jūs varētu maksāt, ir veiktspēja.
Tomēr tagad pasaulē ir daudz gudru datorzinātnieku, kuri cenšas
atstumt tos pašus kompromisus.
Un tāpēc šie tulki, tāpat kā manis rakstītā komanda, Python tehniski
var — it īpaši, ja programmu palaižat atkal un atkal — faktiski,
slepeni, aizkulisēs, apkopot jūsu kodu līdz 0 un 1.
Un tad otrajā, trešajā, ceturtajā reizē, kad palaižat šo programmu,
tā varētu būt ātrāka.
Tātad šeit ir neliels triks, it kā es tās palaidu vienu un tikai
vienu reizi.
Taču laika gaitā mēs varētu gūt labumu, ja mēs atkal un atkal
turpinātu palaist Python versiju un, iespējams, precizētu veiktspēju.
Bet kopumā šis kompromiss būtu sekojošs.
Vai jūs drīzāk pavadītu šīs 60 sekundes, ko es uzrakstīju, ieviešot
pareizrakstības pārbaudītāju, vai šīs 6 stundas, 16 stundas, kuras
jūs varētu būt vai esat pavadījis, lai ieviestu to pašu C valodā?
Laikam nē.
Produktivitātes nolūkos mums ir šīs papildu valodas.
Izklaidei ļaujiet man šeit pāriet uz citu ekrānu un atvērt Python
versiju, kas faktiski — tikai sekundes laikā — ir manā Mac datorā,
nevis mākonī, lai es varētu kaut ko darīt ar grafiku.
Tātad, te manā Mac datorā ir tikai melnbalts termināļa logs.
Un es esmu iepriekš instalējis Python, tāpat kā mēs jums to izdarījām
mākonī ar VS Code.
Ievērojiet, ka man ir šis fotoattēls, iespējams, ar vienu no jūsu
iecienītākajiem TV šoviem kopā ar seriāla Ofiss aktieriem.
Ievērojiet visas šajā attēlā redzamās sejas.
Un ļaujiet man ierosināt pūlī mēģināt atrast vienu seju, CSI stilā,
ar kuru mēs vēlamies atrast, iespējams, tā sakot, Skrantonas
Žņaudzēju.
Un tā, lūk, šī vīrieša sejas piemērs.
Tagad, kā mēs varam atrast šo konkrēto seju pūlī?
Mūsu cilvēka acis, protams, var viņu izraut, it īpaši, ja esat
pazīstami ar seriālu.
Bet ļaujiet man turpināt un alternatīvi izdarīt šo .
Ļaujiet man iet uz priekšu un ierosināt palaist kodu, kuru jau
iepriekš šeit uzrakstīju.
Šī ir Python programma ar vairākām koda rindiņām, pie kurām šodien
nekavēsimies.
Bet tas ir paredzēts, lai motivētu to, ko mēs varam darīt.
No spilvenu bibliotēkas, kas nozīmē Python attēlu bibliotēku, es
vēlos importēt noteikta veida informāciju, kādu funkciju, ko sauc par
attēlu, lai varētu manipulēt ar attēliem, atšķirībā no mūsu ceturtās
problēmu kopas.
Un tas ir spēcīgs.
iekšā?
Python.
Jūs varat vienkārši [MIMICS EXPLOSION]
importēt sejas atpazīšanu kā bibliotēku, ko kāds cits ir uzrakstījis.
Pēc tam es izveidošu mainīgo, ko sauc par attēlu.
Es izmantošu šīs sejas atpazīšanas bibliotēkas.
load_image_file funkcija.
Tas ir nedaudz daudzvārdisks, bet pēc būtības ir līdzīgs fopen.
Un es atvēršu office.jpeg.
Pēc tam es paziņošu otru mainīgo, ko sauc par face_locations,
daudzskaitlī, jo saskaņā ar šīs bibliotēkas dokumentāciju es ceru
saņemt atpakaļ visu seju, kuras tiek noteiktas, atrašanās vietu
sarakstu.
Labi.
Pēc tam es atkārtošu katru no šīm sejām, izmantojot for cilpu, ko mēs
redzēsim sīkāk.
Pēc tam es secināšu, kas ir šīs sejas augšējais, labais, apakšējais
un kreisais stūris.
Un tad es šeit rādīšu tikai šo seju, ja esmu noteicis vajadzīgo seju.
Ļaujiet man turpināt un palaist detect.py.
Un mēs redzēsim ne tikai vienu seju, kuru meklējam.
Bet, ja es palaistu Python no detect.py, tas veiks visu analīzi.
Šeit tagad es redzēšu lielu atvērumu visām sejām, kas tika
konstatētas šajā programmā.
[Smejas] Labi, dažas labāk
nekā citas, es domāju, ja jūs pietuvinātu kādu ķerot.
Tipiska Andžela.
Ja vēlaties tagad atrast šo vienu seju, es domāju, ka mums ir nedaudz
vairāk jāapmāca programmatūra.
Tāpēc ļaujiet man atvērt otru programmu, ko sauc par atpazīšanu, tajā
notiek daudz kas vairāk.
Bet ļaujiet man ar rokas mājienu norādīt, ka es tagad ielādēju ne
tikai office.jpeg, bet arī toby.jpeg, lai apmācītu algoritmu, lai
atrastu šo konkrēto seju.
Un tāpēc tagad, ja es palaistu šo otro versiju — recognize.py — ar
Python no recognize.py — uz brīdi aizturu elpu; tas, domājams,
analizē visas sejas — jūs redzat to pašu oriģinālo fotoattēlu.
Bet vai jūs redzat šeit izceltu vienu šādu seju?
Šī koda versija atrada Tobiju, iezīmēja viņu ar ekrānu un, voilà,
mums ir sejas atpazīšana.
Par labu vai sliktu, bet tas notiek mūsdienās, arvien biežāk
sabiedrībā.
Un, godīgi sakot, lai gan es kodu nerakstīju tiešraidē — jo tas ir
labs ducis vai vairāk koda rindiņu — to nav tik daudz.
Un burtiski visas iestādes — viss, kas mums jādara, ir importēt sejas
atpazīšanu, un, voilà, jums ir piekļuve.
Šīs tehnoloģijas jau ir šeit.
Bet aizdomāsimies uz brīdi, kā mēs atradām Tobiju?
Kā šī bibliotēka var — lai gan mēs neapskatīsim tās ieviešanas
detaļas, kā tā atrod Tobiju un atšķir viņu no visām citām sejām pūlī?
Ko tā varētu darīt, intuitīvi.
Padomājiet pat par p-set four, kam jums pašiem ir piekļuve datu ziņā.
Jā?
Mērķauditorija: [? Kopš ?] mēs tai iedevām
Tobija sejas attēlu, tā, iespējams, skatās, vai pikseļi vienā
apgabalā ir tādi paši kā citā apgabalā un piešķir to vienam un tam
pašam — no tā atsauces attēla uz šo attēlu.
ka tā ir tā pati [? persona. ?]
DEIVIDS MALANS: Jā, tieši tā.
Rezumējot par kameru, mēs esam apmācījuši programmatūru, ja vēlaties,
piedāvājot tai Tobija sejas fotoattēlu.
Tātad, meklējot vienādus vai patiešām līdzīgus pikseļus — īpaši, ja
tas ir nedaudz atšķirīgs Tobija attēls, mēs, iespējams, varam viņu
atpazīt pūlī.
Un kas īsti ir cilvēka seja?
Galu galā dators to zina tikai kā bitu modeli vai - augstākā līmenī -
pikseļu modeli.
Tātad varbūt cilvēka seja, iespējams, kopumā vislabāk var būt
definēta kā divas acis, deguns un mute, kas, lai gan mēs visi
izskatāmies līdzīgi, strukturāli, protams, mērījumi starp acīm un
degunu un mutes platumu, ādas tonis un visas šīs fiziskās īpašības ir
modeļi, kurus programmatūra, iespējams, varētu noteikt un pēc tam
statistiski aplūkojot attēlu, meklēt vistuvāko iespējamo atbilstību
šīm vairākāmmērījumu formām, krāsām, kā arī izmēriem un tā tālāk.
Un patiešām tā varētu būt intuīcija.
Bet varenākais šeit atkal ir tas, cik šī tehnoloģija tagad ir
vienkārša un viegli pieejama.
Labi.
Ņemot to vērā, ierosināsim apsvērt, ko vēl varam darīt ar pašu
Python, atgriezīsimies pie pamatiem, lai jūs paši varētu sākt kaut ko
ieviest paralēli tām rindiņām.
Tātad bez piekļuves tādām lietām kā get_string funkcija, CS50
bibliotēka nodrošina arī dažas citas lietas, proti, C valodā mums tās
bija.
Bet Python valodā būs mazāk.
Python valodā mūsu īstermiņa bibliotēka sniegs jums ne tikai
get_string, bet arī get_int un get_float.
Kāpēc?
Faktiski ir tikai kaitinoši, kā mēs drīz redzēsim, atgūt no lietotāja
veselu skaitli vai peldošu vērtību un tikai pārliecināties, ka tas ir
int un peldoša vērtība, nevis tāds vārds kā kaķis vai suns, vai
virkne, kas patiesībā nav numurs.
Mēs varam importēt ne tikai konkrēto funkciju get_string, bet
faktiski varam importēt visas šīs funkcijas pa vienai, piemēram, kā
mēs to drīz redzēsim.
Vai pat Python no datnes varat importēt noteiktas funkcijas.
Kāds no jums jautāja pirms kāda laika, kad iekļaujat kaut ko līdzīgu
CS50.h vai standarta I/O .h, jūs faktiski saņemat visu šajā datnē
esošo kodu, kas, iespējams, var palielināt jūsu programmas apjomu vai
ieguldīto laiku.
Šādā gadījumā, importējot noteiktas funkcijas no Python, varat
nedaudz precīzāk noteikt, kam vēlaties piekļūt.
Labi.
Tātad, to sakot, turpināsim un redzēsim, kā Python valodā izskatās
nosacījumi.
Tad atkal kreisajā pusē, šeit, mēs redzēsim Scratch.
Tātad tas ir tikai izdomāts piemērs, kurā tiek jautāts, vai x ir
mazāks par y, tad, teiksim, x ir mazāks par y.
C valodā tas izskatījās šādi.
Tagad Python valodā tas izskatīsies šādi.
Un šeit ir pirms C valodā, un šeit ir pēc.
Un tikai, lai pieminētu dažas acīmredzamās atšķirības, kas šķietamiir
mainījies nosacījuma operatoriem Python valodā?
Kādas atšķirības?
Jā.
Mērķauditorija: Trūkst figūriekavu.
DEIVIDS MALANS: Jā.
Tātad vairs nav figūriekavu.
Un patiešām jūs tās neizmantojat.
Kas parādās to vietā, ja jūs varētu secināt?
Kas, izskatās, ir ieņēmis to vietu?
Kā jūs domājat?
Mērķauditorija: [Nesadzirdami]
DEIVIDS MALANS: Tātad kols šīs rindas sākumā, šeit.
Bet arī vēl svarīgāka tagad ir šī atkāpe zem tās.
Tātad dažiem no jums, un mēs to zinām no darba laika, ir ieradums
visu ievilkt pa kreisi, vai ne?
Un tas ir tikai šis trakais haoss, uz kuru jāskatās.
Mulsinoši, protams.
Bet C un Clang ir diezgan iecietīgas valodas, ja runa ir par tādām
lietām kā atstarpes programmā.
Python valodā, ne-ne.
Pirms dažiem gadiem viņi saprata: palīdzēsim cilvēkiem palīdzēt
pašiem sev un prasīsim tikai standarta atkāpi.
Tātad četras atstarpes šeit būtu norma.
Bet, tā kā tas ir ievilkts zem šī kola, tas patiešām norāda, ka tas
tagad ir daļa no šī nosacījuma operatora.
Šajā nosacījuma operatorā kaut kas cits ir pazudis, salīdzinot ar C.
Kas vēl ir nedaudz vienkāršots?
Mērķauditorija: [Nesadzirdami
DEIVIDS MALANS: Jā.
Tātad vairs nav iekavu.
Jūs joprojām varat tās izmantot, it īpaši, ja jums ir nepieciešams
loģiski veiktu darbību secību, piemēram, matemātikā.
Bet šajā gadījumā, ja vēlaties uzdot vienkāršu jautājumu, piemēram,
ja x ir mazāks par y, varat to izdarīt tieši tā.
Kā būtu, ja jums ir if else?
Šeit ir gandrīz tas pats, ar tādām pašām izmaiņām.
C valodā tas izskatījās šādi.
Un tas kļūst smagāks — vismaz, ja mēs šādā veidā izmantojam
figūriekavas.
Python valodā mēs varam būt efektīvāki, lai gan, godīgi sakot, C
valodā jums ne vienmēr ir vajadzīgas figūriekavas.
Bet šeit atkal - iekavas ir pazudušas.
Figūriekavas ir pazudušas.
Atkāpe ir konsekventa, un mēs tikko esam pievienojuši citu
atslēgvārdu - else - ar kolu.
Bet vairs nav arī semikolu.
Kā būtu ar kaut ko lielāku, piemēram, šo - if, else priekšrakstā - if
else?
Šis ir interesants.
Bet C valodā tas izskatījās šādi – if, else, if else.
Python valodā tas tagad izskatās šādi.
Un šeit, iespējams, ir viens kuriozs, ka, godīgi sakot, pēc visiem
šiem gadiem, es joprojām ne vienmēr atceros, kā to uzrakstīt.
Kas tur dīvains?
Ko jūs redzat kā atšķirīgu?
Jā, šeit.
Mērķauditorija: [Nesadzirdami]
DEIVIDS MALANS: Jā.
Else if vietā ir elif.
Kāpēc?
[Nopūšas] Acīmredzot, else
atstarpe if - tas bija pār daudz taustiņsitienu cilvēkiem, tāpēc viņi
to saīsināja šādā veidā.
Iespējams, tas nozīmē, ka tas ir nedaudz saprotamāks arī datoram -
sadalīt if un else.
Bet tagad kaut kas, kas būtu jāatceras.
Tas patiešām ir elif un ne else if.
Labi.
Tātad, kā ar mainīgajiem Python?
Es jau esmu izmantojis pāris no tiem, bet atlasīsim tieši to, kā jūs
definējat un deklarējat šīs lietas.
Tātad, Scratch valodā, ja mēs vēlamies izveidot mainīgo, ko sauc par
skaitītāju, un sākotnēji iestatītu to vienādu ar 0, mēs darītu kaut
ko līdzīgu šim - norādītu, ka tas ir int, izmantotu piešķiršanas
operatoru, beigtu domu ar semikolu.
Python valodā tas ir vienkāršāk.
Jūs nosaucat mainīgo, izmantojat piešķiršanas operatoru, tāpat kā
iepriekš, jūs to iestatāt vienādu ar kādu vērtību, un viss.
Jūs nepieminat veidu.
Jūs neminat semikolu vai ko vairāk.
Ko darīt, ja vēlaties mainīt mainīgo, piemēram, skaitītāju, par 1 —
tas ir, palielināt par 1?
Šeit jums ir dažādi veidi.
C valodā mēs redzējām tādu sintaksi, kur var teikt, ka skaitītājs ir
vienāds ar skaitītāju plus 1, kas atkal šķiet neloģiski.
Kā skaitītājs var būt vienāds ar skaitītāju plus 1?
Bet atkal mēs lasām šo kodu, patiešām, no labās uz kreiso pusi,
atjauninot tā vērtību par 1.
Python valod tas ir gandrīz tā pat.
Jūs vienkārši atbrīvojaties no semikola.
Te ir loģika.
Taču atcerieties, ka C valodā mēs varētu darīt kaut ko nedaudz
savādāku, ko varam darīt arī Python valodā.
Python valodā varat arī lakoniskāk izdarīt tā — plus ir vienāds ar,
un pēc tam jebkurš skaitlis, ko vēlaties pievienot.
Vai arī varat to mainīt, lai atņemtu, ja vēlaties.
Diemžēl ir pagājis tas, ka, iespējams, esat rakstījuši daudz.
Kāds bija cits veids, kā pievienot 1?
Mērķauditorija: Plus plus?
DEIVIDS MALANS: Plus plus diemžēl vairs nav Python valodā.
Pārāk daudz veidu, kā darīt vienu un to pašu, tāpēc viņi no tā
atbrīvojās, izvēloties tikai šo sintakse.
Tāpēc arī to paturiet prātā.
Kas par cilpām, ja vēlaties kaut ko izdarīt Python atkārtoti.
Nu, Scratch, nulles nedēļā, lūk kā mēs ņaudējām trīs reizes, konkrēti.
Valodā C mums bija daži veidi, kā to izdarīt.
Šī bija mehāniskāka pieeja, kur jūs izveidojat mainīgo ar nosaukumu i.
Jūs to iestatāt vienādu ar 0.
Kamēr i ir mazāks par 3, rīkojieties šādi.
Un tad jūs paši palielināt i atkal un atkal.
Mehāniska tādā nozīmē, ka jums ir jāievieš visi šie mehānismi un
jāgriež tie pašiem, taču tas bija pareizs veids, kā to izdarīt.
Python valodā mēs joprojām varam sasniegt to pašu ideju, taču mums
nav nepieciešams int atslēgvārds.
Mums nevajag nevienu semikolu.
Iekavas mums nav vajadzīgas.
Mums nav vajadzīgas figūriekavas.
Mēs nevaram izmantot plus plus, tāpēc, iespējams, tas ir neliels
solis atpakaļ, ja esat fans.
Bet citādi kods, loģika ir tieši tādi paši.
Taču ir arī citi veidi, kā īstenot šo ideju.
Atcerieties, ka C, mēs varējām darīt arī šo.
Varat izmantot for cilpu, kas dara tieši to pašu.
Abi ir pareizi.
Abi, iespējams, ir labi izstrādāti.
Katrs izvēlas pats savu veidu.
Tomēr Python mums būs jādomā, kā to izdarīt.
Tātad jūs nedarāt to pašu for cilpu, kā C valodā.
Tuvākais, ko es varētu izdomāt, ir šis, kur jūs sakāt i — vai jebkurš
mainīgais, kuru vēlaties saskaitīt — in - burtiski prievārds, un pēc
tam izmantojat kvadrātiekavas.
Mēs jau iepriekš esam izmantojuši kvadrātiekavas masīvu un tamlīdzīgu
lietu kontekstā.
Un 0, 1, 2 kaut kādā ziņā izskatās kā masīvs, lai gan esam redzējuši
arī masīvus ar figūriekavām.
Bet šīs kvadrātiekavas pagaidām apzīmē sarakstu.
Python valodā nav masīvu.
Masīvs ir tas blakus esošais atmiņas gabals, kura izmērs ir kaut kā
jāmaina, pārvietojot lietas atmiņā, kā tas bija teikts pirms divām
nedēļām.
Python, savukārt, varat vienkārši izveidot šādu sarakstu, izmantojot
kvadrātiekavas.
Un vēl labāk, kā mēs redzēsim, jūs varat pievienot vai pat noņemt
lietas no šī saraksta.
Kaut gan tas nebūs īpaši labi izstrādāts.
Tas darbosies.
Tas tiks atkārtots Python valodā trīs reizes.
Bet kas varētu jūs kaitināt šajā dizainā, pat ja jūs nekad iepriekš
neesat redzējuši Python?
Ka šis piemērs nebeidzas labi?
Jā?
liels saraksts [nesardzirdami]..
DEIVIDS MALANS: Jā.
Ja veidojat lielu sarakstu, jums ir jāievada katrs no šiem cipariem,
piemēram, komats 3, komats 4, komats 5, komats, punkts, punkts,
punkts, 50 komats, punkts, punkts, punkts. Protams, tas nav labākais
risinājums, lai visi šie skaitļi būtu uz ekrāna, bezgalīgi pārklājot
ekrānu.
Tātad Python valodā vēl viens veids, kā to izdarīt, būtu izmantot
funkciju, ko sauc par diapazonu (range), kas tehniski ir datu tips
pats par sevi.
Un tas atgriež jums tik daudz vērtību, cik jūs tam prasāt.
diapazonam ir nepieciešami arī daži citi argumenti.
Bet vienkāršākais lietošanas gadījums šeit ir, ja vēlaties atgūt
skaitļus 0, 1 un 2 — kopā trīs vērtības — jūs sakāt: “Hei, Python,
lūdzu, norādiet trīs vērtību diapazonu”.
Un pēc noklusējuma tie sāk ar 0 uz augšu.
Taču tas ir efektīvāk nekā visa saraksta cietā kodēšana uzreiz.
Un labākā metafora, ko es varu izdomāt, ir kaut kas līdzīgs šim:
Šeit, piemēram, ir kāršu kava.
Tā ir normālā izmēra kava, un tajā, iespējams, ir 52 kārtis.
Tāpēc, jums zināmo iemeslu dēļ, koda ierakstīšana no 0 līdz 51 būtu
nedaudz smieklīga.
Un tas vienkārši būtu ļoti smagnēji un neglīti, un tas pārklās visu.
Tas būtu virtuāls ekvivalents tam, ja es iedotu jums visas šīs
kārtis, lai jūs paši tiktu ar tām galā.
Un, pareizi, tās nav tik lielas, taču to ir daudz, ko turēt.
Tam ir nepieciešams daudz atmiņas vai fiziskās krātuves, ja vēlaties.
Metaforiski runājot, diapazons dara šādi: ja jūs man prasāt trīs
kārtis, es jums tās pa vienai izdalīšu, šādi, tā, lai jebkurā brīdī
datora atmiņā būtu tikai viens cipars, līdz jums izdalīs nākamo.
Alternatīva — iepriekšējā versija būtu: izdalīt man visas trīs kārtis
uzreiz vai visas 52 kārtis uzreiz.
Bet šajā gadījumā diapazons ir daudz efektīvāks.
Varat veikt diapazonu no 1000.
Tas nedos jums sarakstu ar 1000 vērtībām vienlaikus.
Tas dos jums 1000 vērtības pa vienai, ievērojami samazinot atmiņu
pašā datorā.
Labi.
Tātad, tajā pašā laikā, kā izdarīt kaut ko mūžīgu Scratch valodā?
Mēs to varētu izdarīt burtiski ar mūžīgu bloku, kas C valodā īsti
neeksistēja.
Valodā C mums bija jāuzlauž tas, sakot True — jo True pēc definīcijas
ir PATIESA, vienmēr patiesa.
Tātad tas mums apzināti izraisa bezgalīgu cilpu.
Python loģika būs gandrīz tāda pati.
Un bezgalīgas cilpas Python valodā mēdz būt vēl izplatītākas, jo jūs
vienmēr varat izlauzties no tām, tāpat kā C valodā.
Python valodā tas izskatās šādi. Un tas ir nedaudz smalkāk, taču te
vairs nav figūriekavu.
Iekavas ir pazudušas.
Bet tik neliela atšķirība?
Lielais T, lai apzīmētu True, un tas būs lielais F, kas apzīmēs False.
Stulbas mazas atšķirības.
Galu galā jūs nepareizi ierakstīsiet vienu vai otru.
Taču šīs ir lietas, kurām jāpievērš uzmanība un jāsāk atpazīt, lasot
kodu.
Vai jums ir jautājumi par kādu no šiem blokiem?
Jā?
vienreiz iestatīt uz 0 [? katrai cilpai? ?]
DEIVIDS MALANS: For cilpā bija i — tas tika iestatīts uz 0 pirmajā
iterācijā, tad uz 1 nākamajā, tad uz 2 trešajā.
Un tas pats attiecas uz diapazonu.
Tas vienkārši neizmanto tik daudz atmiņas uzreiz.
Vai ir citi jautājumi par kādu no šiem Python pamatelementiem?
Labi.
Nu, ejam uz priekšu un izveidosim kaut ko vairāk par hello.
Ļaujiet man ierosināt, ka šeit mēs ieviešam, iespējams, vienkāršāko
kalkulatoru.
Tāpēc ļaujiet man atgriezties pie VS Code šeit, atvērt manu termināļa
logu un atvērt, teiksim, datni ar nosaukumu calculator.py.
Un vietnē calculator.py mums būs iespēja izpētīt dažus no šiem
elementiem, taču mēs ļausim lietām diezgan ātri pāraugt
interesantākajos piemēros, lai mēs varētu darīt to pašu.
Un patiesībā ļaujiet man iet uz priekšu un izdarīt to.
Turklāt es jau iepriekš esmu paņēmis līdzi kodu.
Piemēram, kaut kas, ko sauc par calculator0.c, no C valodas pirmās
nedēļas.
Un ļaujiet man iet uz priekšu un faktiski sadalīt savu logu šeit, lai
es tagad varētu izdarīt kaut ko līdzīgu.
Ļaujiet man to pārvietot šeit, šeit.
Calculator.py.
Tāpēc tagad mana ekrāna kreisajā pusē ir calculator.c — vai
calculator0.c, jo tā ir pirmā versija, ko izveidoju — un
calculator.py labajā pusē.
Ļaujiet man turpināt un īstenot to pašu ideju šeit.
Tātad labajā pusē cs50.h iekļaušanas analogs būtu no cs50 import
get_int, ja es patiešām vēlos izmantot šo funkciju.
Tagad es turpināšu un došu sev mainīgo x, nedefinējot tā veidu.
Es izmantošu šo get_int funkciju un likšu lietotājam ievadīt x, tāpat
kā C valodā.
Pēc tam es likšu lietotājam šeit ievadīt citu int, piemēram, y, tāpat
kā C valodā.
Un pašās beigās es iešu uz priekšu un izdrukāšu x plus y.
Un viss.
Tagad, protams, manā koda C versijā ir daži komentāri, lai atgādinātu
jums par katras rindiņas darbību.
Bet es joprojām esmu to sadalījis sešās rindās — vai, īstenībā,
četrās, ja atbrīvojos no tukšās rindas.
Tāpēc šeit jau, iespējams, ir nedaudz skaidrāk.
Tas ir skaidrāks, jo pietrūkst kaut kādas vēsturiski patiešām
svarīgas daļas.
Šķiet, ka es izlaidu, to, ko mēs vēl īsti neesam izcēluši?
Jā?
Mērķauditorija: [Nesadzirdami]
DEIVIDS MALANS: Jā.
Galvenā funkcija ir pazudusi.
Un patiesībā, iespējams, jūs uzskatījāt par pašsaprotamu, ka tas
darbojās pirms brīža, kad es uzrakstīju hello, bet man arī nebija
galvenās funkcijas hello programmā.
Un arī šī ir Python un daudzu citu valodu iezīme.
Tā vietā, lai ievērotu šīs ilggadējās tradīcijas, ja vēlaties tikai
rakstīt kodu un kaut ko paveikt, labi.
Vienkārši rakstiet kodu un paveiciet kaut ko arī bez šīs pašas
tekstveidnes.
Tātad viss, kas atrodas jūsu Python datnē — ar kreiso atkāpi, ja
vēlaties, pēc noklusējuma — tas būs tikai kods, ko tulks izpilda no
augšas uz leju, no kreisās puses uz labo.
Tagad ļaujiet man iet uz priekšu un palaist šādu kodu.
Ļaujiet man turpināt un atvērt savu termināļa logu, palaist python no
calculator.py.
Un es uzrakstīšu, ka x ir 1, y ir 2.
Un, kā jūs varētu gaidīt, tas man dod 3.
Neliela estētiska kļūda.
Es šeit ievietoju atstarpi nepareizā vietā.
Tātad tā ir iesācēju kļūda.
Ļaujiet man to estētiski salabot.
Ļaujiet man atkārtoti palaist python no calculator.py.
Ierakstiet 1.
Ievadiet 2.
Un, voilà, tagad tā pati versija atkal ir te.
Bet ļaujiet man tagad ierosināt atbrīvoties no šiem palīgriteņiem.
Mēs nevēlamies spert vienu soli uz priekšu un pēc tam divus soļus
atpakaļ, pievienojot šos palīgriteņus, tāpēc ļaujiet man izdarīt šo.
Manā calculator.py versijā pieņemsim, ka mēs noņemam palīgriteni, kas
ir CS50 bibliotēka, un tā vietā ļaujam man izmantot tikai Python
iebūvēto funkciju, ko sauc par ievadi, kas burtiski to arī dara.
Tas saņem ievadi no lietotāja un saglabā to, tāpat kā iepriekš, x un
y.
Tātad tas nav saistīts ar CS50.
Šī ir reālās pasaules Python programmēšana.
Ļaujiet man turpināt un atkal palaist python no calculator.py.
Un, protams, ja x ir 1 un y ir 2, x plus y, protams, joprojām ir 3.
Acīmredzot tas ir 12, saskaņā ar Python datiem, līdz iesaistās CS50
bibliotēka.
Bet vai kāds vēlas secināt, kas tikko nogāja greizi?
Jā?
AUDITORIJA: Mēs vienmēr esam [nesadzirdami].
DEIVIDS MALANS: Tieši tā.
Ievades funkcija pēc konstrukcijas vienmēr atgriež teksta virkni.
Galu galā tas ir tas, ko cilvēks ierakstīja.
Un, lai gan, jā, es izmantoju tastatūras ciparu taustiņus, viss
joprojām atgriežas teksta veidā.
Tagad varbūt mums it kā vajadzētu izmantot get_int funkciju.
Nu, tā neeksistē Python valodā.
Viss, ko varat izdarīt - tas ir iegūt teksta ievadi — virkni no
lietotāja.
Bet mēs varam pārveidot vienu par otru.
Un tāpēc, lai mēs nejauši nekonkatenētu — tas ir, apvienotu x plus
y — būtu jādara kaut kas līdzīgs šim.
Ļaujiet man atgriezties pie sava Python koda, šeit.
Un tā kā C valodā mēs iepriekš varējām veikt tipveida atlasi — mēs
varam pārvērst vienu tipu citā — tas parasti nenotika, ja darījāt
kaut ko sarežģītu, piemēram, int funkcijas virkni.
Jūs varētu izmantot char int funkcijā un otrādi.
Bet virknei, atceraties, C veida bibliotēkā bija īpaša funkcija, ko
sauca no atol, tāpat kā ASCII veselam skaitlim.
Tas ir tuvākais analogs šeit.
Un patiesībā Python valodā to var izdarīt, izmantojot funkciju int,
kas patiesībā ir arī datu veida nosaukums, lai gan man tas vēl nav
jāievada.
Un es varu automātiski pārvērst ievades funkcijas izvadi no virknes
uzreiz uz int.
Un tagad, ja es atgriezīšos savā termināļa logā, atkārtoti palaižu
python no calculator.py ar x un y vērtībām 1 un 2, tagad es atkal
esmu ierindā.
Tātad, piemēram, šonedēļ, īslaicīgi, CS50 bibliotēka nodarbojas tikai
ar konvertēšanu.
Un patiešām var būt slikti, ja ierakstīšu kaut ko nepareizi,
piemēram, suns vai kaķis skaitļa vietā.
Bet arī šo problēmu mēs atrisināsim pēc brīža.
Labi.
Kā būtu, ja mēs tagad izdarītu kaut ko nedaudz savādāku ar mūsu
kalkulatoru.
Saskaitīšanas vietā veiksim dalīšanu.
Tātad z ir vienāds ar x dalīts ar y, tādējādi iegūstot trešo mainīgo
z.
Ļaujiet man turpināt un palaist python no calculator.py vēlreiz.
Es ierakstīšu 1.
Šoreiz ierakstīšu 3.
Un kādu problēmu, jūsuprāt, mēs redzēsim?
Vai arī tā ir pazudusi?
Kas notika, kad es to izdarīju C valodā, lai gan ar nedaudz slēptāku
sintaksi, kad es sadalīju vienu skaitli, piemēram, 1 dalīts ar 3?
Kāds atceras?
Jā?
Mērķauditorija: Jūs noapaļosiet līdz tuvākajam veselam skaitlim.
DEIVIDS MALANS: Jā.
Tā tas tiktu noapaļots uz leju līdz tuvākajam veselam skaitlim,
tādējādi tiekot saīsināts.
Tātad, ja ņemat veselu skaitli, piemēram, 1, jūs to sadalāt ar citu
veselu skaitli, piemēram, 3, kam tehniski vajadzētu būt 0,33333,
bezgalīgi garam.
Bet C valodā, atceraties, jūs saīsināt vērtību.
Ja jūs sadalāt int ar int, jūs saņemat atpakaļ int, kas nozīmē, ka
jūs saņemat tikai veselu skaitļa daļu, kas bija 0.
Tagad Python faktiski to nokārto mūsu vietā un izvairās no
saīsināšanas.
Bet tas mums joprojām atstāj kādu citu problēmu, kas, piemēram, nebūs
uzreiz acīmredzama.
Tas izskatās pareizi.
Tas ir atrisinājis problēmu C valodā.
Tātad saīsināšana nenotiek. Veseli skaitļi tiek automātiski pārvērsti
peldošā komata vērtībā.
Bet uz kādas citas problēmas mēs paklupām pirmajā nedēļā?
Kas vēl ir kļuvis nepatīkamāks, strādājot ar vienkāršu aritmētiku?
Kāds atceras?
Python sintakse ir nedaudz atšķirīga, taču ļaujiet man turpināt un
izdarīt šo.
Izrādās, Python valodā, ja vēlaties redzēt nozīmīgākus ciparus par
tiem, kurus es šeit redzu pēc noklusējuma, kas ir apmēram ducis,
ļaujiet man turpināt un izdrukāt z šādi.
Ļaujiet man vispirms izdrukāt formāta virkni, jo es vēlos formatēt z
interesantā veidā.
Un ievērojiet, tas neietekmēs atšķirību.
Šī ir tikai formāta virkne, kas pašlaik bez pārliecinoša iemesla
interpolē z šajās figūriekavās, izmantojot fstring vai formāta
virkni.
Ja es to izpildīšu vēlreiz ar 1 un 3, mēs patiešām redzēsim tieši to
pašu.
Bet, ja izmantojat fstring, jums tiešām ir iespēja formatēt šo virkni
precīzāk.
Tāpat kā ar %f Python valodā, jūs varētu sākt precizēt, cik zīmīgos
ciparus redzat — C valodā, attiecīgi.
Python valodā jūs varat darīt to pašu, taču sintakse ir nedaudz
atšķirīga.
Ja vēlaties, lai dators interpolētu z un parādītu 50 zīmīgos ciparus,
tas ir, 50 ciparus aiz komata, sintakse ir līdzīga C valodai, taču tā
ir nedaudz atšķirīga.
Jūs burtiski ievietojat kolu aiz mainīgā nosaukuma.
Punkts 50 nozīmē: parādiet man decimālzīmi un pēc tam 50 ciparus pa
labi. Un f tikai norāda: lūdzu, uzskatiet to par peldošā komata
vērtību.
Tātad tagad, ja es atkārtoti palaistu calculator.py python, dalītu 1
ar 3, diemžēl - Python nav atrisinājusi visas pasaules problēmas.
Tas atkal bija peldošā komata neprecizitātes piemērs.
Tātad šī problēma joprojām ir latenta.
Tas, ka pasaule ir progresējusi, ne vienmēr nozīmē, ka visas mūsu
problēmas C valodā ir pazudušas.
Ir risinājumi, kuros zinātniskiem aprēķiniem un tamlīdzīgiem nolūkiem
tiek izmantotas trešo pušu bibliotēkas.
Taču peldošā komata neprecizitāte joprojām ir problēma.
Tikmēr C valodā bija vēl viena cita problēma, ar kuru mēs
saskārāmies, iekļaujot skaitļus, un tā bija šī — veselu skaitļu
pārpilde.
Atceraties, ka vesels skaitlis valodā C aizņēma tikai 32 bitus, kas
nozīmēja, ka jūs varētu saskaitīt līdz 4 miljardiem vai, iespējams,
ja izmantojāt pozitīvus un negatīvus skaitļus, — līdz 2 miljardiem,
pēc kā dīvainas lietas notiktu.
Skaitlis būtu 0 vai negatīvs, vai arī tas pārplūstu vai apgrieztos
atpakaļ.
Brīnišķīgi, ka Python valodā viņi vismaz ir pievērsušies tam,
tādējādi jūs varat skaitīt tik augstu, cik vēlaties.
Un Python tikai izmantos arvien vairāk un vairāk bitu un baitu, lai
saglabātu patiešām lielus skaitļus, tāpēc veselu skaitļu pārpilde nav
problēma.
Ņemot to vērā, Python ir ierobežota līdz tam, cik ciparu tā
vienlaikus parādīs kā virkni uz ekrāna.
Bet matemātiski runājot, jūsu matemātika tagad būs pareiza.
Tāpēc mēs esam spēruši pāris soļus uz priekšu, vienu soli uz sāniem.
Bet patiešām šeit mēs esam atrisinājuši dažas no savām problēmām.
Labi.
Vai jums ir jautājumi par kādu no piemēriem, kuri ir bijuši līdz šim?
Jautājumi?
Labi.
Nu, kā būtu ar citu problēmu, ar kuru mēs saskārāmies C valodā.
Apskatīsim to arī šeit - Python valodā.
Tāpēc ļaujiet man turpināt un kreisajā pusē atvērt datni, teiksim,
compare3.c kreisajā pusē, un ļaujiet man izveidot jaunu datni labajā
pusē ar nosaukumu compare.py.
Jo atceraties, ka sliktas lietas notika, kad mums vajadzēja
salīdzināt divas vērtības valodā C.
Tātad pa kreisi, šeit ir atgādinājums par to, ko mēs kādreiz darījām
ar C, un, ja mēs vēlamies salīdzināt vērtības, mēs varam iegūt int
valodā C, saglabāt to x.
get_int valodā C, saglabājiet to y.
Šeit mums ir mūsu pazīstamā, nosacītā loģika, tikai izdrukājot if x,
x ir mazāks par y, vai nav.
Galu galā mēs noteikti varam darīt to pašu Python, izmantojot kādu
diezgan pazīstamu sintaksi.
Un vienkārši ātri parādīsim šo.
Ļaujiet man pāriet šeit.
Es no cs50 importēšu get_int, lai gan to varētu izdarīt, izmantojot
pašu ievades funkciju.
x ir vienāds ar get_int, un es atgādināšu lietotājam par to.
y ir vienāds ar get_int, un es atgādināšū lietotājam par to.
Pēc tam atcerieties, ka bez iekavām varu teikt, ja x ir mazāks par y,
tad bez f izdrukājiet x is less than y.. Tad es varu iet uz priekšu
un pateikt: else if x ir lielāks par y, es varu izdrukāt x is greater
than y.. Ja vēlaties tagad iejaukties, ko es salaidu grīstē?
Kāds?
Jā?
Mērķauditorija: Elif.
DEIVIDS MALANS: Elif, vai ne?
Tātad elif x ir lielāks par y, else - šī daļa ir tāda pati,
izdrukājiet x is equal to y.. Šeit nav nekādas jaunas loģikas.
Bet vismaz sintaktiski tā ir nedaudz tīrāk.
Patiešām, šī programma ir tikai 11 rindiņas gara, lai gan bez
komentāriem.
Ļaujiet man turpināt un palaist python no example.py.
Paskatīsimies.
Vai 1 ir mazāks par 2?
Patiešām.
Palaidīsim to vēlreiz.
Vai 2 ir mazāks par 1?
Nē, tas ir lielāks.
Visbeidzot, ierakstīsim 1 un 1 divreiz.
x ir vienāds ar y.
Tātad mums šeit ir diezgan paralēla, viens pret vienu konversija.
Tad darīsim kaut ko interesantāku.
Kā būtu, ja C valodā atvērtu kaut ko tādu, ko mēs faktiski
salīdzinājām ar mērķi?
Tātad, ja es atveru - no iepriekšējā kursa - kā būtu ar agree.c, kas
mudina lietotāju kaut kam piekrist vai nepiekrist?
Un ļaujiet man šeit iekodēt jaunu versiju, ko sauc par agree.py.
Un es to darīšu labajā pusē ar agree.py.
Bet ar agree.c kreisajā pusē — ievērojiet, ka šādi mēs darījām šo
jā-nē darbību valodā C — mēs salīdzinājām c, rakstzīmi, kas ir
vienāda ar vienpēdiņās Y vai vienāda ar vienpēdiņās mazo y;. Un tad
tas pats par n.
Tagad Python valodā tas faktiski būs nedaudz savādāk šeit.
Ļaujiet man turpināt un Python versijā ļaujiet man izdarīt kaut ko
līdzīgu šim.
Mēs izmantosim get_string.
Patiesībā, nē.
Šajā gadījumā mēs izmantosim tikai ievadi.
Tātad izdarīsim s vienāds ar input.
Un mēs jautāsim lietotājam to pašu — vai piekrītat, jautājuma zīme.
Tad ejam uz priekšu un sakām: ja s ir vienāds ar, tad kā būtu ar Y?
A?
Kā to izdarīt?
Nu, dažas lietas.
Izrādās, es darīšu to — s ir vienāds ar mazo y.
Pēc tam es iešu uz priekšu un izdrukāšu “Agreed”. Un elif s ir
vienāds ar lielo N vai s ir vienāds ar mazo burtu n, es iešu uz
priekšu un izdrukāšu "Not agreed.". Un es šobrīd apgalvoju, ka šī ir
identiska programmai kreisajā pusē C valodā.
Bet kas atšķiras? Tātad mēs joprojām rīkojamies ar tādu pašu loģiku:
šie vienādojumi tiek vienādoti, lai salīdzinātu vienlīdzību.
izteikt loģisku un C, [ŅURD]
jūs varat vienkārši burtiski uzrakstīt vārdu “and”. Tātad, šeit ir
mājiens, kāpēc Python valoda mēdz būt diezgan populāra.
Cilvēkiem vienkārši patīk, ka tā ir nedaudz tuvāka angļu valodai.
Šeit ir nedaudz mazāk sarežģītas sintakses.
Tagad viss ir pareizi, jo šis kods tagad darbosies.
Taču vienpēdiņu vietā esmu izmantojis arī dubultpēdiņas, kā arī pirms
dažām minūtēm savā Python datu tipu sarakstā izlaidu vārdu “char”.
Python valodā nav char.
Nav atsevišķu rakstzīmju.
Ja vēlaties manipulēt ar atsevišķu rakstzīmi, izmantojiet virkni ar
izmēru 1, tas ir - str.
Tagad Python valodā varat izmantot vienpēdiņas vai dubultpēdiņas.
Es apzināti visur izmantoju dubultpēdiņas, lai nodrošinātu atbilstību
tam, kā mēs apstrādājam virknes C valodā.
Tomēr ir diezgan izplatīti tagad lietot vienpēdiņas, kaut vai tāpēc,
ka uz lielāko daļu tastatūru vairs nav jātur Shift taustiņš.
Cilvēki patiešām ir sākuši optimizēt, cik ātri viņi vēlas kodēt.
Tāpēc vienpēdiņu izmantošana mēdz būt diezgan populāra arī Python un
citās valodās.
Tās būtībā ir vienādas, vienpēdiņas vai dubultpēdiņas, atšķirībā no C
valodas, kur tām ir nozīme.
Tātad viss ir pareizi, es apgalvoju.
Un, patiesībā, ļaujiet man to ātri palaist.
Šeit es atvēršu savu termināļa logu.
Ļaujiet man atbrīvoties no versijas C valodā un palaist python no
agree.py.
Un es ierakstīšu Y.
OK. Es palaidīšu to vēlreiz un ierakstīšu mazo y.
Un es noteikšu, ka tas darbosies arī ar “nē”.
Bet tas ne vienmēr ir vienīgais veids, kā mēs to varam izdarīt.
Ir arī citi veidi, kā īstenot to pašu ideju.
Un patiesībā es varu to izdarīt tādā veidā.
Ļaujiet man atgriezties pie sava koda šeit.
Un mēs iepriekš redzējām mājienu uz to.
Mēs zinām, ka Python valodā pastāv saraksti, un jūs varat tos
izveidot, vienkārši izmantojot kvadrātiekavas.
Ko darīt, ja es mazliet vienkāršotu kodu un vienkārši pateiktu, ja s
ir šajā vērtību sarakstā — lielais Y vai mazais y.
Loģiski, ka tas viss nav tik savādāks, bet tas ir nedaudz skaidrāks.
Tas ir daudz kompaktāks.
Tātad, ja elif s ir ar lielo N vai mazo n, es tik un tā varu izteikt
to pašu domu.
Tātad šeit atkal kļūst mazliet patīkamāk rakstīt kodu.
Ir mazāk sitienu pa tastatūru.
Jūs varat izteikties kodolīgāk.
Un, izmantojot atslēgvārdu in, Python izdomās, kā meklēt visā
sarakstā neatkarīgi no s vērtības.
Un, ja tas to atradīs, tas automātiski atgriezīs True.
Citādi tas atgriezīs False.
Tātad, ja es vēlreiz palaižu agree.py un ierakstu lielo Y vai mazo y,
tas joprojām darbojas.
Ja vēlos pievienot papildu funkcijas, es varu to uzlabot.
Nu, ko darīt, ja es vēlos atbalstīt ne tikai lielo Y un mazo y, bet
arī "Yes" vai "yes", vai gadījumā, ja lietotājs kliedz vai kāds,
kuram nepatīk CapsLock ieraksta “YES”? Uzgaidiet mirklīti.
Bet tas varētu būt dīvaini.
Vai mēs gribam atbalstīt šo vai to?
Tas ātri, kombinatoriski kļūst ļoti nogurdinoši, ja ņemat vērā visas
šīs iespējamās variācijas.
Gudrākais būtu darīt kaut ko līdzīgu šim, ja vēlaties vienkārši
paciest “yes” jebkādā lielo burtu formātā?
Loģiski, kas būtu jauki?
Mērķauditorija: Varbūt, lai kāda būtu ievade, jūs vienkārši pārsūtiet
to uz visiem mazajiem burtiem, bet ar lielajiem burtiem, un pēc tam
atkārtojiet to?
DEIVIDS MALANS: Tieši tā.
Super izplatīta paradigma.
Kāpēc gan mēs vienkārši neizmantojam lietotāja ievades burtus ar
visiem mazajiem vai lielajiem burtiem — tam nav nozīmes, ja vien esam
konsekventi — un vienkārši nesalīdzinām ar visiem lielajiem vai
mazajiem burtiem.
Un pretējā gadījumā tas atbrīvos no visām iespējamām variācijām.
Tagad valodā C mēs, iespējams, būtu izdarījuši kaut ko līdzīgu šim.
Mēs varētu būt vienkāršojuši visu šo sarakstu un vienkārši teikuši —
pieņemsim, ka darīsim — kā būtu ar mazajiem burtiem?
Tātad, y vai yes, un mēs to tā atstāsim.
Bet tagad mums ir jāpiespiež s lietot mazos burtus.
Nu, C valodā mēs būtu izmantojuši C veida bibliotēku.
Mēs būtu izdarījuši to.lower un izsauktu šo funkciju, nododot to.
Lai gan ne īsti tāpēc, ka C tipa gadījumā tās darbojas ar atsevišķām
rakstzīmēm vai char, nevis veselām virknēm.
Mēs faktiski neredzējām funkciju, kas varētu C valodā pārvērst visu
virkni mazajos burtos.
Bet Python valodā mēs gūsim labumu arī no dažām citām funkcijām.
Izrādās, ka Python atbalsta tā saukto objektorientēto programmēšanu.
Un CS50 mēs tai pieskarsimies tikai virspusīgi.
Bet, ja apgūstat augstāka līmeņa programmēšanas C kursu vai CS, jūs
to izpētāt kā citu paradigmu.
Līdz šim C valodā mēs esam koncentrējušies uz to, ko patiešām sauc
par procesuālo programmēšanu.
Jūs rakstāt procedūras.
Jūs rakstāt funkcijas no augšas uz leju, no kreisās uz labo.
Un, kad vēlaties mainīt kādu vērtību, mums bija ieradums izmantot
procedūru, tas ir - funkciju.
Jūs nodotu kaut ko - piemēram, mainīgo - funkcijai, teiksim, toupper
vai tolower, un tā darītu savu uzdevumu un atgrieztu jums vērtību.
Izrādās, ka programmēšanas ziņā būtu jaukāk, ja dažiem datu tipiem
tomēr būtu iebūvēta funkcionalitāte.
Kāpēc mums šeit ir mūsu mainīgie un visas mūsu palīgfunkcijas,
piemēram, toupper un tolower šeit, tā, ka mums pastāvīgi ir jānodod
viens otram.
Būtu jauki mūsu datu tipā iekļaut kādu iebūvētu funkcionalitāti, lai
jūs varētu mainīt mainīgos, izmantojot to noklusējuma iebūvēto
funkcionalitāti.
Un tā, objektorientētā programmēšana, citādi pazīstama kā OOP, ir
paņēmiens, kurā noteikta veida vērtībās, piemēram, virknē — t.s. str
- ir ne tikai iebūvētas īpašības — atribūti, tādi kā struct C
valodā – jūsu datos var būt arī iebūvētas funkcijas.
Tātad, lai gan C valodā, kas nav orientēta uz objektu, jums ir struct.
Un struct var saglabāt tikai datus, piemēram, vārdu un numuru,
ieviešot personu.
Piemēram, valodā Python var būt ne tikai struktūra — citādi pazīstama
kā klase - kas glabā vārdu un numuru.
Varat iestatīt, lai funkcija izsauktu šo personu vai nosūtītu tai
e-pasta ziņojumu, vai faktiskos darbības vārdus vai darbības, kas
saistītas ar šo datu daļu.
Tagad virkņu kontekstā izrādās, ka virknēm ir daudz noderīgas
funkcionalitātes.
Un patiesībā šajā vietrādī URL, kas atrodas vietnē docs.python.org,
kas ir oficiālā Python dokumentācija, jūs redzēsiet visu metožu
sarakstu, tas ir - funkcijas , kas nāk ar virknēm, kuras varat
izmantot, lai mainītu to vērtības.
Un es ar to domāju sekojošo.
Ja mēs izejam cauri dokumentācijai, paskatamies apkārt, izrādās, ka
virknēm ir funkcija, ko sauc par lower.
Un, ja vēlaties izmantot šo funkciju, jums vienkārši ir jāizmanto
nedaudz atšķirīga sintakse nekā valodā C.
Jūs neizpildiet tolower un neizpildiet, kā es tikko izdarīju, lower,
jo šī funkcija ir iebūvēta pašā s.
Un tāpat kā C valodā, kad vēlaties iekļūt mainīgajā, piemēram,
struktūrā, un piekļūt tajā esošajiem datiem, piemēram, vārdam vai
numuram, ja datu tipos ir arī iebūvētas funkcijas — t.s. metodes;
metode ir tikai funkcija, kas ir iebūvēta datos — šajā gadījumā varat
norādīt s, punkts, lower atvērt iekavas, aizvērt iekavas.
Un es to varu izdarīt arī šeit.
Ja ir s.lower, pēdiņās “n” vai “no”, viss, es varu piespiest visu šo
rakstīt ar mazajiem burtiem.
Tātad vienīgā atšķirība tagad ir objektorientēta programmēšana, tā
vietā, lai pastāvīgi nodotu vērtību funkcijai, jūs vienkārši
piekļūstat funkcijai, kas atrodas vērtības iekšpusē.
Tas darbojas tikai tāpēc, ka pati valoda ir definēta.
Un vienīgais veids, kā uzzināt, vai šīs funkcijas pastāv, ir
dokumentācija — klase, grāmata, vietne vai tamlīdzīgi.
Vai jums ir jautājumi par šo tehniku?
Labi.
Es apgalvoju, ka tas ir pareizi.
Tagad, lai gan jūs nekad iepriekš neesat programmējuši Python valodā,
lielākā daļa no jums, tā nav īpaši labi izstrādāta.
Tagad 3. un 5. rindā ir neliela neefektivitāte.
Kas ir stulbs tajā, kā es izmantoju lower, kā jūs domājat?
Jā?
Jūs vienkārši gribat citu [? mainīgo. ?]
DEIVIDS MALANS: Jā.
Ja jūs plānojat izmantot vienu un to pašu funkciju divas reizes un
uzdot vienu un to pašu jautājumu, gaidot to pašu atbildi, kāpēc jūs
divreiz izsaucat vienu un to pašu funkciju?
Varbūt mums vajadzētu vienkārši saglabāt rezultātu mainīgajā.
Tāpēc mēs to varētu izdarīt dažādos veidos.
Mēs, piemēram, varētu uzkāpt šeit un izveidot citu mainīgo ar
nosaukumu t un iestatīt, ka tas ir vienāds ar s.lower.
Un tad mēs varētu vienkārši mainīt to uz t, šeit.
Bet godīgi, es nedomāju, ka mums tehniski ir vajadzīgs cits mainīgais.
Es varētu izdarīt kaut ko līdzīgu šim.
Mainīsim s vērtību, lai tā būtu tā mazo burtu versija.
Un tāpēc tagad es varu gluži vienkārši atsaukties uz s atkal un atkal
šādi, atkārtoti izmantojot to pašu vērtību.
Tagad, lai pārliecinātos, es tikko pazaudēju lietotāja sākotnējo
ievadi.
Un, ja man tas rūp — ja tie bija rakstīti ar lielajiem burtiem, man
vairs nav ne jausmas.
Tāpēc, iespējams, es vēlos izmantot atsevišķu mainīgo.
Taču arī šeit ir jāņem vērā tas, ka Python virknes tehniski sauc par
nemainīgajām, tas ir - tās nevar mainīt.
Tā tas nebija C valodā.
Kad mēs bijām iedevuši jums masīvus otrajā nedēļā vai atmiņu
ceturtajā nedēļā, jūs varējāt baudīt virkni un mainīt jebkuru no
vēlamajām rakstzīmēm — lielos, mazos burtus, mainīt tos, saīsināt un
tā tālāk.
Bet šajā gadījumā tiek atgriezta s kopija, kas ir spiesta lietot
mazos burtus.
Tas nemaina sākotnējo virkni, tas ir - baitus datora atmiņā.
Piešķirot to atpakaļ s, jūs būtībā aizmirstat par veco s versiju.
Taču, tā kā Python valoda veic atmiņas pārvaldību jūsu vietā — te nav
malloc, te nav free — Python automātiski atbrīvo sākotnējos baitus,
piemēram, YES, un nodod tos atpakaļ operētājsistēmai jūsu vietā.
Labi.
Vai jums ir jautājumi par šo tehniku?
Jautājumi par šo?
Kopumā es uzsvēršu — Python dokumentācija kļūs par jūsu draugu, jo
klasē mēs virspusīgi pieskaramies tikai dažām no šīm lietām.
Bet, piemēram, vietnē docs.python.org ir atsauce uz visām iebūvētām
funkcijām, kas nāk ar valodu, kā arī, piemēram, tām, kurām ir virkne.
Labi.
Pirms aizejam pārtraukumā, paturpināsim un izveidosim kaut ko
pazīstamu, pamatojoties uz mūsu nedēļām šeit - valodā C.
Ļaujiet man ierosināt pārskatīt šos piemērus, kas ir saistīti ar
dažiem ņaudieniem.
Tā, piemēram, kad mūsu kaķis C valodā ņaudēja pirmajā nedēļā un pēc
tam otrajā, mēs izdarījām kaut ko, kas sākumā bija nedaudz muļķīgi -
izveidojām datni, kā es to izdarīšu šeit. Šoreiz to sauc par meow.py.
Un, ja es gribu, lai kaķis ņaud trīs reizes, es varētu to palaist
vienu reizi, piemēram, šādi, neliels kopēt-ielīmēt.
Un tagad, python no meow.py, un es esmu pabeidzis.
Tagad mēs esam apskatījuši šo piemēru vismaz divas reizes, tagad
Scratch un C valodā.
Tas ir pareizi, es apgalvošu, bet kas, acīmredzot, ir slikti
izstrādāts?
Kas te par vainu?
Jā?
Mērķauditorija: Tam vajadzētu būt tikai cilpai.
DEIVIDS MALANS: Tam vajadzētu būt tikai cilpai, vai ne?
Kāpēc rakstīt trīs reizes?
Burtiski kopēšana un ielīmēšana gandrīz vienmēr ir slikta lieta,
izņemot C, kad jums ir funkciju prototipi, kas jums ir jāaizņemas.
Bet šajā gadījumā tas ir vienkārši neefektīvi.
Tātad, ko mēs varētu uzlabot šeit, Python valodā?
Nu, Python valodā mēs, iespējams, varētu to mainīt pāris dažādos
veidos.
Mēs varētu aizņemties kādu no sintakses, ko iepriekš piedāvājām
slaidu formā, piemēram: dodiet man mainīgo ar nosaukumu i.
Iestatiet to uz 0, bez semikola.
Kamēr i ir mazāks par 3 — ja es vēlos to darīt trīs reizes - es varu
iet uz priekšu un izdrukāt “meow”. Un tad es varu izpildīt i plus ir
vienāds ar 1.
Un es domāju, ka tas visu atrisinātu.
Python no meow.py, un mēs jau esam atpakaļ ierindā.
Nu, ja es vēlētos to mainīt uz for cilpu, labi, Python valodā, tas
būtu nedaudz skaidrāk, taču šī nebūtu labākā pieeja.
Tātad, ja i ir 0, 1, 2, es varētu vienkārši izdrukāt "meow", šādā
veidā.
Un tas arī padarītu darbu.
Bet, atgriežoties pie mūsu diskusijas iepriekš, tas diezgan ātri
kļūtu muļķīgi, ja jums būtu jāturpina uzskaitīt visas šīs vērtības.
Ko mēs tā vietā ieviesām?
Diapazona funkciju.
Tieši tā.
Tā man daudz efektīvāk atdod tikai tās vērtības, kuras es vēlos,
patiešām, pa vienai.
Tātad, pat ja es to palaižu trešo vai ceturto reizi, mums ir tāds
pats rezultāts.
Bet tagad pāriesim tur, uz kurieni mēs savulaik ar to devāmies.
Kā mēs varam sākt to modulēt?
Es apgalvoju, ka būtu jauki, ja MIT mums būtu devusii ņau funkciju.
Vai nebūtu jauki, ja Python mums būtu devusi ņau funkciju?
Varbūt Python valodā tas ir mazāk neatvairāmi, bet kā es varu
izveidot savu funkciju?
Es to darīju īsi ar pareizrakstības pārbaudītāju iepriekš, bet
ļaujiet man iet uz priekšu un ierosināt, ka mēs tagad varētu ieviest
mūsu pašu versiju Python valodā, kā norādīts tālāk.
Ļaujiet man sākt no jauna un izmantot atslēgvārdu def.
Tātad tas nepastāvēja C valodā.
Jums bija atgriešanas vērtība, funkcijas nosaukums, argumenti.
Valodā Python jūs burtiski sakāt def, lai definētu funkciju.
Jūs piešķirat tai nosaukumu, piemēram, - ņau.
Un tagad es iešu uz priekšu un, izmantojot šo funkciju, vienkārši
izdrukāšu ņau.
Un tas ļauj man to mainīt uz jebko citu, ko es vēlos nākotnē.
Bet pagaidām tā ir abstrakcija.
Un patiesībā es varu to pabīdīt no acīm prom, no sirds ārā —
vienkārši vairākas reizes nospiežot ievadīšanas taustiņu Enter, lai
izliktos, ka tagad tas pastāv, bet man ir vienalga, kā tas tiek
īstenots.
Un šeit, tagad, es varu darīt kaut ko līdzīgu šim.
Attiecībā uz i diapazonā 3, ļaujiet man turpināt un vairs nedrukāt
“meow”;.
Ļaujiet man vienkārši izsaukt ņau un vēl vairāk nostiprināt savu kodu.
Paskatīsimies.
Python no meow.py.
Es domāju, ka šī būs pirmā reize, kad tas nedarbosies pareizi.
Labi.
Diemžēl šeit ir mūsu pirmā Python kļūda.
Un paskatīsimies.
Sintakse atšķirsies no C valodas vai Clangs izvades.
Izsekošana (traceback) šeit ir mākslas termins.
Tas ir kā visu tikko izpildīto koda rindu vai, patiesībā, izsaukto
funkciju izsekošana.
Datnes nosaukums ir neinteresants.
Konkrēti, šī ir mana koda telpa, taču šeit svarīgs ir datnes
nosaukums — meow.py.
Mūsu 2. rindiņa ir problēma — labi, es netiku ļoti tālu, pirms
izgāzos, un tad te ir nosaukuma kļūda.
Un jūs redzēsiet, ka valodā Python parasti ir šie atslēgvārdi ar
lielo burtu, kas norāda uz problēmu.
Tas ir kaut kas saistīts ar mainīgo nosaukumiem.
“meow” nav definēts. Labi.
Jūs programmējat Python pirmo reizi.
Jūs salaidāt grīstē.
Jūs sekojat kādai tiešsaistes apmācībai.
Jūs redzat šo.
Prātojat.
Kāpēc “meow” nav definēta?
Ko mēs varam secināt par Python?
Kā loģiski novērst problēmas?
Mērķauditorija: [Nesadzirdami]
DEIVIDS MALANS: Varbūt.
Vai tas ir tāpēc, ka “meow” tiek definēta vēlāk?
Lai arī cik gudrs šķiet Python salīdzinājumā ar C, tām ir dažas
līdzīgas dizaina īpašības.
Tāpēc izmēģināsim šo.
Tāpēc ļaujiet man atritināt atpakaļ līdz tai vietai, kur to pārcēlu
iepriekš.
Ļaujiet man tikt no tā vaļā… - tur lejā.
Es to nokopēšu savā starpliktuvē.
Un ļaujiet man vienkārši kaut ko uzlauzt.
Ļaujiet man to vienkārši ievietot šeit.
Un redzēsim, vai tas darbosies.
Tagad ļaujiet man notīrīt savu termināli, palaist python no meow.py.
Labi.
Mēs esam atkal ierindā.
Tātad intuīcija patiešām nostrādāja.
Laba atkļūdošanas tehnika, tikai pārdomājiet to.
Tagad tas ir pretrunā ar to, ko es apgalvoju pirmajā nedēļā, proti,
ka jūsu programmas galvenajai daļai ideālā gadījumā vajadzētu būt
tikai datnes augšdaļā.
Nelieciet man to meklēt.
Tā nav liela problēma ar četrrindu programmu, taču, ja jums ir 40 vai
400 rindiņas, jūs nevēlaties, lai jūsu programmas sulīgā daļa būtu
šeit apakšā un visas šīs funkcijas būtu augšā.
Tāpēc varbūt būtu jauki, ja mums patiešām būtu galvenā funkcija.
Un patiesībā izrādās, ka Python valodā vienošanās definē galveno
funkciju.
Tā nav īpaša funkcija, kas tiek automātiski izsaukta kā, piemēram,
valodā C.
Bet cilvēki saprata, ziniet ko?
Tā bija diezgan noderīga funkcija.
Ļaujiet man definēt funkciju, ko sauc par galveno.
Ļaujiet man ievilkt šīs rindas zem tās.
Ļaujiet man praktizēt to, ko sludinu, kas ir: rakstiet galveno kodu
datnes augšdaļā..
Un, brīnišķīgā veidā, Python valodā tagad jums nav nepieciešami
prototipi.
Nav nevienas tādas uzlauztas funkcijas atgriešanas veida, nosaukuma
un argumentu kopēšanas un ielīmēšanas, kā tas bija vajadzīgs valodā
C.
Tas tagad ir kārtībā, izņemot vienu nelielu detaļu.
Ļaujiet man iet uz priekšu un palaist python no meow.py.
izmantojot galveno funkciju [VAID].
Bet tagad - nekas nav noticis.
Labi.
Pat ja jūs nekad iepriekš neesat programmējuši Python valodā, kas
varētu izskaidrot šo darbību un kā to novērst?
Atkal, kad atrodaties reālajā pasaulē un mācāties jaunu valodu, jums
ir tikai deduktīvā loģika atkļūdošanai.
Jā?
lai gan mēs [Nesadzirdami]..
DEIVIDS MALANS: Pareizi.
Tātad risinājums, lai būtu skaidrs, C valodā bija tāds, ka mums šeit
bija jāievieto prototips.
Pretējā gadījumā mēs saņemtu kļūdas ziņojumu.
Šajā gadījumā es faktiski nesaņemu kļūdas ziņojumu.
Patiešām, es apgalvošu, ka Python valodā prototipi jums nav vajadzīgi.
Vienkārši nav nepieciešami, jo tas bija kaitinoši, ja nekas cits.
Bet kas vēl varētu izskaidrot?
Jā, aizmugurē?
Mērķauditorija: [Nesadzirdami]
DEIVIDS MALANS: Jā.
Varbūt jums ir jāizsauc pati galvenā funkcija.
Ja galvenajai funkcijai Python valodā nav kāda īpaša statusa, varbūt
nepietiek ar to, ka tā vienkārši eksistē.
Un patiešām, ja vēlaties izsaukt galveno funkciju, jaunā vienošanās
faktiski būs — kā jūsu programmas pēdējā rinda, parasti — burtiski
izsaukt galveno funkciju.
Tas izskatās nedaudz muļķīgi, taču viņi pieņēma dizaina lēmumu.
Un tagad mēs to apstrādājam šādi.
Python no meow.py.
Tagad mēs esam atpakaļ ierindā.
Bet tagad, loģiski, kāpēc tas darbojas tā, kā tas darbojas?
Šajā gadījumā — no augšas uz leju — 1. rindiņa liek Python definēt
funkciju, ko sauc par galveno, un pēc tam definēt to šādi, 2. un
3. rindiņa.
Bet tā vēl nav galvenā funkcija.
6. rindiņa norāda Python, kā definēt funkciju, ko sauc par meow, taču
tā vēl neizsauc šīs rindas.
Tagad 10. rindā jūs sakāt Python: izsauc galveno funkciju.
Un tajā brīdī Python ir apmācīta, ja vēlaties, zināt, kas ir galvenā
funkcija 1. rindā, lai zinātu, kas ir meow 6. rindā.
Tagad ir pilnīgi ok, ja galvenā ir augstāk par meow, jo jūs vēl
neesat tās izsaukuši.
Jūs definējāt, definējāt un pēc tam izsaucāt.
Un tāda ir šī loģika.
Vai jums ir jautājumi par šīs tehnikas struktūru?
Tagad izpildīsim vēl vienu.
Atcerieties, ka pēdējā lieta, ko mēs darījām valodās Scratch un C,
faktiski bija šo pašu funkciju parametrizēšana.
Tātad pieņemsim, ka nevēlaties, lai galvenā funkcija būtu atbildīga
par cilpu šeit.
Tā vietā jūs vēlaties, ļoti vienkārši, izdarīt kaut ko, piemēram, kā
“meow” trīs reizes un beigt ar to.
Nu, Python valodā, tas pēc būtības būs līdzīgi kā valodā C.
Taču mums nav jāturpina pieminēt datu tipi.
Ja vēlaties, lai "meow" pieņemtu kādu argumentu, piemēram, skaitli n,
kā šī argumenta nosaukumu varat norādīt n.
Vai arī varat to nosaukt kā citādi, protams, kā vēlaties.
Jums nav jānorāda int vai kaut kas cits.
Savā kodā tagad, meow iekšpusē, varat darīt kaut ko līdzīgu,
piemēram, i in, teiksim — es noteikti tagad nevaru to izdarīt, jo tas
būtu dīvaini sākt sarakstu un beigt to ar n.
Tātad, ja es varu atgriezties šeit, kāds ir risinājums?
Kā es varu kaut ko darīt n reizes?
Mērķauditorija: [Nesadzirdami]
DEIVIDS MALANS: Jā.
Izmantojot diapazonu.
Tātad diapazons ir jauks, jo tagad varu nodot šo mainīgo n.
Un tagad es varu ņaudēt - ak.
Tagad es varu izdrukāt, pēdiņās, meow. Tātad tas ir gandrīz tāpat kā
Scratch, gandrīz tāpat kā C valodā.
Bet tas ir nedaudz vienkāršāk.
Un, ja es tagad palaistu meow.py, man būs iespēja to izdarīt arī šeit.
Labi.
Jautājumi par kādu no šiem tematiem?
Šobrīd mēs ejam cauri pirmajai nedēļai.
Mēs īslaicīgi pakāpināsim lietas, lai aplūkotu ne tikai dažus no šiem
pamatiem, bet arī citas funkcijas, piemēram, ar sejas atpazīšanu ar
pareizrakstības programmu vai tamlīdzīgi.
Tā kā mūsu šeit ir daudz, mums vestibilā ir milzīgs daudzums konfekšu.
Kāpēc gan mums nepaņemt 10 minūšu pārtraukumu?
Un, kad atgriezīsimies, mēs darīsim vēl brīnišķīgākas, jaudīgākas
lietas ar Python 10. versiju.
Labi.
Tātad esam atpakaļ.
Viens no mūsu mērķiem tagad ir ieviest vēl dažus blokus, lai mēs
beigās varētu atrisināt interesantākas problēmas, līdzīgi tām, ar
kurām mēs sākām.
Jūs atceraties, ka pirms dažām nedēļām mēs spēlējām ar šo
divdimensiju Super Mario pasauli?
Un mēs mēģinājām izdrukāt vertikālu kolonnu no trīs vai vairāk
ķieģeļiem.
Ļaujiet man ieteikt izmantot to kā iespēju, lai tagad arī izmantotu
dažas no Python noderīgākām un lietotājam draudzīgākām funkcijām.
Tāpēc ļaujiet man iekodēt datni ar nosaukumu mario.py, un tad
izdrukāsim šīs vertikālās kolonnas ekvivalentu.
Tātad tā augstums ir 3.
Katrs no tiem ir numura zīme, tāpēc sākotnēji izmantosim i diapazonā
no 3 un izdrukāsim vienu numura zīmi.
Un es domāju, ka tagad python no mario.py — voilà!
Mēs esam ierindā, izdrukājot tikai to pašu kolonnu.
Ko darīt, ja mēs vēlamies izdrukāt mainīga augstuma kolonnu, kurā
lietotājs norāda, cik augstu viņš to vēlas?
Nu, ļaujiet man, piemēram, uzkāpt šeit, un tā vietā, kā būtu...
izdarīsim šādi.
Kā būtu ar cs50 import?
Kā ar funkciju get_int, tāpat kā iepriekš?
Tādējādi tiks nodrošināts, ka lietotājs mums sniedz veselu skaitli.
Un tagad, agrāk, kad vēlējāmies saņemt numuru no lietotāja, mēs
faktiski esam sekojuši noteiktai paradigmai.
Patiesībā, ja es šeit, piemēram, atveru, teiksim, mario1.c pirms kāda
laika, jūs varētu atcerēties, ka mums bija šāds kods.
Un mēs izmantojam tieši do while cilpu valodā C ikreiz, kad vēlamies
kaut ko iegūt no lietotāja, iespējams, atkal un atkal un atkal, līdz
viņš sadarbojas.
Tajā brīdī mēs beidzot izkļūstam no cilpas.
Izrādās, Python ir while cilpas, ir for cilpas, un nav do while
cilpas.
Un tomēr gandrīz jebkad, kad esat saņēmuši lietotāja ievadi, jūs,
iespējams, esat izmantojuši šo paradigmu.
Tātad izrādās, ka Python valodā ekvivalents tam ir darīt, pēc būtības
līdzīgi, bet izmantojot tikai while cilpu.
Un Python izplatīta paradigma, kā jau minēju iepriekš, ir apzināti
izraisīt bezgalīgu cilpu while True — lielais T — un pēc tam darīt
to, ko vēlaties, piemēram, saņemt int no lietotāja un pamudināt viņu
izmantot, piemēram, attiecīgo augstumu.
Un tad, ja esat pārliecināti, ka lietotājs ir devis jums to, ko
vēlaties, piemēram, n ir lielāks par 0, ko es vēlos šajā gadījumā, jo
es vēlos pozitīvu veselu skaitli; pretējā gadījumā tur nav ko
drukāt — jūs burtiski vienkārši izkļūstat no cilpas.
Un tāpēc mēs faktiski varētu izmantot šo paņēmienu valodā C.
Tas vienkārši nav izdarīts valodā C.
Jūs noteikti varētu C valodā kādu laiku veikt while True cilpu ar
iekavām, true mazajiem burtiem.
Jūs varētu izlauzties no tās, un tā tālāk.
Bet Python valodā - šis ir Python veids.
Un tas patiesībā ir mākslas termins.
Šis Python veids ir pitonisks. Tas ir pēdiņās “veids, kā visi to
dara”.
Tas nenozīmē, ka jums tas ir jādara, bet tas ir veids, kā foršie
Python programmētāji īstenotu šādu ideju — mēģinātu kaut ko darīt
atkal un atkal un atkal, līdz lietotājs patiešām sadarbojas.
Bet viss, ko esam paveikuši, ir atņemt do while cilpu.
Bet tomēr, loģiski, mēs varam īstenot to pašu ideju.
Tagad, zem šī, ļaujiet man izdrukāt, jo šoreiz i ir diapazonā n — jo
es vēlos, lai tas būtu mainīgais, nevis 3.
Es varu turpināt un izdrukāt hash — ļaujiet man atbrīvoties no C
versijas šeit — atveršu termināļa logu un atkal palaidīšu Python no
mario.py.
Es ievadīšu 3 un atgūšu šīs trīs numura zīmes.
Bet, ja es tā vietā ierakstu 4, tā vietā tagad saņemu četras numura
zīmes.
Tātad svarīgākais šeit ir tas, pavisam vienkārši, ka šādā veidā,
piemēram, faktiski var atgūt vērtību Python valodā, kas atbilst kādam
parametram, piemēram, lielākam par 0.
Kā būtu ar šo?
Praktizēsim to, ko pirms brīža sludinājām ar saviem ņaudošajiem
piemēriem un to visu ņemsim vērā.
Ļaujiet man turpināt un definēt galveno funkciju, tāpat kā iepriekš.
Ļaujiet man šobrīd pieņemt, ka pastāv funkcija get_height, kas Python
valodā nav paredzēta.
Es to izgudrošu pēc mirkļa.
Un tagad es iešu uz priekšu un izdarīšu kaut ko līdzīgu šim.
i šī augstuma diapazonā, ejam uz priekšu un izdrukāsim tās numura
zīmes.
Tāpēc es pieņemu, ka get_height pastāv.
Ļaujiet man turpināt un ieviest šo abstrakciju, tāpēc tagad
definējiet funkciju, ko sauc par get_height.
Šajā dizainā nav nepieciešami nekādi argumenti.
While True, es varu turpināt un darīt to pašu, ko iepriekš — piešķirt
mainīgo n, get_int atgriešanas vērtība liek lietotājam norādīt šo
augstumu.
Un tad, ja n ir lielāks par 0, es varu iet uz priekšu un pārtraukt.
Bet, ja es šeit pārtraucu, es loģiski — tāpat kā valodā C — izpildu
zem attiecīgās cilpas.
Bet tur nekā nav.
Bet, ja es gribu, lai get_height atgrieztu augstumu, kas man
jāieraksta šeit 14. rindā, loģiski?
Ko es gribu atgriezt, lai būtu skaidrs?
Mērķauditorija: [Nesadzirdami]
DEIVIDS MALANS: Jā.
Tāpēc es patiesībā vēlos atgriezt n.
Un šeit ir vēl viens Python interesants moments salīdzinājumā ar
valodu C.
Šķiet, ka vairs nav jautājumu par darbības redzamības apgabalu, vai
ne?
C valodā bija ļoti svarīgi ne tikai deklarēt savus mainīgos ar datu
tipiem, bet arī ņemt vērā to atrašanās vietu — šajās figūriekavās.
Python valodā, izrādās, jūs varat būt nedaudz brīvāki, uz labu vai
sliktu.
Un tā, 11. rindā, ja es izveidoju mainīgo ar nosaukumu n, tas pastāv
11., 12. un pat 13. rindā ārpus cilpas while.
Skaidrības labad jāsaka, ka C valodā ar while cilpumums parasti
nebūtu kola.
Mums būtu bijušas figūriekavas, piemēram, šeit un šeit.
Un pirms nedēļas es būtu apgalvojis, ka C valodā n neeksistē ārpus
cilpas while, pēc figūriekavu jēgas.
Pat ja figūriekavu vairs nav, Python faktiski ļauj izmantot mainīgo
jebkurā laikā pēc tam, kad tam ir piešķirta vērtība.
Tātad nedaudz jaudīgāk pēc būtības.
Tomēr loģiski, es varu to nedaudz pastiprināt.
Un tā ir taisnība valodā C.
Man tiešām nav nepieciešams izlauzties no cilpas, izmantojot
pārtraukumu.
Atcerieties to vai ziniet, ka es tiešām varu — kad esmu gatavs, es
varu atgriezt man nepieciešamo vērtību, pat cilpas ietvaros.
Un tam būs blakus efekts, proti, mani izraus no cilpas, kā arī
izslēgs mani un atgriezīs no visas funkcijas.
Tātad šeit nav nekā jauna attiecībā uz C pret Python, izņemot šo
problēmu ar redzamības apgabalu.
Un es tiešām tur apakšā atgriezu n, lai būtu skaidrs, ka n joprojām
pastāvēs.
Tātad jebkurš no tiem ir pareizs.
Tagad man ir tikai Python programma, kas, manuprāt, ļaus man īstenot
šo pašu Mario ideju.
Palaidīsim python no mario.py.
Un... Labi, nekas nenotika.
Python no mario.py.
Ko es izdarīju nepareizi?
Mērķauditorija: [Nesadzirdami]
DEIVIDS MALANS: Jā, man jāizsauc galvenā funkcija.
Tātad mana koda apakšā man šeit ir jāizsauc galvenā funkcija.
Un šī ir stilistiska detaļa, kas ir bijusi grūti satverama.
Vispārīgi runājot, rakstot Python valodā, CS50 stila rokasgrāmata
pati par sevi nepastāv.
Patiesībā ir arī Python stila rokasgrāmata, kurai lielākā daļa
cilvēku seko.
Un šajā gadījumā dubultās tukšas rindas starp funkcijām ir norma.
Es to daru apzināti, lai gan pretējā gadījumā tas varētu nebūt
acīmredzami.
Bet tagad, kad esmu izsaucis galveno funkciju 16. līnijā, vēlreiz
palaidīsim mario.py.
Aha.
Tagad mēs to redzam.
Ierakstiet 3, un es atkal sāku darboties, izdrukājot vērtības.
Jā?
AUDITORIJA: Kāpēc jūs [Nesasdzirdami]?
Kāpēc nevar [Nesadzirdami]?
DEIVIDS MALANS: Protams.
Kāpēc man vispār ir vajadzīgs if nosacījums?
Kāpēc es nevaru vienkārši atgriezt n šeit, veicot n atgriešanu.
Vai arī, ja es patiešām vēlos būt īss, es varētu tehniski vienkārši
izdarīt šo.
Vienīgais iemesls, kāpēc pievienoju nosacījumu if, ir tāpēc, ka, ja
lietotājs ieraksta negatīvu 1, negatīvu 2, es vēlējos to prasīt atkal
un atkal.
Tas arī viss.
Bet arī tas būtu pilnīgi pieņemami, ja jums derētu šis rezultāts.
Ļaujiet man izdarīt vēl vienu lietu, lai norādītu, kāpēc mēs tik
bieži lietojam get_int.
Šis jaunais palīgritenis, lai arī uz laiku.
Tāpēc ļaujiet man atgriezties pie tā, kā tas bija pirms brīža, un
ļaujiet man ierosināt tagad noņemt get_int.
Iepriekš es apgalvoju, ka, ja neizmantojat get_int, varat vienkārši
izmantot pašu ievades funkciju no Python.
Bet tas vienmēr atgriež virkni vai str.
Tāpēc atcerieties, ka ievades funkcijas izvade ir jānodod int, vai nu
tajā pašā rindā, vai, ja vēlaties, citā rindā.
Bet izrādās tas, ko es nedarīju, bija parādījis, kas notiek, ja
nesadarbojaties ar programmu.
Tātad, ja es tagad palaižu python no mario.py, tas darbojas lieliski
pat bez get_int funkcijas.
Un es to varu izdarīt ar 4.
Joprojām darbojas lieliski.
Bet ļaujiet man notīrīt savu termināli un būt sarežģītam tagad kā
lietotājam, un tad tā vietā ierakstīt "cat" augstumam.
Enter.
Tagad mēs atkal redzam vienu no šīm izsekošanām.
Šī ir savādāka.
Tā nav nosaukuma kļūda, bet, šķiet, vērtības kļūda.
Un, ja es ignorēju lietas, ko es nesaprotu, es redzu "invalid literal
for int with base 10-- "cat."". Tas ir ļoti noslēpumains veids, kā
pateikt, ka CAT nav skaitlis decimāldaļās.
Un tāpēc man šķiet, ka šī lieta ir kaut kā jārisina.
Un, ja vēlaties būt ziņkārīgāki, jūs redzēsiet, ka šī patiešām ir
izsekošana.
Un arī C valoda mēdz to darīt, vai arī atkļūdotājs to darītu jūsu
vietā.
Jūs varat redzēt visas funkcijas, kas ir izsauktas, lai nokļūtu šajā
punktā.
Tātad acīmredzot mana problēma sākotnēji ir 14. rindā.
Bet 14. rindiņa, ja turpinu ritināt, ir neinteresanta.
Tā ir galvenā.
Bet 14. rinda liek man izpildīt 2. rindu, kas patiešām ir rakstīta
galvenajā funkcijā.
Tas liek man izpildīt 9. rindu, kas ir rakstīta get_height funkcijā.
Un tā, labi, šeit ir problēma.
Tāpēc kļūdas ziņojumam tuvākais rindas numurs, iespējams, atklāj
visvairāk.
9. rindā ir mana problēma.
Tāpēc es nevaru vienkārši akli lūgt lietotājam ievadi un pēc tam
pārvērst to par int, ja viņš nevēlas man dot int.
Tagad, kā mēs ar to tiksim galā?
Atgriežoties pie otrās problēmu kopas, jūs varētu atcerēties, ka esat
apstiprinājuši, ka lietotājs ir ievadījis skaitli, izmantojot cilpu
for un tamlīdzīgi.
Izrādās, Python valodā ir labāks veids, kā to izdarīt, un semantika
ir tur.
Ja vēlaties mēģināt pārvērst kaut ko par skaitli, kas patiesībā
varētu nebūt skaitlis, izrādās, Python un dažās citās valodās
burtiski ir atslēgvārds, ko sauc par try.
Un, ja vien tas būtu pēdējās nedēļās, es zinu.
Bet ar savu kodu varat mēģināt veikt tālāk norādītās darbības.
Ko es vēlos mēģināt izdarīt?
Nu, es vēlos mēģināt izpildīt šīs dažas rindiņas, izņemot, ja tur ir
kļūda.
Tāpēc es varu teikt, izņemot gadījumus, kad ir vērtības kļūda —
konkrēti tā, kuru es salaidu grīstē un izveidoju pirms brīža.
Un, ja ir vērtības kļūda, es varu izdrukāt lietotājam informatīvu
ziņojumu, piemēram, "not an integer" vai kaut ko tamlīdzīgu.
Un tas, kas notiek šeit, tagad, ir burtiski šis operatīvais vārds -
try.
Python mēģinās iegūt ievadi un mēģināt to pārveidot par int, un tā
mēģinās pārbaudīt, vai tas ir lielāks par 0, un pēc tam mēģinās to
atgriezt.
Kāpēc?
Trīs no šīm rindām ir iekšpusē, ievilktas zem mēģinājuma bloka,
izņemot gadījumus, ja kaut kas noiet greizi — konkrēti, notiek
vērtības kļūda.
Pēc tam tas izdrukā šo.
Bet tas neko neatdod.
Un tā kā es esmu cilpā, tas nozīmē, ka tas to darīs atkal un atkal un
atkal, līdz cilvēks patiešām sadarbojas un iedod man reālu skaitli.
Un tā, arī to pasaule sauktu par pitonisku.
Izmantojot Python, jūs noteikti nemēģināt stingri pārbaudīt lietotāja
ievadi, pārliecinoties, vai viņi nav pieļāvuši kļūdas.
Jūs, godīgi sakot, izmantojat daudz vājprātīgāku pieeju un vienkārši
mēģināt kaut ko darīt, bet, ja tā notiek - noķerat kļūdu.
Tātad noķert ir arī mākslas termins, lai gan tas šeit nav atslēgvārds.
Izņemot gadījumus, kad kaut kas notiek, jūs ar to tiekat galā.
Tātad jūs mēģināt un tiekat galā.
Ja vēlaties, programmējiet pēc iespējas labāk.
Bet tas ir iekļauts Python programmēšanas kopienas domāšanā.
Tātad tagad, ja es veicu mario.py python un sadarbojos, tas darbojas
tikpat lieliski kā iepriekš.
Mēģiniet un gūsties panākumus.
3 der.
4 der.
Tomēr, ja es mēģinu un man neizdodas, ierakstot “cat”, tas pats par
sevi nesabrūk.
Tas man neuzrāda kļūdu.
Tas man parāda kaut ko lietotājam draudzīgāku, piemēram, "not an
integer." Un tad es varu mēģināt vēlreiz ar “dog”. "Not an integer."
Es varu mēģināt vēlreiz ar 5.
Un tagad tas darbojas.
Tāpēc mēs parasti nerakstīsim daudz par šiem mēģinājuma-izņēmuma
blokiem, jo tie ātri kļūst nedaudz sarežģīti.
Bet tas ir, lai atklātu, ko dara funkcija get_int.
Tāpēc mēs piedāvājam jums palīgriteņus, lai, ja vēlaties iegūt int,
jums nav jālec cauri visiem šiem kaitinošajiem riņķiem, lai to
izdarītu.
Bet tas ir viss, ko bibliotēka patiešām dara jūsu labā, tas ir -
tikai mēģina un veic izņēmumus.
Galu galā jūs nepaliksiet ar palīgriteņiem.
Vai jums ir jautājumi par to, kā iegūt informāciju un mēģināt šādā
veidā?
Jebkas?
Jā?
[Nesadzirdami] mēģinājuma bloks.
DEIVIDS MALANS: Vai jūs varētu šo nosacījumu iekļaut ārpus mēģinājuma
bloka?
Īsa atbilde - jā.
Un patiesībā es cīnījos ar to pagājušajā naktī, kad pielāgoju šo
piemēru, lai parādītu vienkāršāko versiju.
Es noliegšu, ka patiesībā man vajadzētu tikai burtiski mēģināt
paveikt trauslo daļu.
Un tad, šeit, lejā, man patiešām vajadzētu darīt to, ko jūs
piedāvājat, proti, izpildīt nosacījumus šeit.
Tomēr problēma ir tāda, ka, loģiski, tas viss ātri kļūst ļoti
nekārtīgs, vai ne?
Jo, izņemot, ja ir vērtības kļūda, es vēlos izdrukāt “not an
integer”. Tad es nevaru salīdzināt n ar 0, jo n neeksistē, jo bija
kļūda.
Izrādās, un es jums to parādīšu; šī tagad ir Python uzlabotā
versija — patiesībā Python varat izmantot citu atslēgvārdu, kas
nepavada if vai elif.
Tas pavada mēģinājumu un izņēmumu, kas, manuprāt, ir dīvaini
mulsinoši.
Labāk būtu bijis cits vārds.
Bet, ja jūs patiešām vēlētos, es būtu varējis to izdarīt.
Un šī ir viena no šīm dizaina lietām, kurai saprātīgi cilvēki
nepiekritīs.
Vispārīgi runājot, jums vajadzētu mēģināt izpildīt tikai vienu
rindiņu, kas mierīgi var neizdoties.
Bet, godīgi sakot, tas izskatās muļķīgi.
Nē, tas ir vienkārši nevajadzīgi sarežģīti.
Un tā, mana izvēle patiesībā bija oriģināla, kas bija... jā, es
mēģinu dažas papildu rindiņas, kas tiešām matemātiski nevar
neizdoties.
Bet tā tas ir tikai skaidrāk.
Tādā veidā tas ir tīrāk.
Un šeit atkal ir tādi argumenti, kurus jūs sāksiet izteikt, kad labāk
iepazīsieties ar programmēšanu.
Jums būs viedoklis.
Jūs kādam nepiekritīsiet.
Un, ja vien jūs varat argumentēt, tas, iespējams, ir diezgan
saprātīgi.
Labi.
Kā būtu, ja mēs tagad atņemsim kādu burvības pieskārienu, kas šeit ir
bijis kādu laiku.
Ļaujiet man turpināt un izdzēst visu šo šeit.
Un ļaujiet man ierosināt pārskatīt nevis šo vertikālo kolonnu un
izņēmumus, kas varētu rasties, saņemot ievadi, bet gan šīs
horizontālās jautājuma zīmes, kuras redzējām pirms kāda laika.
Tāpēc es vēlos, lai visas šīs jautājuma zīmes būtu uz vienas tās
pašas rindiņas.
Un tomēr es uztraucos, ka mūs šeit sagaidīs izaicinājums, jo līdz šim
drukāšana visur ir ievietojusi jaunas rindas automātiski, pat bez šīm
slīpsvītras n.
Ļaujiet man ierosināt izdarīt šo.
i diapazonā 4.
Ja es gribu četras jautājuma zīmes, ļaujiet man vienkārši izdrukāt
četras jautājuma zīmes.
Diemžēl, manuprāt, tas vēl nav pareizi.
Ļaujiet man palaist python no mario.py.
Un, protams, tas man dod kolonnu, nevis vajadzīgās jautājuma zīmju
līniju.
Tātad, kā mēs to darām?
Nu, ja palasa drukāšanas funkcijas dokumentāciju, tad izrādās, ka
drukāšana, iespējams tas nav pārsteidzoši, prasa daudz dažādu
argumentu.
Un patiesībā, ja apskatāt to dokumentācijā, jūs redzēsiet, ka tam nav
nepieciešami tikai pozicionālie argumenti, tas ir - no kreisās puses
uz labo, atdalīti ar komatiem.
Izrādās, Python atbalsta stilīgāku funkciju ar argumentiem, kur varat
nodot argumentu nosaukumus arī funkcijām.
Tātad, ko es ar to domāju?
Ja es atgriežos šeit pie VS Code un esmu izlasījis dokumentāciju,
izrādās, ka - jā, tāpat kā iepriekš, jūs varat nodot Python vairākus
argumentus, piemēram, šo.
Hello, komats, David, komats, Nalan! Tas vienkārši automātiski
savienos visus trīs pozicionālus argumentus.
Tie ir pozicionāli tādā nozīmē, ka tie burtiski plūst no kreisās
puses uz labo, atdalīti ar komatiem.
Bet, ja jūs nevēlaties vienkārši nodot šādas vērtības, jūs patiešām
vēlaties izdrukāt jautājuma zīmi, kā es to darīju iepriekš.
Bet jūs vēlaties ignorēt drukas noklusējuma darbību, mainot rindiņas
beigas, faktiski varat izdarīt šo.
Varat izmantot argumenta nosaukumu, par kuru zināt no dokumentācijas,
ka tas pastāv, un iestatīt to vienādu ar kādu alternatīvu vērtību.
Un patiesībā, lai gan tas izskatās sarežģīti, šādi es ignorētu katras
rindiņas beigas, pēdiņās.
Tas nav nekas, jo, lasot dokumentāciju, noklusējuma vērtība šim beigu
argumentam — vai kāds vēlas uzminēt — ir — ir slīpsvītra n.
Tātad, ja lasīsiet dokumentāciju, jūs redzēsiet, ka slīpsvītra n ir
šī beigu argumenta netiešā noklusējuma vērtība.
Un tāpēc, ja vēlaties to mainīt, vienkārši sakiet, ka beigas ir
vienādas ar kaut ko citu.
Un tāpēc es varu to mainīt uz neko un tagad atkārtoti palaist python
no mario.py.
Un tagad tie visi ir vienā rindā.
Tagad tas izskatās nedaudz muļķīgi, jo tajā nedēļā es pieļāvu vienu
kļūdu, kur man joprojām ir jāpārvieto kursors uz nākamo rindiņu.
Tā ir tikai cita problēma.
Es vienkārši došos šeit un neko nedrukāšu.
Man pat nav jādrukā slīpsvītra n, jo, ja drukāšana automātiski
piešķir jums slīpsvītru n, vienkārši izsauciet drukāšanu bez nekā, un
jūs to saņemsiet par velti.
Tāpēc ļaujiet man atkārtoti palaist python no mario.py.
Un tagad uzvednē tas izskatās nedaudz skaistāks .
Un, lai būtu ļoti skaidrs, kas notiek, - pieņemsim, ka es šeit vēlos
izteikt izsaukumu.
Es varētu mainīt slīpsvītru n pēc noklusējuma uz izsaukuma zīmi,
vienkārši joka pēc.
Un, ja es palaižu python of mario.py. Atkal, tagad es saņemu šo
izsaukumu ar jautājuma zīmēm un izsaukuma zīmēm.
Tātad tas ir viss, kas šeit notiek.
Un tas ir tas, ko sauc par nosaukto argumentu.
Tam burtiski ir nosaukums, kuru varat norādīt, izsaucot.
Un tas atšķiras no pozicionālā ar to, ka jūs burtiski izmantojat
vārdu.
Ļaujiet man tomēr piedāvāt kaut ko citu.
Un tāpēc cilvēkiem patīk Python.
Ir vienkārši lieliski veidi, kā rīkoties.
Tas ir trīs rindiņu, detalizēts veids, kā izdrukāt četras jautājuma
zīmes.
Es noteikti varētu izmantot īsceļu un vienkārši izdarīt to.
Bet tas nevienam nav tik interesanti, it īpaši, ja es vēlos to darīt
neskaitāmas reizes.
Bet Python ļauj to izdarīt.
Ja vēlaties reizināt rakstzīmi vairākas reizes, varat ne tikai
izmantot plus konkatenācijai, bet arī zvaigznīti vai zvaigznīti
reizināšanai, ja vēlaties, tas ir - konkatenācija atkal un atkal un
atkal.
Tātad, ja es tikai izdrukāju, pēdiņās “?” reizinātu ar 4, tas
patiesībā būs vieglākais veids, visizteiktākais veids, kā savādāk
varu izdrukāt četras jautājuma zīmes.
Un, ja es neizmantoju 4, es izmantoju n, kur es saņemu n no lietotāja.
Bums!
Tagad esmu pilnībā atbrīvojies no for cilpas, un tā vietā izmantoju
operatoru - zvaigzni, lai ar to manipulētu.
Un, lai būtu ļoti skaidrs, ciktāl Python nav malloc vai free vai
atmiņas pārvaldības, kas jums jādara, uzminiet, kā vēl nav Python.
Vai kaut kas ir jūsu prātā pēdējās pāris nedēļās?
Nav... AUDITORIJA: Rādītāji.
DEIVIDS MALANS: Rādītāji, jā.
Tātad Python valodā nav rādītāju, kas nozīmē tikai to, ka tas viss
notiek automātiski zem pārsega, izmantojot kodu, ko uzrakstījis kāds
cits.
Kā būtu ar vēl vienu atspēlēšanos ar Mario?
Mēs pirmajā nedēļā runājām par šo divdimensiju struktūru, kur tas ir
tāpat kā es apgalvoju, ka 3 reiz 3 — rūtiņu režģis, ja vēlaties.
Nu, kā mēs to varam izdarīt Python valodā?
Tagad mēs to varam izdarīt vairākos veidos.
Ļaujiet man atgriezties pie sava mario.py un izdarīt kaut ko līdzīgu
i diapazonā — mēs veiksim tikai 3, lai gan es zinu, ka tagad es
varētu izmantot get_int vai ievadi un int.
Un, ja es vēlos kaut ko darīt divdimensiju veidā, tāpat kā valodā C,
varat ligzdot savas for cilpas.
Tātad, iespējams, es varētu darīt j diapazonā no 3.
Un tad šeit es varētu izdrukāt numura zīmes (hash) simbolu.
Un tad paskatīsimies, vai tas man kopā dod 9.
Tātad, ja man ir šāda ligzdota cilpa, mario.py python, cerams, man
iedos režģi.
Nē, tas man deva kolonnu no 9.
Kāpēc, loģiski, lai gan man ir sava rinda un kolonnas?
Jā.
Mērķauditorija: [Nesadzirdami]
DEIVIDS MALANS: Jā, rindas beigas.
Tāpēc savā rindā es nevaru ļaut drukai turpināt pievienot jaunas un
jaunas rindiņas.
Tāpēc man vienkārši ir jāignorē tas šeit un jāļauj man nesalaist visu
grīstē kā iepriekš.
Ļaujiet man izdrukāt vienu visas rindas beigās, lai pārvietotu
kursoru uz leju.
Un es domāju, ka tagad mēs kopā esam ieguvuši 3 reiz 3.
Protams, mēs varētu to vēl vairāk noprecizēt.
Ja man nepatīk ligzdotā cilpa, es droši vien varētu ieiet šeit un
vienkārši izdrukāt, piemēram, rūtiņa reiz 3.
Vai arī es varētu mainīt 3 uz mainīgo, ja esmu to saņēmis no
lietotāja.
Tāpēc es varu to vēl vairāk noprecizēt.
Tātad, atkal tikai dažādi veidi, kā atrisināt vienu un to pašu
problēmu, un atkal pierādījumi tam, kāpēc daudziem cilvēkiem patīk
Python.
Ir tikai daži patīkamāki veidi, kā atrisināt problēmas, nepārtraukti
neiekulties nepatikšanās, piemēram, kā tas bezgalīgi ir ar for cilpām
un while cilpām.
Labi.
Nu, kā ar dažiem citiem būvēšanas blokiem?
Saraksti būs tik neticami noderīgi Python valodā, tāpat kā masīvi C
valodā.
Bet masīvi ir kaitinoši, jo jums pašiem jāpārvalda atmiņa.
Lai mainītu to izmērus, jums ir iepriekš jānosaka to lielums vai arī
jāizmanto rādītājus un malloc vai realloc.
Ak, dievs.
Pēdējās divas nedēļas šajā ziņā ir bijušas sāpīgas.
Bet Python to visu dara jūsu vietā tāpat vien.
Faktiski Python komplektā ir iekļauta vesela virkne funkciju, kas
ietver sarakstus, un galu galā tie ļaus mums darīt lietas atkal un
atkal un atkal tajā pašā datu struktūrā.
Un, piemēram, mēs varēsim iegūt saraksta garumu.
Jums pašiem tas nav jāatceras mainīgajā.
Varat vienkārši pajautāt Python valodai, cik elementu ir šajā
sarakstā.
Un ar to es domāju, ka mēs varam atrisināt arī dažas vecas problēmas.
Tāpēc ļaujiet man atgriezties šeit, pie VS Code.
Ļaujiet man aizvērt mario un piedāvāt mums jaunu programmu ar
nosaukumu scores.py.
Un tā vietā, lai tagad rādītu C un Python, pievērsīsimies tikai
Python valodai.
Un iekš scores.c pirms dažām nedēļām mēs tikai rēķinājām trīs
pārbaudes rezultātu vai kuat kā līdzīga - 72, 73 un 33 - vidējo
vērtību.
Tātad, ja es vēlos izveidot sarakstu no 72, 73, 33 šajā Python
versijā, es vienkārši izmantoju savas kvadrātiekavas.
C valoda ļauj izmantot figūriekavas, ja iepriekš zināt vērtības, taču
Python valodā ir tikai šis.
Un tagad, ja es vēlos aprēķināt vidējo — C valodā, atceraties, es
kaut ko darīju ar cilpu.
Es saskaitīju visas vērtības kopā.
Tad es to sadalīju ar kopējo vērtību skaitu, tāpat kā jūs to darītu
pamatskolā, un tas man deva vidējo.
Python ir aprīkota ar daudzām īpaši parocīgām funkcijām — ne tikai
garumu, bet arī citām.
Tātad, ja vēlaties aprēķināt vidējo, varat ņemt visu šo rezultātu
summu un dalīt to ar visu šo rezultātu garumu.
Tātad Python valoda nāk ar garumu, nāk ar summu.
Varat vienkārši nodot visu jebkura izmēra sarakstu un ļaut tam
atrisināt šo problēmu jūsu vietā.
Tātad, ja es vēlos tagad izdrukāt šo vidējo vērtību, es varu izdrukāt
Average, kols, un tad es pievienošu savu vidējo mainīgo
interpolācijai.
Ļaujiet man izveidot šo fstring, lai tā tiktu formatēta, un ļaujiet
man vienkārši palaist python no scores.py.
Un tur ir mans vidējais.
Tas ir dīvaini, jo mēs joprojām esam neaizsargāti no dažām peldošā
komata neprecizitātēm, taču man vismaz nebija vajadzīgas cilpas un
man nebija jāraksta viss šis drausmīgais kods, lai izdarītu kaut ko
tādu, ko var mierīgi var izdarīt Excel un Google izklājlapas.
Python valoda ir tuvāka šiem rīkiem, taču jaudīgākais tajā ir tas, ka
jūs paši varat manipulēt ar datiem.
Tomēr kā būtu, ja es vēlos manuāli iegūt virkni rezultātu no
lietotāja un pēc tam tos summēt.
Nu, apvienosim šeit dažas idejas.
Kā būtu ar šo?
Pirmkārt, ļaujiet man importēt funkciju get_int no CS50 bibliotēkas,
lai mums nebūtu jāstrādā ar to visu.
Un ļaujiet man iet uz priekšu un izveidot sev tukšu sarakstu.
Un tas ir spēcīgi.
C valodā [Nopūšas] nav
norādes uz tukšu masīvu, jo, ja izveidojat tukšu masīvu ar
kvadrātiekavām, tas nekam nebūs derīgs.
Bet valodā Python varat to izveidot tukšu, jo Python automātiski
paplašinās un samazinās sarakstu jūsu vietā, kamēr jūs pievienojat
tam informāciju.
Tātad, ja es vēlos saņemt trīs rezultātus no lietotāja, es varētu
darīt kaut ko līdzīgu šim — i diapazonā no 3.
Un tad es varu paķert mainīgo, ko sauc par “score” vai jebko citu.
Es varētu izsaukt get_int, likt cilvēkam ievadīt rezultātu, kuru viņš
vēlas ievadīt.
Un tad, kad viņi to izdarīs, es varu izdarīt šo.
Tagad, domājot par mūsu objektorientētās programmēšanas iespējām, es
varētu veikt scores.append, un es varu tai pievienot šo rezultātu.
Un jūs to zinātu tikai pēc tam, kad esat izlasījis dokumentāciju,
dzirdējis to klasē, grāmatā vai kas cits, bet izrādās, ka, tāpat kā
virknēm ir tādas funkcijas kā zemāka, sarakstos ir iebūvētas
funkcijas, piemēram, pievienot, kas vienkārši burtiski pievieno
saraksta beigām jūsu vietā, un Python to palielinās vai samazinās pēc
vajadzības.
Vairs nav malloc vai realloc vai kaut kā tamlīdzīga.
Tātad tas tikai pievieno rezultātu sarakstam.
To rezultātu, un tad atkal un atkal un atkal.
Tātad masīvs sākas ar — atvainojiet, saraksts sākas ar 0 lielumu, pēc
tam palielinās līdz 1, pēc tam — 2, pēc tam — 3, jums nav jādara
nekas cits.
Un tāpēc tagad, šeit, es varu aprēķināt vidējo, šo rezultātu summu
dalītu ar kopējā rezultāta skaita garumu.
Un, lai būtu skaidrs, garums - ir kopējais elementu skaits sarakstā.
Nav svarīgi, cik lielas ir pašas vērtības.
Tagad es varu izdrukāt fstring ar kaut ko līdzīgu Average, kols,
average, figūriekavās.
Un, ja es palaižu python no scores.py– - diskusijas labad ievadīšu
trīs vērtības - es joprojām saņemu to pašu atbildi.
Bet būtusāpīgi to darīt C valodā, ja vien iepriekš jūs nebūtu
apņēmušies izmantot fiksēta izmēra masīvu — par ko mēs jau nolēmām,
pirms dažām nedēļām, tas bija kaitinoši — vai arī jūs to dinamiski
attīstījāt, izmantojot malloc vai realloc vai tamlīdzīgus līdzekļus.
Labi.
Ko vēl es varu darīt?
Ir dažas jaukas lietas, par kurām jūs tikpat labi būtu vērtszināt.
Scores.append vietā varat veikt šādu vieglu izdomu.
Ja vēlaties kaut ko pievienot sarakstam, faktiski varat izdarīt plus
vienāds un pēc tam ievietot šo lietu savā pagaidu sarakstā un
vienkārši izmantot to, kas būtībā ir konkatenācija — bet nevis virkņu
konkatenācija, bet gan sarakstu konkatenācija.
Tātad šī jaunā 6. rindiņa tiek pievienota rezultātu sarakstam — šis
mazais, mazais saraksts, kuru es īslaicīgi veidoju, izmantojot tikai
pašreizējo jauno rezultātu.
Tātad tikai vēl viens sintakses fragments, ko ir vērts redzēt, kas
ļauj jums darīt arī kaut ko līdzīgu.
Labi.
Kā būtu, ja mēs uz brīdi atgrieztos pie virknēm?
Un visi šie piemēri, kā vienmēr, vēlāk būs pieejami kursa vietnē.
Pieņemsim, ka mēs vēlamies veikt kaut ko līdzīgu rakstzīmju
pārvēršanai par lielajiem burtiem.
Nu, lai būtu skaidrs, es varētu darīt kaut ko līdzīgu šim.
Ļaujiet man izveidot programmu ar nosaukumu uppercase.py.
Ļaujiet man prasīt lietotājam ievadīt pirmo virkni, izmantojot
ievades funkciju vai get_string, kas ir gandrīz tas pats.
Un es iepriekš palūgšu lietotājam ievadīt virkni.
Pēc tam ļaujiet man izdrukāt atslēgvārdu “After” un pēc tam jauno
rindiņu pabeigt ar neko, lai es varētu redzēt “Before” vienā rindiņā
un “After” nākamajā rindā.
Un tad ļaujiet man darīt šo — un šeit ir vieta, kur Python kļūst
patīkama arī ar cilpām — ar c iekš before — izdrukāt c.upper, end,
vienāds, pēdiņās.
Un tad es to izdrukāšu šeit.
Labi.
Tas bija ātri, bet mēģināsim secināt, kas notiek.
Tātad 1. rindiņa vienkārši saņem ievadi no lietotāja, saglabā to
mainīgajā, kas tika izsaukts iepriekš.
Otrā rinda burtiski tikai izdrukā “After”, bet nepārvieto kursoru uz
nākamo rindiņu.
Ko tad tā dara, ir šis.
Un C valodā tas bija nedaudz kaitinošāk.
Jums bija nepieciešama for cilpa ar i.
Jums bija nepieciešams masīva apzīmējums ar kvadrātiekavām.
Bet, Python valodā, ja sakāt mainīgajam virknē — tātad c, rakstzīmei
virknē, Python automātiski piešķirs c pirmajam lietotāja ievadītajam
burtam.
Pēc tam nākamajā atkārtojumā - otrais burts, trešais burts un
ceturtais.
Tātad jums nav nepieciešams apzīmējums kvadrātiekavās, vienkārši
izmantojiet c, un Python to izdarīs jūsu vietā un atdos jums pa
vienam katru lietotāja ievadīto burtu.
Tātad, ja es atgriezīšos šeit un palaistu, piemēram, python no
uppercase.py un ierakstīšu “david” ar mazajiem burtiem un nospiedīšu
Enter, tad jūsredzēsiet to visu lielajiem burtiem, atkārtojot to,
patiešām, pa vienai rakstzīmei.
Taču mēs jau zinām, ka, pateicoties objektorientētai programmēšanai,
pašām virknēm ir iebūvēta funkcionalitāte, kas nodrošina ne tikai
atsevišķus lielos burtus, bet arī visu virkni.
Tātad, godīgi sakot, šis bija mazliet muļķīgs vingrinājums.
Man vairs nav jāizmanto cilpa, piemēram, kā valodā C.
Un tāpēc ir pienācis laiks lauzt dažus no ieradumiem, kurus esat
attīstījuši pēdējo nedēļu laikā, tad, kad tie nav nepieciešami.
Es varu izveidot mainīgo, ko sauc after, iestatīt to vienādu ar
before.upper — kas patiešām pastāv, tāpat kā punkts, lower.
Un tad es varu iet uz priekšu un izdrukāt, piemēram, - atbrīvosimies
no šīs drukas līnijas šeit un izpildīsim to beigās - “After” un
izdrukāsim šī mainīgā vērtību.
Tātad tagad, ja es atkārtoti palaistu uppercase.py, ierakstītu
“david” mazajiem burtiem, es varu visu uzreiz rakstīt lielajiem
burtiem, jo atkal Python valodā jums nav jāstrādā ar rakstzīmēm
atsevišķi.
Vai ir jautājumi par kādu no šiem trikiem?
Nav?
Labi.
Kā būtu ar dažām citām metodēm, kuras mēs redzējām valodā C, kuras
mēs tagad atgriezīsim Python valodā.
Izrādās, ka valodā Python ir arī citas bibliotēkas, kuras varat
izmantot, lai atklātu vēl vairāk funkcionalitātes.
Tātad, C valodā, ja vēlaties komandrindas argumentus, vienkārši
mainiet parakstu, lai galvenā funkcija būtu, nevis void, int, argc,
komats, virkne, argv, beigās atveriet iekavas masīvam vai char
zvaigznei.
Izrādās, Python valodā, ja vēlaties piekļūt komandrindas argumentiem,
tas ir nedaudz vienkāršāk, taču tie ir ievietoti bibliotēkā — citādi
pazīstamai kā modulis — ko sauc par sys, sistēmas moduli.
Tagad tas pēc būtības ir līdzīgi CS50 bibliotēkai, un tajā ir daudz
funkcionalitātes.
Bet tā nāk ar pašu Python.
Tātad, ja es vēlos izveidot tādu programmu kā greet.py, VS Code,
šeit, ļaujiet man paturpinātun izdarīt šo.
No sys bibliotēkas importēsim argv.
Un tā tas arī pastāv.
Tas nav iebūvēts galvenajā funkcijā, jo vairs nav galvenās funkcijas
kā tādas.
Tātad tas ir paslēpts tajā bibliotēkā.
Un tagad es varu darīt kaut ko līdzīgu šim.
Ja argv garums ir vienāds ar 2, tad izdrukāsim kaut ko draudzīgu,
piemēram, hello, komats, argv, iekavas, 1, un pēc tam aizveriet
pēdiņas.
Citādi, ja argv garums nav vienāds ar 2, tad turpināsim un izdrukāsim
hello, world.
Tagad, vienā acu uzmetienā, tas varētu šķist nedaudz sarežģīti, taču
tas ir identiski tam, ko mēs darījām pirms dažām nedēļām.
Kad es palaižu šo python no greet.py, bez argumentiem, tā vienkārši
saka “hello, world”. Bet, ja es tā vietā pievienoju komandrindas
argumentu, piemēram, savu vārdu, un nospiežu taustiņu Enter, tagad
argv garums vairs nav 1.
Tas būs 2.
Tā vietā tā izdrukās “Hello, David”.
Tātad šeit būtiskākais ir tas, ka C valodā argv tehniski saturēja
jūsu programmas nosaukumu, piemēram, ./hello vai ./greet, un pēc tam
visu, ko ievadīja cilvēks.
Python šajā ziņā nedaudz atšķiras, jo mēs izmantojam tulku šādā
veidā — tehniski, palaižot python no greet.py, argv garums ir tikai
1.
Tajā ir tikai greet.py, tātad datnes nosaukums.
Tas neobligāti satur pašu Python, jo kāda jēga tai būt visuresošai?
Tas satur vārdu skaitu, ko cilvēks ierakstīja pēc pašas Python.
Tātad argv šeit ir garums 1.
argv šeit ir garums 2.
Un tāpēc, kad tas bija vienāds ar 2, es redzēju “Hello, David”, nevis
noklusējuma “Hello, world”. Tāda pati iespēja piekļūt komandrindas
argumentiem, pievienot šāda veida ievades savām funkcijām, taču jums
tā ir jāatbloķē, tā vietā izmantojot argv, šādā veidā.
Ja vēlaties redzēt visus vārdus, varat rīkoties šādi.
Tāpat kā - ja mēs apvienojam idejas, šeit - i , kā būtu, argv garuma
diapazonā.
Pēc tam es varu darīt to — izdrukāt argv, iekavas, i.
Labi.
Nedaudz sarežģīti, bet 3. rindiņa ir tikai for cilpa, kas atkārtojas
argv garuma diapazonā.
Tātad, ja cilvēki raksta divos vārdos, argv garums būs 2.
Tad šis ir tikai veids, kā pateikt, atkārtojiet visus vārdus argv,
izdrukājot tos pa vienam.
Tātad python no greet.py, Enter vienkārši izdrukā programmas
nosaukumu.
python no greet.py ar Deividu izdrukā greet.py un pēc tam Deivids.
Es varu turpināt to laist ar vairākiem vārdiem, un tie tiks izdrukāti
pa vienam.
Bet kas vēl ir patīkams Python valodā — un šī ir šī uzdevuma būtība —
godīgi sakot, tas izskatās diezgan sarežģīti.
Uz to nav īpaši patīkami skatīties.
Ja vēlaties tikai atkārtot katru vārdu sarakstā, kas ir argv,
skatieties, ko es varu izdarīt.
Es to varu izdarīt arg vai jebkuram mainīgā nosaukumam iekš argv.
Ļaujiet man tikai tagad izdrukāt šo argumentu.
Es varētu turpināt to saukt par i, bet i izskatās dīvaini, ja tas nav
numurs.
Tā vietā es pāreju uz arg kā vārdu.
Ja es tagad veicu python no greet.py, tas dara šo.
Ja es izmantoju python no greet.py, Deivid, tas atkal to dara.
Deivids Malans, tas atkal to dara.
Tāpēc, atkal, Python ir tik ļoti pievilcīga.
Vai vēlaties kaut ko darīt vairākas reizes, atkārtot sarakstu?
Vienkārši pasakiet to, un tas skan ļoti līdzīgi angļu valodai.
Un, ja drīkst, tai ir arī citas stilīgas iezīmes.
Tas ir nedaudz muļķīgi, ka es pastāvīgi redzu programmas nosaukumu -
greet.py, tāpēc būtu jauki, ja es to varētu noņemt.
Python atbalsta arī tā sauktās masīvu sektorus — atvainojiet,
sarakstu sektorus.
Pat es jaucu terminoloģiju.
Ja argv ir saraksts, tad tas izdrukās visu tajā esošo.
Bet, ja es vēlos sektoru no tā, kas sākas lokācijā 1 un iet līdz
galam, varat izmantot šo dīvaino sintaksi pa vidu starp
kvadrātiekavām, kuras mēs vēl neesam redzējuši. Tas sāksies ar
1. vienību un turpināsies līdz galam.
Tātad, šis ir jauks, gudrs veids, kā nodalīt pašu pirmo elementu, jo
tagad, kad es palaižu greet.py, David Malan, man vajadzētu redzēt
tikai Deividu un Malanu.
Ja es vēlos tikai vienu elementu, es varētu darīt no 1 līdz 2.
Ja es gribu tos visus, es turpmāk varētu darīt 0.
Šādā veidā es varētu sev uzdāvināt tikai vienu no tiem.
Tātad jūs varat spēlēt ar sākuma un beigu vērtību šādā veidā, lai
sadalītu šos sarakstus dažādos veidos.
Tas būtu bijis sāpīgi C valodā tikai tāpēc, ka mums nebija tāda
iebūvētā atbalsta tik tīrai manipulēšanai ar masīviem kā šis.
Labi.
Lai arī jūs to esat redzējuši — lai gan šo ir ne tik aizraujoši
skatīties tiešraidē — ja es turpinu un izveidoju šeit ātru programmu,
izrādās, ka sys bibliotēkā ir kaut kas cits, iespēja iziet no
programmām — iziet ar statusa kodu 1 vai 0, kā mēs to darām ikreiz,
kad kaut kas noiet pareizi vai nepareizi.
Tā, piemēram, ļaujiet man izveidot ātru programmu, kas vienkārši
saka: ja sys.argv garums nav vienāds ar 2, tad kliegsim uz lietotāju
un teiksim, ka viņam trūkst komandrindas argumenta.
Pretējā gadījumā komandrindas arguments.
Un tad atgriezīsim sys.exit(1).
Citādi, turpināsim un, loģiski, vienkārši teiksim, lai izdrukā
formatētu virkni, kas saka sveiki — tāpat kā iepriekš — sys.argv 1.
Tagad lietas pēkšņi izskatās savādāk, bet es kaut ko daru apzināti.
Pirmkārt, paskatīsimies, ko tas dara.
Tātad 1. rindā es importēju nevis argv, konkrēti.
Es importēju visu sys bibliotēku, un pēc brīža mēs redzēsim - kāpēc.
Izrādās, ka sys bibliotēkā ir ne tikai argv saraksts, bet arī
funkcija exit, kuru es arī vēlētos izmantot.
Tātad izrādās, ka, ja šādā veidā importējat visu bibliotēku, tas ir
labi.
Bet jums ir jāatsaucas uz tajā esošajām lietām, izmantojot to pašu
bibliotēkas nosaukumu un punktu, lai to, tā sakot, nosauktu.
Tātad šeit es tikai saku, ja lietotājs neievada divus vārdus,
kliedziet uz viņu ar trūkstošu komandrindas argumentu un pēc tam
izejiet ar 1.
Tāpat kā valodā C, izejot no 1, vienkārši nozīmē, ka kaut kas nogāja
greizi.
Pretējā gadījumā izdrukājiet hello.
Un tas sāk izskatīties sarežģīti, bet tas ir tikai ideju kombinācija.
Figūriekavas nozīmē: interpolēt šo vērtību, ievietojot to šeit.
sys.argv ir tikai precīzs veids, kā pateikt:dodieties uz sys
bibliotēku un iegūstiet tajā mainīgo argv.
Un 1. iekavas, protams, tāpat kā masīvi C valodā, ir tikai otrais
elements uzvednē.
Kad es palaižu šo versiju, tagad — python no exit.py — bez
argumentiem, uz mani tiek kliegts šādā veidā.
Tomēr, ja es ievadu kopā divus argumentus — datnes nosaukumu un savu
vārdu — tagad mani sveicina ar hello, David.
Un tā ir tā pati ideja iepriekš.
Šī bija ļoti zema līmeņa tehnika, bet šeit tas pats.
Ja nospiežat atbalss, dolāra zīme, jautājuma zīme, Enter, jūs
redzēsiet savas programmas izejas kodu.
Tātad, ja es to daru nepareizi - ļaujiet man to atkārtot bez sava
vārda, Enter - uz mani kliedz.
Bet, ja es izmantoju atbalss, dolāra zīme, jautājuma zīme, tiek
atgriezta slepenā zīme.
Atkal, lai parādītu jums paritāti ar valodu C, šajā gadījumā.
Vai jums ir jautājumi par kādu no šīm metodēm?
Nav.
Labi.
Kā būtu ar kaut ko vēl, kas ir nedaudz spēcīgāks?
Mēs pavadām tik daudz laika 0. un 1. nedēļā, veicot meklēšanu un pēc
tam 3. nedēļā šķirošanu.
Izrādās, ka Python valoda var palīdzēt arī šajā jautājumā.
Ļaujiet man turpināt un izveidot programmu names.py, kas būs tikai
iespēja, iespējams, meklēt visā vārdu kaudzē.
Ļaujiet man importēt sys, lai man būtu piekļuve iziešanai.
Un ļaujiet man turpināt un izveidot mainīgo ar nosaukumu names, kas
būs saraksts ar veselu kaudzi vārdu.
Kā būtu šeit?
Čārlijs un Freds un Džordžs un Džinnija un Persijs un, visbeidzot,
Rons.
Tātad šeit vesela kaudze vārdu.
Un tas būtu nedaudz kaitinoši ieviest kodu C valodā, kas atkārtojas
no kreisās puses uz labo, meklējot kādu no šiem vārdiem.
Starp citu, kāds?
Lūgsim lietotājam ievadīt meklējamo nosaukumu, lai mēs varētu
pateikt, vai nosaukums tur ir vai nav.
Un mēs varētu darīt to, līdzīgi kā C, Python valodā, darot kaut ko
līdzīgu šim.
Tātad n vārdos, kur n ir tikai mainīgais, kas atkārtojas pār katru
vārdu — ja meklētais vārds ir vienāds ar pašreizējo vārdu sarakstā —
AKA n — labi, izdrukāsim kaut ko draudzīgu, piemēram, “Found”. Un pēc
tam izpildīsim sys.exit 0, lai norādītu, ka esam atraduši to, kurš
tas ir.
Pretējā gadījumā, ja mēs nonākam līdz apakšai šeit, ārpus šīs cilpas,
vienkārši izdrukāsim “Not found”, ja mēs vēl neesam izgājuši.
Un tad izejam ar 1.
Lai būtu skaidrs, es varu turpināt visu sys importēšanu vai arī no
sys importēšanas izejas, un tad es varētu atbrīvoties no sys, punkts
visur citur.
Bet dažreiz ir noderīgi precīzi zināt, no kurienes nāk funkcijas.
Tātad arī tas šajā gadījumā ir tikai stila jautājums.
Labi.
Tāpēc iesim uz priekšu un izpildīsim šo.
python no names.py, un beigās meklēsim Ronu.
Labi.
Viņš ir atrasts.
Un meklēsim šeit kādu ārpus ģimenes, piemēram, Hermioni.
Nav atrasts.
Labi.
Tātad šķiet, ka tas darbojas šādā veidā.
Bet kādu algoritmu es būtībā esmu ieviesis?
Kāds algoritms varētu būt 7. un 8. līdz 9. un 10. rindai?
Mērķauditorija: Lineārs.
DEIVIDS MALANS: Jā.
Tātad tā ir tikai lineāra meklēšana.
Tā ir cilpa, pat ja sintakse šodien ir daudz īsāka, un tā tikai
atkārtojas.
Godīgi sakot, mēs esam redzējuši vēl vienkāršāku veidu, kā to izdarīt
Python valodā.
Un tas dažreiz padara to par patīkamāku valodu.
Kāpēc es to nedaru?
Tā vietā, lai atkārtotu pa vienam, kāpēc es to nesaku?
Ļaujiet man turpināt un mainīt savu nosacījumu uz vienkārši — kā
būtu, ja mūsu meklētais vārds ir vārdu sarakstā, mēs esam pabeiguši.
Mēs to atradām.
Izmantojiet beigu prievārdu, ko esam redzējuši pāris reizes, tagad,
kad tā pati uzdod jautājumu, vai kaut kas ir kaut kas citā?
Un Python valoda parūpēsies par lineāro meklēšanu mūsu vietā.
Un tā darbosies tieši tāpat, ja es veicu python no names.py, meklēju
Ron.
Tā joprojām viņu atradīs, un šajā gadījumā tā joprojām darīs to
lineāri.
Bet šajā gadījumā man pašam nav jāraksta viss zemākā līmeņa kods.
Vai tagad ir jautājumi par kādu no šiem tematiem?
Kods kļūst arvien īsāks.
Nav?
Kas par... paskatīsimies.
Kas vēl mums šeit varētu būt?
Kā ar šo?
Dosimies uz priekšu un ieviesīsim to tālruņu katalogu, ar kuru mēs,
metaforiski, sākām kursa sākumā.
Iekodēsim programmu phonebook.py.
Un šajā gadījumā turpināsim un šoreiz veidosim vārdnīcu.
Atcerieties, ka vārdnīca ir kaut kas tāds, kas ievieš kaut ko līdzīgu
šim — divu kolonnu tabula, kurā ir taustiņi un vērtības, vārdi un
definīcijas, vārdi un numuri.
Un šajā gadījumā pievērsīsimies pēdējam no tiem, vārdiem un numuriem.
Es jau iepriekš apgalvoju, ka Python valodā ir iebūvēts atbalsts
vārdnīcām — dict objects — ko varat izveidot ar vienu rindiņu.
Man tas nebija vajadzīgs pareizrakstības programmai, jo komplekts ir
pietiekams, ja vēlaties tikai vienu no taustiņiem vai vērtībām, nevis
abas.
Bet tagad es gribu dažus vārdus un numurus.
Izrādās, ka Python var izveidot tukšu vārdnīcu, sakot dict, atvērt
iekavas, aizvērt.
Un tas tikai dod jums būtībā diagrammu, kas izskatās šādi, bez nekā.
Vai te ir arī precīzāka sintakse.
Varat arī to izdarīt ar divām figūriekavām.
Un patiesībā visu šo laiku esmu izmantojis īsceļu.
Kad man agrāk bija saraksts, kurā manu mainīgo sauca par rādītājiem,
un es to darīju, patiesībā tā bija šī saīsinātā versija — hei,
Python, iedod man tukšu sarakstu.
Tātad viena un tā paša mērķa sasniegšanai ir atšķirīga sintakse.
Šajā gadījumā, ja es vēlos cilvēkiem paredzētu vārdnīcu, es varu
izdarīt šo vai, biežāk, tikai divas figūriekavas, lūk, šādi.
Labi.
Nu, ko es gribu ievietot šajā?
Nu, ļaujiet man šajā sakarā ievietot dažas lietas.
Un es vienkārši pārvietošu savas aizvērtas figūriekavas uz jaunu
rindiņu.
Ja es vēlos īstenot šo ideju par taustiņiem un vērtībām, veids, kā
jūs to darāt valodā Python, ir - atslēga, kols, vērtība, komats.
Taustiņš, kols, vērtība.
Tātad jūs to vairāk ieviestu kodā.
Piemēram, ja es vēlos, lai Kārters būtu pirmais taustiņš manā tālruņu
katalogā un viņa numurs būtu +1-617-495-1000, es varu norādīt to kā
atbilstošo vērtību.
Kols atrodas pa vidu.
Abas ir virknes vai str, tāpēc es apzināti lieku abus pēdiņās.
Ja gribu pievienot sevi, varu likt komatu.
Un tad, lai lietas būtu skaistas, es pārvietoju kursoru uz nākamo
rindiņu.
Bet tas estētiski nav stingri nepieciešams.
Tas ir vienkārši labs stils.
Un šeit es varētu nosūtīt +1-949-468-2750.
Un tagad man ir vārdnīca, kurā būtībā ir divas rindas — Kārters un
viņa numurs, kā arī Deivids un viņa numurs.
Un, ja es to turpinātu papildināt, šī diagramma kļūtu tikai garāka un
garāka.
Pieņemsim, ka es vēlos meklēt kādu no mūsu numuriem.
Pieprasīsim lietotājam vārdu, kura numuru vēlaties meklēt, iegūstot
virkni.
Vai arī ziniet ko?
Mums nav vajadzīga šī CS50 bibliotēka.
Vienkārši izmantosim ievadi un prasīsim lietotājam vārdu.
Un tagad mēs varam izmantot šo īpaši īso sintaksi un vienkārši
pateikt, ja vārds ir cilvēkos, izdrukāt formatētu virknes skaitli,
kols un — lūk, mēs to varam izdarīt — persona, iekavas, vārds.
Labi.
Tāpēc tas ātri kļūst forši, mulsinoši.
Tāpēc ļaujiet man to palaist.
python no phonebook.py. Ierakstīsim Kārters.
Un patiešām es redzu viņa numuru.
Palaidīsim to vēlreiz ar Deividu, un es šeit redzu savu numuru.
Kas tad notiek?
Nu, izrādās, ka vārdnīca pēc būtības ir ļoti līdzīga sarakstam.
Tā patiesībā pēc būtības ir ļoti līdzīga masīvam C valodā.
Taču tā vietā, lai izmantotu tikai ciparu taustiņus, piemēram,
iekavas 0, iekavas 1, iekavas 2, jūs faktiski varat izmantot vārdus.
Un tas ir viss, ko es daru šeit, 8. rindā.
Ja es vēlos pārbaudīt vārdu Kārters, kas pašlaik ir iekļauts šajā
mainīgajā ar nosaukumu name, es varu indeksēt savā cilvēku vārdnīcā,
izmantojot nevis ciparus, bet burtiski izmantojot virkni — vārdu
Kārters vai Deivids vai jebkādu citu.
Lai padarītu to skaidrāku, ievērojiet, ka šobrīd izmantoju šo formāta
virkni, kas rada pārmērīgu sarežģītību.
Bet es varētu to precizēt, iespējams, šādi.
Es varētu dot sev citu mainīgo, ko sauc par numuru, iestatīt to
vienādu ar cilvēku vārdnīcu, indeksējot tajā, izmantojot pašreizējo
vārdu.
Un tagad es varu to saīsināt, lai būtu skaidrāks, ka es
izdrukājutikai tā vērtību.
Un patiesībā es to varu izdarīt vēl sarežģītāk.
Tas būtu dīvaini, bet, ja es vēlos parādīt tikai Deivida tālruņa
numuru, nevis Kārtera numuru, es varu burtiski, pēdiņās “index into”
cilvēku vārdnīcā, jo tagad, kad es to izpildu, pat tad, ja es
ierakstu Kārtera numuru, tā vietā es atgūšu savu numuru.
Bet tas ir viss, kas notiek, ja es to atsaukšu, jo tā tagad ir kļūda.
Bet es to indeksēju, izmantojot vārda vērtību.
Vārdnīcas ir ļoti ērtas, jo tagad jūs varat saistīt jebko, izmantojot
nevis ciparus, bet gan veselus atslēgvārdus.
Tātad, ja pareizrakstības programmā mēs jums sniegtu ne tikai vārdus,
bet arī simtiem tūkstošu definīciju, jūs tās varētu būtībā saglabāt
šādi.
Un tad, kad cilvēks vēlas meklēt definīciju pareizā vārdnīcā, nevis
tikai pareizrakstības pārbaudei, jūs varat indeksēt vārdnīcu,
izmantojot kvadrātiekavas, un atgūt definīciju arī angļu valodā.
Jautājumi par šo?
Jā?
sakot, ka Python ir [Nesadzirdami]?
DEIVIDS MALANS: Tiešām labs jautājums.
Rezumējot, kā Python valoda atrod šo vārdu šajā vārdnīcā?
Šeit, godīgi sakot, galvenais Python valodā ir speller 5. p-set.
Tātad jūs esat cīnījušies, cīnāties ar savas pareizrakstības
pārbaudītāja ieviešanu un savas jaucējtabulas ieviešanu.
Un atcerieties, ka pagājušajā nedēļā jaucējtabulas mērķis bija ideālā
gadījumā iegūt pastāvīgu piekļuvi laikam.
Nevis kaut kas lineārs, kas ir lēns un pat labāks par kaut ko
logaritmisku, piemēram, žurnāla bāze 2 no n.
Tātad Python un patiesi gudrie cilvēki, kas to izgudroja, ir
uzrakstījuši kodu, kas dara visu iespējamo, lai sniegtu jums
nepārtrauktu meklēšanu vārdnīcās.
Un meklēšana ne vienmēr gūs panākumus, tāpat kā jums un jūsu problēmu
kopai, iespējams, ik pa laikam būs sadursmes un sāks veidoties garu
vārdu sarakstu ķēdes.
Bet šeit jūs atkal uzticaties kādam citam, kādam, kas ir gudrāks par
jums, kādam, kuram ir vairāk laika, lai atrisinātu šīs problēmas jūsu
vietā.
Un, ja lasīsiet Python dokumentāciju, jūs redzēsiet, ka tā negarantē
pastāvīgu laiku, bet ideālā gadījumā optimizē datu struktūru, lai jūs
būtupēc iespējas ātrāki.
Un no visām datu struktūrām, piemēram, vārdnīcas, jaucējtabulas
patiešām ir kā Šveices armijas nazis skaitļošanā, jo tā vienkārši
ļauj sasaistīt lietas.
Un, lai gan mēs turpinām koncentrēties uz vārdiem un numuriem, tā ir
patiešām spēcīga lieta, jo tā ir spēcīgāka nekā saraksti un masīvi,
kas ir tikai skaitļi un kaut kas cits.
Tā vietā jums var būt jebkāda veida saistības.
Labi.
Ļaujiet man parādīt dažus citus piemērus, pirms mēs sasniedzam
kulmināciju ar dažām jaudīgākām Python metodēm, pateicoties
bibliotēkām.
Kā ar šo problēmu, ar kuru mēs saskārāmies 4. nedēļā, kas bija šī.
Ļaujiet man šeit iekodēt programmu, ko atkal sauc par compare.py, bet
šoreiz salīdzinot ar virknēm, nevis cipariem.
Tāpēc ļaujiet man, piemēram, iegūt vienu virkni no lietotāja s.
Tikai diskusijas labad ļaujiet man iegūt vēl vienu virkni no
lietotāja, ko sauc par t, lai mēs varētu šeit veikt kādu
salīdzinājumu.
Un, ja s ir vienāds ar t, ejam uz priekšu un izdrukāsim, ka tie ir
vienādi.
Citādi turpināsim un izdrukāsim, ka tie atšķiras.
Tātad tas ir ļoti līdzīgs tam, ko darījām 4. nedēļā.
Bet 4. nedēļā atcerieties, ka mēs to darījām tieši tāpēc, ka radās
problēma.
Piemēram, ja es skrienu, ak.
Ja es skrienu - kas notiek?
[Nesadzirdami] Lūdzu!
Ak.
Labi.
Oho, labi.
Gara diena.
Labi.
Ja es palaižu pareizo komandu, python no compare.py, tad turpināsim
un ierakstīsim kaut ko līdzīgu “cat” mazajiem burtiem, “cat” mazajiem
burtiem.
Un tie ir vienādi.
Tomēr, ja es to daru vēlreiz ar vārdiem “dog” un “dog”, tie ir
vienādi.
Un, protams, “cat” un “dog” nav vienādi.
Bet vai kāds atceras, ka pirms divām nedēļām es divreiz identiski
ierakstīju savu vārdu lielajiem burtiem.
Kas bija teikts?
Ka tie patiesībā bija atšķirīgi.
Un kāpēc tā bija?
Kāpēc divas virknes C valodā bija atšķirīgas, lai gan es burtiski
ierakstīju vienu un to pašu?
Divas dažādas vietas atmiņā.
Tāpēc katra virkne varētu izskatīties vienādi estētiski, bet,
protams, tā tika saglabāta citur atmiņā.
šīs virknes faktiskajai [? kvalitātei. ?]
Tātad šī ir Python funkcija, jo to ir vienkārši vieglāk izdarīt.
Un kāpēc?
Tas izriet no realitātes, ka Python valodā vairs nav rādītāju.
Nav pamata atmiņas pārvaldības.
Tagad jums nav jāuztraucas par zemāka līmeņa detaļām.
Valoda pati par to parūpējas jūsu vietā.
Un līdzīgi, ja es to daru un neprasu lietotājam divas virknes, bet
tikai vienu, tad es daru kaut ko līdzīgu šim.
Kā būtu, ja es dotu sev otru mainīgo t, iestatītu to vienādu ar
s.capitalize, kas, ņemiet vērā, nav tas pats, kas lielie burti; Lielo
burtu rakstīšanā pēc dizaina, saskaņā ar Python dokumentāciju,
lielais burts būs tikai pirmais burts — tagad es varu izdrukāt,
teiksim, divas fstring šeit — kāda ir s vērtība, un tad ļaujiet man
izdrukāt ar citu fstring, kāda ir t vērtība.
Un atcerieties, ka valodā C tā bija problēma, jo, ja jūs lietojāt
lielos burtus s un saglabājāt to t, mēs nejauši rakstījām lielos
burtus gan s, gan t.
Bet šajā gadījumā Python valodā, kad es faktiski palaižu šo un
ierakstu “cat” mazajiem burtiem, oriģinālais s nemainās, jo, kad 3.
rindā izmantoju lielos burtus, tas patiešām ir s ar lielo burtu.
Bet tas atgriež rezultāta kopiju.
Tas pats par sevi nevar mainīties, jo atkal šim tehniskajam terminam
s ir nemainīgs.
Virknes, ja tās pastāv, nevar pašas mainīties.
Bet jūs varat atgriezt kopijas un modificēt šo pašu virkņu mutācijas
kopijas.
Tātad, īsi sakot, visas šīs galvassāpes, ar kurām saskārāmies 4.
nedēļā, tagad patiešām ir atrisinātas tā, kā jūs varētu to sagaidīt.
Un šeit ir vēl viens, pie kura mēs kavējāmies 4. nedēļā, ar krāsaino
šķidrumu glāzēs.
Ļaujiet man iekodēt programmu ar nosaukumu swap.py.
Un swap.py ļaujiet man iestatīt x vienādu ar 1, y vienādu ar 2.
Un tad ļaujiet man šeit izdrukāt fstring.
Tātad, kā ja x ir šis komats, y ir tas.
Un tad ļaujiet man to izdarīt divas reizes, tikai pierādījuma labad.
Un šeit atcerieties, ka mums bija jāizveido mijmaiņas funkcija.
Bet tad mums tā bija jānodod ar atsauci ar & zīmi.
Un ak, dievs, tas bija vislielākais sarežģītības līmenis C valodā.
Ja vēlaties Python valodā mainīt vietām x un y, varat izdarīt: x,
komats, y, ir vienāds ar y, komats, x.
Un tagad, python no swap.py.
Un te mēs esam.
Tas viss ir nokārtots jūsu vietā.
Tā ir kā uzpirksteņu spēle, nedomājot pat par pagaidu mainīgo.
Tātad, ko mēs šeit vēl varam izdarīt?
Kā būtu ar dažiem pēdējiem būvniecības blokiem?
Un tie tagad ir saistīti ar datnēm no šīs 4. nedēļas.
Pieņemsim, ka es vēlos saglabāt dažus vārdus un numurus CSV datnē —
komatatdalītās vērtības, kas ir kā ļoti viegla izklājlapa.
Vispirms ļaujiet man izveidot datni phonebook.csv, kuras pirmajā
rindā ir vārds, komats, numurs.
Bet pēc tam es turpināšu un tagad iekodēšu programmu phonebook.py,
kas faktiski ļauj man pievienot datus šim tālruņu katalogam.
Tāpēc ļaujiet man šeit sadalīt ekrānu, lai mēs varētu redzēt veco un
jauno.
Un šeit, manā phonebook.py kodā, šajā jaunajā un uzlabotajā versijā
es faktiski importēšu pavisam citu bibliotēku, šo bibliotēku ar
nosaukumu CSV.
Un arī šeit, jo īpaši cilvēkiem, kas nodarbojas ar datu zinātni un
tamlīdzīgi, ļoti patīk manipulēt ar datnēm un datiem, kas var ļoti
labi tikt glabāti izklājlapās vai CSV — komatatdalītās vērtības,
kuras mēs īsi redzējām 4. nedēļā.
Tādējādi vietnē phonebook.py pietiek tikai importēt CSV pēc
dokumentācijas izlasīšanas, jo tas man nodrošinās funkcionalitāti
kodā, kas saistīts ar CSV datnēm.
Tātad, lūk, kā es varu atvērt datni Python valodā.
Es burtiski izsaucu open — tagad tas nav fopen; tas ir tikai open —
un es atveru šo datni ar nosaukumu phonebook.csv.
Un tāpat kā C valodā, es to atvēršu pievienošanas režīmā — tas nav
pareizi, jo tas mainītu visu.
Es vēlos vienlaikus pievienot jaunu rindu.
Pēc tam es vēlos, iespējams, iegūt vārdu no lietotāja.
Tāpēc liksim lietotājam ievadīt savu vārdu.
Un tad lūgsim lietotājam ievadīt arī numuru, izmantojot numura
ievades uzvedni.
Labi.
Un tagad tas ir nedaudz sarežģīti, un jūs to zināt tikai no
dokumentācijas.
Bet, ja vēlaties rakstīt rindas CSV datnē, ko varat vēlāk skatīt
programmā Excel vai tamlīdzīgā veidā, varat to izdarīt — iedodiet man
mainīgo, ko sauc par rakstītāju — bet es to varētu saukt kā vien
vēlos.
Ļaujiet man izmantot funkciju csv.writer, kas iekļauta šajā CSV
bibliotēkā, nododot datnē.
Tas ir tāpat kā teikt: Ei, Python, apstrādā šo atvērto datni kā CSV
datni, lai viss būtu atdalīts ar komatiem un jauki formatēts rindās
un kolonnās.
Tagad es izdarīšu šo — izmantošu šo rakstītāju, lai uzrakstītu rindu.
Nu, ko es gribu uzrakstīt?
Es vēlos šai datnei uzrakstīt īsu sarakstu, proti, pašreizējo
nosaukumu un pašreizējo numuru, bet es nevēlos izmantot fprintf un %
un visas šīs lietas, kas mums varēja būt agrāk.
Un tagad es vēlos tikai aizvērt datni.
Ļaujiet man atkārtoti atvērt savu termināli.
Ļaujiet man palaist python no phonebook.py un ļaujiet man ierakstīt
David un pēc tam +1-949-468-2750 un, turot īkšķus, paskatīties uz
faktisko CSV datni augšējā kreisajā stūrī.
Mans kods mani tikko pievienoja datnei.
Un, ja es to palaistu vēlreiz, piemēram, ar Kārteru un
+1-617-495-1000, vēlreiz turot īkšķus, mēs esam atjauninājuši datni.
Un izrādās, ka tagad ir kods, caur kuru es pat varu nolasīt šo datni.
Bet es varu vispirms to nostiprināt, lai jūs to redzētu.
Izrādās, Python valodā ir tik ierasts atvērt datnes un tās aizvērt.
Cilvēki pieļauj kļūdas un bieži aizmirst aizvērt datnes, kā rezultātā
var tikt izmantots vairāk atmiņas, nekā jūs plānojat.
Varat arī šo izdarīt valodā Python, lai jums nebūtu jāuztraucas par
datņu aizvēršanu.
Tā vietā varat izmantot šo atslēgvārdu.
Varat teikt, atverot šo datni kā mainīgo, ko sauc par file, veiciet
tālāk norādītās darbības.
Tāpēc es izgriežu lielāko daļu sava koda.
Es izmantoju šo jauno, Python specifisko atslēgvārdu, ko sauc par
width.
Un tas ir tikai valodas jautājums, ka ar nākamo datnes atvēršanu
veiciet šīs četras koda rindiņas un pēc tam automātiski aizveriet to
manā vietā ievilkuma beigās.
Tā ir neliela optimizācija, taču tas atkal ir pitoniskais veids, kā
rīkoties.
Kā vēl es to varētu izdarīt?
Nu, izrādās, ka kods, ko esmu uzrakstījis šeit, īpaši 9. rindā, ir
pavājš.
Ja kāds cilvēks atver šo izklājlapu — CSV datni programmā Excel,
Google Spreadsheets, Apple Numbers — un, iespējams, pārvieto kolonnas
tikai tāpēc, ka, iespējams, tās jūk.
Cilvēks to saglabāja, un viņš neapzinās, ka tagad ir mainījis manus
pieņēmumus.
Es nevēlos, lai vārdu un numuru vienmēr rakstītu šādā secībā, jo kā
būtu, ja kāds salaiž grīstē un maina šīs divas kolonnas vietām,
burtiski velkot un nometot?
Tātad izrādās, ka tā vietā, lai šeit izmantotu sarakstu, mēs varam
izmantot citu šīs bibliotēkas līdzekli, kā norādīts tālāk.
Tā vietā, lai izmantotu rakstītāju, ir kaut kas, ko sauc par vārdnīcu
vai dict rakstītāju, kas izmanto to pašu argumentu kā ievadi — datni,
kas ir atvērta.
Bet tagad viena atšķirība šeit ir tāda, ka jums ir jāpasaka šim
vārdnīcas rakstītājam, ka jūsu lauku nosaukumi ir vārds un numurs.
Un ļaujiet man aizvērt CSV datni šeit.
Vārds un numurs ir šajā CSV datnē esošo lauku un kolonnu nosaukumi.
Un, kad pienāks laiks rakstīt jaunu rindu, sintakse šeit būs nedaudz
neglītāka, bet tā ir tikai vārdnīca.
Vārds, ko es vēlos ierakstīt vārdnīcā, būs tas, ko cilvēks ir
ievadījis.
Numurs, ko es vēlos ierakstīt CSV datnē, būs neatkarīgs no cilvēka
ievadītā numura.
Bet tagad šajā kodā atšķiras tas, ka, vienkārši izmantojot vārdnīcas
rakstītāju, nevis vispārīgo rakstītāju, tagad kolonnas var būt šādā
secībā vai šādā secībā vai jebkurā secībā.
Un vārdnīcas autors, pamatojoties uz CSV teksta pirmo rindiņu,
izdomās, kur likt vārdu, kur ievietot numuru.
Tātad, ja jūs tos maināt vietām, tā nebūs liela problēma.
Tā pamanīs: ak, pagaidiet, kolonnas mainījās.
Un pareizi ievietos kolonnas.
Tātad, atkal, tā ir vēl viena jaudīga funkcija, kas ļauj
koncentrēties uz reālu darbu, nevis, pretējā gadījumā, faktiski
apmaldīties koda rakstīšanā.
Vēl jautājumi par šo?
Bet tas, ko mēs tagad darīsim, ir daži no sarežģītākajiem piemēriem,
ar kuriem mēs sākām, un es atgriezīšos pie sava Mac klēpjdatora, kur
man ir atvērts un palaists mans termināļa logs. Es tikko gatavojos
iepazīstināt ar dažām pēdējām bibliotēkām, kas patiešām runā par to,
cik spēcīga var būt Python valoda un cik ātri jūs varat sākt izmantot
šo valodu.
Godīgi sakot, visas šīs darbības nevar veikt mākonī, piemēram, koda
telpās, jo jums ir nepieciešama piekļuve saviem skaļruņiem,
mikrofonam vai tamlīdzīgiem līdzekļiem.
Tāpēc es to daru savā Mac datorā, šeit.
Bet ļaujiet man iet uz priekšu un atvērt programmu speech.py.
Un es šeit neizmantoju VS kodu.
Es izmantoju programmu VI, kas pilnībā ir balstīta uz termināļa
logiem.
Bet tas ļaus man, piemēram, importēt Python tekstu uz runas
3. versijas bibliotēku.
Es došu sev mainīgo, ko sauc par dzinēju (engine), kas tiks iestatīts
vienāds ar Python valodas teksta pārvēršanas runā 3 bibliotēku init
metodi, kas tikai inicializēs šo bibliotēku, kas ir saistīta ar
teksta pārvēršanu runā.
Pēc tam es izmantošu dzinēja izteikšanas funkciju, lai pateiktu kaut
ko, teiksim, hello, komats, world.
Un pēc tam kā savu pēdējo rindiņu es teikšu engine.runAndWait,
rakstīts lieliem burtiem, lai pateiktu savai programmai tagad palaist
šo runu un gaidīt, līdz viss ir izdarīts.
Labi.
Es saglabāšu šo datni.
Es palaidīšu python of speech.py.
Un es kā vienmēr turu īkšķi, un... TULKS: Hello, world.
DEIVIDS MALANS: Labi.
Tāpēc tagad man ir programma, kas faktiski sintezē runu, izmantojot
šādu bibliotēku.
Kā es varu tagad to pārveidot, lai tā būtu nedaudz interesantāka?
Nu, kā ar šo?
Ļaujiet man iet uz priekšu un lūgt lietotājam ievadīt viņa vārdu, kā
mēs to esam darījuši vairākas reizes, izmantojot Python valodā
iebūvēto vārdu funkciju.
Un tagad ļaujiet man turpināt un izmantot formāta virkni kopā ar šo
bibliotēku, interpolējot vārda vērtību.
Un vismaz, ja mans vārds ir kaut cik fonētiski izrunājams, iesim uz
priekšu un palaidīsim python no speech.py, ierakstīsim manu vārdu
un... TULKS: Hello, David.
DEIVIDS MALANS: Labi.
Tā ir dīvaina locījuma izvēle, taču mēs sākam sintezēt balsi,
atšķirībā no Siri vai Google Assistant vai Alexa vai tamlīdzīgām
programmām.
Tagad mēs, iespējams, varam izdarīt arī kaut ko nedaudz sarežģītāku.
Papildus runas sintezēšanai šādā veidā mēs varētu sintezēt, piemēram,
faktisku grafiku.
Ļaujiet man iet uz priekšu un izdarīt kaut ko līdzīgu šim.
Ļaujiet man izveidot programmu ar nosaukumu qr.py.
Es importēšu bibliotēku ar nosaukumu OS, kas nodrošina piekļuvi ar
operētājsistēmu saistītajām Python funkcijām.
Es importēšu bibliotēku, ko esmu iepriekš instalējis ar nosaukumu
qrcode, kas ir divdimensiju svītrkods, ko, iespējams, esat redzējuši
reālajā pasaulē.
Es turpināšu izveidot attēla mainīgo, izmantojot šo kvadrātkoda
bibliotēkas make funkciju, kas saskaņā ar tās dokumentāciju aizņem
URL, piemēram, vienu no CS50 videoklipiem.
Tāpēc mēs to darīsim ar youtu.be/xvF2joSPgG0.
Tātad, cerams, šī ir īstā lekcija.
Un tagad mums ir img.save, kas ļaus man izveidot datni ar nosaukumu
qr.ping.
Padomājiet par 4. problēmu kopu un to, cik sāpīga bija datņu
saglabāšana.
Mēs tagad izmantosim saglabāšanas funkciju Python valodā un
saglabāsim to kā PNG datni — Portable Network Graphic.
Un tad, visbeidzot, ejam uz priekšu un atveram ar komandu open qr.png
manā Mac datorā, lai, cerams, tā tiktu automātiski atvērta.
Labi.
Es turpināšu un vēlreiz pārbaudīšu savu sintaksi šeit, lai es nebūtu
pieļāvis nekādas kļūdas.
Es iešu uz priekšu un palaidīšu python no qr.py.
Enter.
Tas to paver.
Ļaujiet man turpināt un pietuvināt.
Ja jums ir pieejams tālrunis un vēlaties noskenēt šo kodu šeit,
klātienē vai tiešsaistē, - es atvainojos.
Jūs to nenovērtēsiet.
Apbrīnojami!
Labi.
Un, visbeidzot, ļaujiet man atgriezties pie mūsu runas piemēra šeit,
izveidot fināla nobeigumu šeit mūsu pēdējos brīžos.
Un kā būtu, ja mēs vienkārši pateiktu kaut ko līdzīgu “This was
CS50”, piemēram, šādi.
Ejam uz priekšu, lūk.
Salabosim manu lielo burtu lietojumu, lai būtu tīrība.
Atbrīvosimies no vārda.
Un tagad, ar mūsu pēdējo uzplaukumu un jūsu iepazīstināšanu ar Python
valodu — lūk, te tas ir: TULKS: This was CS50.
DEIVIDS MALANS: Labi.
Tiekamies nākamreiz.
[APLAUSI]
[SKAN MŪZIKA]