00:00Tässä videossa kerrotaan uudesta ominaisuudesta, joka on positional-only argumentit. Aloitetaan esimerkillä. Haluan aloittaa tämän videon puhumalla sisäänrakennetusta funktiosta nimeltä float()
.
00:09float()
voidaan muuntaa tekstijonoja tai numeroita float
-objekteiksi, kuten tässä. Jos tuot esiin help()
-funktion sisäänrakennetun funktion float
, jos katsot float
:n allekirjoitusta tässä, huomaat, että parametrin jälkeen on vinoviiva (/
). Mitä se tarkoittaa? No, käy ilmi, että funktiossa float()
on yksi parametri ja sen nimi on x
, etkä saa käyttää parametrin nimeä sitä kutsuttaessa. Kun käytät float()
-parametria, voit määrittää argumentit vain aseman mukaan, et avainsanan mukaan. Näytän sinulle, mitä tarkoitan. Huomaa siis jälleen vinoviiva (/
) tässä. Painamalla q
pääset pois help()
:stä. Jos siis yrität float()
uudestaan ja sanot x="3.8"
-tekstijono – näet tässä, että se sanoo float() takes no keyword arguments
, vain tämä sijaintiargumentti.
00:53Et voi käyttää avainsanaa, kun määrität argumentin. Ennen Python 3.8:a ei ollut helppoa tapaa määritellä, että argumentit olisivat vain paikannusargumentteja omissa funktioissa. Jos siis määrittelisit jotain tällaista funktiota – kutsumme sitä incr()
(increment).
01:10Kun kutsut funktiota incr()
ja annat sille vaikkapa float-arvon, voisit käyttää kumpaakin menetelmää, ja se on normaalia tavalliselle argumentille. Ja tähän tulee muutos Python 3.8:ssa.
01:24Voisit kirjoittaa increment incr()
-funktion uudelleen niin, että se hyväksyisi vain positional-argumentteja. Se näyttäisi enemmänkin tältä: ensin pilkku (,
), sitten vinoviiva (/
), ja loppuosa on sama.
01:40Siten kun kutsut incr()
, se toimii hyvin. Mutta jos nyt käyttäisit avainsanaa, tapahtuu jotain uutta. Tässä lukee incr() got some positional-only arguments passed as keyword arguments
.
01:55Se siis aiheuttaa poikkeuksen ja antaa sinulle TypeError
. Voit käyttää tätä melkein erottimena pelkkien sijaintiargumenttien ja tavallisten argumenttien välillä. Annan sinun kokeilla sitä toisella esimerkillä.
02:07Määrittele uusi funktio nimeltä greet()
. greet()
ottaa name
pelkkänä positional-only-argumenttina, sitten laitat tuon vinoviivan (/
) sinne, jotta voit yhdistää positional-only- ja regular-argumentit. Tässä on siis tavallinen argumentti greeting
.
02:23Tässä palautat f-merkkijonon, jossa on greeting
. Jos et ole vielä työskennellyt f-merkkijonojen kanssa, laitan alla olevaan tekstiin linkin sitä käsitteleviin artikkeleihin ja kursseihin.
02:31Komma, välilyönti, name
. Eli kun kutsut greet()
– taas, oletusarvoisesti greeting
on "Hello"
.
02:37Si kirjoitat name
tänne pelkkänä positionaalina.
02:43Hienoa. Voisit myös kutsua greet()
02:49ja antaa sille greeting
.
02:55Mutta mitä et voi tehdä – tai mistä saat virheen – on se, että jos kirjoitat name
,
03:08Tässä saat poikkeuksen TypeError
. Jälleen kerran, aivan kuten edellisessä incr()
:ssä, greet()
:ssä annettiin avainsana-argumentteina joitain vain sijaintiargumentteja, erityisesti name
. Ensi silmäyksellä asema-argumentit voivat vaikuttaa hieman rajoittavilta ja vastoin Pythonin mantraa luettavuuden tärkeydestä.
03:26Valvottavasti huomaat, että ei ole kovinkaan montaa tapausta, joissa vain asema-argumentit parantavat koodiasi. Oikeissa olosuhteissa se voi kuitenkin antaa joustavuutta funktioita suunniteltaessa.
03:35Ensinnäkin vain sijaintia koskevat argumentit ovat järkeviä silloin, kun sinulla on argumentteja, joilla on luonnollinen järjestys, mutta joille on vaikea antaa hyviä kuvailevia nimiä. Toinen hyöty, joka saavutetaan käyttämällä vain sijaintikohtaisia argumentteja, on se, että voit helpommin refaktoroida funktioitasi – erityisesti voit muuttaa parametrien nimiä huolehtimatta siitä, että muu koodi on riippuvainen näistä nimistä.
03:57Tiedon toistamiseksi, miten määrittelet vain sijaintikohtaisia argumentteja? Käytät vinoviivaa (/
) ilmaisemaan, että argumentit ennen sitä on määriteltävä aseman mukaan. Jos haluat lisätietoja slash-merkinnästä, PEP 457:ssä käsitellään sitä perusteellisesti. PEP 570 sukeltaa paljon syvemmälle Pythonin positional-only-parametreihin. Linkit molempiin löytyvät tämän videon alla olevasta tekstistä.
04:20Positional-only-argumenttien täydennyksenä olisivat keyword-only-argumentit, ja ne ovat saatavilla kaikissa Python 3 -versioissa. Voit täsmentää, että haluat vain avainsana-argumentteja käyttämällä tähteä (*
).
04:31Kaikki argumentit tuon *
:n jälkeen on määriteltävä avainsanalla. Tässä on esimerkki, joka muuntaa Fahrenheit-arvoksi, ja näet tässä, että siinä on vain avainsana-argumenttina celsius
.
04:46Kokeilepa tätä funktiota. Tässä siis määritetään vain avainsana, kun laitetaan *
ja sen jälkeen avainsana-argumentti – tässä tapauksessa celsius
. Ja tässä tapauksessa return
05:0232 + celsius * 9 / 5
. Joten tässä, jos kutsuisit to_fahrenheit()
ja antaisit sille vain arvon, vaikkapa 40
celsiusastetta, tässä sanotaan, että se takes 0 positional arguments but 1 was given
.
05:16Se siis vaati, että sinulla on avainsana siinä, jotta voit kutsua sitä oikein. Ja lisäksi, olosuhteista riippuen, saatat haluta yhdistää vain sijaintikohtaisia, tavallisia ja vain avainsanoja sisältäviä argumentteja. Tehdäksesi sen, määrittäisit ne erotettuna tuolla vinoviivalla (/
) ja tähdellä (*
).
05:35Se näyttäisi siis jotakuinkin tältä. Tässä paikannimi text
, vinoviiva (/
). Tässä vakioargumentti.
05:46Ja nyt, border
:n jälkeen, käyttäen *
, avainsana-argumentti width
, jonka oletusarvo on 50
.
05:54Palautat f-merkkijonon, jossa on välilyönti text
-argumentin arvon edessä ja sen jälkeen toinen välilyönti. Ja sitten käytät .center()
:n tekstijonomenetelmää kahdella parametrilla, jotka otat noista argumenteista, width
ja border
.
06:08Ainoastaan text
on positionaalinen. Voisit aloittaa headline()
:llä ja sanoa "Positional-only"
.
06:18Tässä näet oletusarvon, joka tulee olemaan tuon tyyppinen rajaus width
:llä 50
, joka näyttää jotenkin tältä. Jälleen, koska se on vain sijaintikohtainen, jos antaisit sille text
,
06:35se aiheuttaisi virheen, TypeError
. border
:lle se on tavallinen argumentti. Joten tässä tapauksessa voisit sen sijaan sanoa vain arvon, vaikkapa kuten yhtäläisyysmerkki ("="
).
06:49Tai voisit itse asiassa määritellä, että border
on yhtä kuin vaikkapa kaksoispiste (:
). Se hyväksyy kumman tahansa tyylin. Mutta width
on määriteltävä avainsanalla, jos aiot syöttää sen…
07:07Overriding the default with a value of 38
.
07:15Jos antaisit sille pelkän arvon 38
, sekin taas aiheuttaisi poikkeuksen ja saisi TypeError: headline() takes 1 to 2 positional arguments
but 3 were given
. Joten jälleen kerran tuon täytyy olla avainsana-argumentti.
07:29Kuten näet, pelkät asema-argumentit voivat mukavasti täydentää tavallisia argumentteja ja pelkkiä avainsana-argumentteja. Seuraavassa videossa opit, miten Python 3.8 parantaa tyypintarkistusta käyttämällä tarkempia tyyppejä.