முக்கிய உள்ளடக்கத்திற்குச் செல்லவும்
தொகுதி 6 · பாடம் 3 இன் 4பாடத்திட்டத்தில் 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 வரையிலான எண்களின் சதுரங்களின் கூட்டுத்தொகையை (உள்ளடக்க) கூட்டுத்தொகை () க்குள் ஒரு ஜெனரேட்டர் வெளிப்பாட்டைப் பயன்படுத்தி கணக்கிடவும். அதை `tot` க்கு ஒதுக்கவும். `tot` மதிப்பிடவும்.

எடிட்டரை ஏற்றுகிறது…
குறிப்பைக் காட்டு

வரம்பு(1, 101) 100ஐ உள்ளடக்கியது.

3 முயற்சிகளுக்குப் பிறகு தீர்வு கிடைக்கும்

மதிப்பாய்வு பயிற்சி

உடற்பயிற்சி#python.m6.l3.e2
முயற்சிகள்: 0ஏற்றுகிறது…

கொடுக்கப்பட்ட `வார்த்தைகள் = ['ciao', 'mondo', 'PYTHON', 'java']`, குறைந்தபட்சம் ஒரு வார்த்தை பெரிய எழுத்தாக உள்ளதா (.isupper()) என்பதைச் சரிபார்க்க, ஜெனரேட்டர் வெளிப்பாட்டுடன் ஏதேனும்() ஐப் பயன்படுத்தவும். முடிவை `has_uppercase` க்கு ஒதுக்கவும். `உள்ளது_பெரிய எழுத்து` என்பதை மதிப்பிடவும்.

எடிட்டரை ஏற்றுகிறது…
குறிப்பைக் காட்டு

ஏதாவது(p.isupper() க்கு வார்த்தைகளில்)

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 க்கு வரம்பில் (1, 101)) எழுதவும். இரட்டை அடைப்புக்குறிகள் தேவையில்லை.

3 முயற்சிகளுக்குப் பிறகு தீர்வு கிடைக்கும்