ప్రధాన కంటెంట్‌కు వెళ్లండి
మాడ్యూల్ 6 · 4లో పాఠం 3కోర్సులో 23/36~10 min
మాడ్యూల్ పాఠాలు (3/4)

జనరేటర్ వ్యక్తీకరణ

ఒక జనరేటర్ వ్యక్తీకరణ అనేది జాబితా గ్రహణశక్తి వలె ఉంటుంది, కానీ దానితో కుండలీకరణాలు చదరపు బ్రాకెట్‌లకు బదులుగా. వ్యత్యాసం నాటకీయంగా ఉంది: ఇది మెమరీలో జాబితాను రూపొందించదు, ఇది మూలకాలను ఉత్పత్తి చేస్తుంది ఆన్-డిమాండ్, ఒక్కోసారి.

Python
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

సోమరితనం (సోమరితనం మూల్యాంకనం)

ఎవరైనా తదుపరి విలువను అడిగే వరకు జనరేటర్ ఏమీ చేయదు:

Python
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

ఇది అయిపోతుంది: అన్ని మూలకాలను వినియోగించిన తర్వాత, ఇది ఎప్పటికీ ఖాళీగా ఉంటుంది. దీన్ని మళ్లీ ఉపయోగించాలంటే, మీరు దాన్ని మళ్లీ సృష్టించాలి.

ఎప్పుడు ఉపయోగించాలి

మీరు ఫలితాలను క్రమానుగతంగా వినియోగించే ఫంక్షన్‌కు పంపినప్పుడు:

Python
total = sum(n * n for n in range(1_000_000))
# nessuna lista intermedia, memoria costante

sum, any, all, max, min, "".join(...) అన్నీ జనరేటర్లను అంగీకరిస్తాయి. ఔటర్ ఫంక్షన్‌కు కాల్ కుండలీకరణాలు మాత్రమే అవసరమైతే, మీరు చేయవచ్చు జనరేటర్ స్వంతంగా వదిలివేయండి:

Python
sum((n * n for n in range(10)))    # OK
sum(n * n for n in range(10))      # IDENTICO, più leggibile

any మరియు all: షార్ట్-సర్క్యూట్

any(...) మరియు all(...) సమాధానం పొందిన వెంటనే పునరావృతం చేయడం ఆపివేయండి. జనరేటర్‌తో, కింది మూలకాలు కూడా గణించబడవు.

Python
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)

సరళి: సోమరి పైప్‌లైన్

Python
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() వంటి మళ్లింపులను వినియోగించే ఫంక్షన్‌లకు నేరుగా వెళ్లడానికి సరైనవి. ఈ సందర్భంలో, మీరు జనరేటర్ వ్యక్తీకరణ యొక్క బయటి కుండలీకరణాలను వదిలివేయవచ్చు, కేవలం వ్రాయడం:

Python
squares_sum = sum(x**2 for x in range(10))

ఇది మీ కోడ్‌ను క్లీన్‌గా మరియు అధిక మెమరీ-సమర్థవంతంగా ఉంచుతుంది.

దీనిని ప్రయత్నించండి

వ్యాయామం#python.m6.l3.e1
ప్రయత్నాలు: 0లోడ్ అవుతోంది...

1 నుండి 100 (కలిసి) వరకు ఉన్న సంఖ్యల వర్గాలను మొత్తం () లోపల జనరేటర్ వ్యక్తీకరణను ఉపయోగించి గణించండి. దాన్ని `టాట్`కి కేటాయించండి. `టోట్`ని మూల్యాంకనం చేయండి.

ఎడిటర్ లోడ్ అవుతోంది…
సూచనను చూపించు

పరిధి(1, 101)లో 100 ఉన్నాయి.

3 ప్రయత్నాల తర్వాత పరిష్కారం లభిస్తుంది

వ్యాయామం సమీక్షించండి

వ్యాయామం#python.m6.l3.e2
ప్రయత్నాలు: 0లోడ్ అవుతోంది...

ఇచ్చిన `పదాలు = ['ciao', 'mondo', 'PYTHON', 'java']`, కనీసం ఒక పదం పెద్ద అక్షరం (.isupper()) ఉందో లేదో తనిఖీ చేయడానికి జనరేటర్ వ్యక్తీకరణతో ఏదైనా()ని ఉపయోగించండి. ఫలితాన్ని `has_uppercase`కి కేటాయించండి. `అప్పర్‌కేస్_ఉంది`ని మూల్యాంకనం చేయండి.

ఎడిటర్ లోడ్ అవుతోంది…
సూచనను చూపించు

ఏదైనా (p.isupper() పదాలలో p కోసం)

3 ప్రయత్నాల తర్వాత పరిష్కారం లభిస్తుంది

అదనపు సవాలు

వ్యాయామం#python.m6.l3.e3
ప్రయత్నాలు: 0లోడ్ అవుతోంది...

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 ప్రయత్నాల తర్వాత పరిష్కారం లభిస్తుంది