본문 바로가기
  • Fearless
프로그래밍언어/python

[파이썬문법] 15. yield(generator) & lambda func

by Albatross 2022. 4. 22.
반응형

1. yield

아 진짜 하기 싫다 이거.. 여튼 시작.

recursive한 방법은 비효율적이다. 

 

너무 비효율적이다

 

비슷한 top-down 방식의 fibo는 두 방향으로 갈리기 때문에 엄청나게 비효율적이다.

 

효율적이다. 

 

뒤에서부터 맨 앞으로, 거꾸로 출력

 

return하면 첫 반환하고 함수가 죽어버린다.

 

next가 없어서 그만뒀다.

 

tuple을 iterable로 만들어버렸고, next의 끝은 항상 stopiteration

 

list comprehension

 

a는 generator라서 필요할 때 특정값을 딱 넘겨준다. 

ex) for loop을 도는거니까 print(i)하면 다시 a한테 가는데 이 때 a는 list가 아니고 그냥 그 때 특정 값만 넘겨주고 바로 다음값을 구해서 대기하고 있음. 뭔소리냐면

0 전달, 0 출력, 1 전달, 1 출력, ... 이게 a라는 list가 아니라 generator에서 받는거라 메모리를 잡아먹지 않는다는 뜻.

 

그냥 a한테 받아와도 되는데 next(a)를 사용하면 다음 값을 전달받을 수 있다.

 

iter()는 callable을 반복가능한 객체로 바꿔준다. 그런데 이 경우 char(a)가 바로 return되고 끝나버린다. 

iterable로 바꿔줘도 it의 next는 a 밖에 없다. 

 

한번 더 해주면 stopiteration 걸린다. return이라 함수 호출이 더이상 안되기 때문.

그런데 여기서 yield char해버리면 a,b,c 다 반환된다. 

 

tmp가 generator의 역할을 한다. 이게 똑같은 comprehension 같은데 괄호 씌우면 generator고 아니면 list더라.

안에서 iteration 돌아서 값을 생성하고 이를 한 메모리에 보관했다가 순차적으로 불리울 때만 호출하기 때문이다. 

 

처음부터 끝까지 역출력한다. 

g, og, oog, doog 반환

 

현재 my_num의 next()를 반환하는거라 이렇게 출력되는거 같다. 

 

 

2. lambda

labmda x,y : expression

이런 함수를 특정 변수에 할당한 다으메 활용한다. 아니면 직접 써도된다.

 

 

lambda x,y: exp)(3, 3.14) 처럼 쓴다.

아니면 map함수 쓰기도 하는데 이거는 특정 iterable 객체에서 원소 빼와서 대입해서 반환한다. 

filter는 True인 값만 반환한다. 

반응형