익명함수 (lambda)

  파이썬에서 "lambda" 는 런타임에 생성해서 사용할 수 있는 익명 함수 입니다. 이것은 함수형 프로그래밍 언어에서 lambda와 정확히 똑같은 것은 아니지만,  파이썬에 잘 통합되어 있으며 filter(), map(), reduce()와  같은 전형적인 기능 개념과 함께 사용되는 매우 강력한 개념이다.

  lambda는 쓰고 버리는 일시적인 함수 입니다. 함수가 생성된 곳에서만 필요합니다. 즉, 간단한 기능을 일반적인 함수와 같이 정의해두고 쓰는 것이 아니고 필요한 곳에서 즉시 사용하고 버릴 수 있습니다.

람다 사용예제
>>> def inc(n): 
	return lambda x: x + n 
>>> f = inc(2) 
>>> g = inc(4) 
>>> print(f(12)) 14 
>>> print(g(12)) 16 
>>> print(inc(2)(12)) 14 
>>>

  위의 코드는 inc 함수로 lambda 함수를 즉석에서 생성하고 반환 하는 함수를 정의 합니다. 리턴 된 함수는 인수를 작성시 지정된 값만큼 증가시킵니다.

 

 

map() 함수

람다 함수의 장점은 map() 함수와 함께 사용될 때 볼 수 있습니다.  map() 은 두 개의 인수를 가지는 함수입니다.

r = map(function, iterable, ...)

  첫 번째 인자 function 는 함수의 이름 입니다. 두 번째 인자 iterable은 한번에 하나의 멤버를 반환할 수 있는 객체 입니다.(list, str, tuple) map() 함수는 function을 iterable의 모든 요소에 대해 적용합니다. 그리고 function에 의해 변경된  iterator를 반환합니다.

>>> a = [1,2,3,4] 
>>> b = [17,12,11,10] 
>>> list(map(lambda x, y:x+y, a,b)) 
	[18, 14, 14, 14]

 

 

filter() 함수

  filter() 함수도 두 개의 인자를 가집니다.

  r = filter(function, iterable)

  filter에 인자로 사용되는 function은 처리되는 각각의 요소에 대해 Boolean 값을 반환합니다. True를 반환하면 그 요소는 남게 되고, False 를 반환하면 그 요소는 제거 됩니다.

>>> foo = [2, 18, 9, 22, 17, 24, 8, 12, 27] 
>>> list( filter(lambda x: x % 3 == 0, foo) ) 
	[18, 9, 24, 12, 27]

 

reduce() 함수

  reduce() 함수를 두 개의 필수 인자와 하나의 옵션 인자를 가지는데, function 을 사용해서 iterable을 하나의 값으로 줄입니다. initializer 는 주어지면 첫 번째 인자로 추가 된다고 생각하면 됩니다.

  functools.reduce(function, iterable[, initializer])

  예를 들어 reduce(function, [1,2,3,4,5]) 에서 list 는 [function(1,2),3,4,5] 로 하나의 요소가 줄고, 요소가 하나가 남을 때까지 reduce(function, [function(1,2),3,4,5]) 를 반복합니다.

>>> from functools import reduce 
>>> reduce(lambda x,y: x+y, [1,2,3,4,5]) 
	15

 

💬 내용 요약

  이창용 한국은행 신임 총재는 최근 원·달러 환율이 1250원을 향해 고공행진을 이어가고 있는 현상에 대해 “미국의 기준금리가 올라가는 상황에서 원화 약세가 나타나고 있지만, 원화 절하폭이 다른 주요국에 비해서는 크지 않다”고 말했다. 그는 기준금리 조정을 통해 한국은행이 원화 약세를 어느 정도 방어할 계획이 있는지 묻는 질문에 “환율은 정책 변수가 아니라 시장 변수라고 생각하기 때문에 환율에 초점을 맞춰 금리 조정을 하는 것은 바람직하지 않다”고 답했다.

  이 총재는 “앞으로 미 연방준비제도(Fed·연준)가 기준금리를 더 올리면서 원화가 더 절하 압력을 받을 가능성이 높다”면서도 환율 방어를 위한 통화정책 결정은 적절하지 않다고 평가했다. 그러면서 “원화 절하폭은 엔화나 유로화 등에 비해 심한 편은 아니다”라며 “엔화의 경우 미국과 일본의 금리 격차가 확대되면서 가치가 크게 떨어졌지만, 아직까지 원화는 달러화인덱스 상승폭과 비슷한 수준으로 절하됐다”고 했다.

  향후 한국은행의 기준금리 인상 시점과 속도과 관련해서는 기존의 원론적인 입장을 유지했다. 이 총재는 “성장과 물가가 모두 우려되는 상황이지만, 현재까지는 물가가 더 걱정되기 때문에 통화정책이 정상화되는 방향으로 가야 한다”고 말했다. 그러나 기준금리 인상 속도는 성장과 물가 관련 구체적인 데이터를 보고 결정하겠다면서 “5월과 7월에 금리를 계속 올릴지는 한 방향으로 이야기하기 어렵다”고 밝혔다.

  이 총재는 “성장은 우크라이나 사태, 유럽 경제 등 해외 요인이라는 변수가 있고, 국내 요인으로는 사회적 거리두기가 완화되면서 소비가 증가할 가능성도 있어서 추이를 더 지켜봐야 한다”고 설명했다. 물가에 대해서는 “유가, 곡물가격이 어느 정도 시차(lag)를 두고 영향을 줄지 봐야 한다”며 “지난달 소비자물가 상승률이 4%를 넘었는데 이보다 더 올라갈지 봐야 한다”고 했다. 나아가 “5월 기준금리 결정에 가장 큰 영향을 미칠 변수는 미 연방공개시장위원회(FOMC)”라면서 연준의 금리 결정에 따른 자본 유출입이라 환율 움직임을 면밀히 검토하겠다고 답했다.

  이 총재는 단기적으로는 성장률이 오미크론 확산, 우크라이나 전쟁 등 대내외 요인에 따라 바뀔 수 있지만, 중장기 성장률은 고령화 등 구조적 변화의 영향으로 둔화될 가능성이 높은 만큼 한국 경제가 민간 주도의 생산성 제고에 힘써야 한다고 조언했다.

  이 총재는 단기적으로는 금리인상을 시사하면서도 “장기적으로는 비둘기파(통화 완화 선호) 총재가 되고자 한다”고 말했다. 그는 “재정·통화정책보다는 민간이 생산성을 높이는 방식으로 성장 구조를 바꿔 장기 성장률이 크게 떨어지지 않도록 노력해야 한다”고 했다.

  한국은행의 정책 목표에 물가·금융 안정 외에 고용 안정을 더해야 한다는 주장에 대해서는 “경기변동상의 고용안정이라면 정책 목표에 추가해도 괜찮다”고 했다. 다만 정치권에서 생각하는 고용 안정이 고용 창출이나 고용 극대화 등을 포함한다면 한국은행이 담당해서는 안될 부분이라고 강조했다. 이 총재는 “고용 창출은 민간이 해야 하는 일이지, 정부가 하려고 하면 굉장히 많은 부작용이 생기고 지속가능하지 않다”고 했다.

 

 

💭 생각 정리

  3월 소비자물가 상승률이 4.1% 를 기록한 상황에서 금리 인상 계획을 묻는 질문에 환율의 약세 때문에 금리를 인상하지는 않겠다 라고 답한 상황이다. 즉 경기침체보다 물가상승을 억제하는 부분이 현재 당면한 문제라는 것이다. 현재 IMF에서 우리나라의 경제성장률을 2%대로 예상한 가운데 금리인상은 경기성장률을 보다 감소시킬 것이므로 신중하게 결정해야 할 문제라는 것이다. 

  또한 물가상승 전체에서 에너지 가격 상승이 차지하는 부분이 크기 때문에 아직은 섣부른 금리인상을 조심하고 있는 것 같다. 하지만 에너지 가격의 상승으로 시작해 관련된 물가의 상승도 이루어지고 있다. 그래서 소비자 물가 말고도 수출입물가지수를 살펴보았는데 아래처럼 원자재의 상승률이 73.9 %로 눈에 띄는 것을 확인할 수 있다. 

출처 : 기획재정부

  미국의 금리를 상승하며 통화정책을 긴축으로 전환한다면 정작 위험에 빠질 곳은 미국이 아니라 다른 나라들이다. 미국에 따라 금리를 올리지 못하게 되면 외화의 유출이 일어나게 될텐데 그 과정에서 투자위축, 실업증가 등의 심각한 문제들을 겪게된다. 그렇기 때문에 여러 나라들이 앞다퉈 금리를 올리고 있는 이유이다. 

 

📌 용어 정리  

  • 비둘기파

  비둘기파란 정치·사상·언론 또는 행동 따위가 과격하지 않고 온건한 방법을 취하려는 사람을 뜻하는 말이다. 비둘기파는 온순한 비둘기의 비유적인 표현으로, 베트남전쟁의 확대·강화를 주장했던 매파에 대립하여 이들은 전쟁을 더 이상 확대시키지 않고 한정된 범위 안에서 해결할 것을 주장하였다.

  • 올빼미파

어느 한쪽으로 의견을 편향하기보다는 중간에서 지켜보는 관찰자적 모습을 올빼미에 비유한 것입니다. '올빼미파'는 사회경제적 상황에 따라서 금리 인상 여부를 결정하자는 주장을 하는 사람들을 일컫습니다.

 

 

[출처]

https://biz.chosun.com/policy/policy_sub/2022/04/25/2ERIUAY26BD3ZJQP772VDWBZVM/?utm_source=naver&utm_medium=original&utm_campaign=biz https://www.index.go.kr/potal/main/EachDtlPageDetail.do?idx_cd=1062 

https://www.mk.co.kr/dic/

 

💬 내용 요약

주요 은행의 1분기 이자이익 증대에는 순이자마진(NIM) 개선세가 한몫했다. 금리가 크게 올랐고 증권사에서 은행으로 '역머니무브'한 저원가성예금이 효자 역할을 했다. 향후 기준금리 추가 인상이 예고된 만큼 NIM 개선세는 연중 이어질 것으로 전망된다.

24일 은행권에 따르면 KB국민·신한·우리·하나 4대 은행의 NIM은 1분기를 지나며 0.03~0.07%포인트 상승했다. 1.49~1.66% 수준이다. NIM 상승세 덕분에 이들 은행의 1분기 이자이익은 1년 전 같은기간과 비교해 18.3~22.1% 성장했다. 같은기간 비이자이익이 두자릿수 감소율을 보이거나 소폭 증가한 데 그친 것과 대조적이다.

은행 영업의 핵심인 '이자'가 은행 전체 이익을 방어한 셈이다. 금리상승기에 시장금리가 크게 상승해 자산 리프라이싱(Repricing·재산정) 효과가 쏠쏠했다. 이미 고정형(혼합형) 주택담보대출의 상단금리는 6% 중반대, 신용등급 1등급인 고신용자의 신용대출 상단금리는 5%대에 안착하는 등 금리 상승이 가파르게 진행됐다.

예금금리와 대출금리의 차이도 벌어져 이자이익이 늘어날 수 있었다. 신한은행의 예대금리차는 1.87%로 지난해 말, 1년 전과 비교해 다소 확대됐다. 예금금리 인상이 더딘 영향으로 보인다. 은행들은 최근 한국은행 기준금리 인상에 발맞춰 예·적금 등 수신금리를 최대 0.3~0.4%포인트 인상했다고 발표했지만 실제 평균 인상폭은 0.25%포인트에 그쳤다.

또 1분기 가계대출은 지난해 말보다 줄거나 비슷한 수준이었지만 기업대출이 늘어난 것도 NIM 상승에 기여했다. 특히 중소기업 대출의 성장세가 가팔랐는데 우리은행에서는 지난 2년간 매년 10% 이상의 성장 그래프를 그렸다. 중소기업 대출은 리스크가 크다고 평가되지만 우량자산 비중이 90%에 이르러 우려를 씻었다.

예금 영역에서도 호재가 잇따랐다. 빚투(빚내서 투자)가 시들해지자 증권사로 빠져나갔던 돈이 은행으로 '역머니무브'하면서 은행에 돈이 쌓였다. 특히 조달비용이 적게 드는 수시입출금식예금이 늘수록 은행에 이득이다. 정기예·적금은 1~4%대 금리가 나가지만 시중은행 수시입출금식예금의 금리는 0.1% 수준이다.

은행은 수시입출금식예금을 핵심예금, 저원가성예금 등으로 부르는데 1분기 핵심저원가성예금의 증가율은 전년동기대비 우리은행 12.9%, 하나은행 13.3% 등으로 두드러졌다. 같은기간 정기예·적금은 한자릿수 증가하거나 감소한 것과 대조적이다. 하나은행에서는 저금리성 예금 비중이 41.4%로 전분기보다 확대됐다.

앞으로도 은행 NIM은 개선세를 이어갈 것으로 보인다. 기준금리 추가 인상도 예고됐기 때문이다. 현재 연 1.5%로 오른 기준금리는 연내 2%까지 오를 것이란 전망이 나온다. 김재관 국민은행 CFO(최고재무책임자)·전무는 "당초 연간 NIM 0.07~0.08%포인트 상승할 것으로 전망했는데 현재는 0.1%포인트 내외 수준의 상승을 내다본다"고 말했다. 이어 "기준금리 인상이 선반영된 면도 있어 상승 속도가 둔화될 수도 있지만 지속적인 상승세는 이어질 것"이라고 했다.

[출처] https://n.news.naver.com/mnews/article/008/0004736958?sid=101

💭 생각 정리

 현재 우크라이나와 러시아의 전쟁상황과 코로나 등의 여러 이슈로 인해 물가상승이 심각한 수준이다. 3월 기준 미국의 물가는 7.9 % 상승하며 40여년 만의 최고수준의 상승률을 보여주고 있으며 한국의 경우에도 4.1%로 매우 높은 물가상승률을 보이고 있다. 이에 미국 연준(FOMC)은 빅스텝(0.5 % 금리 인상)을 에고한 가운데 시장에서는 자이언트 스텝(0.75% 나 1% 금리 인상)의 가능성도 배제할 수 없다는 상황이다.

 물가의 상승과 금리의 상승으로 인해 주식시장은 침체되어 있는 상황이라 주식시장의 자금들이 은행으로 들어오는 '역머니무브' 현상이 나타나고 있다고 한다. 이러한 상황에서 은행들의 순이자마진 개선추이는 지속되며 은행들 입장에서는 웃음지을만한 일이라 보인다. 하지만 고객들 입장에서는 그다지 반가운 소식은 아닐 것이다. 대출 금리는 시장금리의 상승에 맞춰 가파르게 상승하고 있지만, 예금 등의 금리는 큰 상승을 보여주지 못하고 있기 때문이다.

 은행 입장에서는 '역머니무브'로 늘어나는 자금을 금리인상 시기에 맞게 리프라이싱(re pricing)하여 수익률 개선에 힘 써야 할 것이고, 개인들의 입장에서는 금리인상 시기의 적절한 투자 방안을 모색해 자산 포트폴리오의 구조를 개선해야 할 필요가 있을 것이다. 예를 들면 금리 인상 시기에는 달러 투자나 은행(금융)주식 또는 은행 예적금 등의 투자 비중을 늘려야 할 필요가 있다. 

📌 용어 정리  

  • 순이자마진 [ NIM : Net Interest Margin ]

 은행 등 금융기관이 자산을 운용해 낸 수익에서 조달비용을 차감한 나머지를 운용자산 총액으로 나눈 수치. 금융기관의 수익성을 나타내는 지표다. 예금과 대출의 금리 차이에서 발생한 수익과 채권 등 유가증권에서 발생한 이자가 포함된다. 이자마진이 높을수록 은행 수익이 커진다.

 그러나 예대마진(대출금리에서 예금금리를 뺀 것)이 순이자마진을 좌우하기 때문에, 저금리로 예금을 유치해 고금리 대출한다는 비판을 받기도 한다.

  • 수시입출금식예금

 수시입출금식 예금이란 고객이 원하면 언제든지 조건 없이 지급하는 예금으로 현금과 유사한 유동성을 지녀 통화성예금 또는 요구불예금이라고 불린다.

  • 핵심성 예금

 은행이 적은 비용(금리)으로 자금을 조달할 수 있는 예금으로 저원가성 예금으로도 불린다. 금리가 연 0.1% 수준에 불과한 보통예금, 가계당좌예금, 별단예금 등 수시입출금식 예금이 해당된다. MMDA는 수시입출이 가능하긴 하나 예금액에 따라 금리가 달라지므로 핵심성 예금에선 제외한다.

  • 자산 리프라이싱 [ Asset Repricing ]

 자산 포트폴리오의 비중을 조절하는 작업

  • 고정형(혼합형) 주택담보대출 

 경제 주택을 담보물로 하여 금융기관에서 차입받는 일

 

[출처]

https://n.news.naver.com/mnews/article/008/0004736958?sid=101 

https://www.mk.co.kr/dic/

 

Experience is a dear teacher, but fools will learn at no other.

 소비자잉여 (Consumer's surplus)

소비자가 지불할 용의가 있는 최대가격과 실제 지불한 가격 간의 차이

 어떤 상품에 대해 소비자가 최대한 지불해도 좋다고 생각하는 가격인 수요 가격에서 실제로 지불하는 가격인 시장 가격을 뺀 차액. 소비자가 지불할 용의가 있는 최대가격과 실제로 지불한 가격간의 차이를 말한다. 소비자가 어떤 상품을 구매할 때 치르고자 하는 금액은 시장에서 실제 지불해야 하는 가격과 일치하지 않는 경우가 많다. 예를 들어 소비자 A는 물건 B에 1만원까지 지불할 용의가 있는데 9,000원만 주고 구입했다면 1,000원의 소비자 잉여가 발생한 것이다. 


 수익률곡선 (Yield Curve)

수익률의 기간구조를 나타내기 위해 이자율과 시간의 관계를 나타낸 곡선

 수익률의 기간구조를 나타내기 위해 이자율과 시간의 관계를 나타낸 곡선이다. 기대이자율 가설과 유동성 프리미엄 가설은 수익률 곡선의 모양을 잘 뒷받침하는 이론이다. 만기까지의 잔존기간과 채권수익률의 관계를 나타낸 곡선을 통해 수익률의 기간구조를 파악할 수 있다.


 파레토 최적 (Pareto Optimum)

이보다 효율적인 배분이 불가능한 상태

 경제학자 파레토의 '만족을 주는 힘의 극대' 라는 개념에서 유래된 것으로 효율적인 배분상태를 말한다. 1. 생산의 효율인 경우, 어느 한 재화의 생산량을 증가시키기 위해서는 다른 재화의 생산을 감소시켜야 하는 상태에 있으며, 2. 교환의 효율인 경우 어느 소비자의 효용을 증가시키기 위해서는 다른 소비자의 효용을 감소시키지 않으면 안 될 상태.  이 두 조건을 성립해야 파레토 최적상태라고 할 수 있다. 파레토 최적은 완전 경쟁시장에서 달성된다. 


 범위의 경제 (Economy of Scope)

여러 제품을 생산하는것이 각각의 개별 기업에서 생산하는 경우보다 생산비용이 적게 드는 것

 제품 1과 2를 q1단위 q2단위 생산하는 생산비를 각각 C(q1, 0), C(0, q2)라 하고, 이 두 제품을 결합생산할 때의 비용을 C(q1, q2)라 하자, 다음의 관계 C(q1, 0) + C(0, q2) > C(q1, q2)가 만족되면 범위의 경제가 있다고 할 수 있다. 대기업이 여러 자회사와 사업부를 가지고 있는 현상을 대변하는 이론적 근거가 된다. 생산요소가 복수의 생산과정에서 쓰이거나, 부산물이 다른 제품을 생산하는데 쓰이는 경우 범위의 경제가 발생할 수 있다. 

SC(범위의 경제)의 정도 = { C(q1, 0) + C(0, q2) + C(q1, q2) }  /  C(q1, q2)


 규모의 경제와 규모의 불경제

생산요소 투입량의 증대에 따른 생산비 절약 또는 수익 향상의 이익이 일어날 때가 규모의 경제

 기업이 생산량을 늘림에 따라 제품 하나를 만드는 단위당 비용이 하락하는 현상을 의미한다. 범위의 경제는 두 개 이상의 재화를 생산할 때 얻게 되는 비용 절감효과와 관련되며 규모의 경제는 특정 재화나 서비스의 생산량이 증가함에 따라 발생하는 절감효과와 관련된다. 한편, 모든 생산요소를 똑같은 비율로 증가시킬 때, 총 생산량이 생산요소의 증가율보다 더 작은 비율로 증가하는 현상은 규모의 불경제라고 한다. 규모에 대한 수익감소(Decreasing returns to scale)라고도 부른다.


 혼합경제

이중경제 (Dual Economy)라고도 하며 정부가 경제활동 분야에 개입하는 경제체제

 고전적인 자유방임의 자본주의는 기업이나 개인이라는 민간 경제주체의 자유로운 경제활동 위에 성립되는 것으로서, 가격결정기능에 의해 최선을 이루는 것으로 여겨졌다. 하지만 가격기능의 불완전성과 소득격차, 자원이용의 비효율성 등의 결함을 발견하고, 대공황과 같은 위기를 체험하고 나서 정부의 개입이 본격화되었다. 시장경제를 어디까지나 기본으로 하고 이를 공적 개입으로 보완한다는 점에서 사회주의 계획경제와 다르다.


 공유경제

물품을 소유의 개념이 아닌 서로 대여해 주고 차용해 쓰는 개념으로 인식하여 경제활동을 하는 것

 2008년 로렌스 레식에 의해 처음 사용된 말로, 한 번 생산된 제품을 여럿이 공유해 쓰는 협력소비를 기본으로 한 경제 방식이다. 활용도가 떨어지는 물건이나 부동산을 다른 사람들과 함께 공유함으로써 자원활용을 극대화하는 경제활동이다. 소유자 입장에서는 효율을 높이고, 구매자는 싼 값에 이용할 수 있다. 최근에는 경제침체와 환경오염에 대한 대안을 모색하는 사회운동으로 확대되었다.


 공공재

모든 개인이 공동으로 이용할 수 있는 재화 또는 서비스

 국방, 경찰, 소방, 공원, 도로 등과 같이 정부에 의해서만 공급할 수 있거나 그것이 바람직한 재화 또는 서비스이다. 공공재에는 보통 시장가격은 존재하지 않으며, 수익자부담원칙도 적용되지 않는다. 따라서 공공재 규모의 결정은 정치기구에 맡길 수 밖에 없다. 공공재의 성질로는 어떤 사람의 소비가 다른 사람의 소비를 방해하지 않고 여러 사람이 동시에 편익을 받을 수 있는 비경합성, 비선택성, 대가를 지급하지 않은 특정 개인을 소비에서 제외하지 않는 비배제성 등을 들 수 있다.


 경합성 & 배제성 (Contestability & Exclusiveness)

 한 사람이 더 많이 소비하면 다른 사람의 소비가 줄어드는 재화의 특성(경합성), 사람들이 재화를 소비하는 것을 막을 수 있는 가능성(배제성)

 예를 들어 일기예보와 같은 공공재는 비경합성과 비배제성을 갖는다. 즉 한사람의 소비가 다른 사람의 소비를 방해하지 않으며(비경합성), 사람들이 재화를 소비하는 것을 막을 수도 없다.(비배제성)

구분 경합성 비경합성
배제성 사유재(음식, 자동차, 옷 등) 클럽재(케이블방송, 소프트웨어, 전력 등)
비배제성 공유자원(물, 자연, 곽막힌 유료도로 등) 공공재(국방, 치안, 지상파 TV방송 등)

 대체재

한 재화의 가격이 하락(상승)할 때 다른 한 재화의 수요가 감소(증가)하면 두 재화는 서로 대체재

 대체재 관계에 있는 두 재화는 쌀과 밀처럼 서로 같은 효용을 얻을 수 있는 재화로, 경쟁재라고도 한다. 한 재화의 가격 상승으로 수요가 줄면 대체재의 수요는 증가한다. 


 보완재

두 재화를 동시에 소비할 때 효용이 증가하는 재화

 협동재라고도 부르며, 두 재화를 따로 소비했을 때의 효용을 합한 것 보다 빵과 버터처럼 함께 소비했을 때의 효용이 증가하는 재화를 말한다. 한 재화의 가격이 하락(상승)할 때 다른 한 재화의 수요가 증가(감소)하면 두 재화는 서로 보완재라고 할 수 있다.


 기회비용

어떤 선택으로 인해 포기된 기회들 가운데 가장 큰 가치를 갖는 기회 또는 기회가 갖는 가치

 하나를 선택하면 다른 대안들을 선택할 수 있는 기회는 포기해야 한다. 결국 선택된 하나의 비용은 포기한 다른 것에 대한 기회이다. 경제학에서는 이러한 선택의 비용을 '포기한 다른 선택에 대한 가치'로 측정하고, 이를 기회비용이라고 한다. 


  한계비용

한계생산비, 생산물 한 단위를 추가로 생산할 때 필요한 총비용의 증가분

 한계비용은 총비용 증가분의 생산량 증가분에 대한 비율로 표시하며, 총비용을 생산량으로 나눈 평균생산비와 함께 생산비함수이다. 생산량을 결정할 때 한계비용과 한계수입이 일치할 때까지 생산을 증가 또는 감소시킨다.

https://documen.site/download/5af28bc8ab4ad_pdf


  케인즈 경제학 (Keynesian Economics)

상품에 대한 총수요가 경제를 이끌어 간다는 소비 측면의 경제학 이론

 존 케인즈는 거시경제적 흐름이 각 개인들의 미시적 행동을 압도할 수 있다고 말한다. 경제적 과정을 잠재 생산의 지속적인 성장으로 보는 18세기 후반 이후 고전파 경제학자들의 관점과는 달리, 케인즈는 (특히 불황기에) 경제를 이끌어 가는 요소로서 상품에 대한 총수요를 강조했다. 그는 1930년대 높은 실업률과 디플레이션에 대처하기 위해 정부가 정책적으로 소비를 유도해야 한다고 논했다.


  손익분기점

일정기간의 수익과 비용이 일치해 이익도 손실도 나지 않는 경우의 매출액

 손익분기점 (Break even point)은 이익과 손실의 갈림길이 되는 매출액이다. 손익분기점 매출액을 구하기 위해서는 모든 비용을 고정비와 변동비로 분류해야 한다. 매출액에서 변동비를 공제한 차액을 한계이익이라 하고 한계이익을 매출액으로 나누면 한계이익률이 된다. 고정비를 한계이익률로 나누면 손익분기점 매출액이 된다. 

 손익분기점 = 고정비 / [1-(변동비/매출액)]

https://t1.daumcdn.net/cfile/tistory/2512564F577F604535


  당좌비율

당좌자산 / 유동부채 * 100

 당좌자산과 유동부채와의 비율을 표시한 것으로 유동비율과 함께 기업의 단기적 채무 지불능력을 측정하는 데 이용된다. 여기서 당좌자산은 유동자산 중 재고자산을 제외한 자산을 말하며 현금, 예금, 시장화할 수 있는 증권들을 포함한다. 당좌비율은 재무안정성의 지표로 간주되어 왔으며 대략 100% 이상이 바람직하다.

1. List 

  파이썬이 제공하는 시퀀스 자료구조인 리스트는 C언어 또는 Java언어에서 사용하는 배열(Array)과 가장 흡사하고, 스택(stack)과 큐(Queue)및 데크(Deque)를 구현할 때에도 자주 사용되는 자료구조이다. list는 여러 element로 구성되어 있으며, 문자열처럼 각 element들에 순서가 있고, 그 순서를 인덱스(index)라 한다. 따라서 인덱싱을 통해 각 element들의 불러들어 올 수 있다. 접근 및 사용이 용이하도록 다양한 기능의 함수를 제공하고 그만큼 많이 쓰이는 자료구조이다.

List 표현

  리스트는 대괄호'[]'으로 데이터들을 감싸며 표현하며, 감싸인 데이터들을 요소(element)라고 한다. element가 없는 비어있는 list(즉, empty_list)도 표현가능하다. element의 type이 Integer인경우 그대로 표현하고, string 일 경우 쌍따옴표("") 또는 홀따옴표('')로 감싸서 표현한다. element는 integer나 string등 같이 표현해도 되고, list안에 list로 element를 표현할 수 있다.

List의 특징을 다음과 같다

  • '[ ]'으로 element를 둘러싼다.
  • element들의 순서가 있다
  • element들의 생성, 삭제, 수정이 가능하다.
>>> a = []
>>> a = list()
>>> b = [1, 2, 3]
>>> C = ['Life', 'is', 'too', 'short']
>>> d = [1, 2, 'Life', 'good']
>>> e = [1, 2, ['Life', 'good']]

 

2. Tuple

  Tuple은 element들을 '()'로 감싸고 있어 List와 비슷한 역할을 하지만, 다른 특성을 가지고 있다. Tuple은 List처럼 elemnet들의 순서가 있지만 element값을 변경할 수 없다.

  Tuple의 특징을 다음과 같다

  • '( )'으로 element를 둘러싼다.
  • element들의 순서가 있다
  • element들의 생성, 삭제, 수정이 불가능하다.
Tuple 표현

  Tuple은 element를 둘러싸을때 '()'으로 감싼다. element들을 '()'를 감싸지 않아도 tuple로 표현된다. tuple안에 tuple을 element를 넣어 복잡하게 표현도 가능하다

>>> a = (1, 2, 3)
>>> a
(1, 2, 3)
>>> b = 3, 4, 5
(3, 4, 5)
>>> c = ('a', 'b', ('ab', 'cd'))
('a', 'b', ('ab', 'cd'))

 

3. Dictionary

  데이터가 다양해지고 속성과 값들의 표현들이 많아져 단순 List나 tuple로 데이터를 표현하기가 힘들다. 따라서 데이터들의 대응관계(속성과 값)를 잘 나타낼 수 있는 자료형이 딕셔너리(Dictionary)이다.


  즉, 사전이라는 의미로 예를들어 "people"이라는 단어에 "사람"그리고 "baseball"이라는 단어에는 "야구"라는 뜻을 부합시키듯, Dictionary에서도 Key와 Value로 한 쌍을 이루어 element를 갖는다. 그러나 element들은 순서를 갖지 않고, dictionary에서 원하는 element를 찾고자하면 element의 key를 통해 value를 얻을 수 있다. 마치 사전에서 "baseball"의 뜻을 찾기위해 "baseball"를 찾는 것과 같다.

Dictionary 표현
{Key1:Value1, Key2:Value2, Key3:Value3, ...}

Key와 Value의 쌍 여러 개가 { }로 둘러싸여 있다. 각각의 요소는 Key : Value 형태로 이루어져 있고 쉼표(,)로 구분되어 있다.

dic = {'name':'pey', 'phone':'0119993323', 'birth': '1118'}

위에서 Key는 각각 'name', 'phone', 'birth'이고, 각각의 Key에 해당하는 Value는 'pey', '0119993323', '1118'이 된다.

다음 예는 Key로 정수 값 1, Value로 문자열 'hi'를 사용한 예이다.

>>> a = { 1 : 'hi }

또한 다음 예처럼 Value에 리스트도 넣을 수 있다.

>>> a = { 'a' : [1, 2, 3] }

Dictionary element 추가하기

>>> a = { 1 : 'a' }
>>> a[2] = 'b'
>>> a
{ 1 : 'a', 2 : 'b' }

{1: 'a'} 딕셔너리에 a[2] = 'b'와 같이 입력하면 딕셔너리 a에 Key와 Value가 각각 2와 'b'인 2 : 'b'라는 딕셔너리 쌍이 추가된다.

>>> a['name'] = 'pey'
>>> a
{1: 'a', 2: 'b', 'name': 'pey'}

딕셔너리 a에 'name': 'pey'라는 쌍이 추가되었다.

>>> a[3] = [1,2,3]
>>> a
{1: 'a', 2: 'b', 'name': 'pey', 3: [1, 2, 3]}

Dictionary element 삭제하기

>>> a = {1: 'a', 2: 'b', 'name': 'pey', 3: [1, 2, 3]}
>>> del a[1]
>>> a
{2: 'b', 'name': 'pey', 3: [1, 2, 3]}

위 예제는 딕셔너리 요소를 지우는 방법을 보여 준다. del 함수를 사용해서 del a[key]처럼 입력하면 지정한 Key에 해당하는 {key : value} 쌍이 삭제된다.

Dictionary Key-Value 확인

>>> grade = {'pey': 10, 'julliet': 99}
>>> grade['pey']
10
>>> grade['julliet']
99

>>> a = {1:'a', 2:'b'}
>>> a[1]
'a'
>>> a[2]
'b'

>>> dic = {'name':'pey', 'phone':'0119993323', 'birth': '1118'}
>>> dic['name']
'pey'
>>> dic['phone']
'0119993323'
>>> dic['birth']
'1118'

Dictionary 만들 시 주의사항

먼저 딕셔너리에서 Key는 고유한 값이므로 중복되는 Key 값을 설정해 놓으면 하나를 제외한 나머지 것들이 모두 무시된다는 점을 주의해야 한다. 다음 예에서 볼 수 있듯이 동일한 Key가 2개 존재할 경우 1:'a' 쌍이 무시된다.

>>> a = {1:'a', 1:'b'}
>>> a
{1: 'b'}

Key에 리스트는 쓸 수 없다는 것이다. 하지만 튜플은 Key로 쓸 수 있다. 딕셔너리의 Key로 쓸 수 있느냐 없느냐는 Key가 변하는 값인지 변하지 않는 값인지에 달려 있다. 리스트는 그 값이 변할 수 있기 때문에 Key로 쓸 수 없다. 다음 예처럼 리스트를 Key로 설정하면 리스트를 키 값으로 사용할 수 없다는 오류가 발생한다

>>> a = {[1,2] : 'hi'}
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'

 

4. Set

  Set은 python 2.3부터 지원한 자료형으로, 집합에 관련된 것을 쉽게 처리하기 위해 만든 자료형이다. Set은 다음과 같은 특징이 있다.

  • 중복을 허용하지 않는다.
  • 순서가 없다(Unodered).
Set 표현
>>> s1 = set([1,2,3])
>>> s1
{1, 2, 3}

>>> s2 = set("Hello")
>>> s2
{'e', 'H', 'l', 'o'}

 

 

[참고] https://velog.io/@inyong_pang/Python-List-Tuple-Dictionary-and-Set-%EC%9A%94%EC%95%BD#%EC%A7%91%ED%95%A9-%EC%9E%90%EB%A3%8C%ED%98%95-set

'Python 프로그래밍' 카테고리의 다른 글

[Python] enumerate 함수  (0) 2022.04.28
[Python] 익명함수 lambda  (0) 2022.04.26
[Python] Iterator & Generator  (0) 2022.04.22
[Python] 문자열 출력 Formatting  (0) 2022.04.21
[Python] 가상환경  (0) 2022.04.18

 


 코요테 모멘트 (Coyote Moment)

갑작스러운 경제위기나 증권시장의 붕괴를 표현하는 말

 루니툰즈 만화 주인공 코요테가 먹잇감을 쫓는데 정신이 팔려 낭떠러지 쪽으로 뛰어가다가 문득 정신을 차리고 보니 허공에 떠 있고 이를 알아차리는 순간 추락하는 장면에서 나온 비유이다. 2006년 노벨경제학상 수상자인 폴 크루그먼이 코요테 모멘트를 거론하며 세계경제의 큰 타격을 예언한 바 있으며 2020년에는 경제 비관론자로 꼽히는 스티븐 로치 예일대 교수가 코로나 19 쇼크가 전형적인 코요테 모멘트라며 향후 경제 침체를 전망했다. 


 듀레이션 (Duration)

투자자금(원금)의 평균회수기간, 시장금리 1% 변화 시 채권가격의 변동성

 투자자금의 평균회수기간을 말한다. 듀레이션은 채권만기, 채권의 액면이자율(표면이자율), 시장이자율(할인율)의 세가지 요인에 의해서 결정된다. 즉 채권의 만기가 길수록 듀레이션도 길어지며, 채권의 액면이자율이 높을 수록 듀레이션은 짧아지며, 시장이자율이 높을수록 듀레이션은 짧아진다. 일반적으로 듀레이션이란 채권에서 발생하는 현금 흐름의 가중평균만기로서 채권 가격의 이자율 변화에 대한 민감도를 측정하기 위한 척도로서 사용된다. 


 리디노미네이션 (Redenomination)

화폐단위 변경

 한 나라에서 통용되는 화폐에 대해 실질가치의 변화를 주지 않고 액면가(Denomination)를 동일한 비율로 낮추는 것을 말한다. 경제 발전에 따른 물가 상승에 따라 화폐로 표현하는 숫자가 커지게 되면서 생기는 불편함을 해소하기 위한 목적으로 시행한다. 리디노미네이션을 시행하면 지하경제 양성화, 자국통화 가치상승, 내수경기 부양효과를 기대할 수 있다는 장점을 가지고 있지만, 물가가 상승하고 화폐교환에 따른 간접비용이 많다는 것이 단점이다. 한국에서는 6.25 전쟁으로 물가가 가파르게 오르자 100원을 1환으로 바꾸는 제 1차 리디노미네이션을 진행했고 1962년 6월 지하경제 양성화를 목적으로 10환을 지금의 1원으로 낮추는 제 2차 리디노미네이션을 진행한 적이 있다. 


생산가능곡선 (Production Possibility Curve)

주어진 자원과 기술수준하에서 최대로 생산한 두 재화 또는 서비스의 조합을 나타내는 곡선

 일정한 생산요소를 완전히 사용하여 생산활동을 할 때 기술적으로 가능한 여러 가지 생산물 조합을 그래프로 나타낸 것을 생산가능곡선이라고 한다. 일반적으로 생산가능곡선은 우하향하며, 원점을 기준으로 오목한 형태를 띤다. 이는 자원의 희소성으로 최대 생산할 수 있는 두 재화의 양이 정해져 있다는 것을 뜻한다.

[생산가능곡선]

 위의 생산가능곡선에서 D는 생산이 비효율적으로 이루어지고 있는 상태이고 C는 현재 기술로는 도달이 불가능한 상태이다. 


 본원통화 (Monetary Base)

통화량 증감의 원천이 되는 돈

 한국은행이 화폐발행의 독점적 권한을 통해 공급한 통화를 말한다. 본원통화는 중앙은행의 화폐발행액과 예금은행이 지급준비를 위해 중앙은행에 맡겨 놓은 예치금으로 구성된다. 한국은행이 예금은행에 대해 대출을 하거나 정부가 중앙은행에서 정부예금을 인출할 경우 본원통화가 공급된다. 이렇게 통화량의 기초를 이루고 있다 하여 본원통화라고 한다. 

 시장에 풀린 본원통화는 크게 다음 두 가지 방식으로 유통된다. 

  1. 현금의 형태로 시장에 풀려 유통되는 것 (현금통화)
  2. 시중은행으로 흘러가는 돈(지급준비금으로 사용) : 예를 들면 본원통화 100억원 중 50억은 현금의 형태로 시장에 풀리고, 나머지 50억은 은행으로 흘러들어가게 되는 식이다. 중앙은행이 본원통화 100억원을 발행했다고 하면, 시장에는 100억원보다 훨씬 많은 돈이 유통되게 된다. 그 이유는 시중은행이 대출을 하는 과정에서 통화량이 늘어나기 때문이다. 

 브레튼우즈 체제 (Bretton Woods System)

 미국 달러화를 축으로 한 '조정가능한 고정환율제도'를 도입한 체제

 브레튼우즈 체제는 2차 세계대전 종전 직전인 1944년 미국 뉴햄프셔주 브레튼우즈에서 열린 44개국이 참가한 연합국 통화 금융 회의에서 탄생한 국제 통화 체제이다. 이 협정을 브레튼우즈 협정이라 부른다. 협정에 따라 국제통화기금(IMF)과 국제부흥개발은행(IBRD)이 설립되었다. 통화가치 안정, 무역진흥, 개발도상국 지원을 목적으로 하며 환율을 안정시키는 것이 주요한 목표였다. 미국 달러화를 기축 통화로 하는 금환본위제도의 실시로 금 1온스를 25달러로 고정시키고, 그 외에 다른 나라의 통화는 달러에 고정하였다. 이후 미국은 1971년 달러와 금을 교환하는 금태환 정지를 선언했고 이로서 달러를 중심으로 한 금본위제는 폐지되었다.


 비교우위론

 상대적으로 비교 우위에 서있는 상품 생산에 주력하여 거래를 하면 서로 이익을 얻을 수 있다는 이론

 한 나라가 다른 나라에 대하여 재화의 생산에 절대 열위에 있다고 하더라도 상대적으로 생산의 기회비용이 낮은, 비교우위에 있는 상품 생산에 주력하여 거래를 하면 서로 이익을 얻을 수 있다는 이론이다. 1817년 리카도에 의해 주창되었다. 각각의 나라는 가지고 있는 자원의 차이에 따라 특화되는 산업이 달라진다. 각 나라들은 상대적으로 더 유리한 산업에 집중하고, 다른 국가와 무역을 하는 것이 양국 모두에게 유리하다는 이론이 비교우위론이다. 예를 들어, A라는 나라가 비교우위에 있는 반도체를 특화하고, B나라는 농산물을 특화하여 무역으로 교환하면 두 나라 모두에게 유리하게 된다. 


 세이의 법칙 (Say's Law)

공급은 스스로 수요를 창출한다는 법칙

 프랑스 경제학자 장바티스트 세이(Jean - Baptiste Say)에 의해 제시된 주장으로, 고전학파는 세이의 법칙을 주장하며 생산된 것이 판매되지 않아서 실업이 발생하는 사태는 이론상 있을 수 없다고 보았다. 총공급의 크기가 총수요의 크기를 결정하기 때문에 총공급과 총수요는 언제나 일치하고 따라서 항상 완전고용이 달성된다는 것이다. 하지만 1930년대의 대공황처럼 공급된 것이 판매되지 않아서 공장들이 문을 닫게 되고 대량의 실업과 유흥설비가 발생할 때, 고전학파 이론은 이를 설명할 수 없었다. 이에 케인즈는 총수요의 크기가 총공급을 결정한다는 '유효수요의 원리'를 주장하였다.

💬 내용 요약

  원·달러 환율이 한 달 만에 1240원을 돌파했다. 제롬 파월 미국 연방준비제도(Fed‧연준) 의장이 다음 달 빅스텝(기준금리 0.50%포인트 인상) 가능성을 언급하면서다. 22일 오전 11시 현재 서울 외환시장에서 원·달러 환율은 1242원대에 거래되고 있다. 이날 환율은 전 거래일보다 3.2원 오른 1242.2원에 출발했다. 장 초반 1243.0원까지 오르면서 지난달 15일 기록한 연중 최고치(1242.8원)를 넘어섰다.

  달러 강세는 파월 의장의 매파적 발언으로 인한 국채금리 상승, 안전자산 선호 경향이 강해진 영향이다. 파월 의장은 21일(이하 현지시간) 미국 워싱턴 D.C.에서 진행된 국제통화기금(IMF) 주최 패널토론에 참석해 "금리 인상을 위해 조금 더 빨리 움직이는 것이 적절하다"고 말했다. 그러면서 "5월 회의 테이블에서 50bp(금리인상 의제)가 다뤄질 것"이라고 밝혔다.

  지난 3월 연준은 기준금리를 0.25~0.5% 수준으로 0.25%포인트 인상했다. 이번 발언은 다음 달 연방공개시장위원회(FOMC)에서 기준금리 0.5%포인트 인상을 기정사실화 한 것이다. 이에 뉴욕증시가 급락하고, 미국 장단기 국채금리가 모두 상승했다.

 

💭 생각 정리

  미국 연준에서 금리를 빠르게 인상하겠다는 의지를 강하게 표출하고 있는 상황이다. 매파(통화긴축정책 선호)로 분류되는 제임스 볼라드 세인트루이스 연방준비은행 총재는 "올해 연말까지 정책금리를 3%로 높여야 한다"고 주장했다. 물가 상승이 억제되지 않고 급격한 상승추세가 지속되는 한 0.5포인트를 인상하는 빅스텝이 아닌 0.75% 포인트를 인상할 가능성도 있다고 생각된다. 

  미국 연준이 금리를 올리게 되면 세계적으로 자금이 미국 달러로 유입되기 때문에 달러는 자연스럽게 달러강세가 될 것이다. 여기서 우리나라의 금리를 따라 올리지 않게 되면, 국내의 자금 또한 미국으로 유출되어 환율은 더 급격하게 상승할 것이다. 

 이러한 환율을 상승시키는 요인은 미국의 금리인상 뿐만 아니라 우크라이나와 러시아의 전쟁으로 인한 안전자산 선호 현상과 러시아의 디폴트 즉, 채무불이행과도 연관이 있다. 

 

 

📌 용어 정리  

  • 디폴트 [ Default ]

  디폴트 채무자가 빌린 돈을 정해진 기간 안에 갚지 못하는 상태를 말하며, 한 나라의 정부가 외국에서 빌려온 차관 상환 기간 내에 갚지 못하는 경우도 이에 해당된다. 해당 국가가 디폴트 상황이라고 채권자가 판단하게 되면, 채권자는 채무자에게 이를 통보하는데 이것을 디폴트 선언이라고 한다.

  디폴트가 선언될 경우 해당 국가에 대한 신규 자금 지원이 중단되며 해당 국가의 급여나 사회복지 재원 등을 지출할 수 없어 국가 혼란이 오게 된다.

 

 

[출처]

https://news.mt.co.kr/mtview.php?no=2022041816423168729 

https://biz.chosun.com/policy/policy_sub/2022/04/12/PU3V5EABYVEFFAPMIFFQW5V3UM/?utm_source=naver&utm_medium=original&utm_campaign=biz 

https://www.mk.co.kr/dic/

 

Container

 컨테이너(Container)는 원소들을 가지고 있는 데이터 구조이며 멤버쉽 테스트를 지원한다. (멤버쉽 테스트는 아래에 나온다) 이는 메모리에 상주하는 데이터 구조로, 보통 모든 원소값을 메모리에 가지고 있다.

※ 파이썬에서 잘 알려진 컨테이너는 다음과 같다.

  • list, deque ...
  • set, frozenset ...
  • dict, defaultdict, OrderedDict, Counter ...
  • tuple, namedtuple ...
  • str

 기술적으로, 어떤 객체가 특정한 원소를 포함하고 있는지 아닌지를 판단할 수 있으면 컨테이너라고 한다. 다음과 같이 리스트, 셋 또는 튜플에 대해 멤버쉽 테스트를 할 수 있다.

>>> assert 1 in [1, 2, 3]     # lists
>>> assert 4 not in [1, 2, 3]
>>> assert 1 in {1, 2, 3}     # sets
>>> assert 4 not in {1, 2, 3}
>>> assert 1 in (1, 2, 3)     # tuples
>>> assert 4 not in (1, 2, 3)
# 딕셔너리 멤버쉽은 키 값을 체크한다:

>>> d = {1: 'foo', 2: 'bar', 3: 'qux'}
>>> assert 1 in d
>>> assert 4 not in d
>>> assert 'foo' not in d  # 'foo'는 딕셔너리의 키값이 아니다
# 마지막으로 문자열에는 부분문자열이 “포함"되어 있는지를 체크할 수 있다:

>>> s = 'foobar'
>>> assert 'b' in s
>>> assert 'x' not in s
>>> assert 'foo' in s  # 문자열은 부분문자열을 모두 "포함"하고 있다
※ 참고
 대부분의 컨테이너가 자신이 포함하고 있는 모든 원소들을 생성하는 방법을 제공하지만, 이 기능은 이를 컨테이너로 만드는게 아니라 이터레이블로 만듭니다. (잠시 후에 살펴본다)
 모든 컨테이너가 이터레이블할 필요는 없다. 이의 한 예는 Bloom filter이다. 이와 같은 확률적 데이터 구조는 특정 원소를 포함하고 있는지는 판단할 수 있지만, 각각의 개별 원소를 반환하지는 못한다.

 

Iterable(이터레이블)

 Iterable은 순회할 수 있는 모든 객체를 가리킨다. 다른 말로 하면 파이썬에서 for 문의 in 키워드 뒤에 올 수 있는 모든 값은 Iterable이다. 그러면 list, tuple, set, dict는 말할 것도 없고 문자열, 파일 등도 Iterable이라고 할 수 있다.

 대부분의 컨테이너는 또한 이터레이블(iterable)하다. 그러나 더 많은 것들 또한 이터레이블하다. 일례로 파일 열기, 소켓 열기등이 있다. 컨테이너가 일반적으로 유한할경우, 이터레이블은 무한한 데이터 소스를 나타낼 수도 있다.

 **이터레이블(iterable)**은 반드시 데이터 구조일 필요는 없으며 이터레이터(iterator)(모든 원소를 반환할 목적으로)를 반환할 수 있는 모든 객체가 가능하다. 이는 조금 어색하게 들릴 수 있지만, 이터레이블과 이터레이터 사이에는 중요한 차이점이 있다. 다음 예시를 보자.

>>> x = [1, 2, 3]
>>> y = iter(x)
>>> z = iter(x)
>>> next(y)
1
>>> next(y)
2
>>> next(z)
1
>>> type(x)
<class 'list'>
>>> type(y)
<class 'list_iterator'>

 여기서, y z는 각각 이터레이블 x로부터 값을 생성해내는 이터레이터의 인스턴스이고 x는 이터레이블이다. y z는 예시에서 볼 수 있듯이 상태를 가진다. 이 예시에서, x는 데이터 구조(리스트)지만, 이는 필수 요건은 아니다. 마지막으로 다음과 같이 작성했을 때 아래에 일어나는 일이 사진으로 설명되어 있다.

x = [1, 2, 3]
for elem in x:
    ...

Iterator

 요소가 복수인 컨테이너(리스트, 퓨플, 셋, 사전, 문자열)에서 각 요소를 하나씩 꺼내 어떤 처리를 수행할 수 있도록 하는 간편한 방법을 제공하는 객체이다.  

  ‘Iterable은 for 문에 넣을 수 있는 모든 값’으로 정의하면 되지만 Iterator는 조금 더 까다롭다. Iterator는 상태를 유지하며 반환할 수 있는 마지막 값까지 원소를 필요할 때마다 하나씩 반환하는 것이라고 생각하면 된다.  ‘반환할 수 있는 마지막 값까지 원소를 하나씩 반환한다’의 의미는 가령 list에서 값을 하나씩 반환하는 것과 동작이 같다.

# 무한 시퀀스로부터 유한 시퀀스를 생성하는 Iterator 예제
>>> from itertools import islice
>>> colors = cycle(['red', 'white', 'blue'])  # 무한
>>> limited = islice(colors, 0, 4)            # 유한
>>> for x in limited:						# 따라서 for 루프에 사용하기에 안전하다
... 	print(x)
red
white
blue
red
# 피보나치수를 생성하는 이터레이터 예제
>>> class fib:
...     def __init__(self):
...         self.prev = 0
...         self.curr = 1
...
...     def __iter__(self):
...         return self
...
...     def __next__(self):
...         value = self.curr
...         self.curr += self.prev
...         self.prev = value
...         return value
>>> f = fib()
>>> list(islice(f, 0, 10))
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]

참고로 이 클래스는 이터레이블(iter() 메서드를 사용하므로)이자 자체 이터레이터(next() 메서드를 가지므로)이다.

이터레이터 내의 상태는 prev curr 인스턴스값으로 유지되고 있으며, 이터레이터를 호출하는 서브 시퀀스에 사용된다. **next()**를 호출할때마다 두 가지 중요한 작업이 수행된다:

  1. 다음 next() 호출을 위해 상태를 변경한다
  2. 현재 호출에 대한 결과값을 생성한다

 

Generator

iterator의 한 종류로, 하나의 요소를 꺼내려고 할 때마다 요소 generator를 수행하는 타입으로, Python에서는 yield문을 통해 구현하는 것이 보통이다.

 Generator는 나만의 Iterable, Iterator 기능을 만들되, 생성 문법을 기존보다 단순화한 개념 또는 클래스라고 할 수 있다.리스트나 Set과 같은 컬렉션에 대한 iterator는 해당 컬렉션이 이미 모든 값을 가지고 있는 경우이나, Generator는 모든 데이타를 갖지 않은 상태에서 yield에 의해 하나씩만 데이타를 만들어 가져온다는 차이점이 있다. 이러한 Generator는 데이타가 무제한이어서 모든 데이타를 리턴할 수 없는 경우나, 데이타가 대량이어서 일부씩 처리하는 것이 필요한 경우, 혹은 모든 데이타를 미리 계산하면 속도가 느려서 그때 그때 On Demand로 처리하는 것이 좋은 경우 등에 종종 사용된다.

1) Generator 생성방법 1. yield

Generator 함수가 처음 호출되면, 그 함수 실행 중 처음으로 만나는 yield 에서 값을 리턴한다. Generator 함수가 다시 호출되면, 직전에 실행되었던 yield 문 다음부터 다음 yield 문을 만날 때까지 문장들을 실행하게 된다. 이러한 Generator 함수를 변수에 할당하면 그 변수는 generator 클래스 객체가 된다.

from random import randint

def random_number_generator(n):
	count = 0
    while count < n:
    	yield randint(1, 100)
        count += 1

 ‘yield’ 문을 활용한 기초적인 Generator 활용 예제다. 사용해보기 전에, Iterator를 직접 구현했을 때와 대비되는 Generator의 특징을 살펴보면 다음과 같다.

  • 클래스가 아닌 함수로 정의한다.
  • 프로토콜처럼 Iterable와 Iterator의 두 요소를 분리하지 않고 한 요소에 담을 수 있다.
  • 호출될 때마다 한 번씩 반환할 값을 반환하는 키워드가 ‘yield’이며, 이는 함수가 아니다. 즉 return 문처럼 ()를 사용하지 않는다.
# 랜덤 정수 5개를 반환하는 Generator 예제

g = random_number_generator(5)

print(g)

<generator object random_number_generator at 0x7f0801e15e08>

함수를 호출해 generator 객체(object)를 만들었다. 이때 객체라는 것은 함수의 반환값이 상태값을 유지하는 Generator 클래스의 인스턴스(instance)라는 것을 암시한다. Generator는 Iterable, Iterator 생성 문법을 간략화한 개념 및 구현이기 때문에 그 내부과정이 직관적으로 보이지는 않지만(추상화되었기 때문에), 함수의 호출 결과가 결국은 Iterator protocol을 준수하는 개체를 반환한다고 이해하면 무난하다. 생성된 Generator를 사용해보자.

print(next(g)) 
print(next(g)) 
print(next(g)) 
print(next(g)) 
print(next(g)) 
print(next(g)) 

72
90
3
48 
34 
----> 3 print(next(g)) 

StopIteration: 

# 총 5번의 호출 이후 StopIteration이 반환됐다.

 

 

2) Generator 생성방법 2. Generator comprehension

 ()를 사용해서 comprehension을 만들면 tuple이 생성되지 않고 다음과 같은 결과가 나온다.

print((n for n in range(3))) 

<generator object <genexpr> at 0x7f0801c6f620>

 []를 사용해 만든 comprehension은 list를 만들었다. 그러면 ()를 사용하면 tuple이 반환되리라 무난하게 예상할 수 있다. 그런데 예상과는 정반대로 ()를 사용하면 tuple이 아닌 ‘generator object’가 생성됐다. 즉, list comprehension의 문법을 사용하되 식을 닫는 괄호를 ()를 사용하는 방법이 generator를 생성하는 두 번째 방법이며, 이를 Generator comprehension(또는 generator expression)이라고 한다. 하지만 Generator Expression은 List Comprehension과 달리 실제 리스트 컬렉션 데이타 전체를 리턴하지 않고, 그 표현식만을 갖는 Generator 객체만 리턴한다. 즉 실제 실행은 하지 않고, 표현식만 가지며 위의 yield 방식으로 Lazy Operation을 수행하는 것이다. 위에서 사용한 예제를  generator comprehension을 사용해서 다시 만들어보자. 

for n in g :
	print(n)
    
96
45
14
56
89

 그러면 다음과 같은 질문을 던질 수 있다. Iterable, Iterator, Generator에서 Generator만 쓰면 되는가? 또 Generator를 사용한다고 할 때, yield를 사용하는 대신 Generator expression을 사용하는 방법이 무조건 옳은 것인가? 보다 복잡한 프로그램일수록 Iterator protocol을 준수한 Iterable, Iterator를 만들어 쓰는 것이 좋은 선택일 수 있고, 프로그램이 매우 단순하다면 Generator expression을 사용하는 방법이 더 바람직할 수 있다. 


 

출처 : https://mingrammer.com/translation-iterators-vs-generators/

출처 : https://engineer-mole.tistory.com/64

 

'Python 프로그래밍' 카테고리의 다른 글

[Python] enumerate 함수  (0) 2022.04.28
[Python] 익명함수 lambda  (0) 2022.04.26
[Python] List & Dictionary & Tuple & Set  (0) 2022.04.24
[Python] 문자열 출력 Formatting  (0) 2022.04.21
[Python] 가상환경  (0) 2022.04.18

+ Recent posts