మాడ్యూల్ పాఠాలు (3/4)
జనరేటర్ వ్యక్తీకరణ
ఒక జనరేటర్ వ్యక్తీకరణ అనేది జాబితా గ్రహణశక్తి వలె ఉంటుంది, కానీ దానితో కుండలీకరణాలు చదరపు బ్రాకెట్లకు బదులుగా. వ్యత్యాసం నాటకీయంగా ఉంది: ఇది మెమరీలో జాబితాను రూపొందించదు, ఇది మూలకాలను ఉత్పత్తి చేస్తుంది ఆన్-డిమాండ్, ఒక్కోసారి.
gen = (n * n for n in range(1_000_000))
# istantaneo, memoria costante: nessun calcolo ancora fatto
list_comp = [n * n for n in range(1_000_000)]
# alloca 1M di int in memoriaసోమరితనం (సోమరితనం మూల్యాంకనం)
ఎవరైనా తదుపరి విలువను అడిగే వరకు జనరేటర్ ఏమీ చేయదు:
gen = (n * n for n in range(5))
next(gen) # 0 (calcolato adesso)
next(gen) # 1
next(gen) # 4
# ... e così via, fino a StopIterationఇది అయిపోతుంది: అన్ని మూలకాలను వినియోగించిన తర్వాత, ఇది ఎప్పటికీ ఖాళీగా ఉంటుంది. దీన్ని మళ్లీ ఉపయోగించాలంటే, మీరు దాన్ని మళ్లీ సృష్టించాలి.
ఎప్పుడు ఉపయోగించాలి
మీరు ఫలితాలను క్రమానుగతంగా వినియోగించే ఫంక్షన్కు పంపినప్పుడు:
total = sum(n * n for n in range(1_000_000))
# nessuna lista intermedia, memoria costantesum, any, all, max, min, "".join(...) అన్నీ జనరేటర్లను అంగీకరిస్తాయి.
ఔటర్ ఫంక్షన్కు కాల్ కుండలీకరణాలు మాత్రమే అవసరమైతే, మీరు చేయవచ్చు
జనరేటర్ స్వంతంగా వదిలివేయండి:
sum((n * n for n in range(10))) # OK
sum(n * n for n in range(10)) # IDENTICO, più leggibileany మరియు all: షార్ట్-సర్క్యూట్
any(...) మరియు all(...) సమాధానం పొందిన వెంటనే పునరావృతం చేయడం ఆపివేయండి.
జనరేటర్తో, కింది మూలకాలు కూడా గణించబడవు.
nums = [1, 2, 3, 4, 5]
any(n > 3 for n in nums) # True (si ferma a 4)
all(n > 0 for n in nums) # True
all(n > 2 for n in nums) # False (si ferma a 1)సరళి: సోమరి పైప్లైన్
righe = (linea.strip() for linea in testo.splitlines())
non_vuote = (r for r in righe if r)
prime_dieci = []
for r in non_vuote:
prime_dieci.append(r)
if len(prime_dieci) == 10:
breakభారీ ఇన్పుట్లపై కూడా ఇంటర్మీడియట్ జాబితా లేదు.
మొత్తం, ఏదైనా, అన్నీ కలిపి జనరేటర్లను వినియోగించడం
జనరేటర్ ఎక్స్ప్రెషన్లు sum(), any(), లేదా all() వంటి మళ్లింపులను వినియోగించే ఫంక్షన్లకు నేరుగా వెళ్లడానికి సరైనవి. ఈ సందర్భంలో, మీరు జనరేటర్ వ్యక్తీకరణ యొక్క బయటి కుండలీకరణాలను వదిలివేయవచ్చు, కేవలం వ్రాయడం:
squares_sum = sum(x**2 for x in range(10))ఇది మీ కోడ్ను క్లీన్గా మరియు అధిక మెమరీ-సమర్థవంతంగా ఉంచుతుంది.
దీనిని ప్రయత్నించండి
1 నుండి 100 (కలిసి) వరకు ఉన్న సంఖ్యల వర్గాలను మొత్తం () లోపల జనరేటర్ వ్యక్తీకరణను ఉపయోగించి గణించండి. దాన్ని `టాట్`కి కేటాయించండి. `టోట్`ని మూల్యాంకనం చేయండి.
సూచనను చూపించు
పరిధి(1, 101)లో 100 ఉన్నాయి.
3 ప్రయత్నాల తర్వాత పరిష్కారం లభిస్తుంది
వ్యాయామం సమీక్షించండి
ఇచ్చిన `పదాలు = ['ciao', 'mondo', 'PYTHON', 'java']`, కనీసం ఒక పదం పెద్ద అక్షరం (.isupper()) ఉందో లేదో తనిఖీ చేయడానికి జనరేటర్ వ్యక్తీకరణతో ఏదైనా()ని ఉపయోగించండి. ఫలితాన్ని `has_uppercase`కి కేటాయించండి. `అప్పర్కేస్_ఉంది`ని మూల్యాంకనం చేయండి.
సూచనను చూపించు
ఏదైనా (p.isupper() పదాలలో p కోసం)
3 ప్రయత్నాల తర్వాత పరిష్కారం లభిస్తుంది
అదనపు సవాలు
Use a generator expression passed directly to the `sum()` function to calculate the sum of the squares of all integers from 1 to 100 inclusive. Store the result in `total_sum` and evaluate it.
సూచనను చూపించు
మొత్తం_మొత్తం = మొత్తం (x**2 x కోసం పరిధి (1, 101)) అని వ్రాయండి. డబుల్ కుండలీకరణాలు అవసరం లేదు.
3 ప్రయత్నాల తర్వాత పరిష్కారం లభిస్తుంది