ROSS RHEINGANS-YOO: Hej, jeg er Ross. Og det er en CS50 seminar. Det vil tage dig fra programmering i C til programmering i Python. Python er et scriptsprog. Det er stort set ligesom C i syntaks, selvom nogle af de tekniske detaljer i hvordan denne syntaks bliver henrettet er lidt anderledes. Det er mindre magtfulde end C på nogle måder. Det er mindre ekspressiv for hvor præcis i din computer hukommelse bliver lagt ud, hvordan det bliver lagt ud, når det får frihed og den slags ting. Det er mere nyttigt end C på nogle måder, fordi det er lettere at programmere i. Sproget er til en vis folk, mere intuitiv. Og virkelig, det er målet, at at det er hurtigere at programmere og potentielt langsommere at udføre. Nu, hvis du tænker over mængden af ​​tid du har brugt på din sidste problem sæt skrivning din kode mod mængde tid, du bruger på din sidste problem sæt udfører din kode, du ville forestille sig, at sproget som var dobbelt så hurtigt at skrive, og dobbelt så langsomt at udføre, kan være en forbedring i forhold til C på nogle måder. Bestemt, når du forsøger at skrive små programmer til at gøre små ting, Python er et nyttigt sprog valg. Og i slutningen af ​​denne seminar, håber jeg, du vil kunne gøre valg i fremtidige projekter om, hvilket sprog er korrekt at anvende, ikke ideen at ét sprog er mere korrigere hele tiden. Et par ting om, hvad seminaret er. Seminaret er ikke beregnet til lære dig Python fra bunden. Python er meget ens til C, og jeg går ud at du er en CS50 elev, eller nogen med en lignende fortrolighed med C. Hvis du er CS50 studerende omkring problemet sæt 6, Så du har se en masse ting i C, vil jeg give dig de store forskelle, og nogle af de ting der gør Python forskellige og særlig og nyttig, men jeg har ikke tænkt mig at gå til hvad et programmeringssprog er og hvordan man skriver programmer. Dog vil dette seminar lærer dig at skrive en Python-programmer hvis du er en af ​​de få grupper. Igen vil vi se på, hvordan du ville gennemføre psets-- der bør være 1-6 i Python-- og give pejlemærker til officiel dokumentation til fremtidig brug. Den anden ting, der er vigtigt om, hvordan denne snak er tildelt, denne video vil være online, høflighed af CS50, så du skal ikke lyst du nødt til at tage noter. Du kan altid gå tilbage og se på det senere som reference. Derudover dias er til rådighed lige nu på dette site, som bør tager du gør en Google-doc. Det er en lidt forkortet udgave af hvad jeg viser på skærmen. Et forsigtig advarsel før vi hoppe i, Python 3 er et andet sprog Python 2. De ser meget det samme; der er meget små tekniske forskelle der vil forårsage, at programmer skrevet i Python 2 ikke at kunne udføres i Python 3 miljø. Den CS50 Apparatet leveres med Python, som standard det bruger Python 2. Du kan kontrollere dette ved skrive i din kommandolinje python --version, som bør output 2.7.6 på den aktuelle apparat. Prøv Python 3, som gør arbejde i apparatet, hvis Python standard 2.X.Y, enten på apparatet eller på dine egne maskiner. Du skal erstatte Python 3 når som helst i denne tale, at jeg skriver Python. Hvis din maskine er kører 2 som standard, type Python 3 med henblik på at kunne faktisk følge med og udføre disse ting. Derudover vil jeg pege dig ved officielle ressourcer nu. docs.python.org/3--~~V forsigtig at det er en 3 og ikke en 2-- har nyttige referencer. Tutorial vil tage dig gennem mange af de samme ting at jeg gør nu, bortset fra i tekstform. Henvisning er egnet som et referere til sproget, og Standard Library giver dig nogle af de udvidelser med yderligere funktionalitet. Så en allerførste Python program. På venstre har vi standard C, til højre, har vi Python. Du har måske anerkendt dette problem, er det en af ​​de første problem sæt i CS50, og disse løse det ved hjælp af den samme løsning. Nu årsagen til, at vi er se på disse ved siden af ​​hinanden er, så vi kan se på syntaktiske forskelle. En af elefanter i rummet at du måske har bemærket ret off the bat, er, at Python har nogen vigtigste funktion indpakning omkring koden. Så i C, du skriver en masse filer, du linke dem sammen, og programmet starter udføre på denne ting kaldet int main. I Python, skriver du en fil, du, eksekvere filen, programmet starter udføre på toppen af ​​filen. Så det kommer til at starte på toppen af ​​filen gå ned, indtil den finder noget andet. Hvis den finder en funktion definition, det vil faktisk ikke udføre denne kode, Det vil simpelthen definere funktionen. Men her, når den første Programmet er n lig 10, den første ting, dette program vil gøre er at tage denne værdi på 10 og sæt den ind i en variabel kaldet n. Apropos denne linje, en af andre things-- sorry-- dette betyder, at C-programmer, vil du skrive dem, vil du gøre dem, som vil påberåbe nogle klang-kommandoer, og så vil du kører en resulterende eksekverbar. Python-programmer, du kører tekst file-- denne mario.py måske være denne fil, som jeg bare viste du-- du vil køre denne fil og du vil udføre, og indholdet af det vil blive udført af Python fortolkeren. Du kan gøre dette i din IDE. Så hvis jeg har en Hej-fil, der blot har dette indhold. Dette er faktisk Python 2, ikke Python 3, så ikke bekymre sig om syntaksen for nu. Men jeg vil køre Python, på hello.py, og det kører. En anden måde, at jeg kan bruge Python, at Jeg vil ikke beskæftige sig med så meget i denne tale, er, hvis jeg bare skrive Python, det falder mig ind i et miljø, hvor Jeg kan fodre den Python linje for linje. Så her, hvis jeg skriver i print plads 'Hej, verden'. Skriv ind. Det vil spytte mig, at bakke resultaterne at de enkelte linje med det samme. Dette er kan være nyttigt. I denne tale vil jeg gøre ting på dias. Og så vil du være i stand til at følge sammen enten i her, eller ved at skrive faktiske filer og derefter udføre dem. Men, som går tilbage til dette kode, en anden ting at du måske har noticed-- godt, er der to ting, som du måske mærke til om disse blokke. Den første, lidt mere jordnære, er, at Python har ingen afsluttende semikolon. Semikoloner er valgfri overalt og uskadeligt overalt. Du kan tilføje dem. Det kan få folk, der skriver Python for et levende snicker på dig bag din ryg, fordi de er ikke nødvendige. De er ofte et tegn på at blive holdt i løbet af fra C. Designerne af sproget føler, at det er mere klart denne måde og at det ikke er nødvendigt at erklære hver gang du afslutter en linje. En anden mærkelig ting om dette n er det ikke har en type tilknyttet. Et af de magiske stykker af Python-- og jeg har tænkt mig at kalde det magi, men der er meget tekniske grunde til det works-- en af magiske stykker Python er, at variable kan udvide eller skrumpe til at indeholde data uanset typer, du ville have dem til. Så dette er en 10. Hvis senere ned jeg tildelt dette n 0,5, ville det tage at 0,5. Uanset at det er en int her og flyde der, noget, der bruger denne n vil mere eller mindre, kunne chug sammen, hvis det får en af ​​disse. Medmindre der er nogle meget reelle Grunden til, at det ikke kan bruge data skrive, at n har i øjeblikket, på hvilket tidspunkt den får kilet og smide en fejl, og den slags ting. Men her, Python ikke rigtig pleje hvad det er, at jeg har tænkt mig at holde fast i denne sætning, ligesom, du ønsker denne ting? Denne ting i det? Ja, det er sådan en ting. Jeg vil holde det i sidste ende. Det vil være et problem senere, hvis nogen, der ønsker at bruge herpå kan ikke håndtere det. Dette er en af ​​de største forskelle mellem Python og C der gør det let at skrive meget store C-programmer og gør det lettere at skrive meget lille Python program. Den for syntaks er ikke meget forskellige i, hvad den gør. Det er lidt anderledes i, hvordan det er udtrykt. Så det er en meget, hvad der kaldes Pythonic, måde at skrive det. for række i området (n), er det række tal fra 0 til n, inklusive på bunden og eksklusiv på toppen. Så det er fra 0 til n-1, som er præcis, hvad C-kode gør, undtagen det er meget nemmere at se på måske. Den relevante blok er ikke modsvares af seler, i stedet er det modregne af denne indrykning. Så alle disse linjer er fire rum over til højre, eller lignende om en elefant bredde. Og dem er dem, der er kommer til at blive henrettet i dette for. Hvis jeg rod op indrykning på dette, og jeg skubbe at udskrive tilbage til den oprindelige fordybning, at udskrive vil forlade for-løkken. I modsætning til C, hvor her jeg faktisk nødt til at flytte, at lukkede tandbøjle rundt. Det betyder, at du ikke får fejl at springe ud på dig, fordi du sætte en bandage på forkerte sted. Det betyder, at du får fejl at springe ud på dig, fordi du indrykket en linje forkert. Så det gør fordybninger super forsigtig. Forhåbentlig var du være super omhyggelig med din indrykning alligevel, og så dette er ikke at meget mere af en byrde. Men en grundlæggende regel for Python, og vi vil have et par af disse at vi vil gå igennem igennem løbet af talen, er prøve naturlige syntaks før man ser noget op. Så denne syntaks, for dette nummer i interval, er meget karakteristisk i form af stil. Masser af ting i Python vi vil se at tage denne form. Og så hvis du kommer op med et nyt objekt, som du synes du skal være i stand til gentage over dette, i dette format, viser sig det sandsynligvis understøtter dette format. Vi kommer ikke til at gå super dybt i de tekniske årsager til, at det er rigtigt. Men det er en nyttig intuition til at have når du nærmer Python-programmer, at denne ting bare kommer til at fungere. Prøv det. Boot op kommandolinjen Tolk, se om det virker, komme videre med tingene, før du engang behøver at åbne op Google og sige, hvad er syntaksen for denne særlige ting? Masser af Python du kunne opdage bare ved at prøve. Dette hvis er endnu mere ens til C derefter fors er. Bemærk, at der er ingen parenteser. De parentes er, igen, uskadelige, men unødvendige. Der er et kolon ved udgangen ligesom efter sløjfer, og igen, de relative blokke er indrykket i stedet sat ud af seler. Dette andet er ved den oprindelige niveau fordybning, og dens relevante blok indrykket igen. De, arbejde, præcis som de gør i C. Det er faktisk meget ens. Igen, udskrive mister ét tegn off af printf Du passerer nogle strenge. Det viser sig strygere kan enten mærkes off af enkelte citater eller dobbelte anførselstegn. Der er ingen forskel, bortset fra at inden af enkelte citater, du kan bruge dobbelte anførselstegn med opgive, snarere end at skulle undslippe dem alle. Og inde i anførselstegn, du kan bruge enkelte anførselstegn med opgive uden at skulle undslippe dem. Hvis du ønskede at blande dem, kan du helt sikkert ser op online hvordan man gør det. Du vil opdage, at over her, Jeg har bestået i slutningen = denne ting. Dette er et eksempel på en valgfri argument, som er en af ​​de ting at Python understøtter, at gør det ganske nyttigt. Så print faktisk har en masse argumenter, der normalt indstillet til deres standard værdi, men her har jeg besluttet at tilsidesætte den der hedder ende. Grunden til at jeg er nødt til tilsidesætte den med en tom streng er, at udskrive i Python, ved standard udskriver en ny linje efter ting, som du fortalte det også. Så denne hash er faktisk kommer til at udskrive en hash i en ny linje. Og hvis jeg ikke vil have hash at udskrive en ny linje efter det, så må jeg sige udskrives ikke en. Men, men alligevel så det en sidste ting, der dette program mangler at man har er en include øverst. Print er bagt ind i Python så dybest set at der ikke er nogen sidehoved eller modul at du skal omfatter, men hvis ønsket til at omfatte andre ting i et Python-script, Jeg ville gøre det i en meget lignende format-- ordene er bare lidt anderledes. Jeg nævnte, at vi behøver ikke en vigtigste her, fordi Python starter udførelse på toppen. Hvis jeg ønskede at ombryde dette på en funktion, jeg ville gøre det som denne-- jeg ville sige def funktion navn, argumenter kan gå ind her, og vi vil se nogle af dem senere, colon, og derefter igen, denne Hele modregne blok er, hvad er operationelt blokere for denne funktion. Så dette er definitionen af funktionen. Og der er en erklæring, derefter ned her, kan jeg bare kalde funktionen. Og igen, programmet fortolker, startende øverst, vil se dette er definitionen. Det vil ikke udføre denne, indtil det får her, og så er det ligesom, åh nu har du kaldte det, jeg gætte, jeg bør udføre den. En ting, der er meget almindelig at se i Python-filer, især Python-filer, er frigivet til offentligheden og udviklet by-- og udvikles, og opretholdes, er noget af denne formular. Dette er tilfældet, fordi basically-- Python, du starter på toppen og så du udfører ned til bunden, Jeg hvis jeg havde bare Mario kaldte herude, så helst jeg medtaget denne fil i en anden fil, fordi jeg ønskede at bruge er Mario-funktion, at andre ville billedet også har denne opfordring til Mario i det. Og da jeg kørte filen, det ville kalde Mario. Så det er muligt, at jeg bare ønsker at køre dette, hvis jeg har faktisk henrettet netop denne fil. Og så jeg kan pakke det i en formsprog som dette, hvor jeg siger, hvis navnet på denne henrettelse miljø er vigtigste, så jeg ønsker at gøre disse ting. Ellers nogen andre kan use-- omfatter min function-- min fil, og bare for at få adgang til disse funktioner uden at skulle køre de ting at jeg ønsker at udføre i denne fil. Dette er, igen, valgfrit men meget almindelig. Disse ting er entirely-- er nøjagtig den samme mellem C og Python, bestemt i 3. Jeg tror i 2, division operatør nogle gange giver dig tilbage flyder, når du opereret ints, og enten du ønskede det, eller du ikke. Men plus, minus, og tider arbejde præcis som du ville forvente, undtagen i lidt flere typer. Så du kan formere flåd ved ints og den slags ting. sæt fungerer nøjagtig det samme. Du kan bruge to lighedstegn. inequals-- større end, mindre end, den slags things-- har de betydninger, du er fortrolig med dem. Hvor C bruger disse operatører, Python bruger lidt mere engelsk læsbare dem. Så i stedet for to, og-tegn, du bogstaveligt skrive ordet "og", "eller" eller ej." Ligesom i din if-- i dit betingede udsagn, vi så tidligere, at denne syntaks i C svarer til denne syntaks i Python. Og der er ikke meget anderledes der, bortset fra en lille smule af tegnsætning omkring siderne. Igen, hvor C ville ellers hvis Python bruger Elif, men disse er for det meste ændringer overflade niveau. Iteration som dette er ofte skrevet i denne formsprog i Python. Du kan fremstille denne slags ting med en while-løkke på ydersiden hvis du ønsker, men du sikkert ikke behøver at. Og igen, hvis du ønsker det udskrive elementer i af et array du kan gøre det på denne måde. En af de sjove ting om Python selv, er, at du ikke behøver at bruge dette paradigme, og du kan bruge en lidt mere elegant én. Du siger til en i Ary. Så snarere end at gå her og kører over indeksene, og derefter trække ud individuelle elementer, du fortælle det til rent faktisk bare køre over selve elementerne. Og så uanset hvad du laver inde kan operere direkte på de elementer, som er temmelig sjovt. Og vi vil see-- vi vil bruge at formsprog igen og igen som vi går gennem kode. Dette er igen et eksempel af noget, som jeg vil kalder Python magi, selv om der er meget tekniske grunde til, at det fungerer. Og der er tekniske ting, nødt til at være sandt om array i rækkefølge for at dette virker bag kulisserne. Sagen er, at de fleste typer som du ville forvente at dette virker har haft denne gennemført for dig i den indbyggede sprog. En anden ting, det ville være rart hvis dette arbejdede på alle sprog, men der er nogle grunde kan det ikke, udskrive denne streng gange dette nummer. Viser sig i Python, dette gør præcis hvad du gerne vil, som er lige sjov, og betyder, at vi rent faktisk kan reducere dette program, igen mario.c. Snarere end iteration en masse, vi kan bare sige, jeg vil have nogle flere pladser, Jeg vil have antallet af hashes, og nogle hashes i slutningen. Og igen, vi bruger dette format. Her er vi passerer i en variabel denne måde. Igen, behøver vi ikke at sige hvilken type variabel er det, og den eneste gang vi får får fejl er under kørslen. Når nogen forsøger at passere noget, det vil komme i funktionen fint. Hvis vi kile her, fordi det ikke er ting, du kan lave intervaller i løbet, Jeg får en runtime fejl der, og jeg bliver nødt til at debug det på den måde. Men i mellemtiden, har jeg ikke til at være meget forsigtig med, hvad bliver vedtaget i, så længe i selve udførelse det hele virker meget rent. Jeg kunne endda gøre dette en lille smule renere ved hjælp af en særlig indbygget funktion på strenge, er der Right retfærdiggøre. Dette er blot en nyttig funktion liggende biblioteket. Det er i den dokumentation hvis du går og søge efter den. Og jeg siger, godt jeg har tænkt mig at have denne streng, et bestemt antal hashes, og jeg vil gerne lige retfærdiggøre det-- pad det ud med mellemrum at være denne længde. Igen, dette er i dokumentation, som bringer os-- Jeg vil faktisk klikker igennem these-- som bringer os til vores anden regel for Python-- standard biblioteket funktion metoder er dine venner. Og det er ofte værd at din mens til at gå på udkig efter jeg spekulerer hvis der er en ting, der bare gør det. Der sandsynligvis er. Hvis du gerne vil pad ud af en streng, hvis du ville gerne tage bagsiden halvdelen af ​​en streng, hvis du ville gerne søge gennem en streng, hvis du gerne vil smadre et par ting sammen med en snor med komma mellem dem, der er standard biblioteket funktioner til at gøre dette. Og det gør dit liv lettere, hvis du bruger dem i stedet for at udrulle alt på egen hånd i fem linjer kode her, fem linjer kode her. Der virkelig starter ved tilføje op til realtid. En af de interessante ting om, hvordan det bliver kaldt. Du vil opdage, at der er en prik ting. Jeg har nogle objekt til venstre, og så jeg kaldte en prik en funktion. Dette er en af ​​de paradigmer, som Python bruger til fastgørelse metoder til objekter. Vi taler om, hvad denne er meget kort i slutningen, men ved, at vi begge kan operere på ting ved at tage den ting at sige dot uanset hvad, eller ved at ringe en funktion, der tager objektet og nogle andre argumenter. Så disse er begge måder, tingene bliver gjort i Python. Og hvorvidt en bestemt funktion implementeres i denne stil eller nærværende stil er noget, du skal se op, indtil du får en hænge for hvilken en det er sandsynligt, at falde i. Der er en mere eller mindre sammenhængende Filosofien bag Python at du optager det meste ved at skrive en masse i det. På et tidspunkt, hvor en af ​​disse noget vil blive gennemført som bliver naturligt. For nu, det er bare noget du lærer, når du regne ud, enkelte ting. Så standard biblioteket funktioner er dine venner, og de lad du skriver ting, som tage denne meget plads virkelig kort tid, virkelig elegant. Og det er faktisk nok mere læselig, vil jeg sige, end C-program der ovre. For ikke at nævne det faktum, der er så kort du kan passe en hel elefant i rummet, som vi har gemt. En anden ting, er en implementering af Mario, der er prik C, som jeg tror er den korteste, du kan få det. Det har ikke get int, men det hårde koder værdien af ​​10 på samme måde som det gør. Viser sig, at denne ene ure i på 84 tegn, mens Python er 64. Og det er uendeligt mere læsbar end dette garbage her. Så Python er mere effektivt i rummet. Det er lidt mindre effektiv i tid, men ikke af meget. Lister er en vigtig ting i Python. Vi har ikke set dem, men de fungerer meget gerne arrays gøre i C. Så her kan du erklære dem, du kan passere dem i en ting. Nu kvadrater har en vifte af disse ting. Igen har vi ikke anmeldt som type, men hvis vi nogensinde forsøge at bruge det, noget, som du ville forvente at arbejde på en række af heltal kommer til at arbejde på et array af heltal. Dette er en ting, som du absolut ikke kan gør i C, fordi hukommelse det er så hænder på, men er meget let at gøre i Python. Hvis jeg vil have min matrix til at være større, kan jeg føje et element til det, og det er fint. Hvad der foregår bag kulisserne? Tolken vil gå ud og få noget hukommelse, og måske det får en lidt ekstra hukommelse, så jeg ikke, så jeg ikke behøver at realloc hver gang. Men hvor meget har mere hukommelse behøver det? Dette er ikke beslutninger at du er nødt til at gøre, disse er de beslutninger, tolk vil gøre. Her ser vi rækkevidde kan tage to argumenter, men det er stadig kommer til at være inkluderende af toppen, så vi tilføjer en der. Dette er et udtryk, som er en endnu mere smart måde at skrive ting som dette. Det hedder liste forståelse, og her, hvad vi siger er jeg gerne vil sætte i jeg kvadreret for hver værdi af i i dette område. Denne ting til højre kunne være en anden array, og denne ting til venstre at være nogen særlig funktion der ville tage i I som en variabel og give mig nogle resultat. Hvad jeg har tænkt mig at gøre, er, Jeg har tænkt mig at konstruere en matrix, der er alle disse ting for hver værdi i dette område. Og det er super elegant, super kort, og det er meget klart, hvad det betyder. Dette er en af ​​de things-- dette er igen, én of-- meget symbolsk for den årsager til, at folk som Python. Hvis du kan lide programmering som denne, så er Python er et sprog, du måske gerne lære. Og igen, der er teknisk grunde til, at det virker. Men så vidt vi er bekymret, vi mere eller mindre ligeglad. Så hvis du ønsker at udskrive lister, nogle af de samme udtryk er nyttige. For jeg i dette område, vi kunne indeks igennem alle de ting og derefter udskrive dem alle ud. Og du vil se len her. Hvis du nogensinde har ønsket at få længden af ​​array, der er meget let i Python, det er meget svært i C. Dette ville udskrive præcis hvad du ville forvente det. Vi kunne også, som vi har set før, gentage over elementerne i arrayet direkte, og så bare snakke om dem, i stedet for at indekset tilbage i array hver gang. Og det er en ting, som du kan gøre. Så i C, hvis du beder om noget som denne, ville print sige, det er en bred vifte af heltal. Det er bestemt ikke en streng, kan jeg ikke udskrive det. Python mere eller mindre ligeglad. Det er ligesom, er der en måde, som jeg kunne vende dette til en streng? Ja, jeg vil gøre det. Og så jeg vil bare udskrive det ud. Det betyder, at du kan gøre ting like-- disse er de fleste af de hårde dele af spil femten, skriftlig meget kort i Python. Du vil se, at der er en lille smule of-- her Jeg har kastet et heltal til en streng, og jeg er nødt til at gøre det manuelt. Og jeg har tænkt mig at tilføje det til en anden streng, eller på anden måde Python bliver forvirret. Men uanset om når du er tilsætning af en streng til et heltal, er jeg vel at få en heltal tilbage eller en streng tilbage? Men igen, hvis du bare ringe str på en ting, og det kunne i enhver mulig Verdens omdannes til en streng, Det vil sandsynligvis være omdannes til en streng. Her ser vi brug af indlejrede liste forståelse til venstre, nogle indeksering, der er nøjagtigt, som du ville være vant til det, og nogle udskrivning ud af tingene. Igen har vi defineret nogle funktioner og vi vil kalde dem ned i main, når vi rent faktisk får filen. tilbagevenden fungerer nøjagtig som du ville forventer at arbejde med C. Find, vi kan oprette ting som denne-- her er listen forståelse der er en opgave til en variabel, og vi kan faktisk gøre det endnu nemmere. Vi behøver ikke at skrive søgning, fordi indbygget i sproget er, hvis denne ting er i dette array. Returnere sandt, ellers return false. Så det er samtlige fund. Helhed af sortering indebærer ringer sortere, som is-- der er implementeringer af denne indbygget i visse C-biblioteker. Hvis du gerne vil dette slags baglæns, du kan tilsidesætte denne valgfrie argument i omvendt med en sand. Og hvis du gerne vil sortere i strygere, er der indbygget så godt. Så dette er ikke til at sige disse er ting, du skal gøre hver dag, men ideen er, at denne er filosofien bag Python, at alle disse ting, som du ville slags ønsker at gøre er indbygget. Og de fleste standardfunktioner, så sortere, længde, uanset hvad, støtter mest logisk fornuftige input. Du kalder len på et array samme måde du kalder len på en snor. Du multiply-- du sortere strings på samme måde, du sortere arrays. De fleste standardfunktioner at folk bygge, og mest tredjepart biblioteker, folk bygge, fordi de efterligne udformningen af ​​standard biblioteket, kan kaldes på alt det, du er lignende, hvorfor det ikke bare arbejde, i C. Mere eller mindre, det vil arbejde i Python fordi folk arbejder bag figur ud af, hvad en ting er, og derefter betjene hensigtsmæssigt på det. Så igen, teknisk baggrund, men det gør vores liv lettere som programmører. Så her er fil I / O. fil I / O har masser af små ting, der gør det kompliceret, og så der er ressourcer online, men i en nøddeskal, du kalder åben på en fil navn med en bestemt type. Så der er læst, læse og skrive, skrive eller tilføje. Du læser et vist antal tegn, og du udskriver dem, du får Hello! Jeg mener, ligesom denne fil havde Hello! I det, ringe til at læse, og hvad du får tilbage er en streng, som har alle af resten af ​​arrayet, af eller hele resten af ​​filen. Hvis du kalder læst igen, du er i slutningen af ​​filen, og så du ikke får noget, og så du vil lukke. Igen, dette er .close snarere end tæt fil, som det ville være i C. Dette er mere eller mindre, fordi f er en ting, og du gerne vil for f til at lukke. Men grundlæggende fil I / O er ikke særlig kompliceret. Igen, hvis du gerne vil åbne en fil, hvis du gerne vil læse en bestemt linje, du kan komme ud af særlig line-- der er indbygget ins til det. Hvis du gerne vil skrive en ting, kan du skrive dette. Hvis du gerne vil skrive individ bider, kan du skrive dem. Og hvis du gerne vil gentage over linjerne i en fil individuelt, som vi gjorde i et stykke fra et par uger siden, kan du gøre det til. Igen, de fleste genstande, som du ville gerne være i stand til at gentage over støtte iteration over dem. I kvælerslanger, en fil er måske en ting, Jeg vil gerne gentage over linje for linje. Hvis det var en ordbog af ord, og jeg var forsøger at få dem individuelt ord ud, så inden for denne løkke, line det vil være hvert ord i tur og dette vil blive henrettet for hver linje i filen indtil slutningen af ​​filen. Og igen, hvis jeg udskrives hver linje, linjerne kommer med nye linjer, så jeg sætte enden tilbage til en ting som dette. Så jeg ville få indholdet af min fil. Den anden ting, som opererer i nogle måder som lister og på nogle måder som noget væsentligt mere magtfulde, er ordbøger, som er virkelig cool at bruge, men er dybest set hash tabeller i forklædning. Du opretter en hjælp præcis to tegn, som er awesome hvis du forsøgte at gennemføre hash tabel for dit problem sæt, du ved meget smerte, der kan være. Men folk har gjort det, og gjort det så godt, at du ikke behøver at bekymre dig om det længere. Derefter kan du indsætte enkelte ting. Hash tables-- eller ordbøger ikke særlig ligeglad med, hvad du opbevare i dem. Så hvis nogle poster er tal, og nogle poster er lister, hvis nogle poster er andre ordbøger, og nogle poster er strenge, Python ikke megen pleje. Igen, hvis du går ind i den forventer en streng og hvad du får tilbage er en matrix, det er dit problem. Og måske er det skyld hvem troede, det var at sætte tingene i ordbogen, måske det var dig. Hvis det var en person andet, forhåbentlig de var velopdragen om, hvad foregik i ordbogen og ikke efterlade nogen faldgruber for dig at falde i. Men de standard funktioner vil give dig tilbage velopdragne ting. Så de siger dette afkast bakke en ordbog over strygere, så alt, hvad du skal hen at komme ud af er en streng. Hvis du gør noget af dette, og det ture dig op, ja, der kan være på dig. Python helt sikkert giver dig nok reb til at hænge dig selv, hvis du gerne vil. Nu kan vi udskrive individuelle bestemmelser i dette og dette afkast præcis, hvad du ville forvente. Præcis hvad du ville forvente, tror jeg, er en sætning, som jeg bruger en masse, men det er mere eller mindre hvordan Python fungerer. Hvis du beder om en ting, som ikke er det vil Python smide en fejl og det vil holde op dig ud af uanset hvad program du var i. Det vil faktisk udskrive mere information end det, det vil pege du-- det vil tilføje en linje, og så. Og, igen, måske vi ønsker at gentage over ordbøger og finde alle de ting i det. Her er vi iteration løbet to ting på samme tid. Og så vi vil gøre det med en nøgle, værdi, men derefter udskrive alle disse. Og hvis vi ønskede at cast-- hvis vi faktisk kørte det, vi ville have nogle problemer, fordi on-- når vi gik med David, det kunne ikke add--, hvis vi ikke gjorde kaste det for en streng først, vi ikke kunne tilføje, at matrix af strenge ned på en streng. Men hvis vi kaster den til en streng, vi får noget som denne, som er måske hvad vi gerne vil læse. Og det er at stave. Vi har lige læst i tingene. Så vi kan læse i enkelte ord som linjer. Vi hugge den sidste ting, så colon minus 1 chomps off den sidste ting, we-- det sidste tegn i en streng. Vi vil sige. OK, hver en af ​​dem får indsat i denne ordbog, kortlægning til en værdi på 1. Vi gør ikke specielt bekymre sig om, at man, men det er der bare for at sige, åh ja, denne ting jeg vil sætte i ordbogen. Fordi senere, hvad vi er kommer til at gøre, er at vi er vil sige, godt, hvis det er i ordbogen på alle. Igen, denne kontrol for medlemskab er op operativsystem ved hjælp af en helt anden algoritme end det vil på en liste, men vi kalder det på samme måde, som er nogle af disse Python sukkerovertræk ting, så de er lettere at bruge. Og igen har vi set ting som dette før. Dette er dybest set at finde eller Det er præcis den samme syntaks som finde, men opererer over en helt anderledes struktur. Og vi har ikke særlig pleje. Så det er de ting, du blev bedt om at gennemføre til speller. På denne sats, vi kommer til at få mere eller mindre alle de psets gjort. PUBLIKUM: Så det egentlig bare kommer tilbage som fejlagtigt stavet hvis det ikke gør matche noget i ordbogen? ROSS RHEINGANS-YOO: Ja, ja. Og så er dette en tilpasning af et problem sæt som beder dig om at gøre netop dette. PUBLIKUM: Hvorfor er den linje minus 1 er der? ROSS RHEINGANS-YOO: Så når du iteration i en fil beder om ved linjer, linjerne kommer med en ny linje karakter ved udgangen af ​​det-- minus 1 er bare at shoppe dem fra. Og dette er en særlig fleksibel måde at indeksere ind i ting. Så hvis du har en streng, og du gerne vil, godt jeg er kommer til at starte ved tegn tre og jeg har tænkt mig at gå til slutningen. 3 kolon vil gøre det for dig. Hvis du ligesom jeg ønsker at starte på begynder og gå til det sidste minus 1 karakter, colon minus 1. Og hvis du ønskede at gå fra tredje til minus første, så du ville sige 3 minus 1. Desuden, hvis du ønsker at indeksere i ting regnet fra ryggen, du bare indeks med minus tal. Og fordi, hvor C ville eksplodere eller måske foder du andre hukommelse, du ikke har adgang til, hører du kan sige minus 1 betyder den sidste, men 1 tegn i en streng. Moduler er version-- er analoger til biblioteker i C og er nyttige for en masse ting. En masse ting du ville gerne gøre i Python, udover simpel manipulation af variabler, du ønsker at tilslutte til større biblioteker med større grænseflader og mere kapaciteter til at interagere med andre dele af verden. sys er en af ​​dem med en flok værktøjer der er egnede til at interagere med selve systemet og vil importere den som import sys. Der er mere dokumentation fra at, som du kunne gå her, eller du kunne finde på Google ved at google Python sys. Du skriver i indtaster. Det første link vil være dokumentationen i Python 2, det andet led kommer til at være dokumentation Python 3. Og hvis vi skrev en fil, der kiggede ligesom denne-- Hvis i særdeleshed, er vi ser på opererer på kommandolinjeargumenter, ligesom vi lærte at gøre meget tidligt i denne klasse. Det er ikke svært. Du kan komme ud argv, som er en af ​​de ting som gennemføres af sys. Det er ikke indbygget i den basis pakken, men igen, du kan udvide det ved at importere at funktionalitet fra sys. Du vil kalde det sys. hvad end. Her er der argv. Der er faktisk ikke noget argc i sys, fordi du kan få det så let ved at ringe len. Vi udskrives derefter at ud, så er vi modtog vores terminal echo-args.py. Vi får tilbage et array, som er det første argument. Igen, dette er argv 0, som er den navn på de ting, der fik kaldes. Hvis vi kaldte det med yderligere argumenter, ville vi få dem tilbage. Dette er en måde at få kommandolinjeargumenter. Hvis du vil have flag, hvor du slå bestemte ting på eller overstyring en bestemt standard, argparse er din ven. Og igen du opdage, at online ved python argparse hos Google. Der er et par af nytteværdi moduler, som du finder dig selv ved hjælp og igen, hvis du bruger nogen tid af dette sprog importerer jsons til læsning i og ud af JSON filer, ikke så kompliceret. Du åbner en fil, du har ringet json.load på filen, og du får tilbage en ting. Hvad er det? Det er en JSON objekt. Såfremt denne JSON har array, Python har arrays. Såfremt denne JSON har associative arrays, Pythons ordbøger, strygere, og tal, og så videre. Du ønsker at dumpe det ud, du åbne en ny fil, du kalder dump, og belastninger og lossepladser til gå ind og ud af strenge. Tilsvarende bliver lage kaldes stort set på samme interface. Det er lidt mere nyttigt, hvis du dumping Python objekter. Så hvis du nogensinde har ønsket at spare en version af den aktuelle status af en variabel for en fremtidig køre af dit program, lage er Pythons bibliotek til at gøre det. Hvis du har nogen form for variabel, der kan skrives ud i lignende ord og tegn og bytes-- som denne ordbog, Vi kunne skrive ned, vi kunne skrive det ned som som en JSON objekt, som var bogstaveligt talt disse tegn. Og så ville det være meget let for et menneske for at åbne det up-- åbne op og læse den. Hvis vi gjorde det ikke særlig bekymrer sig om mennesker læse det, vi kunne pakke endnu mere effektivt i former, der kunne senere udpakkes eller som senere kan blive oppustet. Og dette sparer 80% af plads, at dine objekter måske tage, hvis du skrev dem ud hånden. Du kalder lage meget den samme way-- dump, belastning, og så får du dine ting tilbage. Så hvis du skriver meget korte Python-programmer, der vil spare staten, og derefter læse dem tilbage senere, ting som dette er dine venner. At du kunne meget let dumpe dem som JSON. De fleste Python objekter kan dumpe ud JSON hvis der er noget håb, der strukturelt de kunne være repræsenteret på den måde. Disse er kun toppen af ​​det isbjerg på moduler, som er anvendelige. Så sys, OS, multiprocessing, er slags basale arbejdsheste for ting vi er nødt til at interagere med filsystemet OS., ligesom os.isfile, os.isdirectory, os.makefile, disse er dine venner. Hvis du ønsker at interagere med en bestemt filtype, JSON, lage, CSV. Hvis du ønsker at interagere med web sider, den urllib for at få http sider. bs4-- BeautifulSoup-- det er en vidunderlig parser til html. Du kører det på en html og du få denne indlejrede matrix objekt nu, som du kan krydse løbet lookin, med lignende bare på udkig efter hvis, er i, hvilket er fantastisk. Der er en masse pakker til running-- for at gøre især Mathy ting. Så hvis du ønsker at formere, invertere, transformere matricer, numpy bliver brugt af folk alle over hele verden for det. scipy er endnu mere nyttigt værktøjer i den retning. sklearn-- maskine læring, behandling af naturligt sprog, super nyttige ting, får gennemført i Python hele tiden. Og igen, tager lidt længere tid at write-- ked af det, tager lidt længere tid til at køre, men grunden til, at reelle ingeniører tendens brug Python er fordi du har tendens til at være blokeret på dig skrive koden, snarere end din computer, der kører koden. Så hvis du kommer til at skrive en program, som masser af andre mennesker vil bruge evigt, som Linux, du måske skrive det i C. Hvis du var vil skrive en beregning motor, du måske skrive i Python, hvis du havde brug for at ændre det hver par måneder. Nogle mennesker ville skrive det i C fordi de er sådan. Så vi har set import sys som en måde at få tingene for at få modul i dit program. Du kan også importere det som et kaldenavn, hvis du gerne vil. Igen multiprocessing er en smerte at skrive ud hver gang, så importere som mp og så når som helst du bruge det i programmet, du vil sige mp.process, eller hvad har du. Hvis du gerne vil importere kun en enkelt ting, så urllib har en ting kaldet anmodning, så kan du bare importere det. Senere, vil du ikke påberåbe det som urllib.request, men lige så forespørgsel af sig selv. Og du kan importere alt fra et modul, hvis du ønsker. Dette er til tider ikke en god idea-- dette normalt ikke en god idé, faktisk. Fordi du very-- fordi hvis noget i dette modul har et navn, som du ønskede at bruge et andet sted i dit program, kan du ikke. Og det er ikke altid indlysende at det er tilfældet. For at sikre, at hvad du lavede var sikkert, du nødt til at åbne op modulet og se alle af de navne, der ender i there-- alle funktioner, alle de variabler der lever i dette modul, fordi du bringer alle dem ind i din lokale navneområde. Så folk gør dette. Det anbefales generelt at du ikke gør dette. Men folk gør det hele tiden, fordi de er doven og ikke ønsker at skrive ud mp. noget, nogensinde. Alt den snak om moduler bringe mig rundt til en kort snak om, hvordan du designer programmer i Python. Det første skridt er at kontrollere, om nogen andre allerede har gjort de ting, eller gjort 90% af de ting. Chancerne er de sandsynligvis har, og du skal gå få deres ting og køre den. Eller skrive et omslag omkring det at tilpasse den til dit formål. Det er først efter, der har mislykkedes at du ville derefter gå på og write-- begynde at tænke på hvordan du ville sætte denne ting sammen. Der er masser af ting derude, og det er en af ​​de mest nyttige ting om Python. Ligesom sproget er elegant, sproget er nem at bruge, men også fordi det er så elegant og let at bruge, folk har brugt det i et lang tid, og der er en masse ting derude, at du kan udnytte til eget brug. Så sidste regel i Python er, nogen andre har allerede sandsynligvis skrevet et modul til det, en anden har allerede sandsynligvis skrevet et bibliotek til det. Før du forsøger at gøre en ting, se at se, om det er blevet implementeret. Det er ikke så svært. Alle de moduler, som jeg sætter op før, måske med en enkelt undtagelse, kommer pre-installeret i hver standard Python installation. Og så med en opfordring til importere uanset hvad, du har alle denne funktionalitet ved hånden. Begynder at ombryde op denne snak, er der et par ting at jeg har tilbage som sorte bokse og sortering af tilsløres, og der er et par hvide løgne, at jeg har at vide, at af hensyn til ærlighed, Jeg vil i det mindste punkt, her, selvom jeg ikke vil gå super dybt ind dem alle og deres tekniske forklaringer. En masse af de ting, at jeg har kaldt magi er, hvad andre mennesker ville kalde objektorienteret programmering. Så der er masser af things-- så variabler er meget ofte ikke simple byte sidder i, hukommelse, men er meget kompliceret objekter, der har intern tilstand om funktioner og masser af skjulte variabler, masser af skjulte funktionalitet, som lader dig gøre dem til strygere, som lader dig gentage over dem. Og hvis du writing-- og fordi de har alt dette rige funktionalitet skyldes people-- arkitekterne bag language-- gået gennem og for hver standard objekt, sat i funktionaliteten at sige dette er, hvordan det er hvordan det kommer til at fungere hvis nogen ønsker at gentage over det. Så alt, at nogen måske eventuelt ønsker at gentage over, har logik skrevet i manuelt på, hvordan du er formodes at gentage over objektet. Alt det, du muligvis ønsker dumpet i en streng er logisk skrevet. Det er den funktion, som du ringe til, hvis du ønsker at dumpe dette ud til en streng. Det er derfor, du kan kalder LEN på ting, dette er derfor, du kan ringe til, det er hvorfor du kan ringe hvis i om alt at du gerne vil, fordi dem alle bærer med dem, den tekniske know-how til at gøre det. Det er noget, jeg er Super ikke kommer til at gå ind. Men for ting i listen er subtilt forskellig fra C stil for sløjfer, og du kan læse alt om det på internettet, hvis du er interesseret. Der er en mørk side for alle af dette, som jeg nævnte, så der er to ting. Den første er, at denne objektorienteret programmering tilføjer en masse ekstraarbejde til tilfældige ting, så du ender op ved hjælp af en masse mere hukommelse; du ender med at bruge lidt mere tid, end du ellers ville. Den other-- men mere snigende mørke side til dette er, hvis tingene bare handle ligesom du vil have dem til uden at du skal tænke super hårdt om, hvorvidt det skal være en int eller om der skal være en flyde, kan det være, at over her du producerer en int, men herovre du tror, ​​men de vil always-- ked af det, Det kan være, at her du producerer en flyder, men når du kommer til den anden del af dit program, er du tænker, oh well, men de vil altid passere mig en int. Og hvis de ikke gør det, er det muligt at du kilet sted, hvis du forsøger at bruge det til at indeksere til et array, eller hvad har du. Så en af ​​den reelle nyttige ting om C er det tvinger dig til at tænke rigtig hårdt, før du foretager any-- før du sætter nogen variabel i eksistens, som hvad er den type af denne variabel. Og det kommer til at have denne type for alle tider. Det er ikke sandt Python, og i virkeligheden, du can-- hvis du bare slags oppe ved øret, og du foretage nogle beslutninger én måde på ét sted, og nogle beslutninger én måde i det andet sted uden at sætte nok stuff bag scenerne i det andet sted at fange tingene ordentligt, du kan få nogle meget mærkelige fejl. Og programmet kan holde kørende i meget lang tid, fordi det er gør et stort arbejde for at sige, godt denne ting kunne betjene denne måde, så jeg har tænkt mig at køre på den måde. Og faktisk, at det skubber sende igennem en masse små fejl betyder, ofte når en fejl er faktisk dårligt og du rent faktisk ønsker at ordne det, det ender miles away-- programmet ender stoppe miles væk fra da du havde din fejl. Og så en ting, som vi gerne vil programmer at gøre, sometimes-- én ting at vi gerne programmer at gøre, når vi debugging er mislykkes højt og fejle meget hurtigt, når noget går galt. Python er meget dårlige til det. Python er meget god til ikke mangel og rullende fremad gennem uventede ting. Så dette er nyttigt for når du skriver små programmer. Når du får kompliceret bugs det undertiden tager lang tid at drille dem ud. Så der er en mørk side til alle af dette, ligesom det virker bare. Det fungerer ligesom du ville forvente det. Bortset fra, at når det ikke sker, du ender i et helt andet sted og forsøger at regne ud, hvor det var, at du gik galt. Garbage collection is-- så én ting, du vil bemærke er, at nogen af ​​disse ting, Jeg har bragt i existence-- disse arrays, disse ordbøger, disse objekter, disse files-- aldrig få befriet. Der var ingen opkald til fri i nogen af ​​denne snak. Og der var på C-side, fordi vi aldrig fik ind i disse ting. Men i Python-side, der ikke er et frit. Tingene bliver automatisk befriet, når Python tror du ikke at se på dem. Det er virkelig godt ikke frigøre ting, du kan stadig muligvis være at se på, men det betyder, at hvis du var kommer til at tildele denne store ting, og du er ligesom, åh Jeg er færdig med det nu, det er svært at fortælle Python at du er færdig med det nu. Du kan undertiden fastsat variablen at være nogen, og så håber at i sidste ende affaldsindsamling kommer igennem og renser det. Men igen, du ikke har kontrol over det. Og en af ​​grundene til, at folk bruger C for virkelig præstationer kritiske ting, er denne evne til virkelig vide, når hukommelsen er allokeret og når det er befriet, og har en masse kontrol over at sige, Jeg bruger ikke mere hukommelse end jeg har brug for. Hvilket er noget, Python er ikke så stor på. PUBLIKUM: Kan jeg stille dig et spørgsmål? Hvad mente du med fejle højlydt? ROSS RHEINGANS-YOO: Så hvis noget der går galt og du er i debugging tilstand, ville du meget ofte ønsker dit program til at fortælle dig hvor præcis det er gået galt, og ikke bare stille og roligt standse. Men du ville faktisk det at udskrive alle former for oplysninger om lignende, her var dette. Dette skete Hvis du udskriver en wen-- hvis du kører en web server-- PUBLIKUM: [uhørligt] ROSS RHEINGANS-YOO: Ja, hvis du kører en webserver, Det er nogle gange dårligt, hvis du er altid kassere fejl, og du siger, godt, at ikke virkede. Jeg har tænkt mig at stoppe. Jeg bare at ignorere det og holde foregår. Fordi så kan du komme i hundredvis af disse fejl og ikke se dem. Det ville helt sikkert være nyttigt til debugging formål hvis hver gang din webserver gjort en fejl, du havde holdbare registreringer af det. Måske du selv ønsker programmet til at stoppe, således at disse optegnelser Må ikke få begravet under ting. Men igen, det er i debugging mode. Ofte i produktion tilstand, verden er lidt anderledes. Og i små scripts, jeg kører, hvor de ting, jeg sagde at gøre måske kun en lille smule off fra hvad jeg gerne vil have den til at gøre, derefter slags skubbe gennem fejl er noget, du måske ønsker. Og i de tilfælde, i hvert fald Python virkelig tjener sine starter. Den sidste ting, som jeg ikke taler i denne-- at jeg ikke taler om men kan være virkelig frustrerende den første gang du har en af ​​disse fejl, og den anden og tredje og fjerde gang du har en disse fejl. Python, nævnte jeg at det bruger hvid plads at fortælle dig, hvad niveau af indrykning og hvad funktionel blok, du er i, det behandler faner og rum forskelligt. Så hvis du fanen løbet fire, og derefter næste linje har fire rum, selv om de dukker op som samme beløb i din editor, Python ikke behandle dem ens. Faktisk Python behandler faner og rum som olie og vand. De er blot forskellige ting. Der er ingen særlig længde, en fane er, så det er ikke ligesom en fane er lig 8 mellemrum, og så du ville få omkring det Den vej. Ligesom, når den siger, hvad niveau af hvide rum jeg er på, Det er faktisk på udkig efter en mønster af mellemrum og faner. Og så, at den bedste måde at håndtere dette er altid at bruge mellemrum hele tiden. Og i virkeligheden, i Cloud9 IDE og CS50 IDE, dine Tab nøgle indstik fire rum i stedet af en fane, som er super anvendelig. Selvom igen, hvis du skrev en Python program med faner, ville være fint, det er bare hvis nogen gik ind og forsøgte at tilføje en enkelt linje til dit program, som havde fire pladser for hver fane, det ville bryde. Og det ville bryde på en måde, der virkelig ikke er synligt. Selvom det faktiske fejl budskab, at det kaster har at gøre med nye indrykke forventes ikke her, eller-- hvis det er tale om led og det ser ud det er forkert, er det sikkert fordi der er en fane-space problem. De er stadig ærgerlige til debug. Den største helhed i denne tale, som jeg gjorde ikke komme til, fordi det er virkelig en kompliceret, subtil emne, og var ikke nødvendigt at gøre noget af de ting, vi har gjort hidtil, er et begreb kaldet tupler. De er der meget ligesom arrays, som du ikke kan ændre. De vænner over det hele, fordi de er nyttige for masser af ting at arrays ikke er egnede til. Men hvis du gerne vil lave et array, og så lover tolken, at du aldrig vil ønsker at ændre denne thing-- i virkeligheden, hvis du ønsker at ændre, vil du lave en ny med det nye værdier i it-- de er tupler. Stedet for at producere dem med kantede parenteser, du producerer dem med runde parenteser. Hvorfor ville du bruge disse ting, er en lille smule af et spørgsmål. . Det eneste, jeg vil sige om det er dig kan bruge tupler som indeks for ordbøger. Du kan ikke bruge arrays som indeks for ordbøger. Og hvorfor er, igen, teknisk og Jeg har ikke tænkt mig at løbe ind i den. Den pset at jeg ikke har rørt på i denne snak er pset6. Så her er hvordan du? D gennemføre en-- her er hvordan du ville implementere pset6 i Python. Med tanke Python design cyklus, den første ting at du gør, når du er skrive programmer er kontrol at se, om nogen har gjort det allerede. Faktisk, hvis du ønsker at serve-- Apache 50 gør omtrent det, bortset fra det ikke kommer standard installeret på Linux-maskiner. Python gør, og Python simpel http-server gør så godt. Hvis du nogensinde på en Linux-maskine, eller Cloud9 IDE uden for CS50 og du gerne vil tjene dette aktuelle mappe til en bestemt havn, python-m SimpleHTTPServer port tjener det. Du kan også importere den simple HTTP-server og det har fået en masse funktionalitet, hvis du vil tilpasse det, eller ændre det, eller drives it-- udnytte det til køre din egen server tjenester. Så det er Python i en nøddeskal. Og det har været CS50. Tak.