코드를 반복하는 것은 매우 비효율 적이다. 코드를 재사용 하기 위해 탄생한 것이 함수이다. 파이썬에서 함수는 parameter(매개변수)로 모든 타입을 취할 수 있다.
함수 정의는 def로 한다. 괄호안에 option으로 매개변수를 줄 수도 있지만, 안줄수도 있다. 이름 규칙은 변수와 동일하다. 매개 변수가 없는 함수를 호출하면 다음과 같다.
함수 호출은 다음과 같이 수행한다. 그냥 함수 이름을 쓰면 된다. 위에 예제는 return이 없으므로 none이 return 된다. 함수를 호출 하면 다음과 같이 함수 안에 문장이 실행 된 뒤에 다시 돌아간다.
다음과 같이 return을 줄 수도 있다.
한번 def ~~~()에 간단하게 매개변수를 줄수 있다.
여기서 코딩? 하는 사람들이 은근 햇갈리는게 하나 있다. 매개변수(parameter)와 인수(argument)를 오해하는 경우가 있다. 매개변수란 함수 내부에선 매개변수이다. 하지만 함수 외부에서 전달할때는 그것은 인수이다. 즉 def echo(name)에서 name은 매개변수, print에서 김현우는 인수이다.
다음과 같이 색을 test하는 함수도 만들 수 있다. 여러가지 색을 test할때 저거 if문을 도배 하는 것이 아닌 저거 하나만 가져다 쓰면 된다.
return 값은 변수에 전달이 가능하다. 하지만 return이 없다면 None이 return 된다.
None은 파이썬에서 좀 특별한 값이다. 뭔가 False 같아 보이지만 다른 값을 의미한다.
그럼 False와 None으로 어떻게 구분할까 바로 is 연산자를 사용하면 된다.
한번 다음과 같이 None, False, True를 한번 test해보자. 함수를 만든다
한번 다양한 것들을 체크 해보자.
파이썬은 다른 언어에 비해 인수 처리가 매우 유연,독특하다. 매개 변수에 복사하는 위치인수이다. 가장 익숙한 방식이다. 다음과 같은 함수는 3개를 매개변수로 전달 받는다.
여기서 이런 방식은 항상 매개변수의 위치를 알아야 한다.
이러한 방식을 보완하는 방식은 키워드 인수 방식이다. 다음과 같이 하며 순서가 바껴도 상관없다.
매개변수에서 기본값을 지정 할 수도 있다. 처음에는 암것도 안준것, 두번째는 초등학교만 인하를 준 것이다.
여기서 조심히 봐야할 게 있다. 파이썬의 특징이자 기술면접에 가끔 나온다고 한다.
우리가 예상한 결과는 ['a'], ['b']이지만 아니다. 예상한 결과를 만드는 법은 다음과 같다.
*는 C/C++에서는 포인터로 생각 할 수 있지만, 파이썬은 포인터가 없다. 함수의 매개변수 * 에스터리스크를 사용하면 위치 인수 변수를 Tuple로 묶는다. 다음 예시를 확인하자.
이것은 다음과 같이 몇개의 인수는 의도적으로 따로 취할 수 있다.
*args를 사용 하는 이유는 그냥 이름이다. args는 관습적으로 쓰는 표현이다.
*구문은 함수호출 정의만 사용이 가능하다 아니면 error가 발생한다.
키워드 인수 분해 및 모으기는 **두개를 사용한다. 인수의 이름은 key, 이 값은 이 키에 대응하는 딕셔너리 값이다.
키워드 전용 인수로 다음과 같이 start end 위치를 정할 수 있다. python3에서 부터 지원한다. 다음 예시를 확인하자. 이름에서 알 수 있듯, 위치적으로 제공이 아니라 이름=값으로 제공해야한다. *는 start.end를 사용하지 싶지 않으면 인수로 제공해야한다.
가변 인수인 리스트는 함수 안에서 바뀔시에 밖에있는 것도 바뀔까? 한번 test해보자. 아주 안좋은 것으로, 함수 내에서 인수가 바뀐다고 문서화하거나 새값을 반환해야한다. 함수내부에서 변하는 것에 대해서 주의하자.
독스트링이라는 파이썬의 독특한 것이 있다. 문자열을 포함시켜 함수 정의에 문서를 붙일 수 있다. 다음 예제를 확인하자.
이러한 방식으로도 가능하다.
모든것은 객체이다. 파이썬의 철학이다. 객체에는 숫자 문자열 튜플 함수까지 모든 것을 포힘한다. 파이썬은 다른언어에서 구현하기 힘든 것도 구현한다. 다음 예를 보자.
다음과 같이 함수를 실행하는 함수가
있다고 할때 이와 같이 전달하면 answer함수가 실행 되는 것을 알 수 있다.
여기서 함수의 type은 class 'function'이다. 다음과 같이도 가능하다.
그러면 앞에서 배운 *args 와 **kwargs도 가능할까? 그렇다 가능하다.
함수를 리스트, 튜플, 셋, 딕셔너리의 요소로 사용이 가능 하지만, 불변이기 때문에 딕셔너리 key로는 불가능 하다.
함수안에 함수를 정의 할 수도 있다. 좀 신기한 기능 처럼 보이긴 한다. 내부 함수는 주로 복잡한 작업을 한번이상 할떄 이용한다.
이런거로 쓰면 좋을거 같긴 하다.
내부함수는 클로저로 동작 할 수 있습니다. 다른 함수에 의해 동적으로 생성 됩니다. 클로저에 속한 지역변수는 바깥에서 접근 할 수 없어서 데이터를 숨기고 싶을때 사용 합니다. 외부 함수로 부터 생선된 변수값을 저장 할 수 있는 함수입니다.
익명함수는 lambda이다. 파이썬의 람다 함수는 단일문장으로 표현이 가능한 익명함수 입니다.
lambda 를 사용하면 다음과 같이 가능하다. 좀 극단적인 예 인거 같지만
뭐 설명없이 보면 좀 이상해보이긴한다. 람다는 쉽게 설명하면 콜론 : 이후에 함수를 정의한다. all upper를 사용하는 것 보다 명확하며, 람다는 많은 작은 함수를 정의하는데 사용된다. 이런 예를 확인해보자.
간단하게 한 줄로 간단한 기능을 하는 함수를 만들 수 있다.
제네레이터(generator)는 시퀀스를 생성하는 객체이다. 전체 시퀀스를 한번에 메모리에 정렬, 생성하는 것이 아니라 큰 시퀀스를 순회 할 수 있다. 보통 제네레이터는 이터레이터에 대한 데이터 소스로 이용되며, range도 제네레이터에 속한다, 제네레이터의 경우 순회할때 마지막 호출된 항목을 기억하고 다음 값은 반환, 이것의 함수와 차이는 이전 호출에 대한 메모리가 없으며, 항상 똑같은 상태로 진행된다. 메모리 관리에 매우 좋다.
우리만의 range함수를 만들면 다음과 같고 return은 yield이다. yield는 제네레이터를 만드는 것 이며, 호출시 한번 return 그 뒤에 다시 다음 코드부터 실행된다.
이정도 예를 들면 yield에 대해서 이해가 될 것이라고 생각된다. 제네레이터 객체를 순회 할 수 있다. 이때 순회를 마친 제네레이터는 출력이 없다.
제네레이터도 컴프리헨션, generator comprehension이 가능하다. 앞에서도 좀 알아봤지만 ()를 이용한 것이다. 한번 홀수 , 짝수 가지는 generator를 만들어보자.
데커레이터는 하나의 함수를 취해서 다른 함수를 반환하는 함수이다. 코드를 바꾸지 않고 함수를 수정하는것.
이를 알기 위해서는 *args **kwargs, 내부함수, 함수 인수를 알아야한다.
한번 두 숫자를 곱하는 함수도 만들어보자.
document에는 어떻게 전달할까?
하지만 이렇게 하는 방법이 더 좋을거같다 . 파이썬은 저자의 말대로 뭐든 간단하면 좋다!
데커레이터는 좀 어려우니 다시 정리하기로 한다.
지역변수, 전역변수 언제나 어렵다. 모든 언어에서 중요하기도 하다. 아무것도 전해주지 않앗는데 name을 전역변수로 보고 출력한다.
name을 변경이 가능할까?
아래의 경우는 다른 경우이다. 전역변수 김현우로 인해 김현우가 출력,아래는 change_name함수의 지역변수 name으로 인해 오태승이 출력. 그러므로 print_name을 다시 호출하면 오태승이 아니라 김현우가 나온다.
지역변수는 함수가 끝나면 사라진다.
local()과 globals()을 한번 사용 해보자. 이것들은 딕셔너리 형태로 반환한다.
그러면 global을 어떻게 함수 내에서 변경 하냐. 파이썬의 경우 명시해주면 된다.
이름에 _와 __ 사용하는 것은 파이썬 내부 사용하므로 예약 되어있다. 이러한 걸 쓸 확률이 낮으니 개발자들이 _를 선택한것이다. 뭐 너무 많지만 간단한 사용을 다음과 같다.
그리고 메인 프로그램에는 특별히 __main__을 사용 하는 것 들이 있다.
이러한 함수를 이용하여 재귀 함수를 만들 수 있다. 재귀함수는 자기 자신을 재참조 하는것 항상 termination condition이 필요하다.아니면 무한루프에 빠진다.
파이썬에서는 이허한 재귀함수의 깊이를 정할 수 있다. 참고로만 알아두자
재귀 함수로는 브루트포스 아니면 몇차원 데이터를 펴는데 사용 할 수 있다. 다음 예를 확인하자.
예외처리는 필수일것이다.
프로그램이 예외가 발생하는 경우마다 멈추게 하기 싫다면. 모두 try: except:로 처리한다. 다음 예를 확인하자.
한마디로 try문에 error가 있으면 프로그램을 멈추는 것이 아니라 except로 전달한다. 위의 예제의 경우 except에 따로 정의된 error가 없으므로 모든 error을 받는다.
다음과 같이 해보자. except 예외 타입 as 이름 이렇게 하면 error내용을 as 뒤에 이름에 저장한다.
위의 코드는 indexerror만 따로 처리하며 나머지 error는 모두 exception에서 처리한다. 그러면 이러한 예외를 만들 수 있을까? 그렇다 class를 이용하면 만든다. 뭐 다음장이 클래스라 다음에 해도 상관없지만 간단한 예를 들면 이렇다.
parameter로는 Exception, 에러 발생은 raise로 한다. 숫자가 나오면 error 이것도 try except로 받아보자
코드를 한번 이상 실행 하는 것은 while과 for문이 필요하다. 아주 간단한 while문은 다음과 같다.
count가 1 이였다가, print 한 뒤에 +1이 되는 것을 알 수 있다. while문은 반복적인 조건문 이므로 count가 11이 되는 순간 멈추게 된다.
저러한 조건 말고, 무한루프중에 멈추는 방법은 break가 있다.
이 프로그램은 q를 입력하면 종료하게 되며, 아니면 모두 대문자로 변환 된 것이 출력된다.
continue는 break와 반대 같지만, 이것은 반복문을 중단 하지 않고, 아래의 코드를 모두 뛰어넘는 것이다. 다음과 같이 사용이 가능하다.
c로 시작하는 단어가 입력시에는 continue이 되는 것을 알 수 있다.
continue 아래 코드는 모두 무시, while문이 다시 시작된다.
break문이 어떤것을 확인 하면 종료 하지만, 모두 체크하고도 break가 되지 않을 경우 다음과 같이 else: 를 통해서 출력이 가능하다.
파이썬의 이터레이터는 매우 유용하게 사용된다. 자료구조가 엄청 커도 , 어떻게 구현되든 무조건 자료구조를 순회하게 해준다. for과 in을 사용하면 된다.
break와 continue은 동일하게 작동한다.
else: 를 이용하면 break가 호출이 되지 않으면 else안에 있는 것들이 실행된다.
숫자 시퀀스를 생성하는 range는 다음과 같이 사용하다.
range(start,end,steps), start는 생략시 0부터, stop은 항상 입력하며 stop-1 까지, step는 생략시 1, 아닐시에는 설정이가능하다. return 은 반복이 가능한 이터레이터 이다.
return을 range 인 것을 알 수 있다. list 로도 만들 수 있다.
[chapter 7] 튜플과 리스트
python에는 두가지 다른 시퀀스 구조가 있다.
하나는 튜플 하나는 리스트, 튜플은 불변 이며, 리스트는 가변이다.
튜플 생성에는 다양한 방법이 있다.
요소가 두개 이상 이면 마지막에 , 는 써도 상관 없고, 안써도 상관없다. 매우 관대한 언어이다.
다음을 보고 잘 알아두자. type이 했갈릴때가 있을 수도 있다.
tuple은 여러 변수에 한번에 할당이 가능하다. 이것을 튜플 언팩킹(tuple unpacking)이라고 부르며, 다음과 같은 예제들이 있다.
tuple()을 사용하면 튜플을 만들 수 있으며, + 로 튜플을 결합 할 수 있다.
*는 복제하는 것이다.
순회는 다른 이터레이터 똑같이 작동한다.
튜플은 불변객체이므로 수정이 불가능하다. 수정하는 것 처럼 보이지는 주소가 바뀌는 것 을 알 수 있다.
리스트는 데이터를 순차적으로 파악하는데 유용하며, 문자열과 달리 리스트는 변경이 가능하다. 현재 위치에 추가, 삭제하거나 기존 요소를 덮어쓰기, 등이 가능하며, 여러값이 여러번나오기도 가능하다.
리스트를 생성하는 법은 []이다. 이다. 생성하는 것은 list()함수를 이용한다.
list 생성은 다음과 같이 가능하다.
split 메서드는 앞에서 문자열을 split하는 것이다. string 에다가 사용하면 list가 나오는 것을 알 수 있다.
offset으로 string과 동일하게 특정 값을 추출 할 수 있다.
하는 방식은 다음과 string과 동일하다.
리스트 또한 슬라이스로 얻을 수 있다.
스트링과 동일하게 [start:end:step] 형식이다.
동일하게 이 경우 error는 발생 하지 않는다.
리스트를 반대로 뒤집는 것은 reverse 메서드 이다. 이 메서드는 리턴이 없다.
리스트 맨 끝에 항목을 더하는 것은 append를 사용한다. insert는 index, 값을 전달 받으면 그 위치에 삽입한다.리스트 끝을 넘는 인덱스를 주면 자동으로 맨 뒤에 더한다.
너무 편한언어^^
*를 이용하여 항목을 복제 할 수 있다.
리스트의 병합은 extend()와 + 또는 +=이용하면 된다.
append는 리스트 자체가 그 앞에 리스트의 원소로 들어간다. 예를 확인하자.
offset으로 리스트의 값을 바꿀 수 있다, 또한 슬라이스를 이용하여 바꿀 수도 있다. 슬라이스 항목수와 달라도, 아무것도 없어도 상관없다.
심지어 list가 아니라 튜플이 와도 상관없다. 심지어 문자열까지 된다.
오프셋으로 항목을 삭제하는 것은 del 을 이용하면 된다. 삭제 된 곳 뒤가 앞당겨져서 온다.
값으로 항목을 삭제 하는 것은 remove() 메서드를 사용하면 된다.
이것은 같은 값이 중복 되면 맨 앞에 있는 것을 삭제한다.
offset은 pop으로 항목을 삭제하며, return값으로 그 값을 가져온다. pop()에 아무것도 안넘기면 -1, 맨 뒤이며, 값을 주면 offset값을 지운다.
파이썬 3.3이상에서는 모든 항목을 지우는 clear() 메서드가 새로 생겼다.
값으로 인덱스를 찾을 수도 있다.
이때 나오는 인덱스는 제일 먼저 나온 것 이다.
존재 여부 확인은 in을 사용한다, return 은 true or false 이다.
값을 세는 것은 count()를 이용한다.
join은 문자열로 변환하는 것이다. 이걸로 form이 있는 문자열로 합칠 수 있다.
정렬하는 sort와 sorted가 있다. 두개의 차이는 sort는 리스트 자체를 내부적으로 sort하지만, sorted는 복사본을 return 한다.
항목의 개수를 얻는 것은 len 함수이다. 다른 타입에도 사용이 가능하다.
= 할당하기는 가변성질을 가지고 있는 list이므로 주의 해야한다. 다음과 같은 예제를 확인하자.
그러면 어떻게 복사할까.
세가지 방법이 있다.
copy 메서드, list 변환 함수, 슬라이스 [:] 등을 사용 하는 것이다.
깊은복사 deepcopy() 리스트의 값이 모두 불변이면 copy() 가 잘 작동한다. 하지만 하나라도 가변이 있으면 원하는대로 작동이 안할 수 있다. 이 예를 확인해보자.
복사가 잘 된것 같지만 아니다. 리스트 안에 불변 객체는 문제가 안된다 하지만 리스트 안에 리스트 즉 가변객체가 있으면 다음과 같은
의도하지 못한 상황이 발생한다.
위에 있는 것들은 얕은 복사 이기 때문이다. deepcopy를 사용하자. 이를 사용 하는 방법은 copy 를 import 해주자.
deepcopy는 중첩된 리스트, 딕셔너리, 기타 다른 객체들은 모두 복사한다.
리스트는 비교가 가능하다.
이는 매우 유용하다.
같은 offset의 항목을 비교한다.
for 과 in을 사용 할 수 있다.
list에 아무 것도 없으면 else가 실행된다.
여러 시퀀스를 순회하는 것은 zip을 이용 하면 된다.
시퀀스의 길이가 다르면 다음과 같이 제일 짧은게 끝나면 멈춘다.
다음과 같이 list로 만들 수 있다.
dict()로 딕셔너리도 만들 수 있다.
list comprehension, 리스트 컴프리헨션은 한줄로 리스트를 만들 수 있다. 잘만쓰면 매우 편하다. 파이써닉한 방식이다. [ 표현식 for 항목 in 순회 가능한 객체 ] 다양한 예를 참고하자.
이러한 방식도 있다.
여기다가 조건을 줄수도 있다. [ 표현식 for 항목 in 순회 가능한 객체 if 조건] 홀수, 짝수 예를 들어보자.
다음과 같은 경우도 가능하다. for in 을 두번 쓰는 것이다. for in ( for in) 이런 구조라고 생각하면 편하다.
튜플 언팩킹으로 다음과 같이도 가능하다.
리스트안에 리스트도 넣을 수 있다.
다음 예를 보자.
오프셋으로 출력을 해보면 다음과 같다.
리스트와 튜플의 차이는 뭘까?
튜플은 리스트의 append(), insert()가 없다. 그러면 튜플이 있는 이유는?
- 튜플은 더 적은 공간을 사용
- 실수로 튜플의 항목이 손상될 염려가 있다.
- 튜플은 딕셔너리 키로 사용 가능
- 네임드튜플(10.11) 객체의 단순 대안이 된다.
가변타입은 컴프리헨션이 있지만, 튜플은 없다.
9.8절에 배운다.
[chapter 8] 딕셔너리와 셋
딕셔너리는 리스트와 비슷하지만, 순서를 따지지 않는다.
그러므로 0또는 1과 같은 offset 으로 항목을 선택 할 수 없다.
대신 고유한 key와 value를 사용한다. 배열이나 리스트와 다르게 딕셔너리는 매우 좋다,
딕셔너리는 {} 와 dict()를 이용 하여 만들 수 있다.
다음과 같은 예제를 확인하자.
이렇게 예약어, keyword를 사용하면 error가 발생한다.
또한 dict는 변환이 가능하다.
물론 두 값으로 이뤄지는 시퀀스만 가능하다.
다음과 같은 형태도 가능하다 매우 관대한 파이썬..
항목을 추가 및 변경은 다음과 같이 한다.
[key]를 사용한다. 다음과 같은 예제를 확인하다.
여기서 value 변경은 다음과 같이 한다.
새로운 것은 어떻게 추가하나? 다음과 같이 하면 된다.
여기서 만약 키 값이 동일하면 마지막에 들어 온 것으로 대체된다.
키값은 항상 고유해야한다.
딕셔너리에서 항목을 얻는 것은 [key] 아니면 get()을 이용한다.
[key]는 없으면 error가 발생한다.
이러한 것을 방지 하기 위해 get를 이용하면 된다.
이때 옵션 값을 주어, none이 출력이 아니라 다음과 같이도 가능하다.
모든 key를 얻는 것은 keys()를 사용하면 된다. 모든 value를 얻는 것은 values()를 쓰면 된다. list와 같이 쓰면 반복가능한 이터레이터로 만들 수 있다.
여기서 모든 key와 value를 얻는 것은 items를 사용한다. len은 키-값 쌍의 개수를 가져온다.
결합하기는 다음과 같이 가능하다.
파이썬 3.5 이상부터 **를 지원한다.
하지만 이건 얕은 복사이다. 세개이상도 지원한다 , 그냥 뒤에 추가로 써주면 된다.
결합하기는 update()로도 가능하다. 이것은 한 딕셔너리의 키와 값을 복사하여 다른 것에 붙이는 것 이다. 같은 key 가 있으면 마지막에 들어온 key값으로 대체된다.
키와 del로 항목 삭제가 가능하다.
키로 항목 가져온 뒤에 제삭제하는 것은 pop이다
모든 항목을 삭제 하는 방법은 clear()를 사용한다.
딕셔너리에서도 in 이 가능하다. 이것은 key 값을 체크한다.
할당하기는 = 는 리스트와 마찬가지로 참조하는 것 이므로, = 로 할 시에 하나가 변경시 모두가 변경된다.
copy를 사용하면 어느정도 문제를 해결 할 수 있다.
하지만 위에서 설명 한 것처럼 list같은 가변 객체가 들어가 있으면 다음과 같은 문제가 발생한다.
이럴때는 deepcopy를 사용한다. 위에서도 했다.
import copy
딕셔너리 비교는 == != 만 가능하다.
딕셔너리는 순서를 별로 중요하지않게 생각하는 것을 잊지말자.
순회는 for과 in으로 한다. 다음과 같은 것으로 key value item을 출력 할 수 있다.
딕셔너리도 컴프리헨션이 가능하다. 많이 본 형태이다 {키_표현식: 값_표현식 for 표현식 in 순회가능한 객체}
다중 for문도 가능하며, if도 가능하다.
{키_표현식: 값_표현식 for 표현식 in 순회가능한 객체 if test}
셋은 간단하게 생각하면 키만 남은 딕셔너리라고 생각하면된다. 집합, 정규교욱과정만 배웠으면 모두 아는 내용 이다.
set()은 생성과 변환이 가능하다. { } 과 set이라는 것 이다.
empty_set의 출력은 set()이다. 그 이유는 {}는 딕셔너리이기 때문이다.
중복은 제거한다. 집합의 성질이기 때문이다. 순서또한 중요 하지 않다.
그리고 딕셔너리의 경우 key값만 취하는 것을 알 수 있다.
여기서도 동일하게 len으로 길이를 구할 수 있다.
항목을 추가 하는 것은 add()를 활용한다, 삭제는 remove이다.
for과 in으로 순회, 멤버십 테스트로 in을 사용 할 수 있다.
책의 나온 예제 중 하나이다. 딕셔너리 안에 key, value 로 set이 들어 간 형태이다.
여기서 vodka가 포함된 음료는?
그러면 좀더 복잡한 예제로 보드카(vodka)가 섞인 음료 이며, cream과 vermouth를 안먹는 다고 한다.
셋은 집합이다. 집합에는 교집합 , 합집합 이런 것을 생각 할 수 있다. 그러면 위의 예제에서 셋 교집합 연산인 &를 사용해보자. 나는 vermouth or orange juice가 들어간게 먹고싶다고 하면다음과 같이 하면 된다. 이것은 있으면 true이다. 없으면 false
왜그럴까 저거의 retrun값을 확인 해보자.
앞에서 했던것을 해보자, vodka는 있고, cream과 vermouth는 안먹는다고 생각 해보자.
이제 뭐 간단하게 알아보자. 교집합은 & 와 intersection이 있다.
그러면 합집합은 뭘까 |와 union이다.
그러면 차집합도 있을까? - 아니면 difference()를 사용하면 된다.
이외에도 ^ symmetric_difference 가 있다. 대칭차집합으로, 한 set에는 포함이지만 두개의 set에 포함되지 않는 항목을 구하는 것 이다.
부분집합인지 체크 하는 것은 <= 연산이나 issubset을 쓰면 된다.
자기자신은 자기의 부분집합이다 까먹지말자.
진부분집합, 두번째 셋이 a말고도 원소가 더 있어야한다.이것은 < 를 이용한다.
상위집합은 부분집합의 반대이다. >= 이나 issuperset을 사용하면 된다. >는 진 상위집합이다. 예를보면 다음과 같다.
set의 comprehension 컴프리헨션은 쉽다. list 딕셔너리와 동일하다.
{표현식 for 표현식 in 순회가능한 객체}
{표현식 for 표현식 in 순회가능한 객체 if 테스트}
간단한 예를 보자.
불변하는 set 이름 그대로 frozenset을 이용하면 된다.
여기서 배운 자료구조는 [] 리스트, () 튜플, {} 딕셔너리와 셋이 있다. 셋을제외하고는 모두 [ ]를 이용하여 접근한다. 예를 보자.
자료구조는 다양하게 결합이 가능하다. 다음과 같이 list를 확인하자.
이러한 자료구조 결합은 제한사항이 매우 많다.
타입이 문제이다. 예를들어 딕셔너리의 키는 불변하다. 이는 리스트 딕셔너리 셋은 키가 될 수 없다는 것이다. 하지만 튜플은 불변이므로 딕셔너리의 키가 가능하다.
프로그래밍이랑 올바른 단어와 규칙을 학습 하는것, 다음과 같은 예문을 통해서 알 수 있었다.
다음과 같이 wayback machine을 이용한 옛날 웹 사이트를 탐방 하였다. 웹 api, json, requests를 사용한 것으로 다음에 배울 것이다.
그러면 python은 도대체 어디에 쓰이나?
Webs을 포함한 GUI 서버/클라이언트 웹
대용량 데이터 처리를 지원하는 Backend server
클라우드
모바일 디바이스
임베디드 디바이스
인공지능
.. 등등 다양한 곳에서 활용된다. 2021/8월 기준 2위인 언어이다.
Python은 매우 간결하고 간단하다.
C/C++은 매우 어렵다, low level 언어로 Python을 포함한 대부분의 운영체제는 C/C++ 이다. 하지만 메모리 관리가 너무 어렵다. -> Python은 동적언어로 변수 타입을 사용하기전에는 필요 x
python의 대화식 인터프리터는 다음과 같이 사용이 가능하다. 우선 python을 설치 하자. 그리고 cmd, 혹은 window powershell애 python을 입력하면 다음과 같은 창이 나올 것 이다! import this 를 입력하면 python 의 철학을 볼 수 있다. IDE는 Pycharm또는 VSCODE를 추천
[chapter 2] 데이터: 타입, 값, 변수, 이름
python data는 object이다. 객체란 메모리에 할당 된 것으로 프로그램에 사용되는 데이터 또는 식별자에 의해서 참조되는 공간이다. python은 메모리에 객체로 래핑 한다.
기본 data type은 다음과 같다.
가변성이란?
불변 객체는 객체 생성 이후 값을 변경 할 수 없는 object
가변 객체는 객체 생성 이후 값을 변경 가능한 object
하지만 객체의 타입을 모두 못 바꾼다. 파이썬은강타입 언어 한가지 예를 보면 다음과 같다.
다음과 같은 성질을 기본적으로 이해 해야한다.
python data 값을 명시하는 두가지 방법이 존재한다.
- 리터럴
- 변수
다양한 데이터 타입에 따라 리터럴 지정 방법에 대해 나온다.
변수는 컴퓨터 언어의 핵심 개념이며, 파이썬 변수의 이름 규칙은 다음과 같다.
-소문자 (a~z)
-대문자 (A~Z)
-숫자(0~9)
-언더바(_)
-대소 문자 구분
-숫자가 아닌 문자나 언더바로 시작
-언더바로 시작하면 특별한 취급(9장)
-파이썬 키워드는 사용블가
키워드가 햇갈리면 다음과 같이 입력하면 keyword list를 볼 수 있다.
python은 = 를 통해 할당하며, == 는 비교이다,
변수는 단지 이름이다. 이것은 컴퓨터 언어 마다 다르다.
특히 리스트 같은 가변 객체를 사용할 때는 필수다.
할당은 값을 복사가 아니라 , 단지 데이터를 포함하는 메모리 공간의 객체에 이름을 붙이는 것 이다.
객체의 타입 확인법은 다음과 같다.
y = 5
x= 12 - y
x
이 과정은 다음과 같다.
값 5인 정수 객체 생성
변수 y가 객체 5를 가르키도록 한다
값이 12인 정수 객체 생성
객체 값 12와 변수 y가 가르키는 값 5를 뺀다
값 7인 객체 생성
x가 7인 객체를 가리킨다
x가 가르키는 새로운 객체의 참조횟수를 증가
x가 가르키는 값 출력.. 너무 이론적인 내용이라 좀 지겨울수도 있다.
다음과 같이 한번에 다양한 이름 할당이 가능하다. 메모리 주소는 같다,
이름을 재할당 하면 다음과 같이 변한다.
참조 횟수만 감소. 증가한다.
A = 1,1 객체참조 횟수 1
A = 21 객체 참조 횟수 0, 2는 1
값을 복사할때는 불변 객체와 가변 객체가 다음과 같이 다르다.
[chapter 3] 불리언
True or False Python 특수 함수 bool()은 모든 파이썬 data type을 불리언으로 변환
0이 아닌 것은 모두 true이다.
분수나 소수점 x 정수 앞에 부호가 가능하다. 10진수 외 다른 진수로 숫자 표현 가능 연산 순서는 C/C++ 과 동일하다.
이외에도 다양한 것들이 있다.
[chapter 4] if
주석은 # 으로 한다.
#은 해시, 샤프, 파운드, 옥토소프 같이 다양한 이름이 존재하며, 문자열 안에 주석이 있으면 문자로 인식한다.
라인 유지하기는 \로 한다(역 슬래쉬) 코드가 길어 지는 것을 방지한다.
비교하기, if , elif , else 를 사용한다.
기존 C/C++ 과 비슷하면서도 조금 다르다.
조건 테스트시 괄호가 필요 없다.
and or not 이 사용된다.
다음은 모두 False이다.
null, 정수 0, 부동소수점 0.0, 빈문자열, 빈 리스트[], 빈 튜플(), 빈 딕셔너리{}, 빈 셋 set()
멤버십 연산자 in은 다음과 같이 사용이 가능하다. Setlisttuple string dict
[chapter 5] 특수문자열
C/C++과는 다르게 “~~”, “”~~”” 작은 따음표, 큰 따음표 두개로 문자열 생성이 가능하다.
“””~~”””, “”””””~~“””””” 도 가능하다.
“~~~~””~~“”~~~~” 도 가능하다.
“”~~~~~”~~~”~~~~””도 가능하다.
세개의 작은 따음표는 보통 여러줄의 문자열에 많이 쓰인다.
print는 따음표를 제거 한 뒤에 출력한다.( 인터프리터는 나두며\n같은 이스케이프 문자도 그대로 출력한다)
문자열은 불변 이므로 replace로 바꿔야한다. replace 시 할당 하지 않으면 letter은 바뀌지 않는다.
슬라이스로 부분 문자열 추출
[ : ] 처음부터 끝까지 전체를 추출한다
[start : ] start오프셋 부터 끝까지 추출한다. [ : end] 맨 처음부터 end-1 오프셋 까지 추출한다. [start : end] start 부터 end-1 오프셋 까지 추출한다. [start : end : step] start 부터 end-1 까지 step 만큼 뛰면서 추출한다.
다음과 같이 역순으로 출력이 가능하다.
이것은 error가 발생하지 않는다, 이유는 slice는 단지 scan이다.
문자열을 조작 하기 위해서 + 와 같은 것을 사용 했지만, 매우 제한적이다.
len()은 길이를 얻는 함수이다. len은 다른 시퀀스 type에도 사용가능하다.
Split 메서드는 문자열에만 사용이 가능하다. 인수로 “,” 를 전달 한 경우, 두번째는 아무것도 안 준경우list가 return 된다.
join은 split과 반대이다. split() 메서드는string.join(list) 형식이다.
문자열의 일부를 대체 하기 위해서는 replace()메서드를 사용한다. 일치하는 모든 것을 교체한다. 숫자를 줘서 교체하는 개수를 조정 할 수 있다.
strip은 문자열 맨 앞(left), 문자열 맨 뒤쪽(right)의 padding 문자 (여백또는 공백)를 제거 하는 것이다 strip()에 인수가 없으면 “ “, “\t”, “\n” 양쪽 끝을 제거한다.
lstrip()은 왼쪽, rstrip()은 오른쪽이다. 다음과 같이 여러 문자를 인수로 줄 수도 있다.
Python에는 많은 문자열 메서드가 있다.
Startswith은 시작 부분을 체크한다, endswith은 마지막 부분을 체크한다.
Startswith은 시작 부분을 체크한다, endswith은 마지막 부분을 체크한다
Find와 index는 해당 문자열의 시작 오프셋을 리턴한다. 다른 점은없으면 find는 -1를, index는 error를 발생시킨다. 맨 처음 나온 단어의 오프셋을 리턴한다
rfind와 rindex메서드는 뒤에서 부터 탐색을 시작한다.
Count는 몇 개가 들어 있는지 세는 것, isalnum은 모두 숫자와 알파벳인지 체크 하는 것이다. 이외에도 다양한 메서드들이 있지만, 외우는 것이 아닌 필요할 때 찾아 쓰는 것이다.