ROSS RHEINGANS-YOO: Hej, jag heter Ross. Och detta är en CS50 seminarium. Det kommer att ta dig från programmering i C programmering i Python. Python är ett skriptspråk. Det är till stor del som C i syntax, även om vissa av de tekniska detaljerna i hur det syntaxen blir verk är något annorlunda. Det är mindre kraftfull än C på vissa sätt. Det är mindre uttrycksfullt för där exakt i din dator minne blir anlagd, hur det blir anges, när det blir frihet, och den sortens saker. Det är mer användbar än C på vissa sätt, eftersom det är lättare att programmera in. Språket är i viss människor, mer intuitivt. Och egentligen, är målet för det är snabbare att programmera och potentiellt långsammare att köra. Nu om du tycker om den tid du spenderat på din sista problemet set skrift din kod mot tid du spenderar på din sista problem ställa verkställande din kod, du kan tänka mig att språket som var dubbelt så snabbt att skriva, och dubbelt så lång tid att utföra, kan vara en förbättring jämfört med C på vissa sätt. Visst när du försöker skriva små program för att göra små saker, Python är ett användbart språk val. Och i slutet av denna seminarium, jag hoppas du kommer kunna göra val i framtida projekt om vilket språk rätt att använda, inte tanken att ett språk är mer korrigera hela tiden. Några saker om vad seminariet är. Detta seminarium är inte avsedd att lära dig Python från scratch. Python är mycket lik C, och jag antar att du är en CS50 student, eller någon med en liknande förtrogenhet med C. Om du är CS50 elev runt problemet set 6, så att du har se en hel del saker i C, jag ska ge dig de stora skillnaderna, och några av de saker som gör Python annorlunda och speciell och användbar, men jag tänker inte gå för vad ett programmeringsspråk är och hur man skriver program. Dock kommer detta seminarium att lära du att skriva ett Python-program Om du är en av de få grupper. Återigen kommer vi att titta på hur du skulle genomföra psets-- som bör vara 1-6 i Python-- och ge pekare till officiell dokumentation för framtida referens. Den andra saken som är viktigt om hur denna diskussion är tilldelad, den här videon kommer att vara på nätet, med tillstånd av CS50, så du bör inte känner sig som du behöver för att göra anteckningar. Du kan alltid gå tillbaka och titta på det senare som en referens. Dessutom bilderna finns just nu på denna webbplats, vilket bör tar du gör en Google doc. Det är en något förkortad version av vad jag visar på skärmen. En noggrann varning innan vi hoppar in, Python 3 är ett annat språk från Python 2. De ser mycket densamma; det finns mycket små tekniska skillnader som kommer att orsaka program skrivet i Python 2 inte för att kunna verkställas i Python 3 miljön. Den CS50 apparaten kommer med Python, som standard använder Python 2. Du kan kontrollera detta genom att skriva i din kommandorad python --version, vilket bör utgångs 2.7.6 på den aktuella apparaten. Försök Python 3, vilket gör arbeta i apparaten, om Python standard 2.X.Y, antingen på apparaten eller på dina egna maskiner. Du bör byta Python 3 när som helst i detta prat som jag skriver Python. Om din maskin är kör 2 som standard, typ Python 3 för att kunna faktiskt följa med och utföra dessa saker. Dessutom ska jag peka dig vid officiella resurser nu. docs.python.org/3--~~V försiktig att det är en 3 och inte en 2-- har användbara hänvisningar. Handledning kommer att ta dig igenom mycket av samma saker att jag gör nu, utom i textform. Referens är användbar som ett referens för språket, och Standard Library ger några du av förlängningarna med ytterligare funktionalitet. Så en mycket första Python program. Till vänster har vi standard C, till höger, har vi Python. Du kanske har erkänt detta problem, är det ett av det första problemet sätter i CS50, och dessa lösa det genom att använda samma lösning. Nu, anledningen till att vi är titta på dessa sida vid sida är så att vi kan titta på syntaktiska skillnader. En av elefanterna i rummet att du kanske har märkt rätt utanför bat, är att Python har ingen huvudsakliga funktion omslag runt koden. Så i C, skriver du ett gäng filer, länka dig ihop dem, och programmet börjar exekvera på denna sak kallad int main. I Python, skriver du en fil du, köra filen programmet startar verkställande vid toppen av filen. Så det kommer att starta vid toppen av filen gå ner tills den hittar något annat. Om den hittar en funktionsdefinition, Det kommer faktiskt inte köra denna kod, Det kommer helt enkelt definiera funktionen. Men här, när den första Programmet är n lika 10, det första att detta program kommer att göra är att ta detta värde av 10 och ställ in den i en variabel som heter n. På tal om den linjen, en av andra saker-- sorry-- detta innebär att C-program, du ska skriva dem, du kommer att göra dem, som kommer anropa vissa klang kommandon, och sedan kommer du köra en erhållna körbar. Python program du kör text file-- denna mario.py kanske vara den här filen som jag bara visade du-- du ska köra filen och du kommer att köra, och innehållet i det kommer att utföras av Python tolken. Du kan göra detta i din IDE. Så om jag har en Hello fil, som helt enkelt har detta innehåll. Detta är faktiskt Python 2, inte Python 3, så gör inte oroa syntaxen för nu. Men jag ska köra Python, på hello.py, och det går. Ett annat sätt som jag kan använda Python som Jag kommer inte att ta itu med så mycket i denna diskussion, är om jag skriver bara Python, det droppar mig i en miljö där Jag kan mata den Python rad för rad. Så här, om jag skriver in print utrymme "Hej, världen". Typ anger. Det kommer att spotta mig att backa resultaten att enskilda linje omedelbart. Detta är kan vara användbart. I detta prat ska jag göra saker på bilderna. Och så kommer du att kunna följa längs antingen här eller genom att skriva faktiska filer och sedan utföra dem. Men gå tillbaka till denna kod, en annan sak som du kan ha noticed-- väl, det finns två saker som du kan märker om dessa block. Den första, något mer vardagliga, är att Python har ingen avslutande semikolon. Semikolon är valfria överallt och ofarlig allt. Du kan lägga till dem. Det kan göra människor som skriver Python för en levande snicker på dig bakom ryggen, eftersom de är inte nödvändigt. De är ofta ett tecken på att hållas över från C. Formgivarna av språket anser att det är mer tydligt på detta sätt och att det inte är nödvändigt att förklara varje gång du avslutar en linje. En annan konstig sak om detta n är det inte har en typ bifogas. En av de magiska bitar av Python-- och jag kommer att kalla det magi, men det finns mycket tekniska skäl varför det works-- en av magiska bitar av Python är att variabler kan expandera eller krympa för att innehålla de data typer som du vill ha dem till. Så det här är en 10. Vid senare ner jag tilldelats denna n 0,5, skulle det ta att 0,5. Oavsett att det är en int här och flyta där, något som använder denna n kommer, mer eller mindre, att kunna tuff tillsammans om det blir någon av dem. Om det inte finns några mycket verklig Anledningen till att det inte kan använda data skriver att n har för närvarande, vid vilken punkt det får inklämd och kasta ett fel, och den sortens saker. Men här, Python inte riktigt bryr sig vad Det är att jag kommer att fastna i detta meningen, liksom, du vill ha den här saken? Denna sak i det? Ja, det är lite av en sak. Jag ska hålla det i slutändan. Det kommer att bli ett problem senare, om någon som vill använda detta syfte kan inte hantera det. Detta är en av de stora skillnader mellan Python och C som gör det enkelt att skriver mycket stora C-program och gör det lättare att skriva mycket liten Python program. Den för syntax är inte mycket annorlunda i vad den gör. Det är lite annorlunda i hur det uttrycks. Så detta är en mycket, vad som kallas Pythonic, sätt att skriva det. för rad i intervall (n), är detta nummerserie från 0 till n, inclusive på botten och exklusivt på toppen. Så det är från 0 till n-1, som är exakt vad C-kod gör, förutom att det är mycket enklare att titta på kanske. Den relevanta blocket är inte iväg med hängslen, i stället det kvitta genom denna inbuktning. Så alla dessa linjer är fyra platser över till höger, eller liknande om en elefant bredd. Och de är de som är kommer att utföras i detta för. Om jag röra upp indrag på det här och jag driva att trycket tillbaka till den ursprungliga indrag, att trycket kommer att lämna för slingan. I motsats till C, där här jag faktiskt måste flytta den slutna stag runt. Detta innebär att du inte får fel som hoppar på dig eftersom du sätta ett stag på fel ställe. Det betyder inte att du får fel som hoppar på dig eftersom du indragna en rad fel. Så det gör fördjupningar super försiktig. Förhoppningsvis du var super Var försiktig med din indrag ändå, och så detta är inte det mycket mer av en börda. Men en grundregel för Python, och vi kommer att ha ett par av dessa att vi ska gå igenom genom Under samtalet, är prova naturlig syntax innan du tittar något upp. Så här syntax, för detta antal inom räckhåll, är mycket speciell när det gäller stil. Massor av saker i Python vi får se att detta formulär. Och så om du kommer upp med ett nytt objekt som du tror att du ska kunna iterera över detta, i det här formatet, visar sig det förmodligen stödjer det formatet. Vi kommer inte att gå super djupt i de tekniska skälen till att det är sant. Men det är en bra intuition för att ha när du närmar Python program, att denna sak bara kommer att fungera. Försök. Starta upp kommandoraden Tolk, se om det fungerar, gå vidare med saker, innan du ens behöver öppna upp Google och säga, vad är syntaxen för denna sak? Massor av Python du kan upptäcka bara genom att försöka. Detta om är ännu mer lika C då fors är. Observera att det inte finns några parenteser. Parentes är, återigen, ofarliga men onödigt. Det finns en kolon vid slutet precis som för loopar, och återigen, de relativa blocken är indragen snarare än kvittning av hängslen. Denna annat är på den ursprungliga nivå indrag, och dess relevanta blocket indragen igen. De arbete precis som de gör i C. Detta är faktiskt mycket lika. Återigen, förlorar tryck ett tecken off printf Du passerar några strängar. Det visar sig strängar kan antingen märkas ut med enkla citattecken eller dubbla citattecken. Det är ingen skillnad, med undantag av att insidan av enkla citattecken kan du använda dubbla citattecken med överge, stället för att behöva fly dem alla. Och inne i citationstecken, du kan använda apostrof med överge utan att behöva fly dem. Om du vill blanda dem, kan du säkert leta upp på nätet hur man gör det. Du kommer att märka att här borta, Jag har klarat i slutet = denna sak. Detta är ett exempel på en valfri argument, som är en av dessa saker att Python stödjer att gör det ganska användbart. Så trycket har faktiskt en hel del argument, som vanligtvis inställd till standard värde, men här har jag bestämde sig för att åsidosätta en kallas änden. Anledningen till att jag måste åsidosätta den med en tom sträng är att trycket i Python, med standard skriver ut en ny linje efter det som du sa det också. Så här hash faktiskt kommer att skriva ut en kontrollsumma i en ny rad. Och om jag inte vill hash att skriva ut en ny rad efter det, då måste jag säga inte ut en. Men ändå så, det sista som det här programmet saknas att man har är en åtmin toppen. Skriv bakas in i Python så i grunden att det finns ingen rubrik eller modul att du måste inkluderar, men om så önskas att inkludera annat i ett Python-skript, Jag skulle göra det på ett mycket liknande format-- orden är bara lite annorlunda. Jag nämnde att vi behöver inte en huvud här, eftersom Python startar exekverar på toppen. Om jag ville att linda detta i en funktion, jag skulle göra det som this-- jag skulle säga def funktionsnamn, argument kan gå in här och vi ska se några av de senare, kolon, och sedan igen, denna hela iväg blocket är det som är det operativa blockera för denna funktion. Så detta är definitionen av funktionen. Och det finns en förklaring, sedan ner här, jag kan bara ringa funktionen. Och återigen, programmet tolk, med början i toppen, kommer att se detta är definitionen. Det kommer inte att köra tills det komma hit, och då är det som, oh nu har du kallade det, jag antar att jag borde köra det. En sak som är mycket vanligt att se i Python-filer, speciellt Python filer som släpps till allmänheten och utvecklas by-- och utvecklas och bibehålls, är något av detta formulär. Detta basically-- så på grund Python, börjar du på toppen och sedan köra ner till botten, Jag om jag hade bara Mario ropade här, då helst jag ingår filen i en annan fil, eftersom jag ville använda är Mario funktion, den andra filen skulle har också denna uppmaning till Mario i den. Och när jag körde filen, det skulle kalla Mario. Så det är möjligt att jag bara vill köra om jag har faktiskt avrättades just denna fil. Och så jag kan svepa detta i en Idiom så här, där jag säger, Om namnet på denna avrättning miljö är huvud, då jag vill göra dessa saker. Annars någon annan kan use-- inkluderar min function-- min fil, och bara för att få tillgång till dessa funktioner utan att behöva köra saker att jag vill köra i den här filen. Detta är, återigen, valfritt men mycket vanliga. Dessa saker är entirely-- finns exakt samma mellan C och Python, förvisso i 3. Jag tror att 2 divisionen operatören ibland ger dig tillbaka flyter när du opererade Ints, och antingen du ville det eller du inte. Men plus, minus, och tider fungerar precis som du förväntar dig, utom över något fler typer. Så du kan multiplicera flyter genom Ints, och de möjliga saker. set fungerar exakt samma. Du kan använda två likhetstecken. inequals-- större än mindre än dessa typer av saker-- har de betydelser som du är bekant med dem. Där C använder dessa operatörer, Python använder något mer engelska läsbara ettor. Så i stället för två, et-tecken, du bokstavligen skriva ordet "och", "eller" eller inte." Precis som i din if-- i villkorssatser, Vi såg tidigare att denna syntax i C motsvarar denna syntax i Python. Och det finns inte mycket annorlunda där, med undantag för en liten bit av skiljetecken runt sidorna. Återigen, där C skulle annars om, använder Python elif, men dessa är oftast förändringar ytnivå. Iteration som detta är ofta skrivit i denna idiom i Python. Du kan tillverka denna typ av sak med en while-slinga på utsidan om du ville, men du sannerligen inte behöver. Och återigen, om du ville skriva ut element i en array du kan göra det här sättet. En av de roliga saker om Python men, är att du inte behöver att använda detta paradigm, och du kan använda en något mer elegant en. Du säger en i ställig. Så snarare än att gå här och kör över indexen, och sedan dra ut enskilda element, du berätta för att faktiskt bara köra över elementen själva. Och sedan vad du gör insidan kan fungera direkt på elementen, vilket är ganska kul. Och vi kommer see-- vi använder att idiom igen och igen när vi går igenom koden. Detta är återigen ett exempel av något som jag ska Ring Python magi, men det finns mycket tekniska skäl till varför det fungerar. Och det finns tekniska saker som måste vara sant om rad för för att det ska fungera bakom kulisserna. Saken är den att de flesta typer som du kan förvänta dig att detta ska fungera har haft denna genomfört för du i den inbyggda språk. En annan sak som det skulle vara trevligt Om detta fungerat på alla språk, men det finns några skäl till varför det inte kan, Skriv ut den här sträng gånger detta nummer. Det visade sig i Python, gör detta exakt vad du vill, vilket är bara roligt, och innebär att vi kan faktiskt minska detta program igen mario.c. I stället för iteration en hel del, vi kan bara säga, jag vill visst antal platser, Jag vill att antalet hashes, och några hashar i slutet. Och återigen, vi använder detta format. Här, vi passerar en variabel detta sätt. Återigen, behöver vi inte säga vilken typ av variabel är det, och den enda gången vi ska få fel är vid körning. När någon försöker att passera något i, det ska träda i funktion alldeles utmärkt. Om vi ​​kil här eftersom detta inte är sak som du kan skapa intervall över, Jag får en runtime error där, och jag måste felsöka det så. Men under tiden, jag har inte att vara mycket försiktiga med vad blir vidare i, så länge som i själva utförande allt fungerar mycket snyggt. Jag kan även göra detta lite renare användning av en speciell inbyggd funktion på strängar, vilket är rätt motivera. Detta är bara en användbar funktion ligger runt biblioteket. Det är i dokumentationen om du gå och leta efter den. Och jag säger, och jag kommer att ha denna sträng, ett visst antal hashes, och jag skulle vilja höger motivera det-- pad ut med mellanslag för att vara denna längd. Återigen, detta i dokumentation, vilket ger oss-- Jag ska faktiskt klickar igenom these-- vilket leder oss till vår andra regeln för Python-- standardbibliotek funktionsmetoder är dina vänner. Och det är ofta värt mödan att gå söker jag undrar om det finns en sak som bara gör detta. Det antagligen. Om du vill pad en sträng, om du skulle vilja ta tillbaka hälften av en sträng, om du skulle vill söka igenom en sträng, om du vill att krossa ett par saker tillsammans med en sträng med komma mellan dem, Det finns standardbibliotek funktioner för att göra detta. Och det gör ditt liv lättare om du använder dem i stället för att rulla ut allt på egen hand i fem rader kod här, fem rader kod här. Det är verkligen börjar lägga till upp till realtid. En av de intressanta saker om hur detta blir kallade. Du kommer att märka att det finns en punkt sak. Jag har något föremål till vänster, och sedan ringde jag en prick en funktion. Detta är en av de paradigmer som Python använder för att fästa metoder till objekt. Vi pratar om vad detta är mycket kortfattat i slutet, men vet att vi båda kan verka på saker genom att ta den där saken säger dot vad som helst, eller genom att ringa en funktion som tar objektet och några andra argument. Så dessa är båda sätt som saker blir gjorda i Python. Och om en viss funktionalitet implementeras i denna stil eller här stil är något som du bör se upp tills du får en introduktion för vilken det är sannolikt att falla i. Det finns en mer eller mindre sammanhängande filosofin bakom Python att du absorberar mestadels genom att skriva en hel del i det. Vid något tillfälle, som en av dessa något kommer att genomföras som blir naturligt. För nu, det är bara något du lär dig när du räkna ut varje enskild sak. Så standardbibliotek funktioner är dina vänner, och de låter dig skriva saker som ta upp så mycket utrymme verkligen kort, verkligen elegant. Och det är faktiskt förmodligen mer läsbar, skulle jag säga, än C-programmet där borta. För att inte nämna det faktum att är så kort kan du passa en hel elefant i det utrymme som vi har sparat. En annan sak, är detta en implementering Mario som är dot C, som jag tror är den kortaste du kan få det. Det har inte get int, men det hårda koder värdet 10 på samma sätt som här gör. Det visade sig att detta klockor i åtmin 84 tecken, medan Python är 64. Och det är oändligt mycket mer läsbar än detta skräp här. Så Python är mer effektiv i rymden. Det är något mindre effektiv i tid, men inte mycket. Listor är en viktig sak i Python. Vi har inte sett dem, men de fungerar ungefär som matriser göra i C. Så här kan du deklarera dem, du kan skicka dem till en sak. Nu torg har en matris av dessa saker. Återigen har vi inte deklareras som typ, men om vi någonsin försöker använda det, något som du förväntar dig att arbeta på en rad av heltal kommer att arbeta med en array av heltal. Detta är en sak som du absolut inte kan do i C, eftersom minne det är så händer på, men är mycket lätt att göra i Python. Om jag vill att min array att vara större, jag kan bifoga ett element till det och det är bra. Vad händer bakom kulisserna? Tolken kommer att gå ut och få lite minne, och kanske det får en lite extra minne, så jag inte så jag inte har att realloc varje gång. Men hur mycket mer minne behöver det? Detta är inte beslut att du måste göra, dessa är beslut som de tolk kommer att göra. Här ser vi intervallet kan ta två argument, men det kommer fortfarande att vara inkluderande av toppen så vi lägger en där. Detta är ett idiom, vilket är en ännu mer smart sätt att skriva sånt här. Det kallas lista förståelse, och här vad vi säger är Jag skulle vilja sätta in i kvadrat för varje värde på i i detta intervall. Denna sak till höger kan vara en annan array, och denna sak på vänster finnas någon särskild funktion som skulle ta i som en variabel och ge mig ut några resultat. Vad jag ska göra är att, Jag kommer att bygga en array som är alla dessa saker för varje värde i detta intervall. Och det är super elegant, super kort, och det är mycket tydligt vad det innebär. Detta är en av de saker-- detta är återigen, en of-- mycket symboliska av anledningarna till att människor som Python. Om du gillar programmering så här, då Python är ett språk som du kanske gillar att lära sig. Och återigen, det finns teknisk orsaker till varför detta fungerar. Men så långt vi är berörda, vi mer eller mindre inte bryr sig. Så om du vill skriva ut listor, några av samma idiom är användbara. För jag i detta område, vi kunde index igenom alla de saker och sedan skriva ut dem alla ut. Och du ser len här. Om du någonsin velat få längden av arrayen, det är mycket lätt i Python, det är mycket svårt i C. Detta skulle skriva ut exakt vad du förväntar dig. Vi kunde också, som vi har sett förut, iterera över elementen i arrayen direkt, och sedan bara prata om dem, snarare än att ha index tillbaka in i arrayen varje gång. Och detta är en sak som du kan göra. Så i C, om du ber om något så här, skulle trycket säga, det är en array av heltal. Det är definitivt inte en sträng, jag kan inte skriva ut det. Python mer eller mindre inte bryr sig. Det är som, finns det något sätt som jag kunde vända detta till en sträng? Ja, jag ska göra det. Och så jag ska bara skriva ut det. Detta innebär att du kan göra saker like-- dessa är de flesta av de hårda delar spel femton skrivna mycket kortfattat i Python. Du ser att det finns lite of-- här Jag har kastade ett heltal till en sträng, och jag måste göra det manuellt. Och jag kommer att lägga den till en annan sträng, eller på annat sätt Python blir förvirrad. Men om när du är lägga till en sträng till ett heltal, jag antar att få en heltal tillbaka eller en sträng tillbaka? Men återigen, om du bara Ring str på en sak, och det kunde i alla möjliga världen omvandlas till en sträng, Det kommer förmodligen att vara omvandlas till en sträng. Här ser vi användning av kapslad lista förståelse till vänster, en del indexering, som är precis som du skulle kunna användas för att det, och några utskrift av saker. Återigen har vi definierat några funktioner och vi ska kalla ner dem i huvud när vi faktiskt få filen. avkastning fungerar precis som du skulle förvänta sig att arbeta med C. Hitta, vi kan ställa in saker som this-- här är listan förståelse det finns ett uppdrag till en variabel, och vi kan faktiskt göra det ännu enklare. Vi behöver inte skriva sökningen eftersom inbyggt i språket är om det här är i denna uppsättning. Return true, annars returnera false. Så det är helheten av fyndet. Helheten av typ innebär att ringa sortera, vilket är-- det finns implementeringar av detta inbyggt i vissa bibliotek C. Om du vill att detta sorts bakåt, du kan åsidosätta detta tillval argument i omvänd med en sann. Och om du vill sortera över strängar, som är inbyggd i såväl. Så detta är inte att säga det är saker som du behöver för att göra varje dag, men tanken är att detta är filosofin av Python, att alla dessa saker som du skulle sorts vill göra är inbyggda. Och de flesta standardfunktioner, så sortera, längd, vad som helst, stöder mest logiskt förnuftig ingång. Du ringer len på en array samma hur du kallar len på ett snöre. Du multiply-- du sortera strängar på samma sätt som du sortera matriser. De flesta standardfunktioner att människor bygger, och mest tredje part bibliotek som människor bygga, eftersom de är efterlikna utformningen av standardbibliotek, kan kallas på allt som du Liksom, varför inte detta bara fungerar, i C. Mer eller mindre, det kommer att fungera i Python eftersom människor arbetar bakom figur reda på vad en sak är och sedan arbeta lämpligt på den. Så återigen, teknisk bakgrund, men det gör våra liv enklare som programmerare. Så här är fil-I / O. fil I / O har massor av lite saker som gör det komplicerat, och så finns det resurser på nätet, men i ett nötskal, du ringer öppna på en fil namnge med en viss typ. Så det är läs, läs och skriva, skriva eller lägga. Du läser ett visst antal tecken och du skriver ut dem, får du Hello! Jag menar, som den här filen hade Hello! I den ringa för att läsa, och vad du får tillbaka är en sträng som har all av resten av arrayen, eller alla resten av filen. Om du ringer läsa igen, du är i slutet av filen, och så att du inte får något och så att du ska stänga. Återigen, detta .close snarare än nära fil, som det skulle vara i C. Detta är mer eller mindre eftersom f är en sak, och du skulle vilja att f att stänga. Men grundläggande fil-I / O är inte särskilt komplicerat. Återigen, om du vill öppna en fil, om du skulle vilja läsa en viss linje, du kan få ut särskilt line-- det inbyggda ins för det. Om du vill skriva en sak, kan du skriva det här. Om du vill skriva ut enskilda biter, kan du skriva dem. Och om du vill iterera över raderna i en fil individuellt, som vi gjorde i ett stycke från för några veckor sedan, kan du göra det till. Återigen, de flesta objekt som du skulle vilja kunna att iterera över stöd iteration över dem. I Pythons är en fil kanske en sak som Jag skulle vilja att iterera över rad för rad. Om det var en ordbok ord och jag var försöka få dem enskild ord ut, då, i denna slinga, linje den kommer att bli varje ord i taget och detta kommer att utföras för varje rad i filen till slutet av filen. Och återigen, om jag skrivs ut varje linjen, linjerna kommer med nya linjer, så jag ställa in slutet tillbaka till något sådant. Då skulle jag få innehållet i min fil. Den andra saken som verkar i några sätt som listor och på vissa sätt som något väsentligt kraftfullare, är ordböcker, som egentligen coolt att använda men är i princip hash tabeller i förklädnad. Du skapar en användning av exakt två tecken, som är fantastisk om du försökte genomföra hash bord för ditt problem set, du vet mycket smärta som kan vara. Men folk har gjort den, och gjort det så bra, att du inte behöver oroa sig för det längre. Då kan du infoga enskilda saker. Hash tables-- eller ordböcker inte särskilt bry sig om vad du lagrar i dem. Så om vissa poster är siffror, och vissa poster är listor, Om vissa poster finns andra ordböcker, och vissa poster är strängar, Python inte mycket vård. Återigen, om du går in i det förväntar en sträng och vad du får tillbaka är en array, det är ditt problem. Och kanske är det fel av den som Tyckte det var att sätta saker i ordlistan, kanske det var du. Om det var någon annat, förhoppningsvis de var väluppfostrade om vad gick i ordboken och inte lämna några fallgropar för dig att falla i. Men de standardfunktioner kommer ge dig tillbaka väluppfostrade saker. Så de säger denna avkastning backa en ordbok av strängar, då allt du kommer att komma ur är en sträng. Om du gör en del av detta och det resor dig, ja, det kan vara på dig. Python verkligen ger dig tillräckligt rep för att hänga dig själv, om du vill. Nu kan vi skriva ut enskilda delar av detta och denna avkastning exakt vad du kan förvänta dig. Exakt vad du kan förvänta dig, antar jag, är en fras som jag använder en hel del, men det är mer eller mindre hur Python fungerar. Om du ber om en sak som inte är det kommer Python kasta ut ett fel och det kommer att sluta dig ur oavsett program du var i. Det kommer faktiskt skriva ut mer information än så, det ska peka du-- Det kommer lägga till en rad, och så. Och, återigen, kanske vi vill att iterera över ordböcker och hitta alla saker i det. Här är vi iteration över två saker på samma gång. Och så vi kommer att göra det med en nyckel, värde, men sedan skriva ut alla dessa. Och om vi ville cast-- om vi faktiskt körde här, Vi skulle ha några problem eftersom on-- när vi gick in med David, Det kunde inte add-- om vi inte kasta den till en sträng först, Vi kunde inte tillägga att array strängar på en sträng. Men om vi kasta den till en sträng, vi får något så här, vilket är kanske vad vi skulle vilja läsa. Och detta är speller. Vi har just läst i saker. Så vi kan läsa in enskilda ord som linjer. Vi hugga av den sista sak, så kolon minus 1 chomps av det sista som we-- det sista tecknet i en sträng. Vi ska säga. OK, var och en av dessa blir införd i denna ordbok, mappningen till ett värde på ett. Vi gör inte särskilt bryr sig om att man, men det är bara det att säga, jaha, denna sak jag ska sätta i ordboken. Eftersom senare vad vi är kommer att göra är att vi är kommer att säga, ja, om det är i ordboken alls. Återigen, denna kontroll för medlemskapet är upp rörelse med användning av en helt annan algoritm än det kommer i en lista, men vi kallar det på samma sätt, vilket är en del av denna Python sockerbeläggning saker så att de blir lättare att använda. Och återigen, har vi sett saker som det här förut. Detta är i grunden finna, eller Det är exakt samma syntax som hittar, men arbetar över en helt annan struktur. Och vi inte särskilt vård. Så de är de saker som du ombads att genomföra för speller. Med denna takt kommer vi att få mer eller mindre alla psets gjort. PUBLIK: Så att i princip bara kommer tillbaka som felstavat om det inte matchar något i ordboken? ROSS RHEINGANS-YOO: Ja, ja. Och så är det en anpassning av en problembild som ber dig att göra just detta. PUBLIK: Varför är linjen minus 1 där? ROSS RHEINGANS-YOO: Så när du iteration över en fil ber om av linjer, linjerna komma med en ny rad tecken vid slutet av det-- minus 1 är bara att handla dem utanför. Och detta är ett särskilt flexibel sätt att indexera in i saker. Så om du har en sträng, och du vill, och jag kommer att starta vid tecken tre och jag kommer att gå till slutet. 3 kolon kommer att göra det åt dig. Om du är som jag vill börja på början och gå till sista minus ett tecken, kolon minus ett. Och om du ville gå från den tredje till minus först, då du skulle säga 3 minus 1. Dessutom, om du vill indexera in i saker som räknar från baksidan, du bara index i med minusnummer. Och eftersom, där C skulle explodera eller kanske foder du andra minne du inte har tillgång till, hör du kan säga minus 1 betyder det sista men 1 tecken i en sträng. Moduler är version-- är analoger till bibliotek i C och är användbara för en hel del saker. En hel del saker du skulle tycker om att göra i Python, förutom enkel manipulation av variabler, du vill ansluta till större bibliotek med större gränssnitt och mer kapacitet för att interagera med andra delar av världen. sys är en av dem med ett gäng verktyg som är användbara för att interagera med själva systemet och kommer att importera det som import sys. Det finns mer dokumentation från att, som du kan gå här, eller om du kunde hitta på Google genom googling Python sys. Du skriver in anger. Den första länken kommer att bli dokumentationen i Python 2, den andra länken kommer att vara dokumentationen Python 3. Och om vi skrev ut en fil som såg som this-- Om i synnerhet vi är tittar på drift på kommandoradsargumenten, som vi lärt oss att göra mycket tidigt i den här klassen. Detta är inte svårt. Du kan få ut argv, vilket är en av dessa saker som genomförs av sys. Det är inte inbyggt i den bas paket, men återigen, du kan förlänga den genom att importera den funktionaliteten från sys. Du ringer det sys. vad som helst. Här finns argv. Det finns faktiskt ingen argc i sys, eftersom du kan få det så lätt genom att ringa len. Vi skrivs sedan ut det, kommer vi sprang på vår terminal echo-args.py. Vi får tillbaka en matris, som Detta första argumentet. Återigen, detta argv 0, som är den namn på det som blev synad. Om vi ​​kallade det med ytterligare argument, skulle vi få dem ryggen. Detta är ett sätt att få kommandoradsargument. Om du vill flaggor där du slår särskilda saker på eller överstyrning en viss standard, argparse är din vän. Och återigen hittar du att online på python argparse på Google. Det finns ett par verktyg moduler som du befinner dig med hjälp av och återigen, om du tillbringar helst av detta språk importerar jsons för att läsa in och ut ur json filer, inte så komplicerat. Du öppnar en fil som heter du json.load på filen och du får tillbaka en sak. Vad är det? Det är en json objekt. Om denna json har array, Python har matriser. Om denna json har associativa arrayer, Pythons ordböcker, strängar, och nummer, och så vidare. Du vill dumpa det ut, du öppnar en ny fil, du kallar dumpa, och laster och tippar att gå in och ut ur strängar. På liknande sätt blir pickle kallas i grund och botten samma gränssnitt. Det är något mer användbart om du dumpning Python-objekt. Så om du någonsin velat spara en version av den aktuella statusen av en variabel för en framtid kör på ditt program, pickle är Pythons bibliotek för att göra detta. Om du har någon form av variabel som kan skrivas ut Gillar ord och tecken och bytes-- som denna ordbok, vi kunde skriva ner, vi kunde skriva ner det som som en json objekt, som var bokstavligen dessa tecken. Och då skulle det vara mycket enkelt för en människa för att öppna den up-- öppna upp och läsa den. Om vi ​​inte särskilt bryr sig om människor läser det, vi kunde paketera ännu effektivare till former som senare skulle packas upp eller som kunde senare blåsas. Och detta sparar 80% av det utrymme att dina objekt kanske ta om du skrev ut dem long. Du kallar pickle mycket samma way-- dumpa, last, och då får du tillbaka dina saker. Så om du skriver mycket korta Python program som vill spara tillstånd, och sedan läsa dem tillbaka senare, sånt här är dina vänner. Att du kunde mycket enkelt dumpa dem som json. Mest Python objekt kan dumpa ut json om det finns något hopp om att strukturellt de kan representeras på det sättet. Dessa är bara toppen av isberg på moduler som är användbara. Så sys, os, multi, är sorts grundläggande arbetshästar för saker vi måste interagera med filsystemet os., liknande os.isfile, os.isdirectory, os.makefile, dessa är dina vänner. Om du vill interagera med en viss filtyp, json, knipa, csv. Om du vill interagera med webben sidor, den urllib för att få http sidor. bs4-- BeautifulSoup-- det är en underbar parser för html. Du kör det på en html och du få detta underliggande array objekt nu, där du kan färdas över lookin, med liknande bara letar efter om, är i, vilket är fantastiskt. Det finns ett gäng paket för running-- för att göra särskilt Mathy saker. Så om du vill att multiplicera, invertera, omvandla matriser, numpy används av människor alla över hela världen för det. SciPy är ännu mer användbar verktyg i den riktningen. sklearn-- maskininlärning, naturliga språk, super bra grejer, blir genomförts i Python hela tiden. Och återigen, tar lite längre write-- ledsen, tar lite längre tid att köra, men anledningen till att verkliga ingenjörer tenderar Användningen Python är att du tenderar att vara blockerat på dig skriva koden, snarare än din dator som kör koden. Så om du ska skriva en program, som massor av andra människor kommer att använda evigt, som Linux, du kan skriva det i C. Om du var kommer att skriva en beräkningsmotor, du kanske skriva Python om du behöver att ändra det varje par månader. Vissa människor skulle skriva det i C eftersom de är så. Så vi har sett import sys som ett sätt att få saker och ting att få modul i ditt program. Du kan också importera den som ett smeknamn, om du vill. Återigen multi är en smärta att Skriv ut varje gång, så importerar som mp och sedan när du använda den i programmet, du ska säga mp.process, eller vad har du. Om du vill importera bara en enda sak, så urllib har något som heter förfrågan, så du kan bara importera den. Senare kommer du inte åberopa det som urllib.request, men precis som begäran av sig själv. Och du kan importera allt från en modul om du vill. Detta är ibland inte ett bra idea-- detta oftast inte en bra idé, faktiskt. Eftersom du very-- eftersom om något i denna modul har ett namn som du ville använda någon annanstans i programmet, kan du inte. Och det är inte alltid självklart att så är fallet. För att se till att vad du gjorde var säker, du behöver för att öppna upp modulen och se alla av de namn som hamnar i there-- alla funktionerna, alla variabler som lever i denna modul, eftersom du föra alla dem till din lokala namnutrymme. Så människor gör detta. Det är allmänt rekommenderas att du inte gör det. Men människor gör detta allt tiden eftersom de är lat och inte vill skriva ut mp. någonting, någonsin. Allt detta prat om moduler ta mig runt till ett kort föredrag om hur du utformar program i Python. Det första steget är att kontrollera om någon annan redan har gjort saken, eller gjort 90% av saken. Chanserna är de antagligen, och du ska gå och hämta sin grej och kör den. Eller skriva ett omslag runt den att anpassa den till ditt syfte. Det är först efter det har misslyckades att du skulle sedan gå på och write-- börja tänka på hur du skulle sätta denna sak tillsammans. Det finns massor av saker ute, och att en av de mest användbara saker om Python. Liksom språket är elegant, språket är enkel att använda, men också därför att det är så elegant och lätt att använda, människor har använt det för en lång tid och det finns massor av saker där ute som du kan utnyttja för eget bruk. Så förra regeln om Python är, någon annan har redan förmodligen skrivit en modul för att, någon annan har redan förmodligen skrivit ett bibliotek för det. Innan du försöker att göra en sak, se för att se om det har genomförts. Det är inte så svårt. Alla moduler som jag sätter upp före, med kanske ett undantag, komma förinstallerade i varje standard Python installation. Och det med ett samtal till importera vad du har allt detta funktioner till hands. Börjar avsluta detta talk, finns det några saker att jag har kvar som svarta lådor och liksom slätade över, och det finns några vita lögner som jag har berättade att för den skull ärlighet, Jag ska åtminstone punkt här, även om jag kommer inte gå super djupt in dem alla och deras tekniska förklaringar. En hel del av de saker att jag har ringt magi är vad andra människor skulle kalla objektorienterad programmering. Så det finns massor av saker-- så variabler är ofta inte enkla bitgrupper som sitter i, minne, men är mycket komplicerade objekt som har inre tillstånd om funktioner och mycket dolda variabler, massor av dold funktionalitet, vilket låter dig förvandla dem till strängar, som låter dig iterera över dem. Och om du writing-- och anledningen till att de har allt detta rik funktionalitet beror på att people-- arkitekterna bakom language-- har gått genom och för varje standard objekt, lägg i funktionaliteten att säga att detta är hur det är Hur detta kommer att fungera om någon vill iterera över det. Så allt att någon kanske möjligen vill iterera över, har logik skriven i manuellt på hur du är tänkt att iterera över objektet. Allt som du kan tänkas vilja dumpade i en sträng har logik skrivit. Detta är den funktion som du ringa om du vill dumpa ut det här till en sträng. Det är därför du kan ring len på saker, detta är därför du kan ringa i, är detta varför du kan ringa om i på allt att du skulle vilja, eftersom de alla bär med dem, teknisk know-how att göra det. Detta är något som jag är super kommer inte att gå in. Men för sak i listan är subtilt skiljer sig från C stil för loopar, och du kan läsa allt om det på Internet om du är intresserad. Det finns en mörk sida till alla av detta, som jag nämnde, så det finns två saker. Den första är att detta objektorienterat programmering tillför en hel del overhead slumpmässiga saker, så att du slutar med användning av en mycket mer minne; du sluta med en lite mer tid än du annars skulle. Den other-- men ju mer smygande mörk sida till denna är, om saker och ting bara agerar som du vill ha dem utan att du behöver tänka super hårt om huruvida detta bör vara en int eller om det bör finnas en flyta, kan det vara så att hit du producerar en int men hit dig tror men de kommer always-- ledsen, det kan vara att här du producerar en flottör men när du kommer till den andra delen av ditt program, du tänker, jaha, men de kommer alltid ge mig en int. Och om de inte gör det, är det möjligt att du inklämd någonstans, Om du försöker använda det till index i en matris, eller vad har du. Så en av de verkliga användbara saker om C är det tvingar dig att tänka verkligen hårt innan du gör any-- innan du tar någon variabel till existens, precis vad är den typ av denna variabel. Och det kommer att ha denna typ för all framtid. Det är inte sant Python, och i själva verket, du can-- om du bara slags gå på gehör, och du gör några beslut ett sätt på ett ställe, och vissa beslut en sätt på den andra platsen utan att tillräckligt med saker bakom scenerna i den andra platsen att fånga saker på rätt sätt, du kan få några mycket konstiga fel. Och programmet kan hålla igång under en mycket lång tid, eftersom det är gör en hel del arbete att säga, väl denna sak skulle kunna fungera på detta sätt, så jag kommer att köra på det sättet. Och faktiskt, det faktum att den pressar framåt genom en massa små fel betyder att, ofta när ett fel är faktiskt dåligt och du verkligen vill fixa det, det hamnar miles away-- programmet hamnar stoppa miles away från det att du fått ditt fel. Och så en sak som vi skulle vilja program för att göra, sometimes-- en sak att vi skulle vilja program att göra när vi felsökning är inte högt och inte mycket snabbt när något går fel. Python är mycket dålig på det. Python är mycket bra på att inte misslyckas och rulla framåt genom oväntade saker. Så det här är användbart när du skriver små program. När du får komplicerat buggar det ibland tar lång tid att locka fram dem. Så det finns en mörk sida till alla av detta, som det bara fungerar. Det fungerar precis som du förväntar dig. Förutom att när det inte gör det, slutar du upp i en helt annan plats och försöker räkna ut var det var att du gick fel. Sophämtning är-- så en sak som du kommer att märka är att någon av dessa saker som Jag har fört in existence-- dessa matriser, dessa ordböcker, dessa objekt, dessa files-- aldrig bli befriade. Det fanns inget samtal till gratis i något av detta prat. Och det var på C-sidan, eftersom vi fick aldrig in i dessa saker. Men i Python-sida, det finns inte en gratis. Saker och ting blir automatiskt frigjort när Python tror att du inte tittar på dem. Det är riktigt bra inte befria saker som du kan fortfarande möjligen titta på, men detta innebär att om du var kommer att fördela detta stor sak, och du är som, åh Jag är klar med det nu, Det är svårt att säga Python att du är klar med det nu. Du kan ibland ställa denna variabel som ingen, och sedan hoppas att så småningom skräpinsamlaren kommer igenom och rensar ut. Men återigen, gör du inte har kontroll över det. Och en av anledningarna till att människor använder C för riktigt performance kritiska saker, är denna förmåga att verkligen vet när minnet tilldelas och när det är frigjort, och har en hel del kontroll över säga, Jag använder inte mer minne än jag behöver. Vilket är något som Python är inte så bra på. PUBLIK: Kan jag ställa en fråga? Vad menade du med misslyckas högt? ROSS RHEINGANS-YOO: Så om något händer fel och du är i felsökning läge, skulle du ofta vill ditt program att berätta var exakt det har gått fel, och inte bara tyst sluta köra. Men du skulle faktiskt det att skriva ut ut alla typer av information om liknande, här var det. Denna sak hände Om du skriver ut en wen-- om du kör en webb server-- PUBLIK: [OHÖRBAR] ROSS RHEINGANS-YOO: Ja, om du kör en webbserver, det ibland illa om du är alltid kasta fel, och du säger, väl att inte fungerade. Jag kommer att sluta. Jag kommer bara att ignorera det och fortsätt vidare. För då kan du komma i hundratals av dessa fel och inte se dem. Det skulle säkert vara till nytta för felsökning Om varje gång din webbserver gjort en fel, du hade varaktiga uppgifter om det. Kanske du även vill att programmet att sluta, så att dessa poster inte får begravas under saker. Men återigen, det är i felsökningsläge. Ofta i produktionsläge, den värld är lite annorlunda. Och i små manus som jag kör, där det som jag sade att göra kanske bara en liten bit utanför från vad jag vill att det ska göra, då sorts driva igenom fel är något som du kanske vill. Och i sådana fall, säkert Python verkligen tjänar sina starter. Det sista som jag inte tala i this-- att jag inte tala om men kan bli riktigt upprörande först gång du har en av dessa fel, och den andra och tredje och fjärde gång du har en dessa fel. Python, nämnde jag att den använder blank att berätta vilken nivå av indrag och vilka funktionsblock du befinner dig i, den behandlar flikar och utrymmen på olika sätt. Så om flik du över fyra, och sedan nästa rad har fyra platser, även om de dyker upp som samma belopp i din redigerare, Python inte behandla dem på samma. I själva verket, Python behandlar flikar och utrymmen som olja och vatten. De är bara olika saker. Det finns ingen särskild längd som en flik är, så det är inte som en flik lika 8 utrymmen, och så att du skulle komma runt det på det sättet. Liksom, när det står, vad nivå blank jag är på, Det är faktiskt söker en mönster av mellanslag och tabbar. Och så är det bästa sättet att hantera detta är att alltid använda mellanslag hela tiden. Och faktiskt, i Cloud9 IDE och CS50 IDE, fliken nyckelinsatser fyra platser i stället av en flik, som är super bra. Men återigen, om du skrev en Python program med flikar som skulle vara bra, det är bara om någon gick in och försökte lägga till en enda rad i din program som hade fyra platser för varje flik, det skulle bryta. Och det skulle bryta på ett sätt det är verkligen inte syns. Även om själva felet meddelande att det kastar har att göra med nya indrag förväntas inte här, eller-- om det talar om indrag och det ser ut som det är fel, Det är antagligen på grund det finns en flik-space problem. De är fortfarande upprörande att felsöka. Den största helhet detta samtal, vilket jag gjorde inte få eftersom det är verkligen ett komplicerat, subtilt ämne, och inte var nödvändigt att göra något av de saker vi har gjort hittills, är ett koncept som kallas tupler. De är där ungefär som den arrayer som du inte kan ändra. De vänjer överallt eftersom de är användbara för massor av saker att arrayer inte är användbara för. Men om du vill göra en matris, och då lovar tolken som du kommer aldrig att vilja ändra detta thing-- i själva verket, om du vill ändra, du kommer att göra en ny med den nya värden i det-- de är tupler. Snarare än att producera dem med hakparenteser, du producerar dem med runda parenteser. Varför skulle du använda dessa saker, är en liten bit av en fråga. . Det enda som jag ska säga om det är att du kan använda tupler som indexen för ordböcker. Du kan inte använda arrayer som indexen för ordböcker. Och varför är, återigen, tekniska och Jag tänker inte köra in i den. Den pset som jag inte har berört på i detta tal är pset6. Så här är hur du? D genomföra en-- här är hur du skulle genomföra pset6 i Python. Med tanke på Python produktutvecklingen, den första att du gör när du är skriva program är check för att se om någon redan har gjort det. I själva verket, om du vill att serve-- Apache 50 gör ungefär denna, förutom att det inte kommer standard installeras på Linux-maskiner. Python gör, och Python enkla http-server gör också. Om du någonsin på en Linux-maskin, eller Cloud9 IDE utanför CS50 och du vill tjäna denna ström katalog till en viss hamn, python-m SimpleHTTPServer port serverar det. Du kan också importera den enkla http-server och det har fått en hel del funktionalitet om du vill anpassa det eller ändra det, eller drivs det-- utnyttja det till köra dina egna servertjänster. Så det är Python i ett nötskal. Och detta har varit CS50. Tack.