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