이전 판에서는 부록 하나를 차지할 정도로 긴 내용이었는데, 난이도가 너무 높은데 반해서 초급 단계에서 사용을 안 한다는 이유로 이번 책에서 편집이 좀 많이 된 부분입니다. PS. 사실 이전 책에서도 너무 어렵다고, 이거 들어가면 난이도가 초급 책 아니라고 해서 온라인 부록으로 제공했었음.... 그래서 강의에서는 그냥 간단하게 중간 정도 레벨로 설명합니다...!
1강부터 지금까지는 한번 보면 대부분 머리에 남는게 있어서 잘 따라왔다고 생각했는데 여기 40강에서는 generator부분에서 머리가 블랙홀에 온것처럼 빙빙도는데요...!!! 함수 안에 return 값은 함수가 실행되었을떄 순서대로 실행하다가 return이 실행될 시점이 되면 밑에 코드는 실행하지 말고 처음에 함수가 호출된 지점으로 return값을 가지고 돌아가라는 말인 듯한데 그래서 아무리 함수가 반복되어서 호출이 되어도 return 아래에 있는 코드는 실행이 안된다고 이해했습니다. 그에 반해 yield는 험수가 실행되고 yield가 실행될 차례가 오면 그값을 가지고 함수가 호출된 시점으로 가면서 return과 같이 함수를 거기서 멈춰라 한다고 생각됩니다.. 그렇지만 다시 이함수가 호출되면 함수의 yield code 아래에 나머지 코드 부분까지 모두 실행하는 것이라고 이해를 하면 될까요???
강의 잘 들었습니다. 그리고 질문이 한 가지 있는데요, numbers = list(range(1, 10+1)) print("#홀수만 추출하기") print(list(filter(lambda x: x % 2 == 1, numbers))) print() print("3 이상, 7 미만 추출하기") print(list(filter(lambda x: 3
그리고 python3 명령어로 실행하는게 python [파일이름].py로 실행하던 걸 python3 [파일이름].py 로 실행하라는 말씀인가요? python3 [파일이름].py로 실행을 했는데 python3 filterandlambda.py python3 : 'python3' 용어가 cmdlet, 함수, 스크립트 파일 또는 실행할 수 있는 프로그램 이름으로 인식되지 않습니다. 이름이 정확한지 확인하고 경로가 포함된 경우 경로가 올바른지 검 증한 다음 다시 시도하십시오. 위치 줄:1 문자:1 + python3 filterandlambda.py + ~~~~~~~ + CategoryInfo : ObjectNotFound: (python3:String) [], CommandNotFoundException + FullyQualifiedErrorId : CommandNotFoundException 라고 또 오류가 나서요.. 참고로 저는 윈도우를 사용합니다.
p.268 연습문제1번에 numbers안의 요소들이 Int이기 때문에 join앞의 문자열 "::"과 연결을 할 수 없으니 요소들을 문자열로 바꿔야 하는데요. map이라는 개념은 알기에 영상에서 설명해주신대로 하면 이해는 갑니다. 근데 제가 순간적을 떠올린게 str.numbers라고 쓰면안되나.. map을 꼭 써야하나? 라는 생각이 스쳐서요 제가 무슨 개념을 놓치고 있는걸까요?? 형변환을 이런식으로 했던거 같아서요. 형변환을 이렇게 하면 안되는건지와 map을 사용하지 않는 방법이 있는지 질문드립니다!
윤인성 저자님, filter 함수를 쓸때 두가지 조건을 걸러면 예를 들어서 list안에 정수가 홀수이고 5보다 큰 수를 추출하고 싶다면 어떻게 쓰면 되는지요? numbers = [i for i in range(1, 10+1)] print(list(filter(lambda x: x % 2 ==1 , x > 5 , numbers))) 쉼표로 "and" 조건문을 구성할 수가 있는가요?
안녕하세요 오늘도 좋은 수업 감사합니다. 질문이 있습니다. -------------------------------------------------------------------- def 함수(): print("출력A") yield 100 # next 한 번 실행 시 멈춤 print("출력B") yield 200 # next 두 번 실행시 여기까지 print("출력C") yield 300 print("출력D") yield 400 제너레이터 = 함수() 값 = next(제너레이터) -------------------------------------------------------------------- -> 이 경우, 실행하면 출력 A 100 이렇게 첫 번째 yield 값도 같이 나오는데 -------------------------------------------------------------------- def 함수(): print("출력A") yield 100 # next 한 번 실행 시 멈춤 print("출력B") yield 200 # next 두 번 실행시 여기까지 print("출력C") yield 300 print("출력D") yield 400 제너레이터 = 함수() next(제너레이터) next(제너레이터) -------------------------------------------------------------------- -> 이 경우에는 100, 200 등이 안 나오고 출력 A 출력 B 이렇게 나오는 이유는 뭔가요??
앗 다시 한 번 실행해보실 수 있을까요?[저장이 안 되었다던지 등으로 출력이 안 될 수도 있으므로] 위의 것도 print(값)로 값을 출력하지 않는 이상, 값이 출력되어서는 안 됩니다. 주피터 노트북 등에서 실행하시는 경우에는 마지막 줄을 무조건 출력하므로, print() 함수를 사용하지 않아도 100, 200 등이 출력될 수 있지만, 이 경우에는 위의 코드와 아래 코드 모두 숫자를 출력하게 됩니다(마지막 줄만 출력하니 200을 마지막에 붙여서 출력합니다).
선생님 질문이 있는데요 1::2::3::4::5::6 이 문제에서 저는 답을 print("::".join(map(lambda i:str(i), numbers))) 이렇게 했는데 이렇게 해도 답이 제대로 나오더라구요 그런데 선생님은 print("::".join(map(str, numbers))) 이렇게 하셨는데 굳이 람다 함수를 안쓰고 str만 적어도 저절로 형변환이 되는건가요? 만약 저절로 형변환이 된다면 그 원리가 무엇인가요?
리스트를 하나 더 만들어서 메모리를 차지하지 않고 + 단순하게 코드 흐름만으로 데이터를 만들어내서 → 메모리를 절약하게 해줍니다! C 언어 이후의 프로그래밍 언어는 대부분 기본 자료형을 제외한 모든 것을 내부적으로 포인터로 자동으로 처리해서 → 리스트 등등 모두 내부적으로는 포인터를 활용합니다!
오랜만에 강의 듣습니다~~ 6장부터는 난이도가 떨어 진다고 하셨는데.. 6장 들어가기전에 복습하는 의미에서 1장~5장까지 한번더 연습을 해보고 가려고 하는데.. 특히 5장은;; 잘 모르지만 넘어간 부분도 좀 있어서.. 선생님 의견을 한번 들어보고 싶습니다~ 아니면 6장을 천천히 나가면서 다시한번 복습을 하는게 좋을까요?
개인적으로는 - 메인은 진행하면서: "뒤에 엄청 쉬워!!!"하면서 자신감을 기를 수 있습니다. → 일반적인 개발은 해당 문제들만큼의 난이도도 안 나옵니다. - 부가적으로 간단하게 복습: 못 풀겠어서 답지를 봤던 문제를 주기적으로 몇 번 다시 풀어보는 것을 추천합니다[그냥 하루에 한 문제 정도 간단하게]. → 근데 나중에 좀 일반적이지 않은 복잡한 것을 만들려면 필요하기는 해서 차근차근 오래 잡고 보시면 됩니다. 를 추천합니다!
선생님 복습중에 한가지 햇갈리는게 있어서 질문드립니다 def test(): print("함수가 호출되었습니다") yield "hihi" print("a지점통과") test() print("b지점 통과") test() print(test()) next(test()) #제가직접 추가한코딩 266쪽 직접해보는손코딩과 똑같이 하고 마지막 next(test()) 만 추가했습니다. 제가 생각한결과는 next 함수를 사용하면 yield 키워드 뒤에 입력한값까지 리턴되는걸로 알고있어서 3번째 줄에있는 hihi 까지 출력되는걸로 알고있었는데 막상 실행해보면 hihi는 출력되지않는데 무슨이유인가요? 아래는 코딩을 출력한 결과입니다. a지점통과 b지점 통과 함수가 호출되었습니다
교수님 :-) 강의 항상 감사하게 잘 보고 있습니다~! def 함수(): print("출력A") yield 1 print("출력B") yield 2 제너레이터 = 함수 () next(제너레이터) next(제너레이터) 로 실행시키면, 출력A 출력B 가 잘 나오는데요, def 함수(): print("출력A") yield 1 print("출력B") yield 2 next(함수()) next(함수()) 이렇게 실행시키면, 출력A 출력A 로 나오는 이유는 무엇인가요~? 'ㅁ'
next() 함수에 대해 궁금한 점이 있습니다 ! def test(): print("강의 감사합니다.") yield print("책도 알차고 좋아요.") yield next(test()) next(test()) 이 코드를 실행하면 강의 감사합니다. 강의 감사합니다. 위와 같이 출력되는데 def test(): print("강의 감사합니다.") yield print("책도 알차고 좋아요.") yield a = test() next(a) next(a) 이렇게 a = test() 라는 변수를 선언해주면 강의 감사합니다. 책도 알차고 좋아요. 라고 출력되는데 왜 굳이 새로운 변수를 선언해줘야 모두 출력이 되는 걸까요..ㅠㅠ
좋은 강의 감사합니다!! 질문 하나만 할게요! 확인문제 1번에서 아래와 같은 코드도 가능할까 해서 시도를 해봤는데 아래와 같은 실행결과가 나왔어요.... 코드: numbers = [1, 2, 3, 4, 5, 6] print("::".join(str(numbers))) 실행결과: [::1::,:: ::2::,:: ::3::,:: ::4::,:: ::5::,:: ::6::] 이거 왜 이렇게 나오는건가요??? 강의에서 보여주신 코드랑 같은 결과가 나와야 하는게 아닌가요??????
재미있게 따라가다 어느새 40강까지 왔네요. 감사인사드립니다. Visual studio code 에 관해 질문이 있습니다. 자동완성 기능이 한편으론 편리하면서도 아쉬운 점이 있는데 예를 들면, 큰 따옴표나 괄호를 입력하면 여는 괄호, 닫는 괄호가 함께 나옵니다. 이때 닫는 괄호를 굳이 입력하지 않고 빠져나오는 방법이 있을까요? [1,2,3,4 까지만 치고 이미 입력되어 있는 ] 는 굳이 안치고 괄호 밖으로 나올 수 있는가 해서요 간혹 그 라인의 마지막 부분이라면 end 키를 치고 나오면 되는데 그렇지 않은 경우라면, 예를 들면 print(func([1,2,3,4])) 라고 작성할 때 4까지 치고 대괄호를 나와서 소괄호 닫히기 전에 조금더 입력하고 싶은 경우가 있거든요 따옴표 경우에도 이런경우과 왕왕 있는데, 굳이 미리 완성된 기호들을 다시 치지 않아도 되는 방법이 있지 않을까 궁금합니다 :)
코드를 작성하는 분들의 성향에 따라서 크게 구분하면 1. 순서대로 작성한다형 print print( print(ㅇㅂㅇ print(ㅇㅂㅇ) # 그냥 순서대로 쭉 입력 형태로 작성하는 분들인데, 이런 타입 분들은 그냥 괄호까지 모두 입력하면서 나아가시는 편입니다. Visual Studio Code는 괄호를 자동으로 만들어주지만, 순서대로 입력하면 괄호가 중첩되는게 아니라, 그냥 그 위치에 들어가게 됩니다. 2. 호출 스택 순서대로 작성한다형 print print() # 괄호 넣고 왼쪽 키를 누르고 print(ㅇㅂㅇ) # 입력하고 END 눌러서 벗어남 print(ㅇㅂㅇ()) # 더 입력할 경우 괄호 누르고 왼쪽 print(ㅇㅂㅇ(ㅇㅂㅇ)) # 입력하고 END 눌러서 벗어남 형태로 괄호를 열고 닫은 뒤에 + 왼쪽 키를 눌러서 괄호 안으로 들어간 뒤 + 뭔가를 입력하고 END 키를 눌러서 빠져나오는 형태입니다. Visual Studio Code는 괄호는 자동으로 만들어줍니다. Visual Studio Code 기본적으로 위와 같이 사용하는 두 패턴에 맞춰서 설계된 편입니다. 아마 현재 1번처럼 입력하시는 것 같은데, 굳이 완성된 기호를 입력하지 않기 원하신다면, 언급하신 것처럼 END 키를 사용하는 것이 가장 일반적입니다...!
@@user-rh1qt9zn7h 와~! 친절하고 자세한 답변 감사드립니다. 더구나 빠르기까지! :D 두번째 패턴의 경우 자동완성이 더 유용해 보이네요. 한번 염두에 두고 작성해봐야겠습니다. 단순히 타이핑 만이 아니라 생각의 패턴도 조금 바꿔야 할 것 같은데, 그것도 재미있을 것 같아요. 감사합니다!
아예 함수가 다르므로 실행 방식 자체가 다릅니다. map(str, numbers)는 numbers의 각 요소들이 문자열이됩니다. [1,2,3]이 있었다면, ["1","2","3"]으로 되며 최종 결과는 리스트입니다(map함수는 리스트를 리턴하기도하고) str(numbers)는 최종 결과가 문자열입니다. [1,2,3]이 그냥 "[1,2,3]"이 됩니다.
안녕하세요 저자님! yield가 양보한다는 의미가 헷갈려서 질문 드립니다!! p. 267의 소스 코드 generator01.py에서 보면, def test(): print("A 지점 통과") yield 1 output = test() print("D 지점 통과") a = next(output) print(a) - ------> 의 결과로 "D 지점 통과" 다음에 "A 지점 통과" 그리고 1이 출력되는데요!! ************************** yield를 return 으로 바꾸었을 때 ****************************** def test(): print("A지점 통과") return 1 output = test() print("D지점 통과") print(output) --------> 의 결과는 위에 것과 다르게, "A지점 통과"가 "D지점 통과"보다 먼저 출력 되는 것은 output = test()가 print("D지점 통과")보다 먼저 작성되어서 그런건가요 ???ㅜㅜ 그렇다면 제너레이터 함수는 yield 때문에 output = test() 실행을 잠시 미루고?? print("D지점 통과")를 먼저 실행되게 한 건가요???
리스트 선언할때 자체에서 int를 str로 변환하고 싶어서 아래와 같이 해봤는데요.. 1,2,3,4,5,6 각각 변환하는 것 말고 통째로 변환하는 방법은 없나요? (map 함수를 쓰는 것 외에..) numbers2 = [str(1),str(2),str(3),str(4),str(5),str(6)] print("::".join(numbers2))
제너레이터를 for 반복문과 조합해서 쓸때(영상 4:37 부터) for문에 next를 쓰지 않았는데도 함수가 계속 진행되던데 원리를 잘 모르겠습니다. 영상을 보면 i 값에 next(제너레이터) 값이 들어는것 같던데 next를 쓰지 않았는데 어떻게 i에 그 값이 들어가게 되는 건가요?
@@junghun8345 넵 가능합니다! join() 은 정확하게는 "문자열로 구성된 반복 가능한 녀석"을 매개변수로 받기 때문입니다. 그래서 [1, 2, 3]과 같은 리스트가 있을 때 ":".join(map(str, [1, 2, 3]))과 같은 코드를 많이 씁니다(그냥 [1,2,3]을 넣으면 숫자로 구성된 리스트라 오류).
안녕하세요~ㅎ 강의 잘 보고 있습니다. 질문이 있는데요~ 제너레이터를 사용하면 4분 4초처럼 next()에 따라 출력A, 출력A 출력B, 출력A출력B출력C 이렇게 나오는데 처음 사용하면 출력A 두번째 사용하면 출력B 세번째 사용하면 출력C 이렇게 하나씩 출력되는 경우도 제너레이터로 사용할 수 있나요?
안녕하세요!! 책 사서 강의 열심히 듣고 있습니다!! 강의 정말 감사합니다!! 제러레이터 전 P261쪽 직접해보는 손코딩 랜덤하게 1000명의 키와 몸무게 만들기 코드를 쓰고 실행을 하니 return codecs.charmap_encode(input,self.errors,encoding_table)[0] UnicodeEncodeError: 'charmap' codec can't encode characters in position 0-1: character maps to 이렇게떠서요 혹시 제가 코드잘 못적은게 있나해서 홈페이지 소스코드 복사해서 붙여 실행했는데도 똑같이 뜨네요 어떻게 해결해야 하나요??
앗 이건 환경 문제로 환경이 살짝 꼬이신 것 같습니다![원래 파이썬이 알아서 인코딩을 맞춰주는데 약간 충돌이 있어서 못 맞춰주고 있는 것 같습니다]. 인코딩을 강제로 지정해야 하는데 해당 코드에서 open() 함수를 open("info.txt", "w", encoding="utf-8"): 로 해서 파일을 저장하고 이후의 코드에서 open("info.txt", "r", encoding="utf-8") 로 해서 파일을 열어주시기 바랍니다. 만약 이게 같은 오류가 뜰 경우 'utf-8'을 'euc-kr'로 지정해주세요!
@@user-rh1qt9zn7h 선생님 빠른 답변 정말 감사드려요!!! encoding="utf-8"를 넣고 돌리니 text file이 제대로 만들어졌어요!! 근데 질문이 하나 더 드려도 될까요? 제가 262쪽 반복문으로 파일 한줄씩 읽기 고대로 쓰고(encoding="utf-8"포함) 돌리니 File ".\goodmorning.py", line 15, in with open("info.text","r",encoding="utf-8") as file: FileNotFoundError: [Errno 2] No such file or directory: 'info.text'이렇게 떠요. 소스코드붙여서 돌리면 제대로 결과가 나오는데 제가 직접 써서 돌리면 왜 저런 메세지가 뜨는걸까요? 제가 잘못쓴게 있나해서 소스코드랑 제꺼랑 일일이 대조해 봤는데 똑같았거든요. 예전부터 텍스트파일 읽어오려고 할때마다 항상 저메세지가 떴었요;; 뭐가 잘못된걸까요??
질문이 있습니다. def gen: yield 1 print(type(gen())) print(type(gen()) is generator) 를 실행하면 와 함께 NameError가 뜨더라고요. 원하는 타입이 아닐때 에러가 뜨게 하고싶고 제너레이터를 받으면 임시적으로 통과가 되게 하고 싶은데 조언을 구하고 싶습니다ㅠㅠㅠ
아! 그렇다면 아래의 두 제너레이터 함수에서 output = test() vs print("D 지점 통과") print("D 지점 통과") output = test() a = next(output) a = next(output) print(a) print(a) output = test()의 위치가 print("D 지점 통과") 과 바뀌어도 상관이 없는 것인가요???
영상에서 설명해주신 것처럼 제너레이터 = 함수() next(제너레이터) 를 실행했을 땐 yield가 전달해준 값이 나오지 않고, 반면 책 267쪽에 나오는 예제에서처럼 output = test() a = next(output) print(a) a라는 변수를 따로 선언하고 출력하면 yield가 전달해준 값이 나오는데, 변수를 따로 선언해주는 것이 yield 전달값에 어떻게 영향을 미쳐서 다른 결과가 나오는지 궁금합니다..!
@@user-rh1qt9zn7h 주말인데 빠른 답변 감사합니다!! 함수 내부에서 print("출력A")를 입력했기 때문에 출력A 가 출력되는 건 알겠는데, 제너레이터 = 함수() # 실행결과 next(제너레이터) # 출력A 제너레이터 = 함수() # 실행결과 값 = next(제너레이터) # 출력A print(값) # 100 이 둘의 차이는 print를 한 번 더 해줬기 때문에 yield가 전달해준 값이 나오는 것인가요?