π’ TL:DR :
Dealing with data structures is not a big deal if you are using python, isn't it ?
If it is a big deal, then take look at conversation.
Here, we have 2 noob coders .
π Chintu and π·Mintu. π· Mintu is technical client in the room and Chintu is A-K-A a developer. Hence, πChintu is implementing the requirements of his client, which are changing very fast (as we all know).
[ M : Mintu, C: Chintu]
π· M : I want to generate a list of even numbers from 1 to N, but not with classical for.... in loop with range() and all that. Instead with something different
π C : Ok ! this is my try
n = 100
allSum = [num for num in range(1, n+ 1) if num % 2 == 0 ]
print(allSum)
π· M : Ooops ! I want square of each number, once they are in a list....
π C : No worries
n = 100
allSum = [num**2 for num in range(1, n+ 1) if num % 2 == 0 ]
print(allSum)
π· M : Yahh... It will be pretty nice if it contains original numbers also
π C : Ok ! Here we go
n = 100
allSum = [[num, num**2] for num in range(1, n+ 1) if num % 2 == 0 ]
print(allSum)
π· M : Awesome !!! but, now I want dictionary of original and squared number instead of nested lists
π C : Fine ! I have this
n = 100
allSum = [{num: num**2} for num in range(1, n+ 1) if num % 2 == 0 ]
print(allSum)
π· M : Great ! but, now I think all should be in a SET, but by using your previous code
π C : Ok Fine ! see this
n = 100
allSum = {num**2 for num in range(1, n+ 1) if num % 2 == 0 }
print(allSum)
π· M : Cool ! But, now I want iterator instead of the whole list at once
π C : OK Sir !
n = 100
allSum = iter([num**2 for num in range(1, n+ 1) if num % 2 == 0])
print(next(allSum ))
π· M : can you explain why we should prefer ** list iterator ** instead of the normal list ?
π C : Yup ! List iterator are kind of generator object in nature, which are used to comprehensively yield the values when we call the next() on the object of iterator. The real benefit of creating generator is, that they don't consume memory before actual yielding / producing the value. This saves a lot of runtime memory and gives out programme a free space to use.
Application of this would be like, if we have a database transaction which requires millions of rows to complete the process. In this scenario, if we loaded the data using normal data structure like list, then CPU have to pre-load whole data before actual using it and then proceed further, instead we can use generator / iterator object which yields the value at runtime once anyone demanded.
π· M : Nice ! but can you create this
π C : Are you kidding me ! It is so simple
allSum = [i for i in range(0, 7) for j in range (0, i)]
print(allSum)
π€ M : Kinda cool ! I declare you are not NOOB Now
π Final Thoughts :
This are some comprehensions which anyone can use in their day to day programming usage.
This makes our makes our code more readable and more concise. Although, it is every individual's choice about preferring or not preferring the comprehensions. Here, I am putting my simple try for the comprehension.
Thanks for Reading ππ