[Coding The Matrix] 코딩 더 매트릭스 - Chapter 1 함수
# -*- coding: utf-8 -*-
from myutil import consolePrintWithLineNumber as c # 파이썬이 자동으로 제공해주는 print 함수 대신 사용한다.
'''
Created on 2015. 8. 11.
@author: Administrator
'''
'''
1p
Chapter 1 함수
1.1
집합
중괄호
무한집합
유한집합
1.2 카테시안 곱
2p
1.3 함수
출력 : 입력의 상(image)
입력 : 출력의 원상(pre-image)
3p
f : 정의역 -> 공역(치역)
공역 : 함수값이 선택되는 집합(가능한 출력의 집합)
치역 : 모든 정의역 원소들에 대한 함수값들의 집합(실제로 함수값이 되는 공역 원소들의 집합)
<번역오류?>
Example 1.3.5
하지만 정의역의 어떤 원소도 소수로 매핑되지 않기 때문에
-> 하지만 치역의 어떤 원소도 소수로 매핑되지 않기 때문에
4p
함수
프로시저
계산문제
5p
항등함수
7p
역함수
전사함수(onto) : 공역 = 치역
8p
단사함수(one-to-one) : 정의역과 공역이 서로 각각 매칭됨.(중복되지 않음)
가역함수 : 역함수가 존재하는 함수
가역함수 <=> 단사함수 + 전사함수
'''
# 16p
c(100 // 5.1)
c(100 / 5.1)
c(6 / 11) # 파이썬2.x에서는 결과값이 0이지만 파이썬3.x에서는 0.5454545454이다.
c(44 + 11 * 4 - 6 / 11)
c(44 + 11 * 4)
c(1 * 60 * 24 * 7)
c(2304811 % 47)
c(2304811 // 47)
c(2304811 - (2304811 // 47) * 47)
# 17p
c(1e16 + 1)
c('문자')
c("문자'")
c("문자\"")
c('''문자"''')
c(5 == 4)
c(4 == 4)
c((673 + 909) % 3 == 0)
# 18p
x = -9
y = 1 / 2
c(2 ** (y + 1 / 2) if x + 10 < 0 else 2 ** (y - 1 / 2))
# 19p
# 집합(Set) : 순서없음, 중복없음, 중괄호{}, 집합 포함 불가능(변경 불가능한 자료형)
c({1 + 2, 3, "a"})
c(sum({1, 2, 3}, 10))
S = {1, 2, 3}
c(2 in S)
c(4 not in S)
# 20p
c({1, 2, 4} | {2, 3, 4})
c({1, 2, 4} & {2, 3, 4})
S = {1, 2, 3}
S.add(4)
S.remove(2)
c(S)
S.update({4, 5, 6})
c(S)
S.intersection_update({5, 6, 7, 8, 9})
c(S)
T = S
T.remove(5)
c(S)
# 21p
U = S.copy()
U.add(5)
c(S)
c({2 * x for x in {1, 2, 3}})
c({x ** 2 for x in {1, 2, 3, 4, 5}})
c({2 ** x for x in {0, 1, 2, 3, 4}})
c(S)
c({x * x for x in S | {5, 7}})
c({x * x for x in S | {5, 7} if x > 2})
# 22p
c({x * y for x in {1, 2, 3} for y in {2, 3, 4}})
# Task1.5.7
c({x * y for x in {1, 2, 3} for y in {12, 13, 14}})
c({x * y for x in {1, 2, 3} for y in {2, 3, 4} if x != y})
# Task1.5.8 ???? 문제가 이해가 안됨.
# Task1.5.9
S = {1, 2, 3, 4}
T = {3, 4, 5, 6}
c({x for x in S if x > 2 and x < 5})
# Remarks
# c({{1, 2}, 3})
# 에러메시지 - TypeError: unhashable type: 'set'
# unhashable이란 뜻은 hash값을 만들어 낼 수 없다는 뜻이다. '변경불가능한 집합' 과 이것이 어떤 관련이 있는지 모르겠다.
# 23p
# 리스트(List) : 순서있음, 중복있음, 대괄호[], 집합 또는 다른 리스트 포함 가능(변경가능한 자료형)
c([1, 1 + 1, 3, 2, 3])
c([[1, 1 + 1], {2, 3, 4, 2}, 'yo'])
c(len([[1, 1 + 1], {2, 3, 4, 2}, 'yo']))
c(sum([1, 2, 0, 1, 0, 3]))
c(sum([1, 2, 0, 1, 0, 3], -2))
c(sum([20, 10, 15, 75]) / 4)
c([1, 2, 3] + ["my", 'word'])
mylist = [4, 8, 12]
c(mylist + ['m', 'y'])
c(mylist)
# 24p
# sum은 집합<숫자>이나 리스트<숫자>에 대해서는 숫자 합산 기능.
# 리스트<리스트>인 경우는 리스트를 합치는 기능을 한다. 두번째 자리에 [] 필수
# TypeError: unsupported operand type(s) for +: 'int' and 'list'
# sum의 두번째 인수는 default로 숫자 자리인가 보다. 그런데 리스트를 합칠때 두번째 자리를 비워두면, 리스트와 단순한 숫자를 합치게 되므로 오류!!! 그래서 그 자리에 빈 리스트[]
c(sum([[1, 2, 3], [4, 5, 6], ['y']], []))
c([2 * x for x in {2, 1, 3, 4, 5}]) # 집합(순서없음)
c([2 * x for x in [2, 1, 3, 4, 5]]) # 리스트(순서유지)
c([x * y for x in [1, 2, 3] for y in [10, 20, 30]])
c([[x, y] for x in ['A', 'B', 'C'] for y in [1, 2, 3]])
# Task1.5.12
LofL = [[1, 2, 3, 4]]
c(sum(x) for x in LofL) # 왜?? 이렇게 나오지??
c([sum(x) for x in LofL]) # [10]
LofL = [[1, 2, 3, 4], [4, 4, 4, 4]]
c([sum(x) for x in LofL]) # [10, 16]
c(sum([sum(x) for x in LofL])) # 26
LofL = [[.25, .75, .1], [-1, 0], [4, 4, 4, 4]]
c(sum([sum(x) for x in LofL])) # 16.1
# 25p
c(mylist[0])
# c(['in', 'the', 'CIT'][9]) # 에러 IndexError: list index out of range
c(['in', 'the', 'CIT'][1])
L = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
c(L) # [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
# 인덱싱 [a:b]는 a <= x < b
c(L[:]) # [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
# c(L[0.5]) # 에러 TypeError: list indices must be integers, not float
c(L[1]) # 10
c(L[:5]) # [0, 10, 20, 30, 40]
c(L[5:]) # [50, 60, 70, 80, 90]
# 불연속 인덱싱 [a:b:c]는 a <= x < b and (x-a) % c == 0 , c>0 (a를 차감한 상대적인index부터 시작해서)
c(L[::]) # [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
c(L[::2]) # [0, 20, 40, 60, 80]
c(L[::3]) # [0, 30, 60, 90]
c(L[::-3]) # [90, 60, 30, 0] 예외적인 상황인듯
c(L[0:10:-3]) # [] 위와 같은 표현같은데 왜 결과가 없을까?
c(L[0::-3]) # [0] 그냥 c>0으로 사용하자 -_-;;
# c(L[0::0]) #에러 ValueError: slice step cannot be zero
# c(L[::-0.5]) #에러 TypeError: slice indices must be integers or None or have an __index__ method
c(L[2::2]) # [20, 40, 60, 80]
c(L[2:10:3]) # [20, 30, 40]
# 26p
# 언패킹
[x, y, z] = [4 * 1, 4 * 2, 4 * 3]
c(x, y, z)
x, y, z = [4 * 1, 4 * 2, 4 * 3] # 위와 같은데??
c(x, y, z)
# [x,y] = [4 * 1, 4 * 2, 4 * 3] #에러 ValueError: too many values to unpack (expected 2)
# [x, y, z] = [4 * 1, 4 * 2] # 에러 ValueError: need more than 2 values to unpack
listoflists = [[1, 1], [2, 4], [3, 9]]
c([y for [x, y] in listoflists])
# listoflists = [[1], [2], [3]]
# c([y for [x, y] in listoflists]) #에러 ValueError: need more than 1 value to unpack
mylist = [30, 20, 10]
mylist[1] = 0
c(mylist) # [30, 0, 10]
# mylist[0:1] = 1 #에러 TypeError: can only assign an iterable
# 튜플(Tuple) : 순서 있음, 변경불가, 집합의 원소가능, 괄호()
# 보통 파이썬 한국어 용어로 터플보단 튜플을 많이 사용하는 듯.
c((1, 1 + 3, 2))
c({0, (1, 2)} | {(3, 4, 5)})
# p27
mytuple = ('all', 'my', 'books')
c(mytuple[1])
c((1, {'a', 'b'}, 3.14)[2])
(a, b) = (1, 5 - 3)
c(a)
a, b = (1, 2)
c(b)
a, b = 1, 5 - 3
c(a, b)
c([y for (x, y) in [(1, 'a'), (2, 'b'), (3, 'c')]])
c((y for (x, y) in [(1, 'a'), (2, 'b'), (3, 'c')])) # 출력 generator object ...
# Task1.5.14
S = {-4, -2, 1, 2, 5, 0}
c([(i, j, k) for i in S for j in S for k in S if i + j + k == 0])
# Task1.5.15
c([(i, j, k) for i in S for j in S for k in S if i + j + k == 0 and (i, j, k) != (0, 0, 0)])
# Task1.5.16
c([(i, j, k) for i in S for j in S for k in S if i + j + k == 0 and (i, j, k) != (0, 0, 0)][0])
# S의 원소 중 합이 영이 되는 100-원소 터플이 있는지 결정하기를 원한다고 해 보자.
# S를 구성하는 정수가 아주 많을 경우에도 빠르고 확실하게 문제를 해결할 수 있는 방법이 있는가?(만약 있다면, 그 방법으로 Ph.D를 받을 수 있을 것이다.)
# > 헐~~~ 박사학위가...;;;;;;
# 28p
# 컬렉션 생성 및 변환
c(range(10)) # range(0, 10)
c(set(range(10)))
c(set({1, 2, 3}))
c(set([1, 2, 3]))
c(set((1, 2, 3)))
c(list({1, 2, 3}))
c(list([1, 2, 3]))
c(list((1, 2, 3)))
# 1.5.17
L = [1, 2, 3, 4, 5, 1, 2] # 중복값이 있는 경우
c(len(L)) # 7
c(len(list(set(L)))) # 5
'''
아직 잘 이해안됨
집합,리스트,튜플의 변경 가능, 변경 불가능에 대해서, - 실제로는 다 되는 것 같은데,,, 메모리 할당의 차이인가?
누구는 원소로 가능하고, 원소로 불가능한 이유....???
>> 정리:
변경불가능 : 집합, 튜플
변경가능 : 리스트
일반객체 : 숫자, 문자
집합의 원소 : 객체, 튜플
튜플의 원소 : 객체, 튜플, 집합, 리스트
리스트의 원소 : 객체, 튜플, 집합, 리스트
'''
# 제너레이터
c([i for i in range(10)]) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
c({i for i in range(10)}) # {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
c((i for i in range(10))) # 출력 generator object... 왜 튜플만,,,???
c(tuple(i for i in range(10))) # (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
# Range
c(sum({i * i for i in range(10)}))
c({i for i in range(100) if i % 2 == 1})
# 29p
# range(a,b) : a <= x < b
c(list(range(1, 6))) # [1, 2, 3, 4, 5]
# range(a,b,c) : a <= x < b and (x-a) % c == 0
c(list(range(1, 6, 2))) # [1, 3, 5]
# zip > 튜플생성
c(zip([1, 2, 3], [2, 4, 6])) # zip object...
c(list(zip([1, 2, 3], [2, 4, 6]))) # [(1, 2), (2, 4), (3, 6)]
c(set(zip([1, 2, 3], [2, 4, 6]))) # {(1, 2), (2, 4), (3, 6)}
characters = ['Neo', 'Morpheus', 'Trinity']
actors = ['Keanu', 'Laurence', 'Carrie-Anne']
c(set(zip(characters, actors)))
c([character + ' is played by ' + actor for (character, actor) in zip(characters, actors)])
# Taskask 1.5.19
L = ['A', 'B', 'C', 'D', 'E']
c(list(zip(list(range(5)), L)))
# Task.1.5.20
c([x + y for (x, y) in list(zip([10, 25, 40], [1, 15, 20]))])
# reversed
c([x * x for x in reversed([4, 5, 10])])
# 30p
# 딕셔너리, 순서없음, 중괄호{}, 집합에서 KEY:VALUE의 쌍으로 존재, KEY는 변경 불가능(KEY로 집합, 리스트, 딕셔너리 사용 불가)
c({2 + 1:'thr' + 'ee', 2 * 2:'fo' + 'ur'})
c({2 + 1:'thr' + 'ee', 2 + 1:'fo' + 'ur'}) # KEY 중복 불가
c({4:'four', 3:'three'}[4])
mydict = {'Neo':'Keanu', 'Morpheus':'Laurence'}
c(mydict['Neo'])
# c(mydict['Neo1']) # KeyError: 'Neo1'
# 31p
c('Oracle' in mydict) # False
c('Neo' in mydict) # True
c(1 in range(10)) # True
c(11 in range(10)) # False
c(mydict['Neo'] if 'Neo' in mydict else 'Not') # 이건 필터 if 가 아니다.
# Task1.5.21
dlist = [{'James':'Sean', 'director':'Terence'}, {'James':'AA', 'director':'BB'}, {'James':'CC', 'director':'DD'}]
k = 'James'
c([x[k] for x in dlist])
# Task1.5.22
dlist = [{'Bilbo':'Ian', 'Frodo':'Elijah'}, {'Bilbo':'mar', 'Thorin':'Rich'}]
k = 'Frodo'
c([x[k] if k in x else 'NOT PRESENT' for x in dlist])
mydict['Agent Smith'] = 'Hugo'
mydict['Neo'] = 'Philip'
c(mydict)
# 32p
c({k for (k, v) in [(3, 2), (4, 0), (100, 1)]})
c({k:v for (k, v) in [(3, 2), (4, 0), (100, 1)]})
c({(x, y) : x * y for x in [1, 2, 3] for y in [1, 2, 3]})
# Task1.5.23
c({k:k * k for k in range(100)})
# Task1.5.24 항등함수
D = {'red', 'white', 'blue'}
c({k:k for k in D}) # {'blue': 'blue', 'red': 'red', 'white': 'white'} 이게 맞나?
# Task1.5.25 좀... 어렵네;; > VALUE를 숫자조합으로 먼저 구해서, VALUE 로 KEY 를 만들어서 조합하자.
# 이걸 Java로 해야한다면,,, 많이 복잡하겠군;;;
base = 10 # 0 < base <= 10, 알파벳은 좀 무리다...
digits = set(range(base))
c([[x, y, z] for x in digits for y in digits for z in digits])
c({x * base ** 2 + y * base ** 1 + z : [x, y, z] for x in digits for y in digits for z in digits})
c(list(mydict.keys()))
c(set(mydict.values()))
# 33p
c([m for m in mydict.items()])
c([k + " is " + v for (k, v) in mydict.items()])
# Task1.5.26 문제 이해가 안됨;;
id2salary = {0:1000.0, 3:990, 1:1200.50}
names = ['Larry', 'Curly', '', 'Moe']
c([names[k] for (k, v) in id2salary.items()])
c({names[k]:id2salary[k] for (k, v) in id2salary.items()})
def twice(z): return 2 * z
c(twice(12)) # 24
c(twice([3, 4])) # [3, 4, 3, 4]
c(twice('abc12')) # abc12abc12
# 34p
def nextInts(L): return [k + 1 for k in L]
c(nextInts([1, 5, 7]))
def cubes(L): return [k ** 3 for k in L]
c(cubes([1, 2, 3]))
def dict2list(dct, keylist): return [dct[i] for i in keylist]
c(dict2list({'a':'A', 'b':'B', 'c':'C'}, ['b', 'c', 'a']))
def list2dict(L, keylist): return {k:v for (k, v) in zip(keylist, L)}
c(list2dict(['A', 'B', 'C'], ['a', 'b', 'c']))
def all_3_digit_numbers(base, digits): return {x * base ** 2 + y * base + z for x in digits for y in digits for z in digits}
c(all_3_digit_numbers(3, {0, 1, 2}))
# end
콘솔 결과
47 > 19.0
48 > 19.607843137254903
49 > 0.5454545454545454
50 > 87.45454545454545
51 > 88
53 > 10080
54 > 25
55 > 49038
56 > 25
59 > 1e+16
61 > 문자
62 > 문자'
63 > 문자"
64 > 문자"
66 > False
67 > True
68 > False
73 > 1.0
77 > {'a', 3}
78 > 16
80 > True
81 > True
84 > {1, 2, 3, 4}
85 > {2, 4}
90 > {1, 3, 4}
92 > {1, 3, 4, 5, 6}
94 > {5, 6}
97 > {6}
102 > {6}
104 > {2, 4, 6}
105 > {16, 1, 9, 25, 4}
107 > {8, 1, 2, 16, 4}
108 > {6}
109 > {25, 49, 36}
110 > {25, 49, 36}
113 > {2, 3, 4, 6, 8, 9, 12}
115 > {36, 39, 42, 12, 13, 14, 24, 26, 28}
116 > {2, 3, 4, 6, 8, 12}
122 > {3, 4}
131 > [1, 2, 3, 2, 3]
132 > [[1, 2], {2, 3, 4}, 'yo']
133 > 3
134 > 7
135 > 5
137 > 30.0
139 > [1, 2, 3, 'my', 'word']
141 > [4, 8, 12, 'm', 'y']
142 > [4, 8, 12]
149 > [1, 2, 3, 4, 5, 6, 'y']
151 > [2, 4, 6, 8, 10]
152 > [4, 2, 6, 8, 10]
154 > [10, 20, 30, 20, 40, 60, 30, 60, 90]
156 > [['A', 1], ['A', 2], ['A', 3], ['B', 1], ['B', 2], ['B', 3], ['C', 1], ['C', 2], ['C', 3]]
160 > at 0x027A4508>
161 > [10]
163 > [10, 16]
164 > 26
166 > 16.1
169 > 4
171 > the
174 > [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
177 > [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
179 > 10
180 > [0, 10, 20, 30, 40]
181 > [50, 60, 70, 80, 90]
184 > [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
185 > [0, 20, 40, 60, 80]
186 > [0, 30, 60, 90]
187 > [90, 60, 30, 0]
188 > []
189 > [0]
192 > [20, 40, 60, 80]
193 > [20, 50, 80]
198 > (4, 8, 12)
200 > (4, 8, 12)
206 > [1, 4, 9]
213 > [30, 0, 10]
218 > (1, 4, 2)
219 > {(1, 2), 0, (3, 4, 5)}
223 > my
224 > 3.14
227 > 1
229 > 2
232 > (1, 2)
234 > ['a', 'b', 'c']
235 > at 0x027A44E0>
239 > [(0, 0, 0), (0, 2, -2), (0, -2, 2), (1, 1, -2), (1, -2, 1), (2, 0, -2), (2, 2, -4), (2, -4, 2), (2, -2, 0), (-4, 2, 2), (-2, 0, 2), (-2, 1, 1), (-2, 2, 0)]
241 > [(0, 2, -2), (0, -2, 2), (1, 1, -2), (1, -2, 1), (2, 0, -2), (2, 2, -4), (2, -4, 2), (2, -2, 0), (-4, 2, 2), (-2, 0, 2), (-2, 1, 1), (-2, 2, 0)]
243 > (0, 2, -2)
251 > range(0, 10)
252 > {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
253 > {1, 2, 3}
254 > {1, 2, 3}
255 > {1, 2, 3}
256 > [1, 2, 3]
257 > [1, 2, 3]
258 > [1, 2, 3]
262 > 7
263 > 5
283 > [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
284 > {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
285 > at 0x027FE968>
286 > (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
289 > 285
290 > {1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 49, 51, 53, 55, 57, 59, 61, 63, 65, 67, 69, 71, 73, 75, 77, 79, 81, 83, 85, 87, 89, 91, 93, 95, 97, 99}
294 > [1, 2, 3, 4, 5]
296 > [1, 3, 5]
299 >
300 > [(1, 2), (2, 4), (3, 6)]
301 > {(1, 2), (2, 4), (3, 6)}
305 > {('Morpheus', 'Laurence'), ('Neo', 'Keanu'), ('Trinity', 'Carrie-Anne')}
306 > ['Neo is played by Keanu', 'Morpheus is played by Laurence', 'Trinity is played by Carrie-Anne']
310 > [(0, 'A'), (1, 'B'), (2, 'C'), (3, 'D'), (4, 'E')]
313 > [11, 40, 60]
316 > [100, 25, 16]
321 > {3: 'three', 4: 'four'}
322 > {3: 'four'}
325 > four
327 > Keanu
331 > False
332 > True
334 > True
335 > False
336 > Keanu
340 > ['Sean', 'AA', 'CC']
345 > ['Elijah', 'NOT PRESENT']
349 > {'Neo': 'Philip', 'Morpheus': 'Laurence', 'Agent Smith': 'Hugo'}
352 > {3, 4, 100}
353 > {100: 1, 3: 2, 4: 0}
354 > {(1, 2): 2, (3, 2): 6, (1, 3): 3, (2, 3): 6, (3, 3): 9, (2, 2): 4, (3, 1): 3, (1, 1): 1, (2, 1): 2}
357 > {0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81, 10: 100, 11: 121, 12: 144, 13: 169, 14: 196, 15: 225,,,,,,, 92: 8464, 93: 8649, 94: 8836, 95: 9025, 96: 9216, 97: 9409, 98: 9604, 99: 9801}
361 > {'red': 'red', 'blue': 'blue', 'white': 'white'}
367 > [[0, 0, 0], [0, 0, 1], [0, 0, 2], [0, 0, 3], [0, 0, 4], [0, 0, 5], [0, 0, 6], [0, 0, 7], [0, 0, 8], ,,,,,, [9, 9, 2], [9, 9, 3], [9, 9, 4], [9, 9, 5], [9, 9, 6], [9, 9, 7], [9, 9, 8], [9, 9, 9]]
368 > {0: [0, 0, 0], 1: [0, 0, 1], 2: [0, 0, 2], 3: [0, 0, 3], 4: [0, 0, 4], 5: [0, 0, 5], 6: [0, 0, 6],,,,, 995: [9, 9, 5], 996: [9, 9, 6], 997: [9, 9, 7], 998: [9, 9, 8], 999: [9, 9, 9]}
370 > ['Neo', 'Morpheus', 'Agent Smith']
371 > {'Philip', 'Hugo', 'Laurence'}
374 > [('Neo', 'Philip'), ('Morpheus', 'Laurence'), ('Agent Smith', 'Hugo')]
375 > ['Neo is Philip', 'Morpheus is Laurence', 'Agent Smith is Hugo']
380 > ['Larry', 'Curly', 'Moe']
381 > {'Curly': 1200.5, 'Larry': 1000.0, 'Moe': 990}
384 > 24
385 > [3, 4, 3, 4]
386 > abc12abc12
390 > [2, 6, 8]
393 > [1, 8, 27]
396 > ['B', 'C', 'A']
399 > {'a': 'A', 'c': 'C', 'b': 'B'}
402 > {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26}