Vadovėlis/Pažangios funkcijos
Pažangesnės funkcijos
...arba programuoti Python profesionaliau
Papasakosiu tau apie keletą neįtikėtinų funkcijų ir gudrybių, kurios padės supaprastinti užduočių atlikimą. Pradėkime :)
Lambda funkcija
Žinai jau kaip apsirašyti funkciją su žodeliu ‘’def’’. Lambda funkcija yra tokia pati funkcija, tik labai trumpa ir anoniminė - ji neturi jokio vardo. Kai reikia apibrėžti labai trumpą ir paprastą funkciją, kurią naudosime tik vieną kartą ir nereikalauja sudėtingos logikos, galime naudoti lambda funkciją. Tai gali būti ypač naudinga, kai turime sudėtingą funkciją, kurią norime išskaidyti į smulkesnes dalis, arba kai norime panaudoti funkciją kaip argumentą kitai funkcijai. Lambda funkcijos sintaksis yra paprastas, rašome žodį lambda, po to tarp skliaustų nurodome argumentų sąrašą ir funkcijos išraišką. Tai viskas, ko mums reikia, kad apibrėžtume lambda funkciją.
Lambda funkcijos yra naudojamos daugeliui Python standartinių funkcijų, pavyzdžiui, filter(), map(), sorted(), kad būtų paprastesnis kodas. Apie jas daugiau papasakosiu šiame skyriuje, o dabar pažiūrėkime, kaip galime panaudoti lambda funkciją:
# lambda funkcija apskaičiuojanti kvadratą kvadratas = lambda x: x**2 print(kvadratas(5)) # 25 # lambda funkcija filtruojanti nelyginius skaičius skaičiai = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] nelyginiai = list(filter(lambda x: x % 2 != 0, skaičiai)) print(nelyginiai) # [1, 3, 5, 7, 9]
Lambda funkcija taip pat gali būti naudinga, kai reikia perduoti funkciją kaip argumentą į kitą funkciją. Tai leidžia sukurti trumpą, paprastą ir lengvai suprantamą kodą.
Rikiavimas su sorted()
Anksčiau rodžiau rikiavimo funkciją su sąrašais. Sąrašo funkcija sąrašas.sort() modifikuoja savo elementus juos surikiuodamas. Taip kintamasis pakeičia savo reikšmę. Python taip pat turi funkciją sorted() kuri grąžina naują surikiuotą rezultatą, nepakeisdama originalaus kintamojo.
Pažiūrėkim, kaip tai veikia:
# susikuriame sąrašą su atsitiktiniais skaičiais sąrašas = [3,1,5,23,0] # sorted grąžina surikiuotą sąrašą, kuri priskiriame naujajam kintamajam. surikiuotas_sąrašas = sorted(sąrašas) # atsispausdiname rezultatą. Matysi, kad kintamasis sąrašas nepakeitė reikšmės, o surikiuotas_sąrašas reikšmė yra surikiuota. print(surikiuotas_sąrašas, sąrašas) # pažiūrėkim, ką padarys funkcija sort() sąrašas.sort() # rezultate matysi du surikiuotus identiškus sąrašus. print(surikiuotas_sąrašas, sąrašas) # kaip surikiuoti mažėjančia tvarka? Tiesiog pridėkime prie funkcijos reverse=True atbulas_sąrašas = sorted(surikiuotas_sąrašas, reverse=True) print(atbulas_sąrašas, surikiuotas_sąrašas, sąrašas)
Rezultatus turėtum matyti tokius:
[0, 1, 3, 5, 23] [3, 1, 5, 23, 0] [0, 1, 3, 5, 23] [0, 1, 3, 5, 23] [23, 5, 3, 1, 0] [0, 1, 3, 5, 23] [0, 1, 3, 5, 23]
Akylus skaitytojas pamatys, kad pavyzdyje parodžiau papildomą sorted funkcionalumą atbuliniam sąrašo rikiavimui: sorted(sąrašas, reverse=True). reverse anglų kalboje reiškia atbulinis, todėl tai pasako funkcijai, kad mums reikia grąžint sąrašą atbuline tvarka.
Dar vienas labai svarbus skirtumas tarp sąrašas.sort() ir sorted() - ‘’sorted’’ naudojamas visiems iteruojamiems objektams. Pavyzdžiui anksčiau skyriuje minėtiems žodynams.
# pasirašom funkciją sąrašo atvaizdavimui
def spausdink(sąrašas):
for elementas in sąrašas:
print(elementas)
print('')
# apsirašom sąrašą žodynų, kuriuos rikiuosime.
žodynai = [
{"vardas": "Darius", "metai": 15, "pomėgis": "bėgimas"},
{"vardas": "Marius", "metai": 14, "pomėgis": "krepšinis"},
{"vardas": "Katolis", "metai": 16, "pomėgis": "krepšinis"},
{"vardas": "Gileta", "metai": 13, "pomėgis": "tinklinis"},
{"vardas": "Eglė", "metai": 17, "pomėgis": "bėgimas"},
]
print('surikiuojam pagal metus mažejančia tvarka')
spausdink(sorted(žodynai, key=lambda x: -x['metai']))
print('rikiuojame pagal dvi reikšmes: pradžioje pagal pomėgį, o vėliau pagal metus didėjančia tvarka.')
spausdink( sorted(žodynai, key=lambda x: (x['pomėgis'], x['metai'])) )
print('nurodome atbuline tvarka')
spausdink( sorted(žodynai, key=lambda x: (x['pomėgis'], x['metai']), reverse=True) )
print('rikiuojame pagal pomėgį didėjančia tvarka, o vėliau pagal metus mažėjančia')
spausdink( sorted(žodynai, key=lambda x: (x['pomėgis'], -x['metai'])) )
print('nurodome atbuline tvarka')
spausdink( sorted(žodynai, key=lambda x: (x['pomėgis'], -x['metai']), reverse=True) )
Razultatas bus toks:
surikiuojam pagal metus mažejančia tvarka
{'vardas': 'Eglė', 'metai': 17, 'pomėgis': 'bėgimas'}
{'vardas': 'Katolis', 'metai': 16, 'pomėgis': 'krepšinis'}
{'vardas': 'Darius', 'metai': 15, 'pomėgis': 'bėgimas'}
{'vardas': 'Marius', 'metai': 14, 'pomėgis': 'krepšinis'}
{'vardas': 'Gileta', 'metai': 13, 'pomėgis': 'tinklinis'}
rikiuojame pagal dvi reikšmes: pradžioje pagal pomėgį, o vėliau pagal metus didėjančia tvarka.
{'vardas': 'Darius', 'metai': 15, 'pomėgis': 'bėgimas'}
{'vardas': 'Eglė', 'metai': 17, 'pomėgis': 'bėgimas'}
{'vardas': 'Marius', 'metai': 14, 'pomėgis': 'krepšinis'}
{'vardas': 'Katolis', 'metai': 16, 'pomėgis': 'krepšinis'}
{'vardas': 'Gileta', 'metai': 13, 'pomėgis': 'tinklinis'}
nurodome atbuline tvarka
{'vardas': 'Gileta', 'metai': 13, 'pomėgis': 'tinklinis'}
{'vardas': 'Katolis', 'metai': 16, 'pomėgis': 'krepšinis'}
{'vardas': 'Marius', 'metai': 14, 'pomėgis': 'krepšinis'}
{'vardas': 'Eglė', 'metai': 17, 'pomėgis': 'bėgimas'}
{'vardas': 'Darius', 'metai': 15, 'pomėgis': 'bėgimas'}
rikiuojame pagal pomėgį didėjančia tvarka, o vėliau pagal metus mažėjančia
{'vardas': 'Eglė', 'metai': 17, 'pomėgis': 'bėgimas'}
{'vardas': 'Darius', 'metai': 15, 'pomėgis': 'bėgimas'}
{'vardas': 'Katolis', 'metai': 16, 'pomėgis': 'krepšinis'}
{'vardas': 'Marius', 'metai': 14, 'pomėgis': 'krepšinis'}
{'vardas': 'Gileta', 'metai': 13, 'pomėgis': 'tinklinis'}
nurodome atbuline tvarka
{'vardas': 'Gileta', 'metai': 13, 'pomėgis': 'tinklinis'}
{'vardas': 'Marius', 'metai': 14, 'pomėgis': 'krepšinis'}
{'vardas': 'Katolis', 'metai': 16, 'pomėgis': 'krepšinis'}
{'vardas': 'Darius', 'metai': 15, 'pomėgis': 'bėgimas'}
{'vardas': 'Eglė', 'metai': 17, 'pomėgis': 'bėgimas'}
Norint naudoti funkciją sorted() su žodynais, reikia programai nurodyti, pagal kurią žodyno reikšmę nori rikiuoti sąrašą. Tai gali padaryti nurodydamas key=lambda kintamasis: kintamasis[‘reikšmė’]. Parametras ‘’key’’ nurodo funkcijai ‘’sorted’’, kad norėsi naudoti papildoma funkciją. Štai čia mes paduodame bevardę funkciją ‘’lambda’’, kuri ir nurodo, pagal kuriuos parametrus mes norime rikiuoti sąrašą.