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