4 ms·
Forgive the amateur question: when would one absolutely need to have a function defined inline?
by lazzlazzlazz 14y ago
Forgive the amateur question: when would one absolutely need to have a function defined inline?
- csense 14y agoIt's not a matter of absolute need; it's a matter of shortening functions. For example, say I have a list of username and number of posts: users = [["user1", 500], ["n00b", 15], ["thebestuser", 177]] I want to sort the users according to number of posts. The sorted() function takes a parameter key=, you can do it this way without lambda: def get_users_by_posts(): def get_post_count(user): return user[1] return sorted(users, key=get_post_count) The lambda implementation is a one-liner: def get_users_by_posts(): return sorted(users, key=lambda u : u[1]) Well, technically a twoliner, unless you use lambda more aggressively than most people: get_users_by_posts = lambda : sorted(users, key=lambda u : u[1]) In general, you can always expand your lambda's into def's, but it can make your code longer and pollute the code with named functions that do trivial things.
- _ZeD_ 14y agowell, in this particular case, operator.itemgetter is your friend :D import operator def get_users_by_posts(): return sorted(users, key=operator.itemgetter(1)) then, if you really want to, you can use functools.partial to fill the parameters from functools import partial from operator import itemgetter get_users_by_posts = partial(sorted, users, key=itemgetter(1))
- anthonyb 14y agoNo, don't do this. The people maintaining your code will hate you if everything is an unnamed lambda. A better way to do it is to take your core data structure, in this case a user, and turn it into a class, dictionary or named tuple. Classes are the best way - there are all sorts of ways to put a nice interface on them. For example: class User(object): def __init__(self, name, post_count): self.name = name self.post_count = post_count def __repr__(self): return '<User name="%s", post_count="%s">' % (self.name, self.post_count) def __cmp__(self, other_user): # larger is better return -cmp(self.post_count, other_user.post_count) # set up data users_ = [["user1", 500], ["n00b", 15], ["thebestuser", 177]] users = [] for user in users_: users.append(User(*user)) print users # sort users by post count by default print sorted(users)