이번 게시글에서는
섹션 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
파이썬은 함수형 프로그래밍이라고 하는 프로그래밍 스타일을 지원한다.
함수형 프로그래밍
(1) lambda (=익명함수)
: 이름 없는 함수를 정의할 때 사용한다.
익명함수들은 공통으로 일급 객체라는 특징을 가지고 있다.
다른 객체들에 적용 가능한 연산을 모두 지원하는 개체를 의미한다.
(이 설명도 위 게시글에 정리해둠)
언제 이름 없는 함수를 사용할까?
> 한 번 쓰고 말 경우,
즉 재사용할 필요가 없을 경우 람다를 사용한다.
메모리를 아낄 수 있다.
(>> 이 부분은 어떤 원리로 인해 메모리를 아끼는 것인지
인프런 질문에다가 남겨놨으니,
답변이 오면 추가해서 올릴 예정)
(2) Map
: 리스트에 있는 모든 원소들을 내가 지정한 함수에 의해 수행된 결과를
iterator 형태로 객체에게 넘겨주는 것
이게 무슨 말일까,,
iterator는 또 뭐지..?
※ 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. 오픈소스 패키지 배포
강의 링크
인프런에 남긴 질문
>> 1번 질문 답변
: 함수를 정의하고 실행하면, 해당 함수에 메모리가 할당이 된다.
하지만 람다 함수는 한 번만 사용하고 사라지기에 메모리에 대한 걱정 No!
그래서 한 번 쓰고 버릴 로직을 메모리를 할당해가며 정의할 필요가 없어서
람다 함수를 사용한다.
>> 2번 질문 답변
map보다 지능형 리스트를 사용했을 때 코드가 간결해지고 성능이 좋은 코드를 작성할 수 있다.
그래서 효율성 향상에는 지능형 리스트를 사용하는 것이 좋다.
'여니의 Side Project > 인프런 - 리프 (파이썬 고급)' 카테고리의 다른 글
[인프런 리프 대학생 2기] 2주차 미션활동 (0) | 2021.03.18 |
---|---|
[인프런 리프 대학생 2기] 2주차 미션활동 | Context Manager Annotation (0) | 2021.03.15 |
[인프런 리프 대학생 2기] 1주차 미션 활동 | Context Manager(1) (0) | 2021.03.14 |
[인프런 리프 대학생 2기] 1주차 미션 활동 (섹션0. 환경설정편) (0) | 2021.03.13 |
[인프런 대학생 리프 2기] 오리엔테이션 생생한 후기! (2) | 2021.03.08 |