Basic Nested Dictionary in a Loop
Ganesh Pal
ganesh1pal at gmail.com
Tue Apr 4 12:07:56 EDT 2017
Thanks Peter , Terry and others !
On Tue, Apr 4, 2017 at 12:11 PM, Peter Otten <__peter__ at web.de> wrote:
> Ganesh Pal wrote:
>
> >>
> >>
> >> Whenever you feel the urge to write range(len(whatever)) -- resist that
> >> temptation, and you'll end up with better Python code ;)
> >>
> >>
> > Thanks for this suggestion but for my better understanding can explain
> > this further even Steve did point the same mistake.
>
> It's not directly a mistake, it's just that programming against a smaller
> interface makes your code more flexible and more readable.
>
> Readability:
>
> items = [...]
> for i in range(len(items)):
> ...
>
> Are list entries replaced? We cannot know without inspecting the for suite.
>
> items = [...]
> for item in items:
> ...
>
> Are list entries replaced? No.
>
> Flexibility:
>
> def give_raise(employees, amount):
> for i in range(len(items)):
> employee = employees[i]
> employee.payment += amount
>
> employees = [...]
> give_raise(employees, 10)
>
> Now let's adapt the code to raise the payment of some employees:
>
> male_employees = [
> employees[i] for i in range(len(employees))
> if e.sex == "male"
> ]
> give_raise(male_emplyees, 10)
>
> We need a helper list, basically because there is a len() call inside the
> give_raise() function. If we rewrite the function in an idiomatic way
>
> def give_raise(employees, amount):
> for employee in employees:
> employee.payment += amount
>
> it will become not just more concise, the calling code no longer needs to
> build the intermediate list. Instead we save the extra memory and pass a
> generator expression:
>
> give_raise((e for e in employees if e.sex == "female"), 10)
>
> In a similar way you can write code that iterates over data that is lazily
> read into memory, like lines in a file
>
> # wrong, reads the whole file into memory
> lines = open(...).readlines()
> for i in range(len(lines)):
> process(lines[i])
>
> # idiomatic, read the lines as needed
> for line in open(...):
> process(line)
>
> or records from a database.
>
>
>
> --
> https://mail.python.org/mailman/listinfo/python-list
>
More information about the Python-list
mailing list