람다 형식은 인공지능 분야나 AutoCAD라는 설계 프로그램에서 쓰이는 Lisp 언어에서 물려받았다고 하는데요,
함수를 딱 한 줄만으로 만들게 해주는 기똥찬 방법입니다.
lambda 인자 : 표현식
다음은 두 수를 더하는 함수입니다.
>>> def hap(x, y):
… return x + y
…
>>> hap(10,20)
30
>>> (lambda x,y: x+y)(10, 20)
30
lambda 활용법
map(함수, 리스트)
이 함수는 함수와 리스트를 인자로 받습니다. 그렇죠?
그리고, 리스트로부터 원소를 하나씩 꺼내서 함수를 적용시킨 다음, 그 결과를 새로운 리스트에 담아준답니다. 말이 좀 복잡하죠?
그럴 때 예제를 보는 게 최고죠.
>>> map(lambda x: x**2, range(5))
[0, 1, 4, 9, 16]
위의 map 함수가 인자로 받은 함수는 lambda x: x**2구요, 리스트로는 range(5)를 받았습니다.
range 함수는 알고계시죠?
range(5) 라고 써주면 [0, 1, 2, 3, 4]라는 리스트를 돌려줍니다.
그리고 x**2 라는 것은 x 값을 제곱하라는 연산자죠.
reduce(함수, 순서형 자료)
형식은 위와 같구요, 순서형 자료(문자열, 리스트, 튜플)의 원소들을 누적적으로(?) 함수에 적용시킨답니다. 말이 진짜 어렵군요.
이것도 예제나 봅시다.
>>> reduce(lambda x,y: x+y, [0,1,2,3,4])
10
위의 예제는 먼저 0과 1을 더하고, 그 결과에 2를 더하고, 거기다가 3을 더하고, 또 4를 더한 값을 돌려줍니다.
한 마디로 전부 다 더하라는 겁니다.
Step 1: Representing Records
Using Lists
>>> bob = ['Bob Smith', 42, 30000, 'software']
>>> sue = ['Sue Jones', 45, 40000, 'hardware']
>>> bob[0], sue[2] # fetch name, pay
('Bob Smith', 40000)
>>> bob[0].split()[-1] # what's bob's last name?
'Smith'
>>> sue[2] *= 1.25 # give sue a 25% raise
>>> sue
['Sue Jones', 45, 50000.0, 'hardware']
A database list >>> people = [bob, sue] # reference in list of lists >>> for person in people: print(person) ['Bob Smith', 42, 30000, 'software'] ['Sue Jones', 45, 50000.0, 'hardware'] >>> people[1][0] 'Sue Jones' >>> for person in people: print(person[0].split()[-1]) # print last names person[2] *= 1.20 # give each a 20% raise Smith Jones >>> for person in people: print(person[2]) # check new pay 36000.0 60000.0 >>> pays = [person[2] for person in people] # collect all pay >>> pays [36000.0, 60000.0] lambda : the eleventh letter of the Greek alphabet. See table at GREEK >>> pays = map((lambda x: x[2]), people) # ditto (map is a generator in 3.X) >>> list(pays) [36000.0, 60000.0] >>> sum(person[2] for person in people) # generator expression, sum built-in 96000.0 >>> people.append(['Tom', 50, 0, None]) >>> len(people) 3 >>> people[-1][0] 'Tom'
Field labels >>> NAME, AGE, PAY = range(3) # 0, 1, and 2 >>> bob = ['Bob Smith', 42, 10000] >>> bob[NAME] 'Bob Smith' >>> PAY, bob[PAY] (2, 10000) >>> bob = [['name', 'Bob Smith'], ['age', 42], ['pay', 10000]] >>> sue = [['name', 'Sue Jones'], ['age', 45], ['pay', 20000]] >>> people = [bob, sue] >>> for person in people: print(person[0][1], person[2][1]) # name, pay Step 1: Representing Records | 7 Bob Smith 10000 Sue Jones 20000 >>> [person[0][1] for person in people] # collect names ['Bob Smith', 'Sue Jones'] >>> for person in people: print(person[0][1].split()[-1]) # get last names person[2][1] *= 1.10 # give a 10% raise Smith Jones >>> for person in people: print(person[2]) ['pay', 11000.0] ['pay', 22000.0] >>> for person in people: for (name, value) in person: if name == 'name': print(value) # find a specific field Bob Smith Sue Jones >>> def field(record, label): for (fname, fvalue) in record: if fname == label: # find any field by name return fvalue >>> field(bob, 'name') 'Bob Smith' >>> field(sue, 'pay') 22000.0 >>> for rec in people: print(field(rec, 'age')) # print all ages 42 45
Using Dictionaries
>>> bob = {'name': 'Bob Smith', 'age': 42, 'pay': 30000, 'job': 'dev'}
>>> sue = {'name': 'Sue Jones', 'age': 45, 'pay': 40000, 'job': 'hdw'}
>>> bob = {'name': 'Bob Smith', 'age': 42, 'pay': 30000, 'job': 'dev'}
>>> sue = {'name': 'Sue Jones', 'age': 45, 'pay': 40000, 'job': 'hdw'}
Other ways to make dictionaries
>>> bob = dict(name='Bob Smith', age=42, pay=30000, job='dev')
>>> sue = dict(name='Sue Jones', age=45, pay=40000, job='hdw')
>>> bob {'pay': 30000, 'job': 'dev', 'age': 42, 'name': 'Bob Smith'}
>>> sue {'pay': 40000, 'job': 'hdw', 'age': 45, 'name': 'Sue Jones'}
>>> sue = {} >>> sue['name'] = 'Sue Jones'
>>> sue['age'] = 45
>>> sue['pay'] = 40000
>>> sue['job'] = 'hdw'
>>> sue {'job': 'hdw', 'pay': 40000, 'age': 45, 'name': 'Sue Jones'}
by zipping together name/value lists:
>>> names = ['name', 'age', 'pay', 'job']
>>> values = ['Sue Jones', 45, 40000, 'hdw']
>>> list(zip(names, values)) [('name', 'Sue Jones'), ('age', 45), ('pay', 40000), ('job', 'hdw')]
>>> sue = dict(zip(names, values))
>>> sue {'job': 'hdw', 'pay': 40000, 'age': 45, 'name': 'Sue Jones'}
by zipping together name/value lists:
>>> names = ['name', 'age', 'pay', 'job']
>>> values = ['Sue Jones', 45, 40000, 'hdw']
>>> list(zip(names, values))
[('name', 'Sue Jones'), ('age', 45), ('pay', 40000), ('job', 'hdw')]
>>> sue = dict(zip(names, values))
>>> sue
{'job': 'hdw', 'pay': 40000, 'age': 45, 'name': 'Sue Jones'}
>>> fields = ('name', 'age', 'job', 'pay')
>>> record = dict.fromkeys(fields, '?')
>>> record
{'job': '?', 'pay': '?', 'age': '?', 'name': '?'}
Lists of dictionaries
>>> bob
{'pay': 30000, 'job': 'dev', 'age': 42, 'name': 'Bob Smith'}
>>> sue
{'job': 'hdw', 'pay': 40000, 'age': 45, 'name': 'Sue Jones'}
>>> people = [bob, sue] # reference in a list
>>> for person in people:
print(person['name'], person['pay'], sep=', ') # all name, pay
Bob Smith, 30000
Sue Jones, 40000
>>> for person in people:
if person['name'] == 'Sue Jones': # fetch sue's pay
print(person['pay'])
40000
>>> names = [person['name'] for person in people] # collect names
>>> names
['Bob Smith', 'Sue Jones']
>>> list(map((lambda x: x['name']), people)) # ditto, generate
['Bob Smith', 'Sue Jones']
>>> sum(person['pay'] for person in people) # sum all pay
70000
