00:00Denna video kommer att handla om den nya funktionen positional-only arguments. Jag låter dig börja med ett exempel. Jag vill börja den här videon med att prata om en inbyggd funktion som heter float()
.
00:09float()
kan användas för att konvertera textsträngar eller siffror till float
-objekt, så här. Om du visar help()
-funktionen på den inbyggda funktionen float
, om du tittar på signaturen för float
här, kommer du att märka att det finns ett snedstreck (/
) efter parametern. Vad betyder det? Jo, det visar sig att det finns en parameter för float()
och den heter x
, och du får inte använda namnet på parametern när du anropar den. När du använder float()
får du ange argument endast genom position, inte genom ett nyckelord. Låt mig visa dig vad jag menar. Så återigen, lägg märke till snedstrecket (/
) här. Tryck q
för att komma ut ur help()
. Så om du försöker float()
igen och säger x="3.8"
– en textsträng – ser du här att det står float() takes no keyword arguments
, bara detta positionsargument.
00:53Du kan inte använda ett nyckelord när du anger argumentet. Före Python 3.8 fanns det inget enkelt sätt att ange att argument endast ska vara positionella i dina egna funktioner. Så om du skulle definiera något som den här funktionen – vi kallar den incr()
(increment).
01:10När du anropar incr()
, och låt oss säga att du ger den en float, kan du använda vilken metod som helst, och det är normalt för ett vanligt argument. Och det är där förändringen kommer in i Python 3.8.
01:24Du kan skriva om increment incr()
-funktionen så att den endast accepterar positionella argument. Den skulle se ut ungefär så här, med ett kommatecken (,
) och sedan ett snedstreck (/
), och resten är detsamma.
01:40Så när du anropar incr()
fungerar det bra. Men om du nu skulle använda nyckelordet händer något nytt. Det står här incr() got some positional-only arguments passed as keyword arguments
.
01:55Så det kommer att ge upphov till ett undantag och ge dig en TypeError
. Du kan använda detta nästan som en skiljelinje mellan dina positionella argument och vanliga argument. Låt mig låta dig prova det med ett annat exempel.
02:07Definiera en ny funktion som heter greet()
. greet()
kommer att ta ett name
som ett positionellt argument, sedan kommer du att lägga in snedstrecket (/
) där så att du kan kombinera positionella argument med vanliga argument. Så här är ett reguljärt argument med ett greeting
.
02:23Här kommer du att returnera en f-sträng med greeting
. Om du inte har arbetat med f-strängar än, kommer jag att inkludera en länk i texten nedan till artiklar och kurser om det.
02:31Komma, mellanslag, name
. Så när du kallar greet()
– återigen, standard greeting
kommer att vara "Hello"
.
02:37Du ska skriva in name
här som en positional-only.
02:43Snyggt. Du kan också kalla greet()
02:49och ge den en greeting
.
02:55Men vad du inte kan göra – eller vad som kommer att ge dig ett fel – är om du skriver name
,
03:08här kommer du att få ett undantag av en TypeError
. Precis som i det föregående för incr()
fick greet()
några positionella argument som endast skickas som nyckelordsargument, särskilt name
. Vid första anblicken kan positionella argument verka lite begränsande och i strid med Pythons mantra om vikten av läsbarhet.
03:26Du kommer förmodligen att upptäcka att det inte finns så många tillfällen där positionella argument förbättrar din kod. Under rätt omständigheter kan det dock ge dig en viss flexibilitet när du utformar funktioner.
03:35För det första är positionella argument vettiga när du har argument som har en naturlig ordning men som är svåra att ge bra beskrivande namn till. En annan fördel med att använda positionella argument är att du lättare kan refaktorisera dina funktioner – i synnerhet kan du ändra namnet på dina parametrar utan att oroa dig för att annan kod är beroende av dessa namn.
03:57För att upprepa denna information, hur specificerar du positionella argument? Du använder snedstrecket (/
) för att ange att argument före snedstrecket måste specificeras genom position. Om du vill veta mer om slash-notationen kan du läsa mer om den i PEP 457 som innehåller en ingående diskussion om den. PEP 570 dyker mycket djupare ner i Pythons positionella parametrar. Länkar till båda finns i texten under den här videon.
04:20Komplementet till argument med enbart positionella parametrar skulle vara argument med enbart nyckelord, och dessa är tillgängliga i alla versioner av Python 3. Du kan ange att du vill ha nyckelordsargument genom att använda en asterisk (*
).
04:31Alla argument efter *
måste anges med hjälp av ett nyckelord. Här är ett exempel som konverterar till Fahrenheit, och du kan se här att det har ett nyckelordsargument celsius
.
04:46 Låt mig låta dig prova den här funktionen. För att ange keyword-only sätter du in ett *
och sedan keywordargumentet efter – i det här fallet celsius
. Och i det här fallet, return
05:0232 + celsius * 9 / 5
. Så här, om du skulle anropa to_fahrenheit()
och bara ge den ett värde, säg 40
grader Celsius, står det här att den takes 0 positional arguments but 1 was given
.
05:16Så det krävdes att du hade ett nyckelord där för att kunna anropa den korrekt. Beroende på omständigheterna kanske du vill kombinera positionella argument, vanliga argument och nyckelordsargument. För att göra det anger du dem separerade med snedstreck (/
) och asterisk (*
).
05:35Så det skulle se ut ungefär så här. Här är en positional-only av text
, snedstrecket (/
). Här, standardargumentet.
05:46Och nu, efter border
, med hjälp av *
, nyckelordsargumentet width
, som har standardvärdet 50
.
05:54Du returnerar en f-sträng med ett mellanslag framför värdet för text
-argumentet och sedan ytterligare ett mellanslag. Sedan använder du textsträngmetoden för .center()
med två parametrar som du hämtar från dessa argument, width
och border
.
06:08Den enda som är positionell är text
. Du kan börja med headline()
och säga "Positional-only"
.
06:18Här kan du se standardvärdet som kommer att vara den typen av gräns med en width
av 50
, som ser ut ungefär så. Eftersom det bara är positionellt, om du skulle ge det text
,
06:35 skulle det ge upphov till ett fel, ett TypeError
. För border
är det ett vanligt argument. Så i det här fallet kan du säga bara ett värde, säg som, likhetstecknet ("="
) i stället.
06:49Och du kan faktiskt ange att border
är lika med, säg, ett kolon (:
). Det kommer att acceptera båda stilarna. Men width
måste specificeras med ett nyckelord om du ska ange det i…
07:07överordna standardvärdet med värdet 38
.
07:15Om du skulle ge den bara värdet 38
skulle det återigen ge upphov till ett undantag, och få en TypeError: headline() takes 1 to 2 positional arguments
but 3 were given
. Så även detta måste vara ett nyckelordsargument.
07:29Så som du kan se kan argument som endast innehåller positioner komplettera vanliga argument och argument som endast innehåller nyckelord på ett bra sätt. I nästa video får du lära dig hur Python 3.8 förbättrar typkontrollen genom att använda mer exakta typer.