이번에는 Chapter 9까지 스터디를 진행 하였다.

http://www.yes24.com/Product/Goods/29289816

 

처음 시작하는 파이썬 - YES24

파이썬으로 프로그래밍에 입문하자!데이터 분석, 금융, 자연 과학 등 다양한 분야에서 각광받는 언어 파이썬. 개발자가 아니더라도 개발자가 되고 싶다면, 개발자지만 파이썬을 처음 시작한다

www.yes24.com

책의 구매 링크이다.

https://inha-kim.tistory.com/34

 

[처음 시작하는 파이썬] 2주차 스터디 정리 [반복문: while과 for 문], [튜플과 리스트], [딕셔너리와

이번에는 Chapter 6 부터 Chapter 8 까지 스터디를 진행 하였다. http://www.yes24.com/Product/Goods/29289816 처음 시작하는 파이썬 - YES24 파이썬으로 프로그래밍에 입문하자!데이터 분석, 금융, 자연 과학 등..

inha-kim.tistory.com

지난주 스터디 결과이다.

코드를 반복하는 것은 매우 비효율 적이다. 
코드를 재사용 하기 위해 탄생한 것이 함수이다.
파이썬에서 함수는 parameter(매개변수)로 모든 타입을 취할 수 있다.


함수 정의는 def로 한다.
괄호안에 option으로 매개변수를 줄 수도 있지만, 안줄수도 있다.
이름 규칙은 변수와 동일하다.
매개 변수가 없는 함수를 호출하면 다음과 같다.

매개 변수가 없으며, 아무것도 하지 않는다는 pass

함수 호출은 다음과 같이 수행한다.
그냥 함수 이름을 쓰면 된다.
위에 예제는 return이 없으므로 none이 return 된다.
함수를 호출 하면 다음과 같이 함수 안에 문장이 실행 된 뒤에 다시 돌아간다.

다음과 같이 함수 호출

다음과 같이 return을 줄 수도 있다.

간단한 if문을 check

한번 def ~~~()에 간단하게 매개변수를 줄수 있다.

echo 함수에 김현우를 전달 하자 my name is 김현우가 출력

여기서 코딩? 하는 사람들이 은근 햇갈리는게 하나 있다. 매개변수(parameter)와 인수(argument)를 오해하는 경우가 
있다.
매개변수란 함수 내부에선 매개변수이다. 하지만 함수 외부에서 전달할때는 그것은 인수이다.
즉 def echo(name)에서 name은 매개변수, print에서 김현우는 인수이다.

다음과 같이 색을 test하는 함수도 만들 수 있다. 여러가지 색을 test할때 저거 if문을 도배 하는 것이 아닌
저거 하나만 가져다 쓰면 된다.

만약 함수를 쓰지 않는다면 코드가 더 길어지고 피곤해진다.

return 값은 변수에 전달이 가능하다. 하지만 return이 없다면 None이 return 된다.

return이 있으므로 what_color에 결과가 저장 된다. return 없으면 None

None은 파이썬에서 좀 특별한 값이다. 뭔가 False 같아 보이지만 다른 값을 의미한다.

None과 False는 다르다.

그럼 False와 None으로 어떻게 구분할까 바로 is 연산자를 사용하면 된다.

is를 이용하여 None을 체크 한다.

한번 다음과 같이 None, False, True를 한번 test해보자. 함수를 만든다

다음과 같다.

한번 다양한 것들을 체크 해보자.

빈 자료구조와 str은 False이다.

파이썬은 다른 언어에 비해 인수 처리가 매우 유연,독특하다. 
매개 변수에 복사하는 위치인수이다. 가장 익숙한 방식이다.
다음과 같은 함수는 3개를 매개변수로 전달 받는다.

순서에 따라서 전달 받는다.

여기서 이런 방식은 항상 매개변수의 위치를 알아야 한다.

 

이러한 방식을 보완하는 방식은 키워드 인수 방식이다.
다음과 같이 하며 순서가 바껴도 상관없다.

다음과 같이 high와 middle의 위치가 바껴도 출력이 똑같다.

매개변수에서 기본값을 지정 할 수도 있다.
처음에는 암것도 안준것, 두번째는 초등학교만 인하를 준 것이다.

다음과 같이 기본 값을 줄 수 있다, 인수를 전달 안하면 기본값이 전달된다.

여기서 조심히 봐야할 게 있다.
파이썬의 특징이자 기술면접에 가끔 나온다고 한다.

지역 변수가 아닌 것을 알 수 있다. 예상한 결과가 ㅏ아니다.

우리가 예상한 결과는 ['a'], ['b']이지만 아니다.
예상한 결과를 만드는 법은 다음과 같다.

우리가 예상한 결과가 나오는 것을 알 수 있다.

 

*는 C/C++에서는 포인터로 생각 할 수 있지만, 파이썬은 포인터가 없다.
함수의 매개변수 * 에스터리스크를 사용하면 위치 인수 변수를 Tuple로 묶는다.
다음 예시를 확인하자.

인자의 개수를 마음대로 전달 할 수 있다.

이것은 다음과 같이 몇개의 인수는 의도적으로 따로 취할 수 있다.

num1과 num2에서 인수를 취하고, 나머지는 args로 처리한다.

*args를 사용 하는 이유는 그냥 이름이다. args는 관습적으로 쓰는 표현이다. 

두개의 차이를 확인 하자.

*구문은 함수호출 정의만 사용이 가능하다 아니면 error가 발생한다.

키워드 인수 분해 및 모으기는 **두개를 사용한다.
인수의 이름은 key, 이 값은 이 키에 대응하는 딕셔너리 값이다.

다음과 같이 딕셔너리 형태로 저장된다.
위에 args와 비슷하게 생각 할 수 있다.

키워드 전용 인수로 다음과 같이 start end 위치를 정할 수 있다. python3에서 부터 지원한다.
다음 예시를 확인하자.
이름에서 알 수 있듯, 위치적으로 제공이 아니라 이름=값으로 제공해야한다. *는 start.end를 사용하지 싶지 않으면
인수로 제공해야한다.

다음과 같이 원하는 인수를 취할 수 있다.
이렇게 주는 것은 error가 발생한다. 꼭 이름=값으로 전달 해야한다.


가변 인수인 리스트는 함수 안에서 바뀔시에 밖에있는 것도 바뀔까? 한번  test해보자.
아주 안좋은 것으로, 함수 내에서 인수가 바뀐다고 문서화하거나 새값을 반환해야한다.
함수내부에서 변하는 것에 대해서 주의하자.

이건 매우  안좋은 예이다. 외부가 내부에서 바뀜

독스트링이라는 파이썬의 독특한 것이 있다.
문자열을 포함시켜 함수 정의에 문서를 붙일 수 있다.
다음 예제를 확인하자.

함수에 대한 설명이 가능하다. 유용한 기능이다.

이러한 방식으로도 가능하다.

이렇게 파이썬에 사용자 정의 함수에 주석을 달 수 있다.

모든것은 객체이다. 파이썬의 철학이다.
객체에는 숫자 문자열 튜플 함수까지 모든 것을 포힘한다.
파이썬은 다른언어에서 구현하기 힘든 것도 구현한다. 다음 예를 보자.

매우 간단한 함수이다.

다음과  같이 함수를 실행하는 함수가

있다고 할때 이와 같이 전달하면 answer함수가 실행 되는 것을 알 수 있다.

다음과 같이 가능하다.

여기서 함수의 type은 class 'function'이다.
다음과 같이도 가능하다.

add, run_somthing 함수, add 3 4 를 전달하면 7이 나온다.

그러면 앞에서 배운 *args 와 **kwargs도 가능할까? 그렇다 가능하다.

다른예도 많지만 이게 간단하다.

함수를 리스트, 튜플, 셋, 딕셔너리의 요소로 사용이 가능 하지만, 불변이기 때문에 딕셔너리 key로는 불가능 하다.


함수안에 함수를 정의 할 수도 있다. 좀 신기한 기능 처럼 보이긴 한다.
내부 함수는 주로 복잡한 작업을 한번이상  할떄 이용한다.

out_func에서 in_func(a+b)를 return 한다.

이런거로 쓰면 좋을거 같긴 하다.

간단한 예제이지만 함수 내에서 반복하면 쓰면 될거같다.

내부함수는 클로저로 동작 할 수 있습니다.
다른 함수에 의해 동적으로 생성 됩니다.
클로저에 속한 지역변수는 바깥에서 접근 할 수 없어서 데이터를 숨기고 싶을때 사용 합니다.
외부 함수로 부터 생선된 변수값을 저장 할 수 있는 함수입니다.

a,b,의 type은 function, a(),b()를 하면 출력이 함수에 전달되어 사용된 name을 기억한다. 출력이 잘 나오는 것을 알 수 있다.


익명함수는 lambda이다.
파이썬의 람다 함수는 단일문장으로 표현이 가능한 익명함수 입니다.

이런 간단한 code를 참고하자

lambda 를 사용하면 다음과 같이 가능하다. 좀 극단적인 예 인거 같지만

처음보면 많이 이상해 보인다.

뭐 설명없이 보면 좀 이상해보이긴한다.
람다는 쉽게 설명하면 콜론 : 이후에 함수를 정의한다.
all upper를 사용하는 것 보다 명확하며, 람다는 많은 작은 함수를 정의하는데 사용된다.
이런 예를 확인해보자.

첫 글자를 대문자로.
숫자

간단하게 한 줄로 간단한 기능을 하는 함수를 만들  수 있다.

제네레이터(generator)는 시퀀스를 생성하는 객체이다.
전체 시퀀스를 한번에 메모리에 정렬, 생성하는 것이 아니라 큰 시퀀스를 순회 할 수 있다.
보통 제네레이터는 이터레이터에 대한 데이터 소스로 이용되며, range도 제네레이터에 속한다,
제네레이터의 경우 순회할때 마지막 호출된 항목을 기억하고 다음 값은 반환,
이것의 함수와 차이는 이전 호출에 대한 메모리가 없으며, 항상 똑같은 상태로 진행된다.
메모리 관리에 매우 좋다.

간단한 제네레이터 예

 

우리만의 range함수를 만들면 다음과 같고 return은 yield이다.
yield는 제네레이터를 만드는 것 이며, 호출시 한번 return 그 뒤에 다시 다음 코드부터 실행된다.

yield로 인해 generator가 반환 된다. 출력은 이터레이터 처름 사용한다.
이러한 예를 확인하자, yield 1 , 2 , 3 함수를 호출 할때마다 next 1, next 2, next 3이 출력된다.
사용 될때마다 함수가 진행된다.

이정도 예를 들면 yield에 대해서 이해가 될 것이라고 생각된다.
제네레이터 객체를 순회 할 수 있다.
이때 순회를 마친 제네레이터는 출력이 없다.

마지막에는 출력이 안된다.

제네레이터도 컴프리헨션, generator comprehension이 가능하다.
앞에서도 좀 알아봤지만 ()를 이용한  것이다.
한번 홀수 , 짝수 가지는 generator를 만들어보자.

제네레이터는 메모리관리에 좋으니 자주 사용하도록하자.

데커레이터는 하나의 함수를 취해서 다른 함수를 반환하는 함수이다.
코드를 바꾸지 않고 함수를 수정하는것.

이를 알기 위해서는 *args **kwargs, 내부함수, 함수 인수를 알아야한다.

다음과 같은 함수가 있다하자.

한번 두 숫자를 곱하는 함수도 만들어보자.

아주 간단한 것

document에는 어떻게 전달할까? 

이렇게 전달 하는 방법도 있다.

하지만 이렇게 하는 방법이 더 좋을거같다 . 파이썬은 저자의 말대로 뭐든 간단하면 좋다!

더 깔끔한가? 아직 파이썬을 잘 모르는 나에겐 어렵다


데커레이터는 좀 어려우니 다시 정리하기로 한다.

 

 


지역변수, 전역변수 언제나 어렵다.
모든 언어에서 중요하기도 하다.
아무것도 전해주지 않앗는데 name을 전역변수로 보고 출력한다.

print_name에 아무것도 전해 주지 않아도 전역변수를 name을 출력

name을 변경이 가능할까?

이렇게 전역변수를 함수 안에서 변경할려 하면 error가 발생한다.

아래의 경우는 다른 경우이다.
전역변수 김현우로 인해 김현우가 출력,아래는 change_name함수의 지역변수 name으로 인해 오태승이 출력.
그러므로 print_name을 다시 호출하면 오태승이 아니라 김현우가 나온다.

잘 참고하자.

지역변수는 함수가 끝나면 사라진다.

local()과 globals()을 한번 사용 해보자. 이것들은 딕셔너리 형태로 반환한다.

지역변수에는 오준수 윤우재, 전역변수는 다양한 전역변수가 들어있으며 name은 김현우, name2는 조현호가 들어가 있다.

그러면 global을 어떻게 함수 내에서 변경 하냐. 파이썬의 경우 명시해주면 된다.

전역변수 name들이 함수안에서 바뀐다.

이름에 _와 __ 사용하는 것은 파이썬 내부 사용하므로 예약 되어있다.
이러한 걸 쓸 확률이 낮으니 개발자들이 _를 선택한것이다.
뭐 너무 많지만 간단한 사용을 다음과 같다.

함수의 이름 __name__, 설명 __doc__

그리고 메인 프로그램에는 특별히 __main__을 사용 하는 것 들이 있다.

 

이러한 함수를 이용하여 재귀 함수를 만들 수 있다.
재귀함수는 자기 자신을 재참조 하는것 항상 termination condition이 필요하다.아니면 무한루프에 빠진다.

종료조건이 없는 경우 다음과 같이 무한루프에 빠져서 멈춘다.

파이썬에서는 이허한 재귀함수의 깊이를 정할 수 있다. 참고로만 알아두자

재귀 함수로는 브루트포스 아니면 몇차원 데이터를 펴는데 사용 할 수 있다.
다음 예를 확인하자.

많은 차원을 가진 데이터를 펴주었다.


예외처리는 필수일것이다.

프로그램이 예외가 발생하는 경우마다 멈추게 하기 싫다면.
모두 try: except:로 처리한다. 다음 예를 확인하자.

다음과 같은 경우 zeroDivisionError가 발생한다. 그러므로 프로그램이 멈춘다,
except 처리로 0/100은 출력 100/0은 error가 출력

한마디로 try문에 error가 있으면 프로그램을 멈추는 것이 아니라 except로 전달한다.
위의 예제의 경우 except에 따로 정의된 error가 없으므로 모든 error을 받는다.

다음과 같이 해보자.
except 예외 타입 as 이름
이렇게 하면 error내용을 as 뒤에 이름에 저장한다.

이상한 인덱스 초과해서 전달시 out of range, 문자열은 invalid literal

위의 코드는 indexerror만 따로 처리하며 나머지 error는 모두 exception에서 처리한다.
그러면 이러한 예외를 만들 수 있을까?
그렇다 class를 이용하면 만든다. 뭐 다음장이 클래스라 다음에 해도 상관없지만 간단한 예를 들면 이렇다.

다음을 보면 숫자가 나오면 error가 나오도록 Numbererror를 만들었다.

parameter로는 Exception, 에러 발생은 raise로 한다.
숫자가 나오면 error
이것도 try except로 받아보자

우리가 만든 예외가 받아지는 것을 알 수 있다.

 

연습문제 솔루션은 깃허브에 올린다.
https://github.com/kimhyeonwokk/introducing_python_solution

 

GitHub - kimhyeonwokk/introducing_python_solution: Practice Solution in Introducing Python Books

Practice Solution in Introducing Python Books. Contribute to kimhyeonwokk/introducing_python_solution development by creating an account on GitHub.

github.com

 

+ Recent posts