தொகுதி பாடங்கள் (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 வரையிலான எண்களின் சதுரங்களின் கூட்டுத்தொகையை (உள்ளடக்க) கூட்டுத்தொகை () க்குள் ஒரு ஜெனரேட்டர் வெளிப்பாட்டைப் பயன்படுத்தி கணக்கிடவும். அதை `tot` க்கு ஒதுக்கவும். `tot` மதிப்பிடவும்.
குறிப்பைக் காட்டு
வரம்பு(1, 101) 100ஐ உள்ளடக்கியது.
3 முயற்சிகளுக்குப் பிறகு தீர்வு கிடைக்கும்
மதிப்பாய்வு பயிற்சி
கொடுக்கப்பட்ட `வார்த்தைகள் = ['ciao', 'mondo', 'PYTHON', 'java']`, குறைந்தபட்சம் ஒரு வார்த்தை பெரிய எழுத்தாக உள்ளதா (.isupper()) என்பதைச் சரிபார்க்க, ஜெனரேட்டர் வெளிப்பாட்டுடன் ஏதேனும்() ஐப் பயன்படுத்தவும். முடிவை `has_uppercase` க்கு ஒதுக்கவும். `உள்ளது_பெரிய எழுத்து` என்பதை மதிப்பிடவும்.
குறிப்பைக் காட்டு
ஏதாவது(p.isupper() க்கு வார்த்தைகளில்)
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 க்கு வரம்பில் (1, 101)) எழுதவும். இரட்டை அடைப்புக்குறிகள் தேவையில்லை.
3 முயற்சிகளுக்குப் பிறகு தீர்வு கிடைக்கும்