python basic

람다 형식은 인공지능 분야나 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

Leave a Reply

Your email address will not be published.