여니의 Side Project/인프런 - 리프 (파이썬 고급)

[인프런 리프 대학생 2기] 1주차 미션 활동 Python Advanced(1)

여니's 2021. 3. 13. 22:26

이번 게시글에서는

섹션 1 Python Advanced(1) 수업을 들으며,

내용을 정리해보려고 합니다 :0

 


섹션 1에서는 어떤 내용을 배우나 슬쩍 봐볼까요?

음 일단 제가 항상 헷갈려하는

람다함수가 끼어있네요

이번 기회에 제대로 공부해놔야겠어요

 

오 몇일 전에 자바스크립트 공부하면서

깊은 복사와 얕은 복사에 대한 게시글을 올렸었는데,

여기에서도 다루네요 :)

 

목차만 봐도 벌써부터 신나는 건 왜일까요..? 헤헤

본격적으로 수업을 들으러 떠나봅니다


 

01 Variable scope

( Scope, Global , Nonlocal, Locals , Globals )


(1) scope

파이썬은 JS의 scope 방식과 비슷하다.

파이썬에서는,

if 문 안에 있는 변수를

함수 안에서는 어디서든지 호출이 가능하다.

하지만,

함수 밖에서는 호출이 불가하다.

 

파이썬 scope 룰을 LEGB라고 부른다.

Local - Enclosed - Global - Built-in

>> 이 순서대로 scope를 돌린다!

 

Local : 가장 가까운 함수 안 범위

Enclosed - 가장 가까운 함수가 아닌 두 번째 이상의 가까운 함수 범위

Global - 함수 바깥의 변수 또는 import된 모듈

Built-in : 파이썬안에 내장되어 있는 함수나 속성


(2) global

: 유지보수시 좋지 않을 수 있어서 되도록 사용 자제

global는 함수 내부에서 로컬 변수가 아닌 글로벌 변수를 사용하게 해준다.

>> 이 말은 즉, 지역변수를 함수 내에서 사용할 수 있도록 해준다는 말이다.

만약 현재 전역 변수의 값이 3이라고 치자.

함수 내에서 글로벌로 선언한 변수의 값을 5로 바꾸게 되면,

실제로 전역변수의 값이 5로 변경된다.


(3) Nonlocal

: 내부 함수에서 현재 함수의 바깥 쪽에 있는 지역 변수의 값을 변경할 때 사용한다.

즉, 내부 함수에서 외부 함수의 값을 변경할 때 사용하는 예약어!


(4) Locals

: 현재 namespace를 딕셔너리로 구성하여 리턴한다.

현재 로컬 변수를 dict type으로 던져준다.


(5) Globals

: 모듈 namespace를 딕셔너리 형태로 리턴한다.

현재 전역 변수들을 dict type으로 던져준다.


02. Python Advanced(1)

lambda, Reduce, Map, Filter Functions

 

파이썬은 함수형 프로그래밍이라고 하는 프로그래밍 스타일을 지원한다.

함수형 프로그래밍

eboong.tistory.com/227

 

2-4 변수와 상수, 함수형 프로그래밍 (Javascript)

변수 Variable : 데이터를 저장할 때 쓰이는 '이름이 붙은 저장소' 자바 스크립트에서는 let 키워드를 이용해서 변수를 생성한다. let apple; apple='Hello' (let apple='Hello') >> 문자열 'Hello'를 변수 apple..

eboong.tistory.com


(1) lambda (=익명함수)

: 이름 없는 함수를 정의할 때 사용한다.

익명함수들은 공통으로 일급 객체라는 특징을 가지고 있다.

다른 객체들에 적용 가능한 연산을 모두 지원하는 개체를 의미한다.

(이 설명도 위 게시글에 정리해둠)

 

언제 이름 없는 함수를 사용할까?

> 한 번 쓰고 말 경우, 

즉 재사용할 필요가 없을 경우 람다를 사용한다.

메모리를 아낄 수 있다. 

(>> 이 부분은 어떤 원리로 인해 메모리를 아끼는 것인지

인프런 질문에다가 남겨놨으니,

답변이 오면 추가해서 올릴 예정)

 


(2) Map

: 리스트에 있는 모든 원소들을 내가 지정한 함수에 의해 수행된 결과를 

iterator 형태로 객체에게 넘겨주는 것

 

이게 무슨 말일까,,

iterator는 또 뭐지..?

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


※ container

: 원소들을 가지고 있는 데이터 구조이고 멤버쉽 테스트를 지원함.

보통 모든 원소값을 메모리에 가지고 있다.

파이썬에서 잘 알려진 컨테이너는

list, deque, set, frozonse, dict, tuple, str. ...인데,

 

 

컨테이너는 실세계의 컨테이너처럼 생각하면 된다.

어떤 객체가 특정한 원소를 포함하고 있는지 판단이 가능하면,

컨테이너라고 볼 수 있다.

대부분의 컨테이너는 이터레이블하다.

 

컨테이너는  contained objects에 접근하는 방법을 제공하고,

그것들을 반복할 수 있게 해준다.

iteration = 반복

 

※ iterable

member를 하나씩 차례대로 반환 가능한 객체를 의미함

대표적으로 iterable한 타입은

list, str, tuple,  set, bytes,  range가 있다. (sequece type)

non-sequence type인 dict나 file도 iterable 하다.

__iter__()나 __getitem__() 메소드로 정의된 클래스는 모두 iterable 하다

for 루프 안에서 사용될수도 있고,

zip()이나 map()같은 곳에서도 사용될 수 있다.

iter()메서드를 사용해서 iterator 객체를 얻을 수 있다.

iterable은 __iter__ 메서드를 지닌 클래스

 

ex)

for i in range(3):

~~~

 

위 for문은 range로 생성된 리스트가 iterable하기 때문에

순차적으로 데이터를 순회할 수 있었던 것이다.

 


※ iterator

iterator는 데이터 스트림을 나타내는 객체이고,

next() 메서드로 데이터를 순차적으로 호출 가능한 객체이다.

불러올 데이터가 없을 경우 StopIteration exception을 발생시킨다.

iterator는 __iter__ 및 __next__ 를 지닌 클래스를 의미한다.

iterable한 객체를 iter()함수를 사용해서 iterator 객체를 생성함.

ex) map, zip, filter, enumerate

 

데이터 스트림..?

외부(서버)에서 받아온 데이터를 의미한다.

 

스트리밍

: 외부(서버)에서 데이터를 받아오는(로드) 행위 자체를 의미한다.

 

iterable한 객체들은 모두 iterator에 속할까?

No!

list is not an iterator!

 

이럴 땐 iter()라는 built-in function을 사용하면 된다.

(iterable을 iterator로 변환하는 과정)

 

그러나 우리가 파이썬에서,

list나 tuple 같은 객체를 사용할 때

굳이 iter()함수를 사용하지 않아도

for 문을 사용하여 순차적으로 접근이 가능하였다.

이것은 파이썬 내부에서 

임시로 list를 iterator로 자동 변환해주었기 때문이다.

 

 

 


 

>> map(func,list)

func에는 lambda 함수도 들어갈 수 있음

map을 list로 묶어서 형변환 시키면,

리스트 형태로 값이 출력된다.

 

 

* 지능형 리스트는 [] 사용

result=[idx for i in range(10)]

print(result)

>> [0,1,....9]


(3) Filter

여러 개의 데이터로부터 일부의 데이터만 추려낼 때 사용한다.

filter (func, 순회 가능한 데이터)

lambda x : x % 2==0

>> 2,4,6,8,10

filter 함수는 boolean 형태의 return 값을 갖는다.

return 값이 true일 경우 그 요소를 반환한다.

따라서 x가 짝수이면 return 값이 true이니까, 

그 요소들을 반환한다.


(4) Reduce

여러 순회 가능한 시퀀스 데이터에서

누적으로 더하고 합게해줄 때 사용한다.

결과값은 최종값이다.

 


강의 명 : 

모두를 위한 파이썬 : 필수 문법 배우기 Feat. 오픈소스 패키지 배포

 

강의 링크 

www.inflearn.com/course/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%A4%91%EA%B3%A0%EA%B8%89/dashboard

 

모두를 위한 파이썬 : 필수 문법 배우기 Feat. 오픈소스 패키지 배포 (Inflearn Original) - 인프런 | 강

폭넓은 파이썬 개발 경험, 온오프라인 수업 경험을 바탕으로 파이썬 메타프로그래밍, 깊이있는 문법을 다루기 위한 과정입니다. 더 나아가 파이썬 취준생 면접 및 경력자분들의 기술면접에도

www.inflearn.com


인프런에 남긴 질문

>> 1번 질문 답변

:  함수를 정의하고 실행하면, 해당 함수에 메모리가 할당이 된다.

하지만 람다 함수는 한 번만 사용하고 사라지기에 메모리에 대한 걱정 No!

그래서 한 번 쓰고 버릴 로직을 메모리를 할당해가며 정의할 필요가 없어서

람다 함수를 사용한다.

 

>> 2번 질문 답변

map보다 지능형 리스트를 사용했을 때 코드가 간결해지고 성능이 좋은 코드를 작성할 수 있다.

그래서 효율성 향상에는 지능형 리스트를 사용하는 것이 좋다.