00:00Ten film będzie mówił o nowej funkcji argumentów tylko pozycyjnych. Zaczniemy od przykładu. Chcę rozpocząć ten film od omówienia wbudowanej funkcji o nazwie float()
.
00:09float()
może być użyta do konwersji ciągów tekstowych lub liczb na obiekty float
, takie jak ten. Jeśli przywołasz funkcję help()
na wbudowaną funkcję float
, jeśli spojrzysz na sygnaturę dla float
właśnie tutaj, zauważysz, że po parametrze znajduje się ukośnik (/
). Co to oznacza? Cóż, okazuje się, że jest jeden parametr float()
i nazywa się on x
, a ty nie możesz używać nazwy parametru podczas jego wywoływania. Kiedy używasz float()
, możesz określać argumenty tylko przez pozycję, a nie przez słowo kluczowe. Pozwól, że pokażę ci, co mam na myśli. Więc ponownie, zauważ ukośnik (/
) tutaj. Naciśnięcie q
spowoduje wyjście z help()
. Więc jeśli spróbujesz float()
ponownie i powiesz x="3.8"
– łańcuch tekstowy – zobaczysz tutaj, że mówi float() takes no keyword arguments
, tylko ten argument pozycyjny.
00:53Nie możesz użyć słowa kluczowego, gdy określasz argument. Przed Pythonem 3.8 nie było łatwego sposobu, aby określić, że argumenty powinny być tylko pozycyjne w twoich własnych funkcjach. Więc jeśli miałeś zdefiniować coś takiego jak ta funkcja – nazwiemy ją incr()
(increment).
01:10Gdy wywołasz incr()
i powiedzmy, że dasz mu float, możesz użyć dowolnej metody, i to jest normalne dla zwykłego argumentu. I tu właśnie pojawia się zmiana w Pythonie 3.8.
01:24Mógłbyś przepisać funkcję increment incr()
, aby akceptowała argumenty tylko pozycyjne. Wyglądałoby to bardziej podobnie do tego, z przecinkiem (,
) następnie ukośnikiem (/
), a reszta jest taka sama.
01:40Więc kiedy wywołujesz incr()
, to działa dobrze. Ale jeśli miałbyś teraz użyć słowa kluczowego, dzieje się coś nowego. Jest tu napisane incr() got some positional-only arguments passed as keyword arguments
.
01:55So to podniesie wyjątek i da ci TypeError
. Możesz użyć tego prawie jako rozdzielacza między argumentami tylko pozycyjnymi a zwykłymi argumentami. Pozwól, że wypróbuję to na innym przykładzie.
02:07Zdefiniuj nową funkcję o nazwie greet()
. greet()
będzie przyjmować name
jako argument tylko pozycyjny, a następnie umieścisz tam ten ukośnik (/
), abyś mógł połączyć argumenty pozycyjne z regularnymi. Więc tutaj jest regularny argument greeting
.
02:23Tutaj zwrócisz f-string z greeting
. Jeśli jeszcze nie pracowałeś z f-stringami, w tekście poniżej zamieszczam link do artykułów i kursów na ten temat.
02:31Przecinek, spacja, name
. Więc kiedy wywołasz greet()
– znowu, domyślnym greeting
będzie "Hello"
.
02:37Wpiszesz tutaj name
jako tylko pozycyjny.
02:43Doskonale. Możesz również zadzwonić do greet()
02:49i dać mu greeting
.
02:55Ale to, czego nie możesz zrobić – lub co da ci błąd – to jeśli wpiszesz name
,
03:08tutaj dostaniesz wyjątek TypeError
. Ponownie, tak jak w poprzednim przypadku dla incr()
, greet()
dostał kilka argumentów pozycyjnych przekazanych jako argumenty słowa kluczowego, a konkretnie name
. Na pierwszy rzut oka argumenty pozycyjne mogą wydawać się nieco ograniczające i sprzeczne z mantrą Pythona o znaczeniu czytelności.
03:26Prawdopodobnie przekonasz się, że nie ma zbyt wielu okazji, w których argumenty pozycyjne poprawiają Twój kod. Jednakże, w odpowiednich okolicznościach, może to dać ci pewną elastyczność podczas projektowania funkcji.
03:35Po pierwsze, argumenty pozycyjne mają sens, gdy masz argumenty, które mają naturalną kolejność, ale są trudne do nadania dobrych nazw opisowych. Inną korzyścią z używania argumentów pozycyjnych jest to, że możesz łatwiej refaktoryzować swoje funkcje – w szczególności, możesz zmienić nazwę swoich parametrów bez obawy, że inny kod zależy od tych nazw.
03:57Aby powtórzyć te informacje, jak określić argumenty pozycyjne? Używasz ukośnika (/
) do oznaczenia, że argumenty przed nim muszą być określone przez pozycję. Aby dowiedzieć się więcej o notacji ukośnika, PEP 457 zawiera dogłębną dyskusję na jej temat. PEP 570 zagłębia się znacznie bardziej w parametry pozycyjne Pythona. Linki do nich znajdują się w tekście poniżej tego filmu.
04:20Zupełnym uzupełnieniem argumentów pozycyjnych byłyby argumenty oparte na słowach kluczowych, a te są dostępne w każdej wersji Pythona 3. Możesz określić, że chcesz mieć argumenty tylko na słowo kluczowe, używając gwiazdki (*
).
04:31Wszystkie argumenty po tym *
muszą być określone za pomocą słowa kluczowego. Tutaj jest przykład konwersji do Fahrenheita, i można zobaczyć, że ma tylko słowo kluczowe argument celsius
.
04:46Pozwól mi wypróbować tę funkcję. Więc tutaj, aby określić słowo kluczowe, umieściłbyś *
, a następnie umieściłbyś argument słowa kluczowego po – w tym przypadku, celsius
. A w tym przypadku, return
05:0232 + celsius * 9 / 5
. Więc tutaj, gdybyś miał zadzwonić do to_fahrenheit()
i po prostu dać mu wartość, powiedzmy 40
stopni Celsjusza, to mówi tutaj, że to takes 0 positional arguments but 1 was given
.
05:16Więc wymagało to, że masz słowo kluczowe tam, aby wywołać go poprawnie. A także, w zależności od okoliczności, możesz chcieć połączyć argumenty tylko pozycyjne, regularne i słowa kluczowe. Aby to zrobić, podałbyś je oddzielone ukośnikiem (/
) i gwiazdką (*
).
05:35Więc wyglądałoby to mniej więcej tak. Tutaj, tylko pozycja text
, ukośnik (/
). Tutaj, standardowy argument.
05:46A teraz, po border
, używając *
, argumentu keyword-only z width
, który ma domyślną wartość 50
.
05:54Zwracasz f-string ze spacją przed wartością dla argumentu text
, a następnie kolejną spacją. A potem używasz metody text string w .center()
z dwoma parametrami, które bierzesz z tych argumentów, width
i border
.
06:08Jedynym, który jest pozycyjny, jest text
. Możesz zacząć od headline()
i powiedzieć "Positional-only"
.
06:18Tutaj możesz zobaczyć domyślną wartość, która będzie tym typem granicy z width
z 50
, wyglądającą coś takiego. Ponownie, ponieważ jest to tylko pozycyjne, jeśli miałbyś dać mu text
,
06:35 to podniósłby błąd, TypeError
. Dla border
, jest to zwykły argument. Więc w tym przypadku, można powiedzieć tylko wartość, powiedzmy jak, znak równości ("="
) zamiast.
06:49Or można rzeczywiście określić, że border
równa się, powiedzmy, dwukropek (:
). Zaakceptuje każdy z tych stylów. Ale width
musi być określony za pomocą słowa kluczowego, jeśli zamierzasz go wprowadzić…
07:07Odstępując od domyślnego z wartością 38
.
07:15Jeśli miałbyś dać mu tylko wartość 38
, to znowu podniosłoby wyjątek, otrzymując TypeError: headline() takes 1 to 2 positional arguments
but 3 were given
. Więc znowu, ten jeden musi być argumentem słowa kluczowego.
07:29Jak więc widzisz, argumenty pozycyjne mogą ładnie uzupełniać zwykłe argumenty i argumenty słowa kluczowego. W następnym filmie dowiesz się, jak Python 3.8 usprawnia sprawdzanie typów poprzez użycie bardziej precyzyjnych typów.