Jose: 여러분, 반갑습니다.
이번 시간에는 Python에서의 생성기에 대해 이야기해 볼게요.
이 섹션이 정말 기대되네요
좀 더 고급된 것에 대해 얘기할 거거든요
발전기는 파이썬 에서 많은 강의들이 언급조차
하지 않는 주제 중 하나죠 하지만
성능에 필수적입니다 또한 파이썬 에서의 e-sync
개발은 우리가 나중에 배우게 될 e-sync 개발은 이런 발전기를 기반으로
만들어졌거든요
발전기를 이해하게 되면
파이썬 에서의 많은 것들이 명확해지기 시작하죠
발전기가 뭐죠?
Python에서 발전기는 기능이에요
특별한 기능이죠
실행 사이사이에 어떤 상태인지
기억하는 함수를 보세요
그 함수를 여러 번 실행하면 마지막으로
실행했을 때 뭘 했는지 기억할
거예요
이상하게 들리겠지만 예를 들어 설명할게요
100개의 숫자 리스트를 만들고
싶다고 해 봅시다. 아주
간단합니다. 100개를 제외한 0부터 99까지의 숫자로
리스트를 만들고 싶어요.
이런 기능을 만들 수 있어요
범위 같은 걸 사용하지 않죠 범위요
range를 사용하지 말고 처음부터 리스트를 만들죠
어떻게 할 거예요?
가장 좋은 방법은 빈 리스트에서 시작하는 거죠
그걸 nums라고 하고 빈 리스트와 같다고 하죠
인덱스는 0으로 시작하고요
그런 다음 100 이하일 때 nums.append
i라고 하세요
처음에 0을 추가해요
그런 다음 i를 하나 증가시켜
하나로 만들죠
1번, 반복, 2번, 3번을
추가해요 99번까지 할 때까지요
이 함수 끝에는 숫자를
리턴하는 nums를 반환하죠
숫자 100개를 프린트해서 실행하면요
여기 목록에 100개의
숫자가 있는 게 보이시죠
물론 목록을 잘 이해해야겠죠
range 함수를 쓸
수도 있지만 지금은 이게 멋진
방법이라고 가정할게요 range 함수가
안에서 어떻게 작동하는지 설명하고 있으니까요
목록을 만들어서 처음
100개의 숫자를 채우고 반환하는 거죠
이제 목록에 100개의 번호가 있어요
이 목록 전체가 컴퓨터 메모리에 함수의 반환
값으로 저장돼 있어요
100개의 숫자는 그리 크지
않아요 꽤 작은 공간이죠
하지만 천만 개를 저장하고 싶다고 하면 백만
개는 100개의 숫자 같죠
하지만 백만 개의 숫자일 거예요
백만 개의 숫자가 적힌 리스트를
생성해서 컴퓨터
메모리에 저장할 변수에 저장하는
거죠 각각의 숫자가 컴퓨터 메모리를
소량씩 차지하기 때문에 메모리가
더 많이 필요할 거예요
천만 개의 숫자를 원한다면 더 큰 숫자죠
천만 개의 숫자가 좋은 예는 아니지만 뭔가의
목록이 아주 길다고 상상해 보세요
예를 들어 소수를
계산하거나 빅데이터
같은 것에서 큰 리스트를
원할 때가 있죠
그래서 이 문제를 피하기 위해 발전기를 사용합니다
한 번에 100개의 숫자가 필요하지 않기
때문이죠
0이 있어야 뭔가 할 수 있어요
그걸 활용할 수 있도록요
그리고 두 개 더 있어요 그걸로 뭔가 할 수 있게요
예를 들어 이 100개의 숫자는
전부 2를 곱하고 다른 목록에 저장할 수 있어요
어떻게 할 건데요?
이해를 덜 시키겠죠 x 곱하기
x는 숫자 100의 x예요
여기서 할 일은 이 목록을 이용해
그 위에 분리하고 각 숫자를 2씩 곱하는 거죠
2의 곱셈을 이 숫자들로
뭔가를 계산하기 위한 연산이라고
생각해보죠
또 다른 예는 사용자가 많은
경우 사용자가 시스템에 얼마나 관여하고
있는지 주변의 관여도를 계산하고
싶을 때예요
기본적으로 각 요소를 검토하고
연산을 수행해야 하죠
문제는 모든 요소가 동시에 필요하지 않다는 거예요
한 장씩 필요하잖아요
이게 발전기의 용도였군요
요소의 전체 리스트를 갖는 대신에
생성기가 목록의 첫 번째
요소를 줍니다 모든 리스트를
메모리에 저장하지 않고요
다음에 생성기를
호출하면 마지막에 준 요소를 기억하고
두 번째 요소를 줘요
다시 실행하면 세 번째 요소를
얻죠
리스트를 메모리에 저장하지
않고 마지막으로 입력한 숫자만 기억하죠 그런
다음 다음 번호를 입력해요
새 숫자를 원할 때마다 그
기능을 재미있어야 해요 그래서 생성기라고
부르는 거죠 왜냐하면 그건 숫자나 문자열,
사용자나 여러분이 생성하기 원하는 어떤 것이든 생성하니까요
'넘' 대신 이렇게 하면 돼요 "I"라고 입력하세요
반환할 숫자가 i니까요 = 제곱괄호도
더 이상 필요 없죠
return 세그먼트도요
여기 이 기능은 생성기 기능이에요
수익은 반환과 아주 흡사해요 하지만 발생하는
일은 호출하면 i를 주고 여기 있다는 걸 기억하죠
5번째 줄 바로 앞에서 멈췄어요
4번
라인 바로 다음에요
다음에 그 함수를 호출해도 계속될 겁니다
그래서 i를 하나 증가시킬
거예요 루프를 재실행해 하나를 내주고
하나를 준 다음 멈추죠
다음에 호출할 때 계속 증가할
거예요 하나를 산 다음 반복문을
반복해 두 개를 주죠 그런 다음 멈추는 등 그런 식으로요
결국 인원이 바닥나면
아무것도 내줄 수 없죠
그제야 끝났다는 걸 알죠
그럼 어떻게 하죠?
우선 100개의 번호를 프린트하죠
이제 목록이 아닌 생성기
개체를 제공합니다 100개의
숫자라는 함수 이름과 관련
있죠
개체의 메모리 주소도 알려주죠
함수를 어떻게 정의했는지 보십시오 프린트는
객체라는 것을 알려줍니다 백그라운드에서 Python은
여러분이 생산기를 사용했다는
것을 알기 때문에 생성기를 만드는 것이고
그것들을 Python 객체로 바꾸는 것이죠
이 물건들을 기능 없이 만드는
방법은 나중에 알려 드릴게요
발전기를 변수로 저장하죠
발전기를 'G'라고 부를 거예요
소규모 프로그램에서 흔히 쓰는 이름이죠
발전기가 많다면 좀
더 서술적인 이름을 붙여야겠죠
그런 다음 생성기가 제공하는
다음 값을 출력할 거예요
생성기를 초기화할 때 함수를 실행하지
않고 맨 위에서 시작한다는 걸 주목하세요
다음 값을 요구하면 수확까지
가서 여러분이
수확한 값을 주죠
다음 값을 요청하는 방법은
그 함수를 다시 실행하지 않고 다음 "g"을 말하는 거죠
다음은 발전기에 영향을 주는 빌트인 기능입니다
생산량을 올리라고 하죠
이걸 실행하면 이제 0이 나오는 걸 보실 수 있어요 왜냐하면
처음으로 나타난 숫자니까요
발전기 'g'이 4번 라인에서
멈췄어요 4와 5 사이에요
다른 숫자를 요청하면 프로그램 말미에 생성기가 파괴되는
걸 알 수 있죠 이 프로그램을
다시 실행하면 이건 다시 0이 되고
이건 1이 될 거예요
프로그램 실행에 대해서는 기억하지 못합니다
파이썬 은 그런 식으로 작동하지 않죠
이제 첫 번째 숫자와 다음 숫자에 대해
물을 수 있어요
첫 번째 숫자 이후엔 4에서 5
사이에 멈출 거예요
다음이라고 하면 다음이 나올 때까지 계속돼요
이 루프를 한 번 반복하면 하나가 나온다는 뜻이죠
네
기능이 어디서 멈췄는지 기억하는 게 중요해요
어떤 시점에서든 그 함수가 실행되는 걸 멈출 수 있어요
그런 다음 계속하기 위해 Next를 호출할 수 있죠
따라서 숫자를 생성하는 데만 유용한 게 아니라 어떤 함수가
일시적으로 실행되는 걸 중단하고 원할
때 언제든 계속 실행할 수 있습니다
Next를 호출해서요
지금은 말이 잘 안 되지만
동기화 프로그래밍을 할 때 필요할
때를 위해 기억해두세요
범위 함수는요?
앞서 범위 함수가 내부에서
작동하는 원리를 설명한다고 말씀드렸죠? 그건 사실이지만
범위 함수가 발생기를
직접 주진 않아요
'나의 범위 오브젝트'는
10 범위로 하죠
발생기처럼 작동하지만 "my range
object"를 호출하면 오류가
생깁니다. 보세요.
범위 개체가 발생기가 아니기 때문이죠 이런
식으로 동작하더라도요
목록을 생성하지 않고 그걸 반복하게
해줍니다 이 세대식으로 작동해 더 효율적으로 되죠
'나의 범위 오브젝트'는
훨씬 전에 출력했던 것
기억하실 겁니다 그래서
이상한 범위 0에서 10이 나왔죠
'Rpr' 기능이 호출된 거죠 결과를
출력하면 0에서 10까지의
범위도 나와요
"my range 객체"는 이것과
비슷한 동작인데요 몇 비디오에서
객체를 범위 객체처럼 동작하게 하기 위해 정확히 어떻게
반복하는지 배울 거예요
이 발전기에 대해 알아봤는데요 사실 발전기에 대해
말씀드리고 싶은 게 하나 더
있어요 목록 기능은 발전기를 목록으로 바꿀 수 있어요
'g'을 출력할 수 있어요
여기서 '다음'이라고 한 다음 다시 '다음' 그리고
'목표'가 나오죠
이제 0과 1이 "다음" 함수에 그 두 가지를 위해 프린트됐어요
그런 다음 생성기의 목록을
생성했는데 물론 그 목록은 중단한
곳에서부터 계속되죠
제너레이터가 기억하기 때문에
0이 아니라 2에서 리스트가 시작되죠
발전기가 어디 있었는지 기억하는
게 중요해요
그래서 하나를 만들면 사용을 시작한 그 순간부터 "다음"을
부르기 시작하는 순간
위치를 기억하기 때문에 뒤로 돌아갈
수 없어요 네
다음 영상 몇 개에서는 발전기에
관해 좀 더 배울 거예요
발생기 클래스에 대해 배워보겠습니다
발생기처럼 동작하는 클래스를 만드는 방법과
Python의 반복 장치에 대해서도 배워보겠습니다
범위 오브젝트가 그 예 중 하나죠
그런 다음 기능적인
프로그래밍 예로 넘어가겠습니다
필터, 맵, 아무것이나 열거하기 같은 거요
그래서 이 섹션에 대해
꽤 기대하고 있습니다 확신하건대 여러분이
Python 개발에 발전기가 필요하게
될 겁니다 특히 과정이 더 진행됨에 따라서요
그럼 다음 영상에서 만나요