Lesson 11: Functions ( Part 2 ) (Funkcijos ‐ 2 dalis) [LTU] - CodeAcademy-Online/python-level-1 GitHub Wiki
Tęsinys
Viena iš galingų, tačiau mažiau populiarių "Python" funkcijų yra *args
ir **kwargs
argumentai, lambda
funkcija.
*args
, **kwargs
Taigi, kas yra *args
ir **kwargs
argumentai? Aukščiausiu lygiu jie leidžia funkcijoms priimti neprivalomus argumentus ir suteikia mums lankstumo kviesti funkciją su bet kokiu argumentų skaičiumi. Todėl juos naudodami galime rašyti lankstesnes klases, funkcijas ir modulius.
Paprastas pavyzdys: 🔽
def check_arguments(mandatory: Any, *args, **kwargs) -> None:
print (mandatory)
if args:
print (args)
if kvargs:
print (kvargs)
Pirmiau pateikta funkcija check_arguments
reikalauja bent vieno argumento, vadinamo "privalomu", tačiau ji gali priimti ir papildomus pozicinius bei raktinius argumentus.
Jei iškviesime funkciją su papildomais argumentais, args
surinks papildomus pozicinius argumentus kaip tuple, nes parametro vardas turi * priešdėlį.
Taip pat kwargs
surinks papildomus raktinių žodžių argumentus kaip dict, nes parametro vardas turi ** priešdėlį. Ir args
, ir kwargs
bus tušti, jei funkcijai neperduodami jokie papildomi argumentai.
Kad suprastume args
ir kwargs
elgesį, iškvieskime savo check_arguments
metodą su skirtingais argumentais:
>>> check_arguments():
TypeError:
"check_arguments() missing 1 required positional arg: 'mandatory'"
>>> check_arguments('welcome')
welcome
>>> check_arguments('welcome', 1, 2, 3)
welcome
(1, 2, 3)
>>> toy_fun('welcome', 1, 2, 3, name='Sarah', age=26)
welcome
(1, 2, 3)
{'name': 'Sarah', 'age': 26}
👨🏫 ❗ GERAI ŽINOTI ❗
** ``argsir
kwargs` yra paprasta pavadinimų suteikimo konvencija. Aukščiau pateiktas pavyzdys puikiai veiktų, jei pavadintume juos `parms` ir `**argv` arba bet kaip kitaip. Tikroji sintaksė yra tik žvaigždutė () arba dviguba žvaigždutė ().
👨🏫 ❗ DĖMESIO! ❗
** Naudodami *args
arba **kwargs
su kitais parametrais arba naudodami juos kartu, turėtume nepamiršti, kad argumentai turi būti išdėstyti nurodyta tvarka ⬇️ .**
- Formalūs argumentai
- *args
- reikšminiai argumentai
- **kwargs
def my_func(a:int, b:int, *args, c: int = 5, d: int = 9, **kwargs) -> None:
print (a, b)
print (type(args), args)
print (c, d)
print (type(kwargs), kwargs)
>>> my_func(1, 2, 3, 4, 5, e=6, f = 7)
1, 2
<class 'tuple'> (3, 4, 5)
5, 9
<class 'dict'> {'e': 6, 'f': 7}
Lambda
funkcija
Lambda funkcijos yra anoniminės funkcijos Pythone. Lambda
funkcijos yra panašios į įprastas funkcijas. Skirtumas tarp įprastų funkcijų ir lambda
funkcijų yra tas, kad jas galima apibrėžti be pavadinimo, tačiau įprastos funkcijos apibrėžiamos raktiniu žodžiu def
.
lambda raktažodis naudojamas anoniminei arba lambda funkcijai apibrėžti.
Jei galėtume palyginti lambda
funkciją su įprasta funkcija:
lambda
funkcija gali priimti bet kokį argumentų skaičių, bet gali turėti tik vieną išraišką, o įprasta funkcija turi tikslų argumentų skaičių, kurį deklaruojame apibrėžimo metu.Lambda
funkcijos yra vienos eilutės funkcijos. Jos implementavimas turi išraišką toje pačioje eilutėje, kurioje ji apibrėžiama. Įprastose funkcijose yra funkcijos blokai, kuriuose apibrėžtos tam tikros vykdomos frazės.- Kadangi
lambda
yra vienos eilutės funkcija, ji gali būti iškviečiama iš karto, o įprastinė funkcija turi pati save iškviesti ir jai iškviesti reikia laiko.
Paprasta daugybos funkcija:
def multiply(x: int,y: int) -> int:
return * y
print(multiply(2,3))
>>> 6
galime perrašyti kaip lambda
funkciją:
multiplication= lambda x,y : x * y
print(multiplication(2,3))
>>> 6
Argumentus funkcijai galime perduoti apsupdami funkciją ir jos argumentą skliaustais:
multiplication= (lambda x,y : x * y)(2,3)
print(multiplication)
>>> 6
Naudojimas
Pirmenybė teikiama lambda
funkcijai:
- Kai norite, kad funkcija būtų naudojama vieną kartą.
- Kai funkcijos apibrėžtyje yra viena išraiška.
- Kai norite parašyti aiškią sintaksę, turėdami kelias kodo eilutes.
Tačiau jis nėra tinkamas:
- Kai funkciją reikia naudoti vėl ir vėl.
- Kai funkcijos apibrėžtyje yra daug ar sudėtingų išraiškų.
Pratimai:
-
Parašykite funkciją, kuri paima du
list'us
ir prie pirmojolist
pirmojo elemento prideda antrojolist
pirmąjį elementą, antrojo sąrašo antrąjį elementą, antrojo sąrašo antrąjį elementą ir antrojo sąrašo antrąjį elementą. pirmąjį sąrašą su antruoju antrojo sąrašo elementu ir t. t., ir t. t. Grąžinkite True, jei visi elementų deriniai sudaro tą patį skaičių. Priešingu atveju grąžinama False. Pavyzdys:puzzle_pieces([1, 2, 3, 4], [4, 3, 2, 1]) ➞ True # 1 + 4 = 5; 2 + 3 = 5; 3 + 2 = 5; 4 + 1 = 5 # Abiejų sąrašų suma yra [5, 5, 5, 5, 5] puzzle_pieces([1, 8, 5, 0, -1, 7], [0, -7, -4, 1, 2, -6]) ➞ True puzzle_pieces([1, 2], [-1, -1]) ➞ False puzzle_pieces([9, 8, 7], [7, 8, 9, 10]) ➞ False
-
Tarp lyginių ir nelyginių skaičių vyksta didelis karas. Šiame kare jau žuvo daug skaičių, todėl tavo užduotis - jį nutraukti. Jūs turite nustatyti, kurios grupės sumos didesnės: lyginių ar nelyginių. Laimi didesnė grupė.
Sukurkite funkciją, kuri paimtų sveikųjų skaičių sąrašą, atskirai suskaičiuotų lyginių ir nelyginių skaičių sumas, tada grąžintų lyginių ir nelyginių skaičių sumų skirtumą skaičių.
Pavyzdys:
war_of_numbers([2, 8, 7, 5]) ➞ 2 # 2 + 8 = 10 # 7 + 5 = 12 # 12 yra didesnis už 10 # Taigi grąžiname 12 - 10 = 2 war_of_numbers([12, 90, 75]) ➞ 27 war_of_numbers([5, 9, 45, 6, 2, 7, 34, 8, 6, 90, 5, 243]) ➞ 168
-
Jums duotas bigramų masyvas ir žodžių masyvas. Parašykite funkciją, kuri grąžintų True, jei iš šio masyvo galima rasti kiekvieną bigramą bent vieną kartą žodžių masyve.
Pavyzdys:
can_find([["at", "be", "th", "au"], ["beautiful", "the", "hat"]) ➞ True can_find([["ay", "be", "ta", "cu"], ["maybe", "beta", "abet", "course"]) ➞ False # "cu" nėra nė viename iš žodžių. can_find(["th", "fo", "ma", "or"], ["the", "many", "for", "forest"]) ➞ True can_find(["oo", "mi", "ki", "la"], ["milk", "chocolate", "cooks", "cooks"]) ➞ False
-
Sukurkite funkciją, kuri priima eilučių sąrašą ir grąžina naują sąrašą, kuriame yra tik tos eilutės, kurios prasideda balsiu. Naudokite lambda funkcijas, kad įgyvendintumėte logiką, tikrinančią, ar eilutė prasideda balsiu.
-
Sukurkite lambda funkciją, kuri:
- priima du argumentus: eilutę ir skaičių.
- grąžina naują eilutę, kuri pakartoja pradinę eilutę tiek kartų, kiek kartų pakartotas skaičius.
Pavyzdžiui, jei įvesties duomenys yra
Hello
ir3
, funkcija turėtų grąžintiHelloHelloHello
.