00:00Denne video vil fortælle om den nye funktion med kun positionelle argumenter. Jeg vil få dig til at starte med et eksempel. Jeg vil starte denne video med at tale om en indbygget funktion ved navn float()
.
00:09float()
kan bruges til at konvertere tekststrenge eller tal til float
-objekter, f.eks. sådan her. Hvis du viser help()
-funktionen på den indbyggede funktion float
, vil du, hvis du kigger på signaturen for float
lige her, bemærke, at der er en skråstreg (/
) efter parameteren. Hvad betyder det? Jo, det viser sig, at der er én parameter i float()
, og den hedder x
, og det er ikke tilladt at bruge navnet på parameteren, når du kalder den. Når du bruger float()
, er det kun tilladt at angive argumenter ved position, ikke ved et nøgleord. Lad mig vise dig, hvad jeg mener. Så igen, læg mærke til skråstregen (/
) her. Tryk på q
for at komme ud af help()
. Så hvis du prøver float()
igen og siger x="3.8"
– en tekststreng – vil du se her, at der står float() takes no keyword arguments
, kun dette positionsargument.
00:53Du kan ikke bruge et nøgleord, når du angiver argumentet. Før Python 3.8 var der ingen nem måde at angive, at argumenter kun skal være positionelle argumenter i dine egne funktioner. Så hvis du definerer noget som denne funktion – vi kalder den incr()
(increment).
01:10Når du kalder incr()
, og lad os sige, at du giver den en float, kan du bruge begge metoder, og det er normalt for et almindeligt argument. Og det er her ændringen kommer ind i Python 3.8.
01:24Du kan omskrive increment incr()
-funktionen, så den kun accepterer positionelle argumenter. Det ville se mere sådan ud, med et komma (,
) og derefter en skråstreg (/
), og resten er det samme.
01:40Så når du kalder incr()
, fungerer det fint. Men hvis du nu skulle bruge nøgleordet, sker der noget nyt. Her står der incr() got some positional-only arguments passed as keyword arguments
.
01:55Så det vil udløse en undtagelse og give dig en TypeError
. Du kan bruge dette næsten som en skillevej mellem dine positionelle argumenter og almindelige argumenter. Lad mig få dig til at afprøve det med et andet eksempel.
02:07Definér en ny funktion med navnet greet()
. greet()
skal tage et name
som et positionelt argument, og så skal du sætte skråstregen (/
) ind der, så du kan kombinere positionelle argumenter med almindelige argumenter. Så her er et regulært argument med et greeting
.
02:23Her returnerer du en f-streng med greeting
. Hvis du endnu ikke har arbejdet med f-strenge, vil jeg inkludere et link i teksten nedenfor til artikler og kurser om det.
02:31Komma, mellemrum, name
. Så når du kalder greet()
– igen, standard greeting
bliver "Hello"
.
02:37Du skal indtaste name
her som en positional-only.
02:43Godt. Du kunne også kalde greet()
02:49og give den en greeting
.
02:55Men hvad du ikke kan gøre – eller hvad der vil give dig en fejl – er, at hvis du skriver name
,
03:08her får du en undtagelse af en TypeError
. Igen, ligesom ved den foregående for incr()
, fik greet()
nogle positionelle argumenter, der kun blev overført som nøgleordsargumenter, specielt name
. Ved første øjekast kan positionelle argumenter virke en smule begrænsende og i modstrid med Pythons mantra om vigtigheden af læsbarhed.
03:26Du vil sandsynligvis opdage, at der ikke er mange tilfælde, hvor positionelle argumenter forbedrer din kode. Under de rette omstændigheder kan det dog give dig en vis fleksibilitet, når du designer funktioner.
03:35Først giver positional-only-argumenter mening, når du har argumenter, der har en naturlig rækkefølge, men som det er svært at give gode beskrivende navne til. En anden fordel ved at bruge positional-only-argumenter er, at du lettere kan refaktorisere dine funktioner – især kan du ændre navnet på dine parametre uden at bekymre dig om, at anden kode er afhængig af disse navne.
03:57For at gentage disse oplysninger, hvordan angiver du positional-only-argumenter? Du bruger skråstregen (/
) til at angive, at argumenter før den skal angives ved position. Hvis du vil vide mere om slash-notationen, kan du læse mere om den i PEP 457, som indeholder en dybdegående diskussion om den. PEP 570 dykker meget dybere ned i Python positional-only-parametre. Links til begge er i teksten under denne video.
04:20Komplementet til positional-only-argumenter ville være keyword-only-argumenter, og disse er tilgængelige i enhver version af Python 3. Du kan angive, at du ønsker keyword-only-argumenter ved at bruge en stjerne (*
).
04:31Alle argumenter efter dette *
skal angives ved hjælp af et keyword. Her er et eksempel, der konverterer til Fahrenheit, og du kan se her, at den har et nøgleordsargument på celsius
.
04:46Lad mig få dig til at prøve denne funktion. Så her skal du angive keyword-only ved at sætte et *
og derefter sætte keyword-argumentet bagefter – i dette tilfælde celsius
. Og i dette tilfælde returnerer du
05:0232 + celsius * 9 / 5
. Så her, hvis du skulle kalde to_fahrenheit()
og bare give den en værdi, f.eks. 40
grader Celsius, står der her, at den takes 0 positional arguments but 1 was given
.
05:16Så det krævede, at du havde et nøgleord der for at kunne kalde den korrekt. Og også, afhængigt af dine omstændigheder, vil du måske kombinere positional-only-argumenter, almindelige argumenter og keyword-only-argumenter. For at gøre det skal du angive dem adskilt af den skråstreg (/
) og stjernen (*
).
05:35Så det ville se nogenlunde sådan ud. Her, en positional-only af text
, skråstregen (/
). Her standardargumentet.
05:46Og nu, efter border
, ved hjælp af *
, keyword-only-argumentet width
, som har en standardværdi på 50
.
05:54Du returnerer en f-streng med et mellemrum foran værdien for text
-argumentet og derefter et andet mellemrum. Og så bruger du tekststrengmetoden for .center()
med to parametre, som du tager fra disse argumenter, width
og border
.
06:08Den eneste, der er positionsbestemt, er text
. Du kunne starte med headline()
og sige "Positional-only"
.
06:18Her kan du se standardværdien, der vil være den type grænse med en width
på 50
, der ser nogenlunde sådan ud. Igen, da det kun er positionelt, ville det give en fejl, en TypeError
, hvis du gav den text
,
06:35, hvis du gav den text
,
06:35. For border
er det et almindeligt argument. Så i dette tilfælde kunne du i stedet for bare sige en værdi, f.eks. et lighedstegn ("="
).
06:49Og du kunne faktisk angive, at border
er lig med, f.eks. et kolon (:
). Det vil acceptere begge stilarter. Men width
skal angives ved hjælp af et nøgleord, hvis du vil indtaste det i…
07:07overskrive standardværdien med en værdi på 38
.
07:15Hvis du bare ville give den værdien 38
, ville det igen give anledning til en undtagelse, idet du ville få en TypeError: headline() takes 1 to 2 positional arguments
but 3 were given
. Så igen skal det være et nøgleordsargument.
07:29Så som du kan se, kan argumenter, der kun er baseret på positioner, fint supplere almindelige argumenter og argumenter, der kun er baseret på nøgleord. I den næste video lærer du, hvordan Python 3.8 forbedrer typekontrollen ved at bruge mere præcise typer.