├── .gitignore ├── 1_ 파이썬의 기본문법 ├── #1_ 그외 │ ├── #1-1-터틀그래픽스 모듈.py │ ├── #1-2-(터틀그래픽스로n각별그리기).py │ ├── #2-(지뢰찾기).py │ ├── #3-(대각선 출력하기).py │ ├── #4-1-(회문판별코드).py │ ├── #4-2-(회문판별코드+).py │ ├── #5-1-(별찍기1-1).py │ ├── #5-2-(별찍기1-2).py │ ├── #5-3-(별찍기1-3).py │ ├── #5-4-(별찍기1-4).py │ ├── #5-5-(별찍기2).py │ ├── #5-6-(별찍기3).py │ ├── #6-(재귀함수피보나치수열).py │ ├── #7-N-gram.py │ └── #8-(요소중최댓값).py ├── 1-1_ 기초 │ ├── 1-파이썬기본문법.py │ ├── 2-변수.py │ ├── 3-기본연산자.py │ └── 4-print()함수와인자.py ├── 1-2_ 자료형 │ ├── 0-파이썬의 자료형.md │ ├── 1-숫자자료형, 산술연산자.py │ ├── 2-불자료형.py │ ├── 3-1-문자열자료형, 연산자.py │ ├── 3-2-문자열 인덱싱, 슬라이싱, 함수.py │ ├── 3-3-문자열내장함수총망라.py │ ├── 3-4-문자열포맷팅.py │ ├── 3-5-문자열포맷팅,형식지정자.py │ ├── 4-시퀀스자료형공통문법.py │ ├── 5-1-리스트자료형, 연산자.py │ ├── 5-2-리스트함수.py │ ├── 6-1-집합자료형.py │ ├── 6-2-(집합으로공약수구하기).py │ ├── 7-튜플자료형.py │ ├── 8-딕셔너리자료형, 함수.py │ ├── 9-1-리스트내포.py │ ├── 9-2-리스트내포심화, 다중리스트내포.py │ └── 9-3-리스트내포확장.py ├── 1-3_ 기초확장판 │ ├── 1-단순복사vs얕은복사vs깊은복사.py │ ├── 2-map()함수.py │ ├── 3-range()함수.py │ └── 4-enumerate()함수.py ├── 1-4_ 제어문 │ ├── 0-파이썬제어문_기초함수.md │ ├── 1-조건문 if.py │ └── 2-반복문 for, while + pass, continue.py ├── 1-5_ 함수(기초) │ ├── 1-함수.py │ ├── 2-함수매개변수,반환값.py │ ├── 3-함수독스트링.py │ ├── 4-함수타입힌팅.py │ ├── 5-함수의고정,가변인수+패킹,언패킹.py │ ├── 6-함수의위치인수,키워드인수+딕셔너리언패킹.py │ └── 7-디폴트매개변수,매개변수초깃값.py ├── 1-6_ 파일 │ ├── 1-파일,파일모드,with_as문.py │ └── 2-파일함수,피클링,언피클링.py ├── 1-7_ 함수(심화) │ ├── 1-재귀함수.py │ ├── 2-1-람다표현식.py │ ├── 2-2-람다표현식응용.py │ ├── 3-지역변수,전역변수,global,네임스페이스.py │ ├── 4-함수중첩,지역변수구분,nonlocal.py │ └── 5-클로저.py └── 1-8_ 모듈,패키지,라이브러리 │ ├── 1-모듈,패키지,라이브러리.py │ ├── 2-0-패키지설치.py │ ├── 2-1-모듈가져오기.py │ ├── 2-2-패키지가져오기.py │ ├── 3-0-if __name__=='__main__',프로그램시작점.py │ ├── 3-1-모듈만들기.py │ ├── 3-2-패키지만들기.py │ └── 3-3-__all__,하위패키지,패키지와모듈독스트링.py ├── 2_ 파이썬의 코어문법 ├── 2-1_ 정규표현식 │ ├── 1-정규표현식패턴.py │ └── 2-정규표현식함수.py ├── 2-2_ 클래스, 객체(기초) │ ├── 1-클래스,객체,인스턴스.py │ ├── 2-클래스메쏘드,self,속성,private(비공개)설정,독스트링.py │ └── 3-생성자,소멸자.py ├── 2-3_ 클래스, 객체(심화) │ ├── 1-클래스의_클래스속성.py │ ├── 10-1-메타클래스.py │ ├── 10-2-메타클래스사용법.py │ ├── 2-1-클래스메쏘드,정적메쏘드.py │ ├── 2-2-(정적메쏘드,클래스메소드예제).py │ ├── 3-클래스상속.py │ ├── 4-클래스상속과포함관계.py │ ├── 5-super(),부모클래스속성사용.py │ ├── 6-메쏘드오버라이딩.py │ ├── 7-다중상속,다이아몬드상속,메쏘드탐색순서.py │ ├── 8-추상(가상)클래스.py │ ├── 9-1-스페셜메쏘드,매직메쏘드.py │ └── 9-2-(스페셜메쏘드예제).py ├── 2-4_ 예외처리 │ ├── 1-예외처리 try, except, as.py │ ├── 2-예외처리 else, finally.py │ ├── 3-예외발생, raise, assert.py │ └── 4-사용자정의예외,예외만들기.py ├── 2-5_ 이터레이터, 제너레이터 │ ├── 1-1-이터레이터(iterator).py │ ├── 1-2-이터레이터만들기,이터레이터언패킹.py │ ├── 1-3-1-이터레이터에인덱스활용,__getitem__.py │ ├── 1-3-2-(이터레이터,인덱스예제).py │ ├── 1-4-내장함수,iter,next.py │ ├── 2-1-제너레이터,yield.py │ ├── 2-2-1-제너레이터만들기,yield로함수호출.py │ ├── 2-2-2-(제너레이터예제).py │ └── 2-3-yield from,제너레이터표현식.py ├── 2-6_ 코루틴 │ ├── 1-코루틴(coroutine),코루틴안으로값전달.py │ ├── 2-코루틴밖으로값전달.py │ ├── 3-코루틴종료,예외처리,throw.py │ ├── 4-하위코루틴값전달,yield from.py │ └── 5-(코루틴예제).py └── 2-7_ 데코레이터 │ ├── 1-데코레이터(decorator),@.py │ ├── 2-데코레이터의매개변수,반환값.py │ ├── 3-데코레이터클래스구현.py │ └── 4-(데코레이터예제,html태그).py ├── README.md ├── _1 파이썬으로 codeup 기초100제 풀이 ├── 11~20번.py ├── 1번~10번.py ├── 21~30번.py ├── 31~40번.py ├── 41~50번.py ├── 51~60번.py ├── 61~70번.py ├── 71~80번.py ├── 81~90번.py └── 91~100번.py ├── _2 파이썬 문법정리 파일(구버전) ├── 1 │ ├── #1-파이썬기본문법.py │ ├── #2-변수.py │ ├── 0-파이썬의 자료형.md │ ├── 01-숫자자료형, 산술연산자.py │ ├── 02-1-불자료형.py │ ├── 02-2-파이썬기본연산자.py │ ├── 03-1-문자열자료형, 연산자.py │ ├── 03-2-문자열 인덱싱, 슬라이싱, 함수.py │ ├── 03-3-문자열내장함수총망라.py │ ├── 03-4-문자열포맷팅.py │ ├── 03-5-문자열포맷팅,형식지정자.py │ ├── 03-6-시퀀스자료형공통문법.py │ ├── 04-1-리스트자료형, 연산자.py │ ├── 04-2-리스트함수.py │ ├── 05-1-집합자료형.py │ ├── 05-2-(집합으로공약수구하기).py │ ├── 06-튜플자료형.py │ ├── 07-딕셔너리자료형, 함수.py │ └── 08-print()함수와인자.py ├── 2 │ ├── #1-터틀그래픽스 모듈.py │ ├── #2-(터틀그래픽스로n각별그리기).py │ ├── #3-단순복사vs얕은복사vs깊은복사.py │ ├── #4-(지뢰찾기).py │ ├── 0-파이썬제어문_기초함수.md │ ├── 01-map()함수.py │ ├── 02-1-range()함수.py │ ├── 02-2-enumerate()함수.py │ ├── 03-1-조건문 if.py │ ├── 03-2-반복문 for, while + pass, continue.py │ ├── 04-리스트내포.py │ ├── 05-(대각선 출력하기).py │ ├── 06-1-리스트내포심화, 다중리스트내포.py │ ├── 06-2-리스트내포확장.py │ ├── 08-(회문판별코드).py │ ├── 09-(회문판별코드+).py │ ├── 10-(별찍기1-1).py │ ├── 11-(별찍기1-2).py │ ├── 12-(별찍기1-3).py │ ├── 13-(별찍기1-4).py │ ├── 14-(별찍기2).py │ ├── 15-(별찍기3).py │ ├── 16-1-함수.py │ ├── 16-2-함수매개변수,반환값.py │ ├── 16-3-함수독스트링.py │ ├── 17-1-함수타입힌팅.py │ ├── 17-2-함수의고정,가변인수+패킹,언패킹.py │ ├── 17-3-함수의위치인수,키워드인수+딕셔너리언패킹.py │ ├── 17-4-디폴트매개변수,매개변수초깃값.py │ ├── 18-1-파일,파일모드,with_as문.py │ └── 18-2-파일함수,피클링,언피클링.py ├── 3 │ ├── 01-1-재귀함수.py │ ├── 01-2-(재귀함수피보나치수열).py │ ├── 02-딕셔너리응용(메쏘드).py │ ├── 03-람다표현식.py │ ├── 04-람다표현식응용.py │ ├── 05-N-gram.py │ ├── 06-(요소중최댓값).py │ ├── 07-1-지역변수,전역변수,global,네임스페이스.py │ ├── 07-2-함수중첩,지역변수구분,nonlocal.py │ └── 07-3-클로저.py ├── 4 │ ├── #1-모듈,패키지,라이브러리.py │ ├── #2-0-패키지설치.py │ ├── #2-1-모듈가져오기.py │ ├── #2-2-패키지가져오기.py │ ├── #3-0-if __name__=='__main__',프로그램시작점.py │ ├── #3-1-모듈만들기.py │ ├── #3-2-패키지만들기.py │ ├── #3-3-__all__,하위패키지,패키지와모듈독스트링.py │ ├── 01-zip()함수.py │ ├── 02-1-zip응용dict변환-1.py │ ├── 02-2-zip응용dict변환-2.py │ ├── 03-(zip응용,dict으로구구단).py │ ├── 04-ord(),chr()함수-(암호화,복호화).py │ ├── 05.random모듈.py │ ├── 06-time모듈.py │ ├── 07-calendar모듈.py │ └── hi_module.py ├── 5 │ ├── 01-(randint와리스트응용).py │ ├── 02-(randint응용2).py │ ├── 03-(time응용예제).py │ ├── 04-(외부모듈복합응용예제).py │ └── 05-(로또 뽑기).py ├── 6 │ ├── #1-1-정규표현식패턴.py │ ├── #1-2-정규표현식함수.py │ ├── #1-3-(정규표현식으로url검사).py │ ├── 01-(딕셔너리메쏘드복습).py │ ├── 02-(딕셔너리복습2).py │ ├── 03-1-클래스,객체,인스턴스.py │ ├── 03-2-클래스메쏘드,self,속성,private(비공개)설정,독스트링.py │ ├── 03-3-생성자,소멸자.py │ ├── 03-4-(클래스예제).py │ ├── 04-1-클래스의_클래스속성.py │ ├── 04-2-1-클래스메쏘드,정적메쏘드.py │ ├── 04-2-2-(정적메쏘드,클래스메소드예제).py │ ├── 04-3-클래스상속.py │ ├── 04-4-클래스상속과포함관계.py │ ├── 04-5-super(),부모클래스속성사용.py │ ├── 04-6-메쏘드오버라이딩.py │ ├── 04-7-다중상속,다이아몬드상속,메쏘드탐색순서.py │ ├── 04-8-추상(가상)클래스.py │ ├── 04-9-1-스페셜메쏘드,매직메쏘드.py │ ├── 04-9-2-(스페셜메쏘드예제).py │ ├── 05-1-예외처리try,except,as.py │ ├── 05-2-예외처리else,finally.py │ ├── 05-3-예외발생,raise,assert.py │ ├── 06-사용자정의예외,예외만들기.py │ ├── 07-01-이터레이터(iterator).py │ ├── 07-02-이터레이터만들기,이터레이터언패킹.py │ ├── 07-03-1-이터레이터에인덱스활용,__getitem__.py │ ├── 07-03-2-(이터레이터,인덱스예제).py │ ├── 07-04-내장함수,iter,next.py │ ├── 07-05-제너레이터,yield.py │ ├── 07-06-1-제너레이터만들기,yield로함수호출.py │ ├── 07-06-2-(제너레이터예제).py │ ├── 07-07-yield from,제너레이터표현식.py │ ├── 07-08-코루틴(coroutine),코루틴안으로값전달.py │ ├── 07-09-코루틴밖으로값전달.py │ ├── 07-10-코루틴종료,예외처리,throw.py │ ├── 07-11-하위코루틴값전달,yield from.py │ ├── 07-12-(코루틴예제).py │ ├── 08-1-데코레이터(decorator),@.py │ ├── 08-2-데코레이터의매개변수,반환값.py │ ├── 08-3-데코레이터클래스구현.py │ ├── 08-4-(데코레이터예제,html태그).py │ └── 09-(급식표프로그램,클래스,예외처리,파일응용).py └── readme.md └── bookmark_list.md /.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | hide.md 3 | 4 | _1 파이썬으로 codeup 기초100제 풀이/venv 5 | _1 파이썬으로 codeup 기초100제 풀이/idea 6 | -------------------------------------------------------------------------------- /1_ 파이썬의 기본문법/#1_ 그외/#1-1-터틀그래픽스 모듈.py: -------------------------------------------------------------------------------- 1 | import turtle as t 2 | """ 3 | 터틀(turtle) 그래픽스 모듈: 4 | 파이썬에서 지원하는 기본 모듈로, 5 | 거북이가 기어가는 모양대로 그림을 그려줌. 6 | 7 | .shape() 함수: 8 | 그림을 그리는 아이콘의 모양을 설정 9 | 'classic' (기본값), 'triangle' (삼각형), 'circle'(원), 'arrow'(화살표), 'turtle'(거북이)... 10 | .shape()만 쓰면, 현재 모양을 문자열로 반환함. 11 | 12 | .forward() 함수 (=.fd()) 13 | 거북이 머리방향으로 입력한 인자값 만큼 이동 14 | 15 | .backward() 함수 (=.bk()) 16 | 거북이 꼬리방향으로 입력한 인자값 만큼 이동 17 | 18 | .right() 함수 (=.rt()) 19 | 거북이를 오른쪽으로 입력한 인자값(도)만큼 회전 20 | 21 | .left() 함수 (=.lf()) 22 | 거북이를 왼쪽으로 입력한 인자값(도)만큼 회전 23 | 24 | .setheading() 함수 25 | 인자값 각도롤 회전, (오른쪽 기준, x축 양의 방향을 0도(기준)으로 시계 반대방향의 각을 말함) 26 | 27 | .circle() 함수 28 | 인자값 만큼의 반지름을 가지는 원을 그림 29 | 30 | .color(펜색깔, 칠하는색깔) 함수 31 | 색이름을 인자값으로 사용('red', 'blue', 'green'...) (기본값 검정) 32 | (웹 색상(#RRGGBB)를 이용해서 세밀한 색상을 인자값으로 쓸 수 있음) 33 | 인자값이 하나일 경우 그 색으로 펜과 칠하는 색깔을 통일함. 34 | 35 | .pencolor() 함수 36 | 색이름을 인자값으로, 도형을 그릴때의 선 색깔을 지정 37 | 38 | .fillcolor() 함수 39 | 도형 내부를 칠하는 색을 지정 40 | 41 | .turtle.speed() 함수 42 | 움직이는 속도를 조절 (1이 느림 ~ 10이 빠름, 10을 넘어서면 0으로 취급(0은 가장빠름)) 43 | 44 | 외에도 메쏘드가 너무 많다... 45 | https://m.blog.naver.com/PostView.nhn?blogId=python_math&logNo=221214856867&proxyReferer=https%3A%2F%2Fwww.google.com%2F 46 | 47 | 링크로 축약한다. 48 | """ 49 | t.shape('turtle') 50 | n = int(input("n각형의 각 : ")) 51 | for i in range(n): 52 | t.right(360 / n) 53 | t.forward(800 / n) 54 | 55 | t.mainloop() 56 | """ 57 | 위는, 각을 입력받아서 n각형을 그리는 코드 58 | * 파이참같은 환경에서는 터틀 그래픽스 창이 열렸다가 바로 닫히기도 하는데, 창을 유지시키기 위해 .mainloop() 함수를 마지막에 덧붙임 59 | """ -------------------------------------------------------------------------------- /1_ 파이썬의 기본문법/#1_ 그외/#1-2-(터틀그래픽스로n각별그리기).py: -------------------------------------------------------------------------------- 1 | import turtle as t 2 | 3 | t.shape('turtle') 4 | t.speed('fastest') 5 | 6 | n, length = map(int, input("별의 꼭짓점 개수와 선의 길이를 입력하세요(둘은 공백으로 구본해서) : ").split()) 7 | for i in range(n): 8 | t.forward(length) 9 | t.right((360/n) * 2) 10 | t.forward(length) 11 | t.left(360/n) 12 | 13 | t.mainloop() 14 | 15 | """ 16 | n개의 꼭짓점을 가지는 별을 그리는 코드 17 | """ -------------------------------------------------------------------------------- /1_ 파이썬의 기본문법/#1_ 그외/#2-(지뢰찾기).py: -------------------------------------------------------------------------------- 1 | x, y = map(int, input().rstrip().split()) 2 | mine_map = [] 3 | for i in range(x): 4 | mine_map.append(list(input())) 5 | 6 | for i in range(x): 7 | for j in range(y): 8 | if mine_map[i][j] is not '*': 9 | around = 0 10 | if i > 0: 11 | around += (1 if mine_map[i-1][j] is '*' else 0) 12 | if j > 0: 13 | around += (1 if mine_map[i-1][j - 1] is '*' else 0) 14 | if j < x-1: 15 | around += (1 if mine_map[i-1][j + 1] is '*' else 0) 16 | if i < x-1: 17 | around += (1 if mine_map[i+1][j] is '*' else 0) 18 | if j > 0: 19 | around += (1 if mine_map[i+1][j - 1] is '*' else 0) 20 | if j < x-1: 21 | around += (1 if mine_map[i+1][j + 1] is '*' else 0) 22 | if j > 0: 23 | around += (1 if mine_map[i][j-1] is '*' else 0) 24 | if j < x-1: 25 | around += (1 if mine_map[i][j+1] is '*' else 0) 26 | mine_map[i][j] = around 27 | 28 | for col in mine_map: 29 | for cell in col: 30 | print(cell, end='') 31 | print() 32 | 33 | """ 34 | 1시간컷,, 35 | 나는 아직도 코딩보단 삽질을 더 잘한다. 36 | """ -------------------------------------------------------------------------------- /1_ 파이썬의 기본문법/#1_ 그외/#3-(대각선 출력하기).py: -------------------------------------------------------------------------------- 1 | v = [] 2 | for a in range(10): 3 | for b in range(10): 4 | if a is b: 5 | v.append(1) 6 | else: 7 | v.append(0) 8 | print(v) 9 | v.clear() 10 | ''' 11 | for 문과 range()함수, 리스트 함수를 응용한 코드다. 12 | 대각선 출력! 13 | ''' -------------------------------------------------------------------------------- /1_ 파이썬의 기본문법/#1_ 그외/#4-1-(회문판별코드).py: -------------------------------------------------------------------------------- 1 | word = input('단어를 입력하세요: ') 2 | 3 | oh = True 4 | for i in range(len(word) // 2): 5 | if word[i] != word[-1 - i]: 6 | oh = False 7 | break 8 | 9 | if oh == True: 10 | print("회문입니다") 11 | else: 12 | print("회문이 아닙니다") -------------------------------------------------------------------------------- /1_ 파이썬의 기본문법/#1_ 그외/#4-2-(회문판별코드+).py: -------------------------------------------------------------------------------- 1 | words = input('단어를 입력하세요: ') 2 | 3 | rewords = ''.join(reversed(words)) 4 | print(words, rewords) 5 | if words == rewords: 6 | print("회문입니다") 7 | else: 8 | print("회문이 아닙니다") 9 | -------------------------------------------------------------------------------- /1_ 파이썬의 기본문법/#1_ 그외/#5-1-(별찍기1-1).py: -------------------------------------------------------------------------------- 1 | # 별찍기 문제 (직각삼각형) 2 | n = int(input("높이를 입력하세요 : ")) 3 | for i in range(1, n+1): 4 | print("*"*i) 5 | -------------------------------------------------------------------------------- /1_ 파이썬의 기본문법/#1_ 그외/#5-2-(별찍기1-2).py: -------------------------------------------------------------------------------- 1 | # 별찍기 문제 (직각삼각형 좌우대칭) 2 | n = int(input("높이를 입력하시오 : ")) 3 | for i in range(1, n+1): 4 | print(f"{'*'*i : >10}") 5 | # 포맷팅 f-string에서는 (출력할 것) or (출력할 것 : 출력 형식) 6 | -------------------------------------------------------------------------------- /1_ 파이썬의 기본문법/#1_ 그외/#5-3-(별찍기1-3).py: -------------------------------------------------------------------------------- 1 | # 별찍기 문제 (직각삼각형 상하대칭) 2 | n = int(input("높이를 입력하시오 : ")) 3 | for i in range(n, 0, -1): 4 | print("*"*i) 5 | -------------------------------------------------------------------------------- /1_ 파이썬의 기본문법/#1_ 그외/#5-4-(별찍기1-4).py: -------------------------------------------------------------------------------- 1 | # 별찍기 문제 (직각삼각형 상하좌우대칭) 2 | n = int(input("높이를 입력하시오 : ")) 3 | for i in range(n, 0, -1): 4 | print(f"{'*'*i : >10}") 5 | -------------------------------------------------------------------------------- /1_ 파이썬의 기본문법/#1_ 그외/#5-5-(별찍기2).py: -------------------------------------------------------------------------------- 1 | # 별찍기 문제 (정삼각형) 2 | n = int(input("폭을 입력하시오 : ")) 3 | for i in range(1, n+1, 2): 4 | print(f"{'*'*i : ^10}") 5 | # print(f"{format('*'*(i), '^10'}") 과 같다. 6 | -------------------------------------------------------------------------------- /1_ 파이썬의 기본문법/#1_ 그외/#5-6-(별찍기3).py: -------------------------------------------------------------------------------- 1 | # 별찍기 문제 (마름모) 2 | n = int(input("폭을 입력하시오 (홀수) : ")) 3 | for i in range(1, n+1, 2): 4 | print(f"{'*' * i : ^10}") 5 | for i in range(n-2, 0, -2): 6 | print(f"{'*' * i : ^10}") 7 | 8 | # .ljust(n) n만큼(n은 변수도 가능) 왼쪽 정렬 .ljust(n, 'X')하면 공백을 X로 채워줌 9 | # .center(n) 가운데 정렬 10 | # .rjust(n) 오른쪽 정렬 11 | -------------------------------------------------------------------------------- /1_ 파이썬의 기본문법/#1_ 그외/#6-(재귀함수피보나치수열).py: -------------------------------------------------------------------------------- 1 | # def fib(i): 2 | # if i < 3: 3 | # return 1 4 | # return fib(i-1) + fib(i-2) 5 | 6 | 7 | def fib(i): 8 | if i in [0, 1]: 9 | return i 10 | return fib(i-1) + fib(i-2) 11 | 12 | 13 | n = int(input()) 14 | print(fib(n)) 15 | 16 | """ 피보나치수열 재귀함수로 반환: 17 | n을 입력하면 n번째의 피보나치수열 값이 출력된다. 18 | 19 | 좀 머리좀 잘써야 대가리가 돌아갈듯? https://dojang.io/mod/quiz/view.php?id=2356 20 | """ -------------------------------------------------------------------------------- /1_ 파이썬의 기본문법/#1_ 그외/#7-N-gram.py: -------------------------------------------------------------------------------- 1 | print("N-gram - N개의 연속된 요소 추출기") 2 | n = int(input("끊어 읽을 수를 입력하세요 : ")) 3 | word = list(input("문장을 입력하세요 : ").rstrip()) 4 | print(word) 5 | if n < 0: 6 | print("<에러>끊어 읽을 수가 음수 입니다.") 7 | elif len(word) < n: 8 | print("<에러>끊어 읽을 수가 전체 문장보다 큽니다.") 9 | else: 10 | for i in range(len(word)+1-n): 11 | for j in range(i, n+i): 12 | print(word[j], end='') 13 | print() 14 | 15 | """N-gram: 16 | 2-gram, 3-gram, ... 같은 걸 묶어서 부르는 건데, 17 | 문장의 글자를 N개씩 묶은 것들을 추출하는 것. 18 | """ 19 | -------------------------------------------------------------------------------- /1_ 파이썬의 기본문법/#1_ 그외/#8-(요소중최댓값).py: -------------------------------------------------------------------------------- 1 | nums = list(map(int, input("입력: ").rstrip().split(','))) 2 | max_num = nums[0] 3 | for num in nums: 4 | max_num = num if num > max_num else max_num 5 | print(max_num) 6 | 7 | # 걍 max(nums) 로 해도 됨. (max() : 요소들 중에서 가장 큰 값 반환) 8 | 9 | """ 10 | 리스트의 요소중에서 가장 큰 값을 반환하는 코드, 11 | 이렇게 보다는 파이썬 내장함수인 max(), min()등을 활용하자. 12 | """ 13 | -------------------------------------------------------------------------------- /1_ 파이썬의 기본문법/1-1_ 기초/1-파이썬기본문법.py: -------------------------------------------------------------------------------- 1 | print("안녕"); print("하세요!") 2 | """ 3 | 파이썬의 기본문법 4 | - 세미클론(;) : 파이썬에서 세미콜론(;)을 쓰는건 필수가 아니다. 5 | 다른언어에선 구문(한줄)이 끝날때마다 세미콜론(;)을 붙여주지만, 파이썬은 꼭 붙여줄 필요는 없다. 6 | 7 | 붙이나 안붙이나 차이가 없고, 보통 세미콜론을 붙이지는 않는다. 8 | 다만 여러구문(여러줄)을 한줄로 합칠때, 구문과 구문사이를 구분하기위해 세미콜론(;)을 사용한다. 9 | """ 10 | 11 | if True: 12 | print("이렇게, 특정 코드의 영역에서는") 13 | print("그 영역에 속한다면 4칸 들어쓰기 후 코드를 표현합니다.") 14 | print("영역에 속하지 않는다면, 들어쓰기를 하지 않습니다.") 15 | """ 16 | - 코드블럭( ) : 파이썬에서 코드블록은 스코프({})가 아닌, 들여쓰기(보통4칸)( )로 나타냅니다. 17 | 다른언어는 코드블록(코드의 영역)을 스코프({})로 묶어서 구분하기도 합니다. 예를들어 c언어만 해도, 18 | 19 | # #include 20 | # 21 | # int main(){ 22 | # printf("안녕하세요!"); 23 | # } 24 | 위같이 스코프({})로 코드의 영역을 구분하고, 들여쓰기와 여백등은 개개인 스타일이지만, 25 | 파이썬은 스코프를 생략하고, 같은 코드블럭은 들여쓰기를 서로 동일하게 함으로써 표현한다. 26 | """ 27 | 28 | if True: # 대표적으로 if, while, for문 안의 실행문 별개의 코드블럭이기에 들어쓰기로 나타내야 함. 29 | a = 10 # 같은 코드블럭이라면(여기선 2~3행이 같은 영역) 들어쓰기한 크기를 맞춰줘야 함. 30 | if a is 10: 31 | print(a) # 위같이 들어쓰기 안에서 새로운 코드블럭을 만든다면 또 들어쓰기를 해야함. 32 | """ 33 | 들어쓰기는 2칸, 4칸을 띄어쓰거나, 탭키를 사용할 수 있는데, 파이썬 PEP8에선 코딩스타일로 4칸 띄어쓰기를 권장한다. 34 | 특이한 경우가 아니라면, 4칸 띄어쓰기를 들어쓰기로 사용하자. 35 | """ 36 | 37 | print("와우") # print("이부분은 주석이라서 실제 코드에 반영되지 않습니다!") 38 | """ 39 | - 주석(#) : 파이썬에서 주석은 #를 앞에 붙여 표시한다. 40 | 41 | 파이썬에서 주석은 #기호를 앞에 붙여서 사용한다. 42 | #이 사용되면, # 뒤로부터 그줄의 끝까지는 주석처리되기에 그부분은 코드로 인식하지 않는다. 43 | #은 한줄만 주석처리할 수 있기에, 여러줄을 주석 처리하려면 줄마다 #을 붙여줘야 한다. 44 | 45 | 46 | 아니면 문자열 여러줄을 처리하는 기호("""""", '''''')를 사용해서 여러줄 주석을 처리할 수 있다. 47 | 이때는 여러줄 주석을 변수에 대입하게 된다면 주석이 아닌 실제 코드로 반영되기에 주의해야 된다. 48 | """ 49 | 50 | # 이렇게 51 | # 샵을 행마다 52 | # 사용해서 53 | # 여러줄 주석을 54 | # 만들거나, 55 | 56 | """ 57 | 이렇게 58 | 여러줄 문자열을 59 | 표시하는 기호를, 60 | """ 61 | 62 | ''' 63 | (이것도 됩니다.) 64 | 사용해서 여러줄 65 | 주석을 만들 수 있습니다. 66 | ''' 67 | 68 | #이렇게 보다는 69 | # 이게 보기에도 좋다. 70 | 71 | """ 72 | 참고로 위같이 #을 이용한 주석에는, #바로 내욜을 다는 것보다, #과 주석내용을 한칸 띄어주는 스타일이 가독성이 좋다. 73 | """ 74 | -------------------------------------------------------------------------------- /1_ 파이썬의 기본문법/1-1_ 기초/2-변수.py: -------------------------------------------------------------------------------- 1 | x = 10 2 | """ 변수(variable) 3 | 변수는 값을 저장하는 존재로, 4 | 5 | 변수이름 = 값 6 | 과 같은 형식으로 변수를 생성함과 동시에 변수에 값을 할당(저장)할 수 있다. 7 | 8 | 이때 파이썬의 변수이름에는 규칙이 있다. 9 | - 영문자, 숫자를 사용할 수 있다. (한글도 사용가능한데, 권장안함) 10 | - 영문자의 대소문자가 구별된다. 11 | - 변수의 맨처음 글자로 문자 아니면 _(언더바, 언더스코어)만 올수 있다. (숫자는 맨앞에 올수 없다) 12 | - 특수문자(+, -, *, /, $, @, &, % 등)은 변수이름으로 쓸 수 없다. 13 | - 파이썬 키워드, 예약어(if, for, while, and, or)는 변수이름으로 쓸 수 없다. 14 | 15 | = 는 프로그래밍언어에서 값을 할당하는 대입연산자다. (수학처럼 등호로 쓰고 싶으면 ==를 활용) 16 | left value(왼쪽 값) = right value(오른쪽 값)과 같이 두개의 항(피연산자)를 가지는 연산자로, 17 | 오른쪽 값을, 왼쪽 값에 대입(할당)한다. 원래 있던 값이 있다면 할당할 때 덮어씌우게(새로 할당하게)되는데, 18 | 따라서 오른쪽 값엔 변수, 값 등이 올수 있지만, 왼쪽엔 변수만 올 수 있다. 19 | 20 | 값은 1 2 4 와 같은 정수(int), 1.23 같은 소수(float), 'abc'같은 문자(str)말고도 여러가지를 사용할 수 있다. 21 | 파이썬에서 사용하는 값에 대해선 자료형 파트를 참고. 22 | """ 23 | a = 1 24 | b = '와우' 25 | print(a, b) 26 | 27 | del a, b 28 | """ 29 | 변수를 만들었다면, 다시 삭제할 수 도 있는데, 이때는 30 | 31 | del 변수이름 32 | 같은 형식으로 변수를 삭제할 수 있다. 33 | """ 34 | 35 | x, y, z = 1, 2, 3 36 | print(x, y, z) 37 | x = y = z = 1 38 | print(x, y, z) 39 | 40 | null = None 41 | print(null) 42 | """ 43 | 변수는 x, y, z = 1, 2, 3 과 같이 여러개를 한번에 선언 할 수도 있고, (사실은 이것이 튜플을 언패킹하는 작업일줄을...) 44 | x = y = z =1 과 같이 변수들의 값이 동일하다면, 변수를 = 로 연결해서 한번에 할당 할 수도 있다. 45 | 46 | 빈 변수는 참고로 None 을 값으로 할당한다. 47 | (다른언어에서 null(널)이라 표현하는 것을 파이썬에선 None(논)으로 표현한다.) 48 | """ 49 | 50 | won = 110_000 51 | print(won) 52 | """ 53 | 가격이나 큰 숫자를 표시할 때 100,000,000 같이 세자리마다 콤마(,) 로 구분해서 표현하는 데, 54 | 파이썬은 대신 _를 구분해서 사용할 수 있다. (,를 붙이면 튜플 자료형이 되버리기에 주의) 55 | (반대로 출력할 때 3자리마다 ,를 출력하고 싶으면 문자열 포맷팅중 형식지정자 참고) 56 | """ 57 | 58 | x = 100 59 | y = 100 60 | print(x, y) 61 | print('x의 주소:', id(x), 'y의 주소:', id(y)) 62 | """ 63 | ** 중요한 것은 파이썬은 값도 객체로 존재한다. 64 | 파이썬에서 변수는 그래서 사실은 값을 저장하는 것이 아니라, 객체를 가리키는 방식이다. 65 | 66 | 두 변수에 서로 값은 값을 할당했으면 사실 두 변수는 서로 같은 객체를 가리키고 있는 것이다. 67 | """ -------------------------------------------------------------------------------- /1_ 파이썬의 기본문법/1-1_ 기초/3-기본연산자.py: -------------------------------------------------------------------------------- 1 | """ 2 | 블로그포스팅 : https://bodhi-sattva.tistory.com/62 3 | """ 4 | 5 | a = 10 6 | b = 6 7 | print(a + b, a - b, a * b, a / b, a ** b, a // b, a % b) 8 | """산술연산자 9 | 사칙연산(+,-,/,*)말고도 제곱(**), 몫(//), 나머지(%)연산자도 있다. 10 | """ 11 | 12 | a += 10 13 | print(a) 14 | a -= 10 15 | print(a) 16 | a *= 2 17 | print(a) 18 | a /= 2 19 | print(a) 20 | a **= 2 21 | print(a) 22 | a //= 10 23 | print(a) 24 | a %= 2 25 | print(a) 26 | """대입연산자 27 | 익히 쓰는 단순대입(=) 오른쪽피연산자를 왼쪽 피연산자에 대입(copy) 28 | 산술연산자가 붙어 두 피연산자를 산술연산한 후의 값을 대입하는 연산자다. 29 | """ 30 | 31 | print(a > b, a < b, a >= b, a <= b, a == b, a != b, a > b > 1) 32 | """비교연산자 33 | 둘의 관계를 부등호나 등호로 확인해서 참인지 거짓인지를 반환하는 연산자다. (한번에 두 비교연산자도 사용가능하다) 34 | """ 35 | 36 | b1 = 0b1010 # 2진수 1010 37 | b2 = 0b0101 # 2진수 0101 38 | print(b1 & b2) 39 | print(b1 ^ b2) 40 | print(b1 | b2) 41 | print(~b1) 42 | print(b1 << 1) 43 | print(b1 >> 1) 44 | """비트연산자 45 | 게이트회로에서 봤던 불대수 논리함수(and, or, not, xor)를 비트단위로 수행하는 연산자다. 46 | """ 47 | 48 | bo1 = True 49 | bo2 = False 50 | print(bo1 and bo2) 51 | print(bo1 or bo2) 52 | print(not bo1) 53 | """논리연산자 54 | 논리함수(and. or, xor)를 비트단위가 아닌, 값과 값 단위로 수행하는 연산자다. 55 | &&, ||, ^^같은 형식과 다르게 영어로 and, or, not을 사용한다. 56 | """ 57 | 58 | yo = 1 59 | print(yo in [1, 2, 3]) 60 | print(yo not in [1, 2, 3]) 61 | print([1, 2] in [1, 2, 3]) 62 | """맴버연산자 63 | in 으로 왼쪽 값(요소)이 오른쪽 값(요소들)중에 있는지 참거짓으로 반환한다. 64 | """ 65 | 66 | n1 = 256 67 | n2 = 256 68 | print(id(n1), id(n2)) 69 | print(n1 is n2) 70 | print(n1 is not n2) 71 | """식별연산자 72 | is, is not 으로 둘이 같은지 아닌지를 구분한다. 정확히는 둘의 메모리 위치를 비교한다. 73 | """ 74 | 75 | t1 = 4 76 | t2 = 5 77 | print("짝수" if t1 % 2 == 0 else "홀수") 78 | print("짝수" if t2 % 2 == 0 else "홀수") 79 | """삼항연산자 80 | [참일때값] if [조건문] else [거짓일때값] 으로 if else 문과 같은 분기문을 구현할 수 있다. 81 | 차이점은 if else 에 따른 실행문이 아니라, 지정해준 값이 반환된다. 82 | """ 83 | -------------------------------------------------------------------------------- /1_ 파이썬의 기본문법/1-1_ 기초/4-print()함수와인자.py: -------------------------------------------------------------------------------- 1 | import sys 2 | 3 | print("뭔""차이여") 4 | print("뭔", "차이야") 5 | print("뭔" + "차인겨") 6 | """print()함수: 7 | c언어의 printf()함수 처럼, 파이썬에서 화면에 뭔가를 띄우려면 반드시 사용하는 함수는 print()다. 8 | 여기서 프린트에서 같은 따옴표로 묶은 문자열을 연달아 놓거나, +로 문자열 결합을 해준채로 출력하면 공백없이 나온다. (+로 숫자, 문자를 더하면 에러난다) 9 | 아니면 ,을 사용해서 한칸의 공백으로 다른 요소를 같이 출력할 수 있다. 10 | (문자열을 입맛에 맛게 출력하려면 문자열자료형에 붙인 설명을 참고해라) 11 | """ 12 | num = 1 13 | chars = "일은" 14 | print(chars, num) 15 | # print(chars + num) # 오류남! 16 | print(chars + str(num)) # 이렇게 같은 자료형으로 형변환 시켜서 + 해줘야 함 17 | """ 18 | 여기서 ,를 사용해서 여러개의 요소들을 print()에서 출력할 때, 인자 값을 추가해 줌으로 형식을 바꿀 수 있다. 19 | 요소에는 end=, sep=, file=, flush= 가 있다. 20 | """ 21 | 22 | print("바", '닐', "라") 23 | print("바", '닐', "라", sep='') 24 | print("바", '닐', "라", sep=".", end='\n') 25 | print("바", '닐', "라", file=sys.stdout, flush=False) 26 | """ 27 | sep= 에서는 요소 사이사이에 있는 틈에 무엇을 출력할지 정해주며, 기본값은 ' '(한칸 공백) 입니다. 28 | end= 에서는 print() 함수 마지막에 무엇을 출력할지 정해주며, 기본값은 '\n'(한줄 개행) 입니다. 29 | file= 에서는 출력될 방향을 설정하며, 기본값은 sys.stdout(표준 출력장치 = 모니터) 입니다. 30 | flush= 에서는 스트림(stream, 데이터 입출력 처리의 중간자)을 강제적으로 flush(버퍼상태의 데이터들을 모두 출력으로 날려버릴지) 설정하며, 31 | 기본값은 False 입니다. 32 | 33 | 위 코드처럼 sep= 으로 요소 사이의 출력을, end= 으로 요소 끝의 출력처리를 지정해줄 수 있기에 많이 써먹고 있습니다. 34 | file= 로는 위에서 코드를 쓰진 않았지만, 이걸로 file=(파일객체) 와 같이 한다면, open 했던 파일에 데이터를 보낼수 있습니다. 35 | flush= 는 sys.stdout.flush() 로도 할 수 있는데, 버퍼를 비우는(flush) 수행을 해줍니다. (3.0버전부터 지원한다네요) 36 | 근데 file= 이랑 flush= 는 다른 함수로 대체해서 쓰는것 같아서 그렇게는 안쓰는 것 같기도 합니다.. 37 | """ -------------------------------------------------------------------------------- /1_ 파이썬의 기본문법/1-2_ 자료형/0-파이썬의 자료형.md: -------------------------------------------------------------------------------- 1 | ### 파이썬의 자료형 2 | 3 | 파이썬에서는 자료형의 종류는 있는데, 다른 언어와 달리 변수 선언시에 따로 자료형을 붙이지 않는다. 4 | 종류를 나누자면, 5 | 6 | 숫자로는 7 | - int(정수 숫자) 8 | - float(실수(소수점아래까지) 숫자) 9 | - complex(복소수 숫자) 10 | 가있고, 추가로 참과 거짓을 저장하는 11 | - bool(불, True or False) 12 | 도있다. 13 | 14 | 요소들이 모여있는 군집적인 자료형에는 15 | - str(문자열) 16 | - list(리스트, 배열) 17 | - tuple(튜플, 읽기전용 리스트) 18 | - set(집합) 19 | - dict(딕셔너리, 사전구조) 20 | 가 있다. 21 | 22 | 그외에도 23 | - bytes (수정불가한 바이트) 24 | - bytearray (수정가능한 바이트) 25 | - frozenset (집합인데 읽기전용) 26 | 가 있다. 27 | 28 | ![파이썬자료현](https://user-images.githubusercontent.com/48408417/76589027-172ccd80-652c-11ea-9aa5-b38d66836db6.png) 29 | 30 | 군집자료형들을 맨처음 보면 서로 헷갈리기도 하고, 이해하기 어려운데... 31 | 간단하게 걔네들의 특징을 정리하자면, 32 | 33 | |자료형|요소 순서|요소 중복|요소 수정|표현| 34 | |:---:|:---:|:---:|:---:|:---:| 35 | |str(스트링, 문자열)|중요|허용|불가|"문자열입니다"| 36 | |list(리스트, 배열)|중요|허용|가능|["리", "스", "트", 1]| 37 | |tuple(튜플)|중요|허용|불가|("튜", "플", 2)| 38 | |set(셋, 집합)|안중요|불가|가능|{1, 2, 4}| 39 | |dict(딕셔너리, 사전)|안중요|불가|가능|{1: '값', '키', 2}| 40 | 41 | 앞으로 정리할 자료형들은 그외의 자료형을 뺀 나머지 자료형들이다. 42 | 다시한번 복습하면서 놓친부분을 챙기고, 부족한 부분은 다시 보충하도록 하자. 43 | 44 | 블로그 링크: 45 | https://bodhi-sattva.tistory.com/58 46 | -------------------------------------------------------------------------------- /1_ 파이썬의 기본문법/1-2_ 자료형/1-숫자자료형, 산술연산자.py: -------------------------------------------------------------------------------- 1 | """ 2 | 블로그 포스팅 : https://bodhi-sattva.tistory.com/59 3 | (좀더 세부적으로 정리했습니다.) 4 | """ 5 | 6 | a = 1 7 | b = 0 8 | c = -9 9 | print(a, type(a), b, type(b), c, type(c)) 10 | # type(변수)는 그변수의 자료형을 반환하는 함수이다. 11 | """ 숫자자료형 12 | 우리가 흔히 사용하는 그 숫자를 담는 자료형이 바로 숫자 자료형이다. 13 | 숫자자료형에는 3가지가 있었는데, 14 | 정수, 실수, 복소수에 따라서 각각 int, float, complex 자료형이 있다. 15 | 16 | 첫번째는 위와 같은 int 자료형으로, 정수형(integer) 숫자다. 17 | (python3 이전 버전에서는 32비트의 저장공간을 차지하며, 범위도 약-21억~21억만큼이고, 대신에 long 18 | 이라는 자료형으로 메모리가 허락하는 선에서 무제한의 범위를 사용할 수 있었는데, python3으로 오면서 19 | long자료형이 없어지고, 대신에 int가 long같이 크기제한이 없어졌다고 한다.) 20 | int()함수 라는것이 있는데 인자값을 int 자료형으로 반환한다. 21 | 22 | 두번째는 float 자료형으로, 실수형(floating-point) 숫자다. 23 | """ 24 | d = -4.2 25 | e = 4.2E1 26 | print(d, type(d), e, type(e)) 27 | n1 = float('nan') 28 | n2 = float('inf') 29 | print(n1, type(n1), n2, type(n2)) 30 | """ 31 | 바로 소수점 아래의 값도 있는 숫자를 말하며, 32 | 유호자릿수는 15자리까지이다. 33 | float()함수로 실수로 변환한 값을 가져올 수 있는데, 이걸 이용해서 34 | inf(양의무한), nan(불가능한수), -inf(음의무한)까지도 대입할 수 있다. 35 | 변수 e 와 같이 부동소수점 표현으로 입력할 수도 있다. 36 | 참, 추가로 8진수와 16진수도 사용할 수 있다. 37 | 2진수도 0b를 쓰면 가능하다. 그리고 대소문자 구별없이 써도된다(0x든 0X든 상관없음) 38 | """ 39 | f = 0o12 40 | # 8진수(0o) 41 | g = 0x12 42 | # 16진수(0x) 43 | print(f, type(f), g, type(g)) 44 | """ 45 | 물론 저장될때 따른 자료형이 있는 것이 아니며, 10진수로 변환되서 저장된다. 46 | 세번째로 복소수도 포함하는 자료형인 complex 도 있덴다. 47 | 허수기호를 j, J로 표현하며, 48 | complex()함수로 복소수를 만들수도 있다. 49 | complex(n)은 n+0j인 복소수로, complex(n, m)은 n+mj인 복소수가 되고, 50 | complex('n+mj')도 n+mj인 복소수가 된다. 51 | .real(실수부), .imag(허수부), .conjugate(컬레복소수), abs(절댓값 반환) 52 | 과 같은 함수로 응용할 수 있다. 53 | """ 54 | h = 2 + 3j 55 | print(h, type(h)) 56 | print(h.real, h.imag, h.conjugate(), abs(h)) 57 | i = 1j 58 | print(i, i**2, i**3, i**4) 59 | """숫자 연산자: 60 | +, -, /, * 61 | 같은 사칙연산은 기본적으로 제공한다. 그리고 추가로 62 | ** : 제곱 연산자 (2**3 == 8) 63 | % : 나머지 연산자 (5%2 == 1) 64 | // : 몫 연산자 (5//2 == 2) 65 | 도 제공한다. 66 | """ 67 | print(float('3.2'), float(2)) 68 | -------------------------------------------------------------------------------- /1_ 파이썬의 기본문법/1-2_ 자료형/2-불자료형.py: -------------------------------------------------------------------------------- 1 | """ 2 | 블로그포스팅 : https://bodhi-sattva.tistory.com/61 3 | """ 4 | 5 | b1 = True 6 | b2 = False 7 | print(b1, type(b1), b2, type(b2)) 8 | """불 자료형: 9 | 불은 bool 으로, 2진수처럼 참 또는 거짓, 1 또는 0, True 또는 False 를 가진다. 10 | 이거 자체로 if 나 while 문의 조건식에 넣을 수도 있다. 11 | 근데 불 자료형을 쓰지않아도 참과 거짓이 이미 구분되어 있는데, 12 | [], (), {}, 0, "", None 같은 것은 자료형에서 비여있는 형태로 거짓으로 인식하고, 13 | 반대로 비여있지 않거나, 0이 아닌 값을 가지면 참으로 인식한다. 14 | bool()함수의 인자로 값을 넘기면, 그 값이 참또는 거짓으로 인식하는지 판별할 수 있다. 15 | 16 | 그리고 이러한 불 자료형으로 반환되는게, 비교, 논리연산자다. 17 | (연산자들을 별개로 묶어서 코드를 분할했다.) 18 | """ 19 | print(bool([]), bool({}), bool(0), bool(""), bool(None)) 20 | print(bool([1]), bool({1}), bool(-3), bool("wow"), bool(0.1)) 21 | 22 | print(not None) 23 | -------------------------------------------------------------------------------- /1_ 파이썬의 기본문법/1-2_ 자료형/3-1-문자열자료형, 연산자.py: -------------------------------------------------------------------------------- 1 | """ 2 | 블로그 포스팅 : https://bodhi-sattva.tistory.com/64 3 | """ 4 | 5 | s1 = "hi" 6 | s2 = 'five' 7 | s3 = '''ㅋ''' 8 | s4 = """이것이 문자열이다.""" 9 | print(s1, type(s1), s2, type(s2), s3, type(s3), s4, type(s4)) 10 | """문자열 자료형 11 | 문자열 자료형은 str 하나 밖에 없는데 활용법과 문법이 어마무시하다. 12 | 심지어 문자열의 선언 방법도 4가지나 된다. 13 | 물론 이런 선언 방법으로 14 | 1. 문자열 선언을 중복되지 않는 선언방법으로 문자열 안에 '또는 "를 포함시킬 수 있으며 15 | (물론 \', \"와 같은 방법으로 해도 문제는 없다.) 16 | 2. 특히 연속으로 따옴표를 사용한 것은 한줄이 아닌 여러줄을 개행문자(\n)없이 사용할 수 있다. 17 | """ 18 | 19 | s5 =''' 20 | 이렇게 21 | 개행문자 없이도 22 | 여러줄을 사용할 수 있습니다.''' 23 | print(s5) 24 | """ 25 | 이렇게 말이다. 그리고 문자열 선언으로 # 말고 지금 이런 글처럼, 26 | 3. 여러줄 주석으로도 사용할 수도 있다. 27 | 그 원리는 문자열을 변수에 넣지 않고, 이렇게 쓰기만 하는 것은 컴파일러가 무시해버리기 때문이다. 28 | 이와 반대로 문자열을 개행없이 그대로 이어붙이고 싶다면 29 | """ 30 | 31 | s6 = "떨어졌지만 \ 32 | 사실 붙어있습니다" 33 | s7 = "이것도""그렇구요" 34 | print(s6, s7) 35 | """ 36 | 와 같이 '\'를 사용하거나 "" 을 사용해서 이어붙일 수 있다. 37 | 그리고 문자열에서 사용할 수 있는 이스케이프(특수)문자는 c언어와 동일하다. 38 | """ 39 | 40 | print(s1 + s2) 41 | print(s3 * 5) 42 | print(len(s4)) 43 | """문자열 연산자: 44 | 문자열은 독특하게도 더하거나(연결) 곱하거나(반복) 길이만 반환할 수 있다. 45 | 그리고 이걸 응용해서 print('-' * 20) 과 같이 구분선 등을 간단하게 만들 수 있다. 46 | """ 47 | -------------------------------------------------------------------------------- /1_ 파이썬의 기본문법/1-2_ 자료형/3-2-문자열 인덱싱, 슬라이싱, 함수.py: -------------------------------------------------------------------------------- 1 | """ 2 | 블로그 포스팅 : https://bodhi-sattva.tistory.com/65 3 | """ 4 | 5 | no_char = "언젠가 파이썬 정리도 끝나겠지?" 6 | print(no_char[2], no_char[-4]) 7 | """인덱싱, 슬라이싱: 8 | 인덱싱(Indexing, 가리킴)과 슬라이싱(Slicing, 잘라냄)은 각각 문자열에서 한개 또는 여러개를 뽑아내는 방법이다. 9 | 인덱싱은 그중 1개의 값을 뽑아내는 것으로, (변수이름)[n] 과 같이 쓴다. 10 | [n]이라고 하면, 문자열의 인덱스 n 번째에 있는 값을 가리킨다. (참고로 인덱스는 0 ~ 문자열의개수-1 으로 차례대로 존재한다) 11 | 참고로 n가 음수라면, 문자열의 맨끝부터 거꾸로 해서 -n 번째에 있는 값을 가리킨다. 12 | """ 13 | print(no_char[:], no_char[3:], no_char[3:7], no_char[4:7:2], no_char[6:3:-2]) 14 | """ 15 | 슬라이싱은 여러개의 값을 뽑아내는 것으로, 다양한 방법으로 쓸 수 있는데, 16 | (변수이름)[:] 비워놓으면 끝을 의미한다. 따라서 맨처음부터 맨끝까지 이다. 17 | (변수이름)[n:] n번째 인덱스부터 맨 끝까지 가리킨다. 18 | (변수이름)[n:m] n번째 인덱스부터 m-1번째 인덱스까지 가리킨다. 19 | (변수이름)[n:m;s] n번째 인덱스부터 m-1번째 인덱스까지 s 간격만큼 건너뛰어서 가리킨다. 20 | * 여기서 특징은 n <= 출력되는 문자열 인덱스 < m 라는 점이다. [:m]를 해도 인덱스 m-1까지 문자열이 출력된다. 21 | 와 같다. 인덱싱처럼 n, m, s가 음수일 수도 있고, 특히 s(간격)이 음수면, 거꾸로 진행한다. 22 | """ 23 | 24 | 25 | """문자열 내장 함수: 26 | 문자열 변수에 .을 붙이고 특정 함수를 달면, 문자열만 있는 함수를 실행할 수 있다. (이걸 내장 함수라 한다) 27 | 대표적이고, 자주쓰이는 함수는 아래와 같다. 28 | 확실하게 알아볼 셈이면 03-3을 확인하자. 29 | """ 30 | ex = "Hello! Omm... PPAP?" 31 | print(ex.count('.')) 32 | # 인자 값(문자, 문자열)이 문자열에 몇번 쓰이는지 숫자 반환 33 | 34 | print(ex.find('e')) 35 | # 인자 값(문자, 문자열)이 가장 처음 쓰인 문자열 인덱스를 반환 (없을시 -1 반환) 36 | 37 | print(ex.index('e')) 38 | # find 와 같은 역할 (찾을려는 것이 없으면 오류 발생) 39 | 40 | print('-'.join(ex)) 41 | # 인자 값(리스트, 문자열)에 점 앞에 있는 문자, 문자열(ex> '-')을 요소 사이사이에 삽입 42 | 43 | print(ex.upper()) 44 | # 문자열의 문자를 모두 대문자로 변환 45 | 46 | print(ex.lower()) 47 | # 문자열의 문자를 모두 소문자로 변환 48 | 49 | print(ex.replace('PPAP', '샌즈')) 50 | # 문자열의 모든 첫번째 인자 값(문자, 문자열)을 두번째 인자 값으로 수정 51 | 52 | print(ex.split(' ')) 53 | # 문자열을 인자 값(문자, 문자열(괄호 비워놓을시 화이트 스페이스가 인자))을 기준으로 나누어서 리스트로 반환 54 | 55 | ex2 = " 널널 하쥬? " 56 | print(ex2.lstrip(), "<문자열 끝") 57 | # 왼쪽 공백 삭제 58 | 59 | print(ex2.rstrip(), "<문자열 끝") 60 | # 오른쪽 공백 삭제 61 | 62 | print(ex2.strip(), "<문자열 끝") 63 | # 양쪽 공백 삭제 64 | 65 | -------------------------------------------------------------------------------- /1_ 파이썬의 기본문법/1-2_ 자료형/4-시퀀스자료형공통문법.py: -------------------------------------------------------------------------------- 1 | print("주석 참고") 2 | """ 3 | 시퀀스자료형(리스트, 튜플, 문자열, range())의 공통되는 문법 4 | 5 | 값 in 시퀀스객체 # 시퀀스 객체에 특정 값이 있는지 확인 6 | 값 not in 시퀀스객체 # 시퀀스 객체에 특정 값이 없는지 확인 7 | 8 | 시퀀스객체1 + 시퀀스객체2 # 시퀀스 객체를 서로 연결하여 새 시퀀스 객체를 만듦 9 | 시퀀스객체 * 정수 # 시퀀스 객체를 특정 횟수만큼 반복하여 새 시퀀스 객체를 만듦 10 | 정수 * 시퀀스객체 # 시퀀스 객체를 특정 횟수만큼 반복하여 새 시퀀스 객체를 만듦 11 | 12 | len(시퀀스객체) # 시퀀스 객체의 요소 개수(길이) 구하기 13 | max(시퀀스객체) # 시퀀스 객체중 최대값인 요소 구하기 14 | min(시퀀스객체) # 시퀀스 객체중 최소값인 요소 구하기 15 | 16 | 인덱싱: 17 | 시퀀스객체[인덱스] # 시퀀스 객체의 요소에 접근 18 | 시퀀스객체[0] # 시퀀스 객체의 인덱스는 0부터 시작하므로 첫 번째 요소 19 | 시퀀스객체[-음수] # 인덱스를 음수로 지정하면 뒤에서부터 요소에 접근, -1은 뒤에서 첫 번째 20 | 시퀀스객체[인덱스] = 값 # 시퀀스 객체의 요소에 값 저장 21 | del 시퀀스객체[인덱스] # 시퀀스 객체의 요소를 삭제 22 | 23 | 슬라이싱: 24 | 시퀀스객체[시작인덱스:끝인덱스] # 지정된 범위의 요소를 잘라서 새 시퀀스 객체를 만듦 25 | 시퀀스객체[시작인덱스:끝인덱스:인덱스증가폭] # 인덱스 증가폭을 지정하면 해당 값만큼 인덱스를 증가시키면서 요소를 가져옴 26 | 27 | 시퀀스객체[:끝인덱스] # 시작 인덱스를 생략하여 객체의 처음부터 끝 인덱스 - 1까지 가져옴 28 | 시퀀스객체[시작인덱스:] # 끝 인덱스를 생략하여 시작 인덱스부터 마지막 요소까지 가져옴 29 | 시퀀스객체[:] # 시작 인덱스와 끝 인덱스를 생략하여 객체 전체를 가져옴 30 | 31 | 시퀀스객체[0:len(시퀀스객체)] # len을 응용하여 객체 전체를 가져옴 32 | 시퀀스객체[:len(시퀀스객체)] # 시작 인덱스 생략, len을 응용하여 객체 전체를 가져옴 33 | 34 | 시퀀스객체[:끝인덱스:증가폭] # 객체의 처음부터 증가폭만큼 인덱스를 증가시키면서 끝 인덱스 - 1까지 요소를 가져옴 35 | 시퀀스객체[시작인덱스::증가폭] # 시작 인덱스부터 증가폭만큼 인덱스를 증가시키면서 마지막 요소까지 가져옴 36 | 시퀀스객체[::증가폭] # 객체 전체에서 증가폭만큼 인덱스를 증가시키면서 요소를 가져옴 37 | 시퀀스객체[::] # 객체 전체를 가져옴, 시퀀스객체[:]와 같음 38 | 39 | 시퀀스객체[시작인덱스:끝인덱스] = 시퀀스객체 # 범위를 지정하여 여러 요소에 값 할당 40 | 시퀀스객체[시작인덱스:끝인덱스:인덱스증가폭] = 시퀀스객체 # 증가폭만큼 인덱스를 건너뛰면서 할당 41 | 42 | del 시퀀스객체[시작인덱스:끝인덱스] # 특정 범위의 요소를 삭제(원본 객체가 변경됨) 43 | 44 | """ -------------------------------------------------------------------------------- /1_ 파이썬의 기본문법/1-2_ 자료형/5-1-리스트자료형, 연산자.py: -------------------------------------------------------------------------------- 1 | """ 2 | 블로그 링크 : https://bodhi-sattva.tistory.com/69 3 | """ 4 | 5 | list_1 = [1, 2, 3, 4, 5] 6 | list_2 = [] 7 | list_3 = list() 8 | list_4 = ['hi', 5] 9 | list_5 = [1, [2, [3, 4]]] 10 | print(list_1, list_2, list_3, list_4, list_5) 11 | """리스트(list): 12 | 리스트는 여러개의 객체들을 묶어서 하나로 나타낸 것으로, c언어의 배열과 비슷하다. 13 | 여기서 다른 트깅은 다른 자료형들이라도 하나의 리스트로 저장할 수 있다는 것이다. 14 | 그리고 다차원 리스트(리스트 안에 리스트를 만드는 것)도 할 수 있는데, 정적이지 않고 각 각 다른 길이를 가질 수 있다. 15 | 빈 리스트는 []로, 선언할 수 있고, list()로도 선언할 수 있다. (list()함수는 아래 참조) 16 | 17 | 리스트도 문자열처럼 연결(+), 반복(*) 및 길이 측정(len())이 가능하다. 18 | 인덱싱과 슬라이싱도 문자열과 같은 방식으로 할 수 있는데, 추가된 점은 다차원 리스트일시 가장 바깥 리스트에서 안쪽 리스트 순으로 19 | [n][m]과 같이 []를 여러번 사용해주어야 한다. 20 | """ 21 | li = [1, 2, 3] 22 | li[1] = '둘' 23 | del li[2] 24 | print(li) 25 | """ 요소 수정, 삭제: 26 | 인덱싱으로 가리킨 리스트의 요소를 수정, 삭제하는 문법은 위와 같다. 27 | 수정은 간단히 = 연산자를 사용하면 되고, 28 | 삭제는 'del 삭제할 요소'와 같이 하면 된다. 29 | """ 30 | lis = [1, 2, 3, 4, 5] 31 | lis[1:4] = ['오', '예', '스'] 32 | del lis[3:5] 33 | print(lis) 34 | """ 35 | 물론 슬라이싱한 요소들도 수정, 삭제가 가능하다. 36 | """ 37 | -------------------------------------------------------------------------------- /1_ 파이썬의 기본문법/1-2_ 자료형/6-2-(집합으로공약수구하기).py: -------------------------------------------------------------------------------- 1 | n, m = map(int, input().split()) 2 | a = {i for i in range(1, n+1) if n % i == 0} 3 | b = {i for i in range(1, n+1) if m % i == 0} 4 | divisor = a & b 5 | print(divisor) 6 | """ 7 | 집합연산(&)으로 공약수 구하는 코드 8 | """ 9 | -------------------------------------------------------------------------------- /1_ 파이썬의 기본문법/1-2_ 자료형/7-튜플자료형.py: -------------------------------------------------------------------------------- 1 | t1 = (1,) 2 | t2 = (1, 2) 3 | t3 = 1, 2, 3 4 | t4 = ('a', 'b', ('ab', 'cd')) 5 | t5 = tuple('ppap') 6 | t6 = tuple([1, 2, 3, 4]) 7 | print(t1, t2, t3, t4, t5, t6) 8 | """튜플(typle) : 9 | 리스트랑 비슷한데, 다른점이라면 튜플은 요소 값을 삭제, 수정할 수 없다.(읽기전용이다) 10 | 요소 값을 중간에 못바꿔서 리스트를 튜플대신에 많이 쓰지만, 튜플이 속도가 빠르덴다. 11 | tuple() 함수로 군집자료형(연속되는 값들)을 튜플자료형으로 변환할 수 있다. 12 | 13 | 생성하는 법이 독특한데, 리스트는 []가 테두린데, 튜플은 ()가 테두리다. 근데 ()없이도 생성이 가능하다. 14 | (왜냐면 괄호 없이 값을 콤마로 구분하면, 그걸 하나로 묶어서 튜플 객체로 생각한다.) 15 | 그리고 한개 요소에서는 ,를 뒤에 붙이는데, 왜그런지 생각해보니까 숫자, 문자열이랑 차별을 두는 거였다. 16 | (튜플을 선언할때 ()없이 생성가능하다 보니까 요소가 1개일때 비군집 자료형이랑 생성방식이 겹치게 된다.) 17 | t01 = 1 # type(t01) == int 18 | t02 = 1, # type(t02) == tuple 19 | 20 | 튜플도 시퀀스(순서가 있는 군집)자료형이기 때문에 아래 문법을 사용 가능하다. 21 | 인덱싱과 슬라이싱이 가능하다. 다차원 튜플도 된다. 22 | 그리고 기본연산인 +(더하기), *(곱하기)도 리스트처럼 된다. 23 | 리스트에서 봤던 내장함수도 튜플과 동일하다. 24 | """ 25 | 26 | 27 | def ppap(li): 28 | return li[0], li[-1] 29 | 30 | 31 | print(ppap("ppap!")) 32 | first, last = ppap("ppap!") 33 | print(first, last) 34 | """튜플에 대한 알쓸잡지: 35 | 함수의 반환 값이 위같이 여러개일 경우 튜플로 반환된다. 36 | 이걸 변수들에게 대입하면 각각 변수에 각각의 값이 들어간다. (해체 할당과 비슷하덴다) 37 | (a, (b,(c, d))) = (4,(3,(2,1))) 38 | 이렇게도 가능하다. 39 | """ 40 | a = '국' 41 | b = '밥' 42 | a, b = b, a 43 | print(a, b) 44 | ''' 45 | 예전에 신발끈공식으로 두 변수의 값을 바꿀때 temp 변수를 선언해서 바꿔줄 필요가 없다! 46 | 튜플을 이용해서 한줄로 해결 가능하다. 47 | ''' 48 | 49 | tp = (1, 3, 5, 7, 9) 50 | print(len(tp), max(tp), min(tp)) 51 | """ 튜플 내장함수, 메쏘드: 52 | 튜플 내장함수는, 리스트에서 사용했던 그대로 len(), max(), min()을 사용할 수 있다. 53 | 메쏘드는 다른자료형과 다르게 다행이도(?) .count(), .index()만 있다. 54 | """ 55 | 56 | print(tp.count(1), tp.index(1)) 57 | """ 58 | .count(), .index() 함수도 사실 리스트와 같이 사용할 수 있다. 59 | """ 60 | 61 | 62 | -------------------------------------------------------------------------------- /1_ 파이썬의 기본문법/1-2_ 자료형/9-1-리스트내포.py: -------------------------------------------------------------------------------- 1 | data = [1, 2, 3, 4] 2 | print(data, [n+1 for n in data], [n for n in data if n % 2 is 0], sep='\n', end="\n"*2) 3 | """ 리스트 내포: 4 | 리스트 컴프리헨션(list comprehension), 리스트 내장, 리스트 축약, 리스트 해석이라고도 하는데, 5 | 리스트 안에 for 반복문이나 if 조건문을 사용하는 파이썬만의 리스트 표현식이다. 6 | 7 | * [n+1 for n in data] 8 | for 반복문을 복습하자면, 반복되는 여러가지 요소들(data)에서 요소를 하나하나 차례대로 변수(n)에 가져와서 반복문 아래서 쓰는 과정이였는데, 9 | 리스트 내포는 요소들에서 가져온 요소가 있는 변수(n)을 맨 앞에 위치시켜 반환한다. 이때 n에 산술연산을 덧붙이면, 변환된 상태로 반환된다(n+1). 10 | 반환된 요소들이 모여서 리스트가 만들어진다. 11 | 12 | * [n for n in data if n % 2 is 0] 13 | for 문으로 data 를 가져와 차례대로 n 변수에 가져오는 것은 동일한데, if 조건문 뒤에 붙은 조건식이 거짓이면 반환하지 않고 참인 경우에만 반환한다. 14 | 반환된 요소들끼리 리스트가 만들어지는 것이다. 15 | """ 16 | 17 | print([n for n in [1, 2, 3]], [n for n in (1, 2, 3)], [n for n in range(1, 4)], [n for n in "123"], sep='\n') 18 | print([n for n in {1: '일', 2: '이', 3: '삼'}], [n for n in {1, 2, 3}], sep='\n') 19 | 20 | print([i for i in enumerate([1, 2, 3])], [i+n for i, n in enumerate([1, 2, 3])], sep='\n') 21 | """ 22 | range()함수를 활용해도 좋고, 기타 군집자료형들을 활용해도 된다. (딕셔너리는 역시 키 값이 차례대로 반환된다) 23 | enumerate()함수같이 인덱스와 값을 묶어 튜플로 반환하는 경우도 된다. 두 변수로 전달받아 활용해도 된다. 24 | """ 25 | -------------------------------------------------------------------------------- /1_ 파이썬의 기본문법/1-2_ 자료형/9-2-리스트내포심화, 다중리스트내포.py: -------------------------------------------------------------------------------- 1 | # for x1, x2, y in [(0, 0, 0), (0, 1, 0), (1, 0, 0), (1, 1, 1)]: 2 | # print(x1, x2, '|', y) 3 | # """ 4 | # == for x1, x2 in [(0,0), (0,1), (1,0), (1,1)]: 5 | # print(x1, x2, '|', x1 and x2) 6 | # 의 코드로도 같은 실행 결과를 볼 수 있다. (리스트 안의 값이 두 변수의 and 연산 결과를 가지고 있다.) 7 | # """ 8 | test = [[1, 2], [3, 4], [5, 6]] 9 | print([n2-n1 for n1, n2 in test]) 10 | """리스트내포 심화: 11 | 위처럼 리스트내포로 한번에 여러값을 받을 수 있는 것쯤은 알것이다. 12 | 이건 아까 했던 거니까 그렇다 치고, 이젠 더 고급지게, 리스트 내포를 이중으로도 해보자. 13 | """ 14 | 15 | print([x*y for x in range(1, 10) for y in range(1, 10)]) # 이렇게 구구단의 모든 출력 내용을 파이썬에선 한줄로 소화해낼 수 있다. 16 | # 위의 한줄이 아래 세줄 코드와 동일하다. 17 | # for y in range(1, 10): 18 | # for x in range(1, 10): 19 | # print(x*y, end=' ') 20 | """이중 리스트내포: 21 | 말그대로, 이중 for 문처럼, for 문을 연달아서 두번 사용하는 것이다. 22 | 이 상황에서 오른쪽의 for 문이 바깥 반복문이고, 왼쪽의 for 문이 안쪽 반복문이다. 23 | 물론 여기서도 if 문을 혼합할 수 있다. 24 | """ 25 | 26 | print([x*y for x in range(1, 10) if x is not 1 for y in range(1, 11) if y is not 10]) 27 | """ 28 | 여기서 if 문은 자신의 왼쪽에 위치한 for 문에 속해있는 것같다. 29 | if 문까지 들어가니까 좀 보기 어려워 졌는데... 30 | """ 31 | 32 | print([x+y+z for x in range(1, 11) for y in range(1, 11) for z in range(1, 11)]) 33 | print([x+y+z+a for x in range(1, 11) for y in range(1, 11) for z in range(1, 11) for a in range(1, 11)]) 34 | print([x+y+z for x in range(1, 11) if x is not 10 35 | for y in range(1, 11) if y is not 10 36 | for z in range(1, 11) if z is not 10]) 37 | """ 38 | 삼중, 사중 리스트도 가능하고, 한술 더떠서 if 문을 넣는것도 된다. 39 | 이정도 되니까 한줄로 가독성좋던 리스트 내포가 복잡해졌다. 40 | 다중 리스트에서는 for 문 단위로 끊어주는 센스가 필요할 것 같다. 41 | """ 42 | print([a+b+c+d+e+f+g+h+i+j+k+l+m+n+o for a in range(1, 3) for b in range(1, 3) for c in range(1, 3) for d in range(1, 3) 43 | for e in range(1, 3) for f in range(1, 3) for g in range(1, 3) for h in range(1, 3) for i in range(1, 3) 44 | for j in range(1, 3) for k in range(1, 3) for l in range(1, 3) for m in range(1, 3) for n in range(1, 3) 45 | for o in range(1, 3)]) 46 | """ 47 | 근데 다중리스트에도 끝이 있을까? 15중첩 리스트내포까지 갔는데도 멀쩡하다. 슬슬 무서워 지는것 같아서 여기까지만 하고 그만둬야 겠다. 48 | """ -------------------------------------------------------------------------------- /1_ 파이썬의 기본문법/1-2_ 자료형/9-3-리스트내포확장.py: -------------------------------------------------------------------------------- 1 | print("딕셔너리내포") 2 | print({k*2: v*3 for k, v in {1: 1, 2: 2, 3: 3}.items()}) 3 | print({v: k for k, v in {1: '값', 2: '값2', 3: '값3'}.items()}) # 키와 값을 뒤집어서 응용 할 수도 있다. 4 | print({0: value for value in {1: '1', 2: '2', 3: '3'}.values()}) # 참고로 딕셔너리 내포에서 반복되는 값을 값으로 해도, 값은 1개만 들어간다. 5 | print({value: 0 for value in {1: '1', 2: '2', 3: '3'}.values()}) 6 | print({key: 0 for key in {1: '1', 2: '2', 3: '3'}.keys()}) 7 | 8 | print("집합내포") 9 | print({n for n in 'ppap!'}) 10 | print({n for n in 'ppap!' if n is not '!'}) 11 | 12 | print("튜플내포") 13 | print(tuple(n*2 for n in range(1, 6))) 14 | """ 15 | 리스트 내포는 사실 문자열을 뺀 모든 군집자료형(리스트, 딕셔너리, set, 튜플) 16 | 에서도 사용가능하다. 17 | 18 | 딕셔너리는 19 | {키: 값 for 키, 값 in 딕셔너리} 아니면, 20 | dict({키: 값 for 키, 값 in 딕셔너리}) 같은 형식이다. 21 | (딕셔너리 부분에는 달랑 {~~}같은 딕셔너리 객체가 들어가면 에러가 난다. 22 | 항상 뒤에, .items()로 키-값 쌍아니면, .keys()로 키들 아니면, .values()로 값들을 반환하게 해야한다.) 23 | if문을 활용할 수 있으며, if문의 조건식으로 키 또는 값을 활용하면 된다. 24 | 25 | 26 | set(집합)에서는 27 | {식 for 변수 in 반복가능한객체} 28 | set(식 for 변수 in 반복가능한객체) 같은 형식이다. 29 | 반복가능한 객체는 문자열이든 리스트, 튜플이든 다 올수 있다. 30 | 31 | 튜플에서는 32 | tuple(식 for 변수 in 반복가능한객체) 같이 사용한다. 33 | (식 for 변수 in 반복가능한객체) 같이 사용하면 제너레이터 표현식(튜플이 아니게)이 된다. 34 | """ -------------------------------------------------------------------------------- /1_ 파이썬의 기본문법/1-3_ 기초확장판/1-단순복사vs얕은복사vs깊은복사.py: -------------------------------------------------------------------------------- 1 | import copy 2 | """ 3 | 단순복사 vs 얕은복사(shallow copy) vs 깊은복사(deep copy) 4 | """ 5 | print("단순복사") 6 | a = b = [1, 2, 3] 7 | # 집합(set), 리스트, 딕셔너리 같이 값을 수정할수 있는(불변하지 않는) 자료형은 마찬가지. 8 | print(a, b) 9 | del a[0] 10 | print(a, b) 11 | 12 | """단순복사: 13 | 동일한 주소를 가지는 객체를 복사함. 14 | 파이썬에서 모든 값은 자료형 객체이며, 변수는 객체를 참조하는 것이다. 15 | 그리고, = 은 객체를 변수로 접근(참조)하게 해준다. (할당) 16 | 그래서 변수1 = 변수2 같이하면, 변수1에서도 변수2가 가리키는 값을 똑같이 가리킬수 있는 것이다. 17 | 그렇기에 변수2가 가리키는 값을 수정하면, 수정한 객체가 변수2와 변수1 모두 같이 가리키는 값이기에, 변수1도 변한다. 18 | 19 | (대신에 불변하는 값, immutable(숫자자료형, 불자료형, 튜플(읽기전용자료형), 문자열(수정불가능))은 예외, 20 | 값을 수정하면, 그 객체가 변할 수가 없기에(불변), 수정하려는 새로운 객체(값)을 할당하게 된다.) 21 | """ 22 | 23 | print("\n얕은복사") 24 | kiki = [1, 2, 3] 25 | kuku = kiki.copy() 26 | print(kiki, kuku) 27 | del kiki[0] 28 | print(kiki, kuku) 29 | 30 | eo = [1, [2, 3, 4]] 31 | ei = eo.copy() 32 | print(eo, ei) 33 | del eo[1][1] 34 | print(eo, ei) 35 | """얕은복사: 36 | 수정가능한 자료형에서 메쏘드로 존재하는 .copy()메쏘드, 37 | 사실 얘의 역할은 얕은복사한 값을 반환한다. 38 | 얕은복사는 단순복사처럼 1개의 객체를 주는 것이 아니라, 1개의 객체를 복제해 2개로 만들어 넘겨준다. 39 | 대신에 표면적인(복합객체라고 합니다)객체 틀만 복사해서 주기에, 중첩리스트, 딕셔너리일 경우에 40 | 표면적인 리스트 안에 있는 내부리스트(내부객체라고 합니다.)는 2개로 복제하지 않는다. (참조객체) 41 | 그래서 다차원에서 얕은복사를 하면, 내부객체들은 제대로 복사할 수 없다. 42 | """ 43 | 44 | print("\n깊은복사") 45 | yeo = copy.deepcopy(eo) 46 | print(eo, yeo) 47 | del eo[1][0] 48 | print(eo, yeo) 49 | """깊은복사: 50 | copy 모듈의 .deepcopy()함수로 깊은복사한 값을 반환할 수 있다. 51 | 깊은복사는 얕은복사에서 1차적인 리스트들만 복사하는 수준에서 벗어나, 객체 전체를 복사해준다. 52 | 따라서 중첩리스트, 딕셔너리의 2차, 3차적인 내부객체도 모두 2개로 복제해서 넘겨준다. (참조하는 것따윈 없다) 53 | """ 54 | 55 | print("\niu(이유)") 56 | huhu = [1] 57 | huhu.append(huhu) 58 | print(huhu) 59 | print(huhu.copy()) 60 | print(copy.deepcopy(huhu)) 61 | -------------------------------------------------------------------------------- /1_ 파이썬의 기본문법/1-3_ 기초확장판/2-map()함수.py: -------------------------------------------------------------------------------- 1 | """ 2 | map() 함수는 iterable(반복가능한 객체, ex> list, dict, ... )의 데이터들을 3 | 하나 하나의 데이터로 쪼개서 그 데이터를 전달받은 방법으로 변환해서 다시 데이터들로 반환하는 함수다. 4 | ex)""" 5 | list_a = [1, 2, 3] 6 | a, b, c = map(str, list_a) 7 | print(a, "의 타입:", type(a), b, "의 타입:", type(b), c, "의 타입:", type(c)) 8 | 9 | """(map 동작 구조) 10 | 11 | 데이터들(인자) 1 ->(처리)-> '1' 데이터들(반환) 12 | [1, 2, 3] -> 2 ->(처리)-> '2' -> ['1'. '2', '3'] 13 | 3 ->(처리)-> '3' 14 | 15 | 형식은 map(변환할 형식, 변환할 값들) 과 같으며 16 | 변환할 형식은 함수, 자료형 같은 인자가 들어갈 수 있고, 17 | ex)""" 18 | def func(x): 19 | return x * 2 20 | 21 | 22 | print(list(map(func, [1, 2, 3]))) 23 | # -> [2, 4, 6] 변환에 함수를 사용 24 | """ 25 | 변환할 값은 리스트나 dict 같은 인자가 들어갈 수 있다. 26 | ex)""" 27 | x = {1: 10, 2: 20, 3: 30} 28 | print(list(map(str, x))) 29 | # -> ['1', '2', '3'] dict 의 key 값을 사용 30 | print(list(map(str, [x[i] for i in x]))) 31 | # -> ['10', '20', '30'] dict 의 value 값을 사용 32 | 33 | 34 | """ 35 | map()함수에 변환할 객체를 여러개 사용할 수도 있다. 36 | 람다표현식이랑 주로 합해서 사용하는데(3>4 람다표현식응용 참고) 변환할 객체가 제한이 없다. 37 | """ 38 | a = [1, 2, 3, 4] 39 | b = [4, 3, 2, 1] 40 | print(list(map(lambda a1, a2: a1+a2, a, b))) 41 | c = [10, 20, 30, 40] 42 | d = reversed(c) 43 | print(list(map(lambda b1, b2, b3, b4: b1+b2+b3+b4, a, b, c, d))) 44 | -------------------------------------------------------------------------------- /1_ 파이썬의 기본문법/1-3_ 기초확장판/3-range()함수.py: -------------------------------------------------------------------------------- 1 | sum = 0 2 | for i in range(1, 11, 2): 3 | # 반복문은 03-2에서... 4 | # i -> 1, 3, 5, 7, 9 5 | sum += i 6 | print(sum) 7 | # -> 25 8 | """range()함수: 9 | range()함수는 10 | 11 | range(마지막 값) 처음값 = 0, 간격 = 1 12 | range(처음값, 마지막 값) 간격 = 1 13 | range(처음값, 마지막 값, 간격) 14 | 15 | 과 같은 형식으로 간격(공차)만큼 연속되는 값(등차수열)을 차례대로 반환하는 함수다. 16 | 처음값에서 시작해서, 마지막 값-1까지 생성한다.(마지막 값은 포함하지 않음) 17 | """ 18 | n = 10 19 | for i in range(1, n+1): 20 | print(i, end=' ') 21 | print() 22 | # 1~n(10)까지 range(범위) 출력 23 | """ 24 | 간격이 음수일 경우 증가가 아니고 감소하는 방향이 된다. 25 | """ 26 | n = 10 27 | for i in range(n, 0, -1): 28 | print(i, end=' ') 29 | # n(10)~1까지 range(범위) 출력 30 | -------------------------------------------------------------------------------- /1_ 파이썬의 기본문법/1-3_ 기초확장판/4-enumerate()함수.py: -------------------------------------------------------------------------------- 1 | lis = [1, 1, 2, 3, 5, 8, 13, 21] 2 | for li in enumerate(lis): 3 | print(li, end=' ') 4 | print() 5 | """enumerate() 함수: 6 | for li in lis: 7 | 라고 하면 리스트의 원소들을 차례대로 li 에 넣어서 원소들이 모두 끝나면 반복문이 끝나는데, 8 | enumerate(열거하다)의 함수를 사용하면, 리스트의 인덱스와 원소 모두 사용할 수 있다. 9 | lis.index(li) 같이 보기도, 쓰기도 힘들게 원소값의 인덱스를 다룰 필요가 없는 것이다. 10 | enumerate()는 인자값으로 군집자료형(문자열, 튜플, 리스트)를 전달받으면, 인덱스와 요소 값을 차례대로 튜플로 반환한다. 11 | (딕셔너리를 인자로 하면, 키 인덱스와 키 값을 반환한다. 아쉽...) 12 | """ 13 | for index, num in enumerate(lis): 14 | print(index, "번째 : ", num, sep='', end=' ') 15 | """ 16 | 튜플자료형에서 해체할당 같이 튜플을 각각의 변수로 할당하는 문법이 가능한데, 17 | 그걸 활용해서 위같이 좀더 보기쉽게 표현할 수 있다. 18 | """ -------------------------------------------------------------------------------- /1_ 파이썬의 기본문법/1-4_ 제어문/0-파이썬제어문_기초함수.md: -------------------------------------------------------------------------------- 1 | ## 파이썬의 제어문_기초함수 2 | 3 | 파이썬의 제어문인, if문(분기문)과 for, while문(반복문)에 대해서, 4 | 그리고 여기서 활용되는 pass, continue, break와 range(), enumerate()함수로 5 | 더 활용성 있게 파이썬의 제어문을 활용할 수 있습니다! 6 | -------------------------------------------------------------------------------- /1_ 파이썬의 기본문법/1-4_ 제어문/1-조건문 if.py: -------------------------------------------------------------------------------- 1 | a, b = map(int, input("a와 b를 입력하세요: ").split(' ')) 2 | if a > b: 3 | print(a*b) 4 | else: 5 | print(b-a) 6 | """ if else: 7 | 조건문은 c언어 처럼 if 문을 사용할 수 있다. switch case 문은 없다. 8 | (대신에 딕셔너리(dic)을 사용한 함수로 구현가능하다.) 9 | 추가로 else if 문은 파이썬에서 elif 로 표현한다. 10 | """ 11 | -------------------------------------------------------------------------------- /1_ 파이썬의 기본문법/1-4_ 제어문/2-반복문 for, while + pass, continue.py: -------------------------------------------------------------------------------- 1 | for i in range(1, 10): 2 | print(i) 3 | """반복문: 4 | 반복문으로는 while 문과 for 문이 있다. 5 | for 문은 유용하고 구조도 보기쉬운데, 여기서 같이 쓰이는 함수가 range 다. 6 | for i in [1,2,3]: 7 | 과 같은 코드는 []같은 iterable(반복가능한 객체)의 요소(1, 2, 3)를 처음부터 끝까지 i라는 변수로 뽑아내면서 for 문의 실행문을 반복한다. 8 | 여기서 리스트 요소를 간편하게 range()함수를 사용해서 나타낼 수 있다. 9 | """ 10 | j = 0 11 | while j <= 10: 12 | print(j) 13 | j += 1 14 | """ 15 | while 문도 있는데, c언어 에서와 같다. 16 | 그리고 반목문과 조건문에서 쓰이는 예악어들도 있는데, break, continue 추가로 pass 도 있다. 17 | break 는 가까운 반복문을 탈출 하고, 18 | pass 와 continue 모두 아래 실행문을 무시하고 건너뛰는데, 이때 둘의 차이점은 19 | pass 는 다음 루프를 실행시키지 않지만, continue 는 다음 루프로 넘어간다. 20 | """ 21 | n = 0 22 | while True: 23 | n += 1 24 | if n > 5: 25 | print("break!") 26 | break 27 | print(n) 28 | # break 문 29 | 30 | pas = True 31 | for i in range(1, 3): 32 | if pas: 33 | print("pass 전 i값: ", i) # -> 1 34 | pas = False 35 | pass 36 | print("pass 후 i값: ", i) # -> 1 37 | break 38 | # pass 문 39 | 40 | con = True 41 | for i in range(1, 3): 42 | if con: 43 | print("continue 전 i값: ", i) # -> 1 44 | con = False 45 | continue 46 | print("continue 후 i값: ", i) # -> 2 47 | break 48 | # continue 값 49 | 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /1_ 파이썬의 기본문법/1-5_ 함수(기초)/2-함수매개변수,반환값.py: -------------------------------------------------------------------------------- 1 | def sum_mul(a, b): 2 | return a + b, a * b 3 | # 튜플에서 배웠듯이 반환 값이 여러개면 튜플로 반환 4 | 5 | 6 | result = sum_mul(3, 4) 7 | # result = (7,12) 8 | sum, mul = sum_mul(3, 4) 9 | # sum = 7, mul = 12 10 | print(result, sum, mul) 11 | """함수의 매개변수(parameter), 반환값(return 문): 12 | 13 | 지금까지 파이썬 함수에서 괄호()안에 인자값을 넘겨주는 경우가 많았는데, 14 | 마찬가지로, 사용자가 만든 함수에서도 인자값을 넘겨받아서, 함수 안에서 활용 할 수 있음. 15 | 이를 파라미터(parameter, 매개변수라고 함. 16 | def 함수이름(매개변수): 17 | 코드 18 | 같이 함수를 정의할 때 괄호 안에 매개변수를 선언할 수 있다. (매개변수가 여러개도 가능하다.) 19 | 이러한 매개변수는 함수를 호출할 때 (ex> 함수이름(전달인자) ) 괄호안에 전달인자로 넘겨받은 인자값을 매개변수에 저장한다. 20 | 21 | ** 매개변수 = Parameter(파라미터) = 가인수(Dummy argument) = 형식매개변수 22 | ** 전달인자 = Argument(아규먼트) = 실인수(인수) = 실매개변수 23 | 24 | *** 인자, 인자값은 논란이 많은데, 인자가 전달인자의 줄임말로 쓰기도 하고, 인수(값)과 대조되기도 하는데, 25 | 나는 가볍게, 인수(값) vs 인자(변수)로 생각할련다. 인자 = 파라미터 vs 인자값 = 아규먼트 26 | 27 | 28 | 그리고 스크립트에서 함수로 값을 전달(인자)할 수 있듯이, 함수에서 거꾸로 스크리브로 값을 전달할 수 있다. 29 | 이렇게 함수가 종료되면서 가져오는, 반환하는 값을 반환 값이라 하며, return 문을 이용하면 된다. 30 | 31 | return 반환할 값(or변수) 32 | 와 같이 하며, 여러개를 사용할 수 있다. (여러개일 경우 튜플로 반환한다.)(파이썬은 괄호없이 값을 콤마로 구분하면 튜플이 된다.) 33 | return 을 만나면 함수는 반환하게 되는데, 이를 이용해 함수 중간에 return 문을 넣어 함수를 종료하고 반환 할 수 있다. 34 | (보통 분기문(if)의 조건식을 만족할 때 return 문으로 빠져나오게 한다.) 35 | 36 | 37 | 정리해서 함수의 흐름을 파악하자면, 38 | 함수는 호출 됬을 시에, 원래 파이썬 스크립트(코드)의 순서대로 읽다가, 호출되는 행에서 함수로 넘어가서, 39 | (인자값도 있다면, 함수로 넘어갈 때 같이 넘어감) 함수 부분에 있는 모든 코드를 순서대로 처리하고, 40 | return 을 만나거나, 함수의 마지막 코드까지 실행이 끝났으면 함수를 종료하고, 41 | (반환 값이 있으면 스크립트로 넘어갈 때 같이 넘어감) 아까 스크립트에서 함수를 호출했던 행으로 넘어감. 42 | """ -------------------------------------------------------------------------------- /1_ 파이썬의 기본문법/1-5_ 함수(기초)/3-함수독스트링.py: -------------------------------------------------------------------------------- 1 | def remove_space(words): 2 | """전달받은 인자(문자열)의 앞 뒤 공백을 3 | 정리한 값을 반환합니다.""" 4 | return words.strip() 5 | 6 | 7 | s = input("문자열 입력 : ") 8 | print(remove_space(s)) 9 | 10 | print(remove_space.__doc__) 11 | help(remove_space) 12 | """함수 독스트링(docstring): 13 | 파이썬에선 함수정의 시에, 콜론: 바로 다음 줄에 """"""(문자열 주석)으로 함수에 대한 설명을 넣을 수 있는데, 14 | 이런 문자열을 독스트링(= 문서화 문자열, documentation strings, docstrings(독스트링))이라고 함. 15 | (대신 독스트링 위에 다른 코드가 오면 안됨, 독스트링이 가장 먼저) 16 | 17 | 물론 '', "", '''''' 을 활용해서 만들어도 되지만, PEP 8(코딩스타일규칙)에서는 큰따옴표 세개를 활용하는 걸 권장한다. 18 | 19 | 독스트링은 함수의 사용방법만 기록하고, 함수의 코드에는 영향을 주지 않는데, 20 | 함수이름.__doc__ 와 같이하면, 함수의 독스트링을 반환할 수 있다. 21 | 22 | 아니면 heip(함수이름)과 같이, help()함수에 함수이름을 넣으면, 23 | 인자값으로 받은 함수의 독스트링을 도움말 형태로 출력할 수 있다. 24 | """ -------------------------------------------------------------------------------- /1_ 파이썬의 기본문법/1-5_ 함수(기초)/4-함수타입힌팅.py: -------------------------------------------------------------------------------- 1 | def count_length(word: str, num: int) -> int: 2 | return len(word) * num 3 | # 함수 타입 힌팅(Type hinting) 4 | # def 함수이름 (파라미터이름 : 파라미터타입) -> 반환타입: 5 | 6 | 7 | print(count_length("CHANIK", 5)) 8 | print(count_length([1, 2], 3)) 9 | """ 함수 타입 힌팅(Type hinting): 10 | python 3.5 버전에서는 코드 가독성에 도움을 주는, 파라미터, 아규먼트에 대한 타입 힌트가 도입됨. 11 | python 3.6 버전에서는 함수의 변수에서도 타입 힌트를 표시할 수 있음. 12 | 이것을 타입 힌트(Type hint), 그리고 힌트를 표시하는 것을 타입 힌팅(Type hinting)이라함. 13 | 14 | 이게 생긴 이유는 타입(자료형) 표시하는 표준적인 구문을 던져줘서 15 | 정적 분석을 쉽게하고, 리펙토링(소프트웨어를 이해하기 쉽게, 디자인을 개선시키는 기법)에도 도움을 줌. 16 | (그렇다고 파이썬이 정적 타입을 지향하는 것은 아님.) 17 | 18 | 근데 타입 힌트는 말그대로 힌트기능이다. (런타임에 영향을 주지 않는다) 19 | 다르게 말하면 코드에 붙은 주석 기능으로, 타입 힌트와 다른 타입(자료형)을 사용해도 코드가 에러나지는 않는다. 20 | (대신 개발환경에서 (파이참에선 노란색 바탕으로) 표시된다,) 21 | 22 | 23 | 함수의 독스트링을 __doc__로 가져왔듯이, 타입 힌트도 __annotations__로 가져올 수 있다. 24 | """ 25 | print(count_length.__annotations__) 26 | """ 27 | 함수의 매개변수에 타입 힌트를 붙일 때는, 함수의 정의 부분에서 괄호안에 28 | 29 | 함수이름(매개변수: 타입, 매개변수: 타입...): 30 | 와 같이 하며, 31 | 32 | 함수의 반환값에 타입 힌트를 붙일 때는, 함수의 정의 부분에서 콜론 바로 뒤에 33 | 34 | 함수이름(매개변수...) -> 타입 35 | 과같이 한다. 36 | 37 | 변수에 타입 힌트를 붙일 때도, 매개변수와 같이, 38 | 39 | 변수: 타입 = 값 40 | 과 같이 하면 된다. 41 | 그외에도 클래스 맴버 변수(변수와 같은 방법)나, 클래스 메쏘드의 매개변수(함수 매개변수와 같은 방법)에서도 타입 힌트를 적용 할 수 있다. 42 | """ 43 | 44 | """typing 모듈 45 | typing 모듈을 사용해서 좀더 다양한 타입 기능을 이용할 수 있다. 46 | 47 | 타입중에서 키워드를 쓰는 것도 가능하다. Any(아무 타입) NoReturn(반환값에서 쓰는데, 리턴이 안될때) 48 | 그외에도 타입을 별명으로 만들어서 사용하거나, 블로그에 찾으니까 넘쳐나는 정보가 있었다. (정리할 훗날을 기약하자) 49 | 50 | 참고 : 51 | https://lewisxyz000.tistory.com/35 52 | """ -------------------------------------------------------------------------------- /1_ 파이썬의 기본문법/1-5_ 함수(기초)/6-함수의위치인수,키워드인수+딕셔너리언패킹.py: -------------------------------------------------------------------------------- 1 | def func(a, b, c): 2 | print(a, b, c) 3 | 4 | 5 | func(1, 2, 3) # 위치인수로 함수 호출 6 | func(a=3, b=2, c=1) # 키워드 인수로 함수 호출 7 | func(1, c=2, b=3) # 인수를 짬뽕(위치인수 + 키워드 인수)해도 가능 8 | """ 위치인수(positional argument), 키워드 인수(keyword parameter) 9 | 위치 인수는 함수를 호출할 때 받은 인수의 순서대로, 매개변수에 대입하는 것을 말함. 10 | 함수를 배우면서 지금까지 대부분 이 방법을 사용했으며, 11 | 인수의 순서가 중요하며, 순서가 바뀌면, 변수에 값이 뒤바껴 들어갈 수 있기에 조심해야함. 12 | 13 | 대신에 키워드 인수는 인수의 위치(순서)에 신경 쓸 필요 없음. 14 | 말그대로 키워드 인수는 인수에 키워드(이름)을 붙이는 기능으로, 함수를 호출할 때도 매개변수=인자값 형식으로 사용. 15 | 함수를 정의할 때는 따로 건들 필요 없음. 16 | (위치인수와 키워드 인수는 짬뽕해서 사용가능하다.) 17 | """ 18 | dic = {'a': '에이', 'b': '비', 'c': '씨'} 19 | func(*dic) 20 | func(**dic) 21 | """ 딕셔너리 언패킹: 22 | 지난번 시퀀스데이터에 *를 앞에 붙여 시퀀스데이터의 요소들을 언패킹 했었는데, 딕셔너리 자료형도 가능하다. 23 | *딕셔너리 와 같이하면, 키들만 언패킹한다. 24 | 그래서 딕셔너리는 *를 추가로 더 붙여서 **딕셔너리와 같이 해야 키:값 쌍들을 언패킹 할 수 있다. (이렇게 하면 가변+키워드 인수가 된다.) 25 | 26 | 함수의 정의에서 가변 키워드 인수(딕셔너리 인자들을)를 받아온다면, 언패킹을 활용하면 된다. **매개변수와 같이 한다. 27 | 28 | 매개변수 이름도 자유지만 관례적으로 KeyWord ARGumentS 를 줄여서 kwargs 를 사용한다. 29 | kwargs 는 딕셔너리 자료형으로 for문에서 반복 할 수 있다. (.items()함수 없으면 에러) 30 | 31 | 32 | 또한 마찬가지로 고정위치인수와 가변키워드인수를 함께 사용해도 되고, 33 | 가변위치인수와 가변키워드인수를 함께 사용해도 된다. 34 | """ 35 | 36 | 37 | def intro(name, **kwargs): 38 | """ 39 | :param name: 위치 고정 인수 40 | :param kwargs: 키워드 가변 인수 41 | """ 42 | print('<인적사항> \n이름:', name) 43 | for key, value in kwargs.items(): 44 | print(key, ":", value) 45 | 46 | 47 | intro("김동") 48 | intro("김동", **{'사는곳': '참나의직관속', '진짜사는곳': '대전'}) 49 | 50 | 51 | def prt(*args, **kwargs): 52 | """ 53 | :param args: 위치 가변 인수 54 | :param kwargs: 키워드 가변 인수 55 | """ -------------------------------------------------------------------------------- /1_ 파이썬의 기본문법/1-5_ 함수(기초)/7-디폴트매개변수,매개변수초깃값.py: -------------------------------------------------------------------------------- 1 | def func(head="제목없음", body="설명없음"): 2 | print("제목:", head) 3 | print("설명:", body, sep='\n') 4 | print() 5 | 6 | 7 | func("이래도 되는가", "이렇게 하루종일 쉬면서 보내도 되는가") 8 | func("제목만 있음") 9 | func() 10 | """ 디폴트 매개변수 11 | 함수를 호출할 때 경우에 따라서 인수를 생략할 수 있게 하고 싶으면, 함수 매개변수에 초깃값을 지정하면 된다. 12 | 이를 디폴트 매개변수라고 하며, 이런 함수는 호출할때 인자값을 줘도 되고 없어도 된다. 13 | (언뜻보면 가변인자와 비슷하지만, 디폴트 매개변수는 아무것도 주어지지 않을 때, 초깃값을 가진다.) 14 | 15 | 이러한 디폴트 매개변수는 일반 변수랑 혼합해서도 사용할 수 있다. 16 | 대신에 일반변수가 디폴트 매개변수의 뒤에 올 수 없다. 그렇게되면 에러가 난다. 17 | """ 18 | 19 | 20 | def function(name, sex="알수없음", age="알수없음"): 21 | print("이름:", name) 22 | print("성별:", sex, "/ 나이:", age) 23 | 24 | 25 | function("김숭") 26 | function("김승", "남자") 27 | function("김송", "남자", '14살') 28 | -------------------------------------------------------------------------------- /1_ 파이썬의 기본문법/1-6_ 파일/1-파일,파일모드,with_as문.py: -------------------------------------------------------------------------------- 1 | file = open('18.txt', 'w') 2 | file.write('예시 파일입니다.') 3 | file.close() 4 | 5 | """파일(file) 6 | 프로그래밍에서 중요한 부분중 하나가 파일처리임. 7 | 파이썬에서 파일은 파일객체로 사용할 수 있으며, open()함수로 파일을 열고, .close()메쏘드로 파일을 닫을 수 있음. 8 | 9 | 파일객체 = open(파일이름, 파일모드) 10 | 파일객체.close() 11 | 12 | 파일이름은 절대주소, 상대주소중 하나를 사용함. 13 | 그리고 파일의 이름과 확장자까지 들어가야함 (ex> '파일이름.txt') 14 | 15 | 16 | 파일모드는 종류가 다양함, 17 | 파일 : 18 | 읽기 전용 : 'r', 19 | 쓰기 전용 : 20 | 파일 덮어쓰기(새로만듬) : 'w', 21 | 파일 끝에 추가(덧붙이기) : 'a', 22 | 파일이 있으면 에러 : 'x' 23 | 파일 모드 오른쪽에 +를 붙이면 읽기/쓰기 혼합 (ex> 'r+', 'w+', 'a+' ...) 24 | 파일 모드 맨오른쪽에 파일 종류를 붙여서 종류 지정 가능(기본값 텍스트파일(t)) b: 바이너리 파일 (ex> 'wb', 'w+b', 'a+b' ...) 25 | 26 | 27 | 파일의 종류는 텍스트(text)파일과 바이너리(binary)파일이 있는데, 28 | 텍스트 파일은 문자를 기반으로 하는 코드값을 저장하는 형식으로, txt파일등이 해당됨. 29 | 이런 텍스트 파일은 문자열 개념을 그대로 사용할 수 있음. 30 | 31 | 바이너리(binary) 파일은 정보, 숫자값을 특별한 가공없이 저장하는 형식으로, 32 | jpg, png같은 그림파일, mp3같은 음악파일, exe같은 실행파일이 해당됨. 33 | 34 | 파이썬에서 파일을 열때 기본적으로 텍스트 모드로 읽고, b를 파일모드에 추가하면 바이너리 모드로 읽음. 35 | 36 | 37 | 그리고 파일객체를 사용해서 문자열을 읽고 쓸수 있음. (open()함수 뒤에, .close()메쏘드 전에 사용함) 38 | 39 | .write() 메쏘드로 파일에 문자열을 쓸수 있고, 40 | .read() 메쏘드로 파일에서 문자열을 읽은 값을 반환할 수 있음. (문자열로 반환) 41 | """ 42 | file = open('18.txt', 'r') 43 | s = file.read() 44 | print(s) 45 | file.close() 46 | 47 | """with as 문 48 | with open(파일이름, 파일모드) as 파일객체: 49 | 실행문 50 | 51 | 과 같은 형식으로 자동으로 파일 객체를 열고 닫을 수 있음. (파이썬 2.5 부터 추가된 기능) 52 | 이러한 것을 context manager(특정작업(여기선 파일)의 context(파일을 열고 닫고, 예외처리)를 관리하는 객체), 53 | 컨텍스트 매니저라고 함. (컨텍스트 매니저에 대해선 심화 내용이다 보니, 나중에 알아보도록 함. 6폴더의 04-9-1 참고.) 54 | """ 55 | 56 | with open('18.txt', 'r') as f: 57 | print(f.read()) 58 | print("이렇게 with as 문을 빠져나가면 파일객체가 자동으로 닫힙니다. (close()함수 필요없이)") 59 | -------------------------------------------------------------------------------- /1_ 파이썬의 기본문법/1-6_ 파일/2-파일함수,피클링,언피클링.py: -------------------------------------------------------------------------------- 1 | import pickle 2 | 3 | lines = ["세\n", "로\n", "로\n", "보\n", "세\n", "요\n"] 4 | with open('19.txt', 'w', encoding='utf-8') as file: 5 | # 파일을 open 할 때, encoding(인코딩)인자를 추가하면, 인코딩을 utf-8(한글지원)등으로 지정할 수 있다. 6 | file.writelines(lines) 7 | 8 | """파일(file) 문자열 여러개 읽고 쓰기 9 | 반복문과 .write()를 활용해서 문자열을 여러줄도 쓸 수 있다. (개행문자 '\n'가 필수) 10 | 하지만 간편하게 .writelines()를 활용해서 문자열 여러개를 한번에 입력할 수 있다. (마찬가지로 줄을 바꿀때 개행문자 필수) 11 | 12 | 대신 두 방법의 특징은, 개행문자를 넣지 않으면, 텍스트가 한줄로 붙여서 저장된다. 유의. 13 | """ 14 | 15 | with open('19.txt', 'r', encoding="utf-8") as file: 16 | # encoding 인자를 넣어서 txt 파일을 작성했으면, 읽을때도 필요하다. 없으면 에러남. 17 | line = None # line 초기화 18 | while line != '': # 읽어온 값이 ''(더이상 문자열이 없음)이 아닐때까지 반복 19 | line = file.readline() 20 | print(line.strip('\n')) 21 | # 여기서 .strip()함수는 별게 아니고, 문자열 메쏘드로 \n(개행문자)를 삭제하는 역할 22 | """ 23 | .readline() 메쏘드를 쓴다면, 문자열을 한 줄씩 순서대로 읽을 수 있다. 24 | 근데 for 반복문으로 똑같이 파일의 내용을 읽을 수 있음, 파일 객체를 for 문의 반복가능한 객체로 넣는 것, 25 | 26 | 참고로 이외에도 파이썬 파일 메쏘드는 많으며, c언어랑 비슷함. 27 | 참고 : https://simplesolace.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC-python-%ED%8C%8C%EC%9D%BC 28 | """ 29 | with open('19.txt', 'r', encoding="utf-8") as file: 30 | for line in file: 31 | print(line.strip('\n')) 32 | 33 | """피클링(pickling), 언피클링(unpickling) 34 | 파이썬은 파이썬 객체를 파일에 저장하는 pickle(피클) 모듈을 제공. 35 | 파이썬 객체를 파일로 저장하는 것을 피클링, 파일에서 파이썬 객체를 읽는 것이 언피클링이라 함. 36 | 37 | .dump()메쏘드를 사용해서 피클링을 할 수 있고, 38 | (.dump(객체, 파일객체) 형식) 39 | .load()메쏘드를 사용해서 언피클링을 할 수 있음. (객체를 반환) 40 | (.dump(파일객체) 형식) 41 | 42 | 파일이름의 확장자는 자유롭게 해도 상관 없으나, 피클링, 언피클링할 때 b(바이너라)파일 형식으로 해야함. 43 | 따라서 파일모드에 b를 붙여줘야 함. 44 | 45 | 피클링 했던 순서대로 언피클링도 이루어지며, (첫번째로 객체1을 피클링 했으면, 첫번째 언피클링때 객체1를 불러올수 있음) 46 | 피클링 횟수 만큼 언피클링 해야함. 47 | """ 48 | word = "삼겹살" 49 | price = {'300g': 5000, '600g': 10000} 50 | with open('pickle.ppap', 'wb') as f: 51 | pickle.dump(word, f) 52 | pickle.dump(price, f) 53 | 54 | with open('pickle.ppap', 'rb') as f: 55 | w = pickle.load(f) 56 | p = pickle.load(f) 57 | print(w, p) 58 | -------------------------------------------------------------------------------- /1_ 파이썬의 기본문법/1-7_ 함수(심화)/1-재귀함수.py: -------------------------------------------------------------------------------- 1 | def factorial(a): 2 | if a == 1: 3 | return 1 4 | return a * factorial(a-1) 5 | 6 | 7 | f = int(input("입력값 : ")) 8 | pr = factorial(f) 9 | print(pr) 10 | 11 | """ 재귀함수(recursive call) : 12 | 함수안에서 스스로(함수)를 다시 호출하는 것. (return 이 되지 않는 한 무한반복(호출)) 13 | 14 | 파이썬에서 재귀함수의 최대횟수는 기본적으로 1000 임. 15 | 넘어설경우 RecursionError 에러 발생. (sys 모듈의 setrecursionlimtit(재귀함수 최대호출횟수)함수로 최댓값을 변경해줄 수 있음) 16 | 17 | 따라서 재귀함수를 무한반복 하기 싫다면, 멈추고 싶은 조건을 걸어서 그조건에 함수가 return 하게 만들어야함. 18 | 참고로 return 시 함수가 호출됬던 바로 그 위치로 돌아온다. 19 | (함수가 종료되는 것은 중간에 return 됬거나 or 함수의 마지막 실행문까지 실행이 끝난 후) 20 | ex> 21 | def func(a): 22 | func(a-1) 23 | print(a) 24 | if a is 0: 25 | return 26 | 27 | 28 | 이라는 재귀함수 func()에서 29 | 30 | func(5)의 실행결과는, 31 | 1 32 | 2 33 | 3 34 | 4 35 | 5 36 | 가 될것임. 37 | 38 | """ 39 | -------------------------------------------------------------------------------- /1_ 파이썬의 기본문법/1-7_ 함수(심화)/2-1-람다표현식.py: -------------------------------------------------------------------------------- 1 | i = list(filter(lambda x: x > 0, range(-10, 11))) 2 | print(i) 3 | 4 | """람다표현식(lambda expression): 5 | 람다표현식으로 이름없는 익명의 함수(Anonymous function)를 만들수 있음. 1줄로 선언함. 6 | 형식은 7 | lambda 매개변수들: 반환식 8 | ( 9 | 일반 함수로 변환할 시 10 | def <함수이름, 람다에서만 생략됨>(매개변수들): 11 | return 반환식 12 | ) 13 | 과 같음. (매개변수들은 생략 가능하나 반환식은 필수) 14 | ( * 람다 함수에선 함수안의 변수를 선언할 수 없음) 15 | 16 | 이걸로 17 | 함수이름 = lambda 매개변수들: 반환식 18 | 과 같이 해서 함수를 변수에 할당 할 수 있고, 19 | 함수이름(인자값) 과 같이 다른 함수처럼 호출 할 수 있음. 20 | 21 | 아니면 22 | (lambda 매개변수들: 반환식)(인자값) 23 | 과 같이 람다 표현식 자체를 (함수처럼)호출 할 수도 있음. 24 | 25 | 아니면 인수[1]로 람다표현식을 써서 26 | 함수(람다표현식, 다른인자값) 27 | 과 같이 활용 가능. 28 | (대표적인 ex> map 함수, 29 | map(lambda 매개변수들: 반환식, 연속되는값) 30 | ) 31 | 그외에도 reduce, filter 등과 활용가능 (크롤링 함수(find)에서도 활용) 32 | 33 | [1] : 인수 (변수인데 함수에서 쓰이는 변수) = 파라미터(Parameter) 34 | + 실인수(= 실매개변수 = 전달인자 = Argument = 인자) : 가인수(= 형식매개변수 = 매개변수 = Parameter = 인수) 35 | """ 36 | -------------------------------------------------------------------------------- /1_ 파이썬의 기본문법/1-7_ 함수(심화)/2-2-람다표현식응용.py: -------------------------------------------------------------------------------- 1 | proto_li = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 2 | a = list(map(lambda x: x+1, proto_li)) 3 | print(a) 4 | """ 람다표현식응용: 5 | map 함수의 인자로 람다 표현식을 사용한다면, 6 | map 함수 자체가 두번째 인자값으로 받은 반복가능한 객체를 7 | 첫번째 인자값의 형식으로 각각의 요소들을 변환해서 map 객체로 반환하는데, (2폴터 1 참고) 8 | 9 | 첫번째 인자값으로 람다 표현식을 사용한다면, 인자값으로 전달받은 리스트의 요소하나하나를 각각 람다표현식으로 변환할 수 있다. 10 | 11 | 그리고 2>1에서 배웠듯이 map 함수에 변환할 값(반복가능한 객체)를 여러개 넣을 수도 있다. (주로 람다 표현식과 응용한다.) 12 | """ 13 | 14 | i = list(map(lambda x: "박수" if x % 3 == 0 else x, proto_li)) 15 | # 각각의 요소들을 람다표현식으로 변환하는데, 람다표현식에서 조건식을 넣어서 3의 배수면 '박수' 아니면 숫자를 출력 16 | print(i) 17 | """ 18 | 람다 표현식에서 조건문을 넣을 수 있다. 파이썬의 삼항연산자를 이용한다. 19 | 물론 삼항연산자를 중복해서도 사용할 수 있지만, 원만해선 가독성이 별로라서 안쓴다. 20 | """ 21 | 22 | i = list(filter(lambda x: x % 3 == 0, range(1, 21))) 23 | print(i) 24 | """ 25 | filter 함수와 응용할 수 있다. filter(함수, 반복가능한 객체)는 map()함수와 비슷한데, 26 | 필터라는 이름대로 첫번째인자에서 함수의 반환값이 True 일때(반환 조건을 만족하는 요소)에 속하는 요소들만 묶어서 filter 객체로 반환한다. 27 | 반복하는 객체중에서 조건에 만족하는 요소들만 가져오고, 만족하지 않는 요소들은 걸러내는 함수다. 28 | 29 | 여기서 함수 인자에 람다 표현식을 사용할 수 있으며, 마찬가지로 람다 표현식의 반환 값에 만족하는 요소만 가져와서 filter 객체로 반환한다. 30 | """ 31 | 32 | l = [1, 2, 3, 4] 33 | from functools import reduce # 파이썬 3부터는 reduce 는 내장함수가 아니라서, functools 모듈에서 가져와야 된다. 34 | print(reduce(lambda x, y: x*y, l)) 35 | """ 36 | reduce 함수와도 응용할 수 있다. reduce(함수, 반복가능한 객체)는 얼핏 다른 함수와도 비슷한데, 37 | 반복가능한 객체의 모든 요소를 첫번째 인자로 받는 함수의 매개변수들로 대입해서, 결국 모든 요소를 매개변수로 넣었을 때 누적되는 값을 반환한다. 38 | 39 | ex) reduce(lambda x, y: x+y, [1, 2, 3,]) 같은 경우에선 40 | [1, 2, 3]을 lambad x, y로 받아서 x+y로 반환하니까 , 41 | (1 + 2)+ 3 의 결과가 된다. (반복문 처럼 반복가능한 객체의 모든 요소를 누적 할 때 까지 반복한다.) 42 | 추가로 세번째 인자값으로 누적되는 값의 초깃값을 지정할 수 있다. (기본값은 0) 43 | 44 | (솔직히 반복문으로 나타내는것이 보기에 좋다) 45 | """ 46 | 47 | # 팩트는. 48 | # map, filter와 람다표현식을 응용 하는 것보다, 리스트 내포(표현식)을 응욯하는 것이 더 빠르고, 가독성도 좋다(상위호환) 49 | # 그리고 reduce 보다 for, while 반복문을 응용하는 것이 가독성에 좋다,(reduce 함수는 복잡해지기만 해도 가독성이 맣이 떨어진다) 50 | -------------------------------------------------------------------------------- /1_ 파이썬의 기본문법/1-7_ 함수(심화)/3-지역변수,전역변수,global,네임스페이스.py: -------------------------------------------------------------------------------- 1 | x = 10 # 여기서 x는 전역변수(파이썬 스크립트(파일) 어디서든지 접근할 수 있음) 2 | 3 | 4 | def func(): 5 | y = 20 # 여기서 y는 지역변수(변수를 선언한 함수에서만 접근할 수 있고, 함수 바깥에서는 접근할 수 없음) 6 | print(x, y) 7 | 8 | 9 | func() 10 | print(x) 11 | """ 지역변수(local variable), 전역변수(global variable): 12 | 전역변수는 일반적으로 파이썬 스크립트에서 변수를 만들었을 때 해당되며, 13 | 함수 안에서도 함수 바깥에서도 어디든지 사용할 수 있음. (물론 변수 선언 전에선 사용할 수 없음) 14 | 15 | 이런 전역변수에 접근할 수 있는 범위를 전역 범위(global scope)라고 함. 16 | 17 | 18 | 지역변수는 함수 안에서 변수를 만들었을 때 해당되며, 19 | 만든 지역변수는, 변수를 만든 함수의 지역변수로, 그 함수에서만 접근 할 수 있고, 함수 바깥에선 사용할 수 없음. 20 | 21 | 마찬가지로 지역변수에 접근할 수 있는 범위를 지역 범위(local scope)라고 함. 22 | 23 | 24 | 참고로 지역변수와 전역변수 둘다 같은 이름일 수도 있는데, 그럴경우, 해당함수에선 지역변수가 우선임. 25 | 함수 안에선 전역변수를 읽고 참조하기만 할 뿐 전역변수의 값을 변경할 수 없음. 26 | 함수 안에서 전역변수를 변경하려면 global 키워드를 사용함. 27 | """ 28 | n = 10 29 | 30 | 31 | def n_func(): 32 | global n 33 | n += 10 34 | 35 | 36 | n_func() 37 | print(n) 38 | """ 39 | 함수 안에서 40 | global 전역변수 41 | 를 붙이면 해당 전역변수를 함수안에서 사용할 수 있음. 42 | """ 43 | # 참고로 이럴때 함수안에서 사용하는 전역변수는 프리변수(free variable)이라고 함. 44 | # 프리변수는 어떤 코드블럭 안에서 사용은 됬는데, 그 코드블럭 안에서 정의되지는 않은 변수를 말함. 45 | 46 | 47 | def m_func(): 48 | global m 49 | m = 10 50 | 51 | 52 | m_func() 53 | print(m) 54 | """ 55 | 해당 전역변수가 없다면, global 에서 붙인 변수이름을 가지고 새로운 전역변수를 선언함. 56 | (대신에 함수를 호출해야만 해당 전역변수가 선언됨.) 57 | """ 58 | print(locals()) 59 | 60 | 61 | def f(): 62 | f1, f2 = 1, 2 63 | print(locals()) 64 | 65 | 66 | f() 67 | """ 네임스페이스(namespace): 68 | 파이썬에서 변수는 네임스페이스(이름을 모아놓은 공간)에 저장되며, locals 함수를 이용해서 현재 네임스페이스를 반환할 수 있음. 69 | 함수 바깥 뿐만아니라, 함수안에서도 locals 함수를 사용할 수 있으며, 그럴시 지역범위에서의 네임스페이스를 반환함. 70 | (지역 네임스페이스를 반환함) 71 | """ -------------------------------------------------------------------------------- /1_ 파이썬의 기본문법/1-7_ 함수(심화)/4-함수중첩,지역변수구분,nonlocal.py: -------------------------------------------------------------------------------- 1 | def func1(): 2 | word = "외부 함수" 3 | print(word) 4 | 5 | def func2(): 6 | print(word, "가 호출한 내부 함수", sep='') 7 | func2() 8 | 9 | 10 | func1() 11 | """ 함수에서 함수 정의(함수 중첩): 12 | 함수안에서 함수도 만들수 있으며, 이때 외부함수에서 만든 지역함수는 내부함수에서도 사용할 수 있다. 13 | 외부함수의 지역 범위는 외부함수의 시작부터 끝이며, 외부함수에서 정의하고 호출한 내부함수도 범위 내에 속한다. 14 | (간단히, 함수의 지역변수는, 그안에서 정의한 모든 함수에서 접근할 수 있음) 15 | """ 16 | 17 | 18 | def func1(): 19 | x = 1 20 | 21 | def func2(): 22 | x = 10 23 | print(x) 24 | func2() 25 | print(x) 26 | 27 | 28 | func1() 29 | """ 30 | 내부함수에서 외부함수 지역변수의 값을 수정할 수 없음, 시도하면 외부함수 지역변수와는 이름만 같은 내부함수의 지역변수를 만듬. 31 | (함수에서 변수를 선언하면 현재 함수의 지역변수가 됨) 32 | 33 | 그래서 내부함수에서 외부함수의 지역변수를 수정하려면, nonlocal 키워드를 사용해야 함. 34 | nonlocal 지역변수 35 | 에서 nonlocal 의 의미는 오른쪽에 적힌 지역변수가 현재 함수의 지역변수가 아니라는 것을 의미함. 36 | """ 37 | 38 | 39 | def A(): 40 | """x, y 모두 A의 지역변수로 선언 됬다.""" 41 | x = 10 42 | y = 100 43 | 44 | def B(): 45 | """x 가 B의 지역변수로 선언됬다.""" 46 | x = 20 47 | 48 | def C(): 49 | nonlocal x 50 | # 이때 x는 A함수, B함수 에서 같은 지역변수가 있지만, 가까운 함수우선으로, B 함수의 지역변수를 불러온다. 51 | nonlocal y 52 | # y는 A함수 에서는 같은 이름의 지역변수가 없고, A함수 에만 있기에 A함수의 지역변수를 불러온다. 53 | print(x, y) 54 | 55 | C() 56 | 57 | B() 58 | 59 | 60 | A() 61 | """ 62 | nonlocal 은 현재함수 바깥에 있는 지역변수를 찾을 때 가장 가까운 함수 우선으로 불러옴. 63 | 64 | 참고로 함수가 여러단계 중첩되도, global 키워드는 항상 전역변수를 사용함. (지역변수는 모두 무시) 65 | 66 | ** 전역변수를 global 로 접근하는 대신 함수의 매개변수, 반환값을 이용하는 것이 좋음(권장함) 67 | ** 나중에 코드가 복잡해질때 global 이 있으면, 변수 값이 어디서 바뀌는지 알기 어려워짐. 68 | """ -------------------------------------------------------------------------------- /1_ 파이썬의 기본문법/1-8_ 모듈,패키지,라이브러리/1-모듈,패키지,라이브러리.py: -------------------------------------------------------------------------------- 1 | summary = """ 2 | 모듈 vs 패키지 vs 라이브러리: 3 | 파이썬에서 볼수 있는 개념들로, 서로 비슷하면서도 차이가 있다. 4 | 5 | * 모듈(module): 6 | 특정 기능을 .py 파일 단위로 작성한 것. 7 | (함수, 변수, 클래스 같은 것들이 모여있는 파일) 8 | 9 | 파이썬이 제공하는 모듈 -> 표준 모듈 10 | 설치해서 사용하는 모듈 -> 서드파티 모듈 11 | 사용자가 만들어쓰는 모듈 -> 사용자 생성 모듈 12 | 13 | 14 | * 패키지(package): 15 | 모듈을 묶은 것(관련된 기능끼리). 16 | 디렉토리(패키지)가 다른 디렉토리(모듈)을 포함하는 형태로 구조화함. 17 | 18 | 패키지이름.모듈이름 19 | 형식으로 사용함. 20 | 패키지는 모듈마다에 네임스페이스(namespace)를 제공. 21 | 22 | 파이썬 패키지 인덱스(Python Package Index, PyPI)를 통해 인터넷의 다양한 패키지를 설치후 사용 가능. 23 | 파이썬 패키지 인덱스는 파이썬 패키지들이 모여있는 저장소로, 24 | 2020-4-19일 기준, 229,009 projects(프로젝트)와 1,784,025 releases(릴리즈(=버전)) 가 있음. 25 | (링크 : https://pypi.org/ ) 26 | 27 | 28 | * 라이브러리(library): 29 | 모듈과 패키지를 묶어놓은 것. 30 | 31 | 파이썬의 기본 모듈, 패키지, 내장함수등 -> 파이썬 표준 라이브러리(Python Standard Library, PSL) 32 | """ 33 | print(summary) 34 | 35 | """ 라이브러리 vs 프레임워크: 36 | 라이브러리(library) : 개발할 때 필요한 부속품 (가져다 쓰는 것) 37 | 프레임워크(framework) : 개발할 때 짜여진 기본틀 (이 위에 뭘 덧붙여 만드는 것) 38 | """ -------------------------------------------------------------------------------- /1_ 파이썬의 기본문법/1-8_ 모듈,패키지,라이브러리/2-0-패키지설치.py: -------------------------------------------------------------------------------- 1 | summary = """ 2 | 파이썬 패키지 인덱스에서 패키지 설치하기: 3 | 4 | (방법도 종류가 있는데, 파이참 Settings > Project: (프로젝트이름) > Project Interpreter 에서 설치하거나, 5 | 명령 프롬프트(콘솔, 터미널)에서 설치하는 방법이 있다. 여기선 명령 프롬프트로 설치하는 법에 대해 알아본다.) 6 | 7 | 우선 pip(파이썬 패키지 인덱스의 패키지 관리 명령어)를 설치해야 한다. 8 | 윈도우용 파이썬은 기본적으로 깔려있기에 할 필요 없고, 리눅스, macOS 에서만 pip 를 따로 설치해야 한다. 9 | $ curl -O https://bootstrap.pypa.io/get-pip.py 10 | $ sudo python3 get-pip.py 11 | 위 명령어를 콘솔(터미널)에 치면 되는데, 만약 curl 도 설치되있지 않으면, 12 | 우분투 : $ sudo apt-get install curl 13 | CentOS : $ sudo yum install curl 14 | 같은 방법으로 설치한다. 15 | 16 | 17 | 그리고, 18 | $ pip install 패키지이름 19 | 으로 원하는 패키지를 설치하면 된다. (윈도우는 명령 프롬포트에서, 리눅스, 맥에서는 콘솔(터미널)에서) 20 | 21 | 22 | 마지막으로 다른 패키지 처럼 23 | 파이썬 스크립트 안에서 install 패키지 24 | 형식등으로 설치한 패키지를 가져와서 사용하면 된다. 25 | 26 | 27 | 참고로 파이썬 버전이 2와 3모두 깔려 있다면, (보통 리눅스와 macOS 는 같이 깔려있음.) 28 | python2(python) 에서는 pip2(아니면 pip)로 명령을 사용하고, 29 | python3(python3) 에서는 pip3(아니면 pip)로 명령을 사용한다. 30 | (파이썬 3만 깔려있으면 pip 가 파이썬 3 용 명령으로 쓰임.) 31 | 32 | 33 | * pip 에 대한 추가 명령어 34 | $ pip search 패키지 -> 패키지 검색 35 | $ pip install 패키지==버전 -> 패키지를 특정 버전으로 설치 36 | $ pip list 아니면 $ pip freeze -> 패키지 목록 출력 37 | $ pip uninstall 패키지 -> 패키지 삭제 38 | """ 39 | print(summary) -------------------------------------------------------------------------------- /1_ 파이썬의 기본문법/1-8_ 모듈,패키지,라이브러리/2-1-모듈가져오기.py: -------------------------------------------------------------------------------- 1 | import pprint # pprint 모듈을 가져옴 2 | 3 | pprint.pprint('haha') # 모듈명.함수() 로 모듈에 있는 함수를 사용 4 | # 참고로 import 문은 코드 중간에 사용해도 된다. 모듈과 패키지를 사용하기 이전에서라면 어디든지 사용가능 5 | """ 모듈(module) 가져오기: 6 | 파이썬의 내장함수(built-in function)(ex> input, print)에서 넘어서서 7 | 복잡한 프로그램을 만들기 위해 모듈과 패키지를 불러올 수 있는데, 이때 import 키워드를 사용한다. 8 | 9 | import 모듈 10 | import 모듈1, 모듈2, ... 11 | 으로 모듈을 사용하기 전에 가져온 다음, 12 | 13 | 모듈.변수 14 | 모듈.함수() 15 | 모듈.클래스() 16 | 으로 모듈에 있는 객체들을 활용할 수 있다. 17 | 18 | 19 | import 모듈 as 이름 20 | 으로 모듈명을 그대로 입력하지 않고, 모듈명을 다른 이름으로 대체할 수도 있으며, 이럴땐 21 | 22 | 이름.변수 이름.함수() 23 | 등등 as 에서 정해준 모듈의 이름으로 모듈명 대신 사용할 수 있다. 24 | 25 | 26 | from 모듈 import 변수 27 | from 모듈 import 함수 28 | from 모듈 import 클래스 29 | 등으로 모듈 전체를 가져오는 것이 아니라, 모듈의 일부만 가져올 수 있다. 30 | 이럴때는 모듈. 을 앞에 붙일 필요 없이 31 | 변수 함수() 클래스() 32 | 로 바로 활용 할 수 있다. 33 | 34 | from 모듈 import 변수, 함수, 클래스 35 | 으로 여러개를 가져올 수도 있고, 36 | 37 | from 모듈 import * 38 | 으로 모두 가져올 수도 있다. (이러면 앞에 모듈. 을 붙일 필요 없이 모듈의 모든 객체를 사용할 수 있다.) 39 | 그리고, 40 | 41 | from 모듈 import 변수 as 이름 42 | from 모듈 import 변수 as 이름1, 함수 as 이름2, 클래스 as 이름3 43 | 처럼 여기서도 as 문을 활용해서 가져온 객체를 원하는 이름으로 지정해 사용할 수 있다. 44 | """ -------------------------------------------------------------------------------- /1_ 파이썬의 기본문법/1-8_ 모듈,패키지,라이브러리/2-2-패키지가져오기.py: -------------------------------------------------------------------------------- 1 | from urllib import request 2 | 3 | response = request.urlopen('https://dojang.io/mod/page/view.php?id=2442') 4 | """ 패키지 가져오기: 5 | 마찬가지로 패키지와 그 안의 모듈도 import 로 가져옴. 6 | 7 | import 패키지.모듈 8 | 과 같으며, as from import 문도 동일하게 사용가능, 9 | 10 | 추가로는, 11 | from 패키지 import 모듈 12 | from 패키지.모듈 import 객체 13 | 와 같은 형식도 사용가능. 14 | 15 | (from 상위요소 import 하위요소 16 | 라는 형식만 지키면, 왠만한건 되는듯.) 17 | """ -------------------------------------------------------------------------------- /1_ 파이썬의 기본문법/1-8_ 모듈,패키지,라이브러리/3-0-if __name__=='__main__',프로그램시작점.py: -------------------------------------------------------------------------------- 1 | if __name__ == '__main__': # 위 조건식은 현재 스크립트 파일이 프로그램의 시작점일 때만 참이 됨. 2 | print("여기가 프로그램의 시작점 입니다.") 3 | """ 4 | 인터넷에서 보면 위같은 코드를 자주 사용하는데 왜 쓸까? 5 | 6 | 사실 위 코드는 현재 스크립트 파일이 어디서 실행되는지 파악하기 위에 사욯한다. 7 | 8 | 현재 실행되는 메인 스크립트 파일에서 __name__ 변수에는 '__main__' 이 들어간다. 9 | 대신에 다른곳에서 모듈로 불려서 사용되는 스크립트 파일에서는 __name__ 변수에 모듈 자기자신의 이름이 들어간다. 10 | 11 | 그래서 이걸로 파이썬 코드가 실행될 때, 12 | 여러 스크립트 중에서 누가 메인 프로그램(프로그램의 시작점)인지, 누가 모듈인지 알 수 있는 것이다. 13 | 14 | 15 | 사실 이런 것을 사용하는 이유는, 파이썬에서 프로그램의 시작점이 항상 정해져 있지 않기 때문이다. 16 | 파이썬은 리눅스,유닉스에서 사용하는 스크립트 언어 기반으로 처음 개발되었기에, 프로그램의 시작점이 따로 없었는데, 17 | 그 이유는 리눅스,유닉스의 스크립트 파일은 파일 1개로 이뤄진 경우가 대부분이 였기 때문이다. 18 | (이와 다르게 C, java 같은 언어는 여러 소스 파일의 함수들 중에서 main() 함수(시작 함수)가 따로 지정되어 있어서 19 | 프로그램의 시작점이 항상 main() 으로 정해져 있다.) 20 | """ -------------------------------------------------------------------------------- /1_ 파이썬의 기본문법/1-8_ 모듈,패키지,라이브러리/3-1-모듈만들기.py: -------------------------------------------------------------------------------- 1 | import hi_module 2 | 3 | print(hi_module.hi) # hi_module 의 변수 hi 를 사용 4 | hi_module.hello() # hi_nodule 의 함수 hello() 를 사용 5 | h = hi_module.Hey() # hi_module 의 클래스 Hey() 를 사용(인스턴스 생성) 6 | 7 | h.hey() # hi_module 의 Hey() 클래스 메쏘드 hey() 를 사용 8 | print(h.ha) # hi_module 의 Hey() 클래스 속성 ha 를 사용 9 | """ 10 | 사용자가 직접 모듈을 만든다면, 간단하게 .py 로 끝나는 파일을 저장한 후, 다른 곳에서 11 | 12 | import 파일이름 13 | 으로 그 파일을 모듈로써 가져올 수 있다. 14 | 그러면 그 모듈(파일)의 변수, 함수, 클래스 같은 것들을 모듈처럼 사용할 수 있는 것이다. 15 | (모듈을 가져와 사용하는 것에 대해서는 #2-1, 모듈 가져오기 의 내용과 동일하다.) 16 | """ 17 | -------------------------------------------------------------------------------- /1_ 파이썬의 기본문법/1-8_ 모듈,패키지,라이브러리/3-2-패키지만들기.py: -------------------------------------------------------------------------------- 1 | summary = """ 2 | 패키지 만들기: 3 | 패키지는 모듈로 구성되어 있는 구조이기에, 패키지를 만들 때 4 | 패키지 이름을 폴더로, 폴더안에 모듈들을 .py 파일로 만들면 된다. 5 | (파이썬 3.3 이전에서는 패키지 폴더 안에 __init__.py 파일이 있어야 폴더를 패키지로 인식한다. 6 | 파이썬 3.3 이상부터는 __init__.py 파일이 폴더에 없어도 인식하지만, 7 | 하위버전에도 호환될 수 있게 __init__.py 파일을 작성하는 것이 권장된다.) (__init__.py 는 기본적으로 비워둘 수 있다.) 8 | 9 | ex> 10 | 패키지이름 11 | - __init__.py 12 | - 모듈이름.py 13 | - 모듈2이름.py 14 | - 모듈3이름.py 15 | ...... 16 | 17 | 이런 패키지를 가져오는 메인스크립트는 18 | 19 | import 패키지.모듈 20 | 등과 같이 가져오면 된다. (추가로는 #2-2. 패키지 가져오기 참고) 21 | 22 | 참고로 패키지의 모듈은 일반 모듈과 다르게 23 | __name__ 변수에서 '모듈이름' 이 저장되지 않고, '패키지이름.모듈이름' 이 저장된다. 24 | """ 25 | # 아래는 패키지 from import 응용 26 | """ 27 | 패키지 안의 모듈에서 다른 모듈을 참조할 때, 28 | 29 | from . import 모듈 30 | 로 같은 패키지의 다른 모듈을 가져올 수 있다. 31 | 이때 .(점)은 현재 패키지 라는 뜻이다. 32 | 33 | 이 .을 활용해서 34 | 35 | from .모듈 import 변수(, 함수, 클래스) 36 | 로 같은 패키지의 모듈에 있는 변수(, 함수, 클래스)를 가져올 수 있다. 37 | 38 | from .모듈 import * 39 | 과 같다면 모듈의 모든 객체(변수, 함수, 클래스)를 가져올 수 있다. 40 | 41 | 42 | 이것으로 모듈에서 다른 모듈의 객체를 활용할 때 사용할 수도 있지만, 43 | 메인 스크립트에서 패키지의 모든 변수, 함수, 클래스를 가져오게 할 수도 있다. 44 | 45 | 바로 패키지의 __init__.py 파일에서 46 | 원하는 모듈들의 변수, 함수, 클래스를 가져오게 하면, (ex> from .모듈 import 변수,함수,클래스 또는 from .모듈 import *) 47 | 48 | 나중에 패키지를 가져올 때, 모듈을 거치지 않고 그 모듈의 변수, 함수, 클래스를 이용할 수 있게 된다. 49 | 50 | 패키지.변수 51 | 패키지.함수() 52 | 패키지.클래스() 53 | 와 같이 모듈을 따로 거치지 않고 패키지로 패키지의 모듈 변수, 함수, 클래스를 접근할 수 있는 것이다. 54 | """ 55 | -------------------------------------------------------------------------------- /1_ 파이썬의 기본문법/1-8_ 모듈,패키지,라이브러리/3-3-__all__,하위패키지,패키지와모듈독스트링.py: -------------------------------------------------------------------------------- 1 | """ 2 | from .모듈 import * 으로 해당 모듈의 모든 변수, 함수, 클래스를 가져올 수 있는데 3 | 패키지 외부에 공개하기 싶은 것 까지 공개하게 되는 단점이 있다. 4 | 여기서 패키지에서 공개할 변수, 함수, 클래스를 from import 문 앞에 __all__ 를 선언해서 리스트 형식으로 담아주면 된다. 5 | __all__ = ['사용할', '것들'] 6 | __all__ 은 이름 그대로 모든것을 *으로 가져갈 때의 가져갈 목록을 정할 수 있다. 7 | 8 | 파이썬에선 추가로 패키지 안에 하위 패키지를 만들 수 있다. 9 | 구현하는 법은 패키지 폴더안에 새 폴더를 만들고 거기에 모듈과 __init__.py 를 넣으면 하위 패키지가 도니다. 10 | import 패키지.하위패키지.모듈 11 | 과 같이 하위패키지의 모듈도 가져올 수 있으며, 상위패키지의 모듈에서 하위패키지의 모듈을 가져올 때 12 | import .하위패키지.모듈 from * 13 | 과 같이 하지만, 반대로 하위패키지 모듈에서 상위패키지 모듈을 가져올 때는 14 | import ..상위패키지.모듈 15 | import ..상위모듈 16 | 과 같이 ..(상위 폴더를 의미) 을 이용한다. (.이 한개씩 더 붙을 수록 더 상위 폴더로 올라간다. 17 | 18 | 추가로 모듈과 패키지에도 독스트링을 넣을 수 있다. 19 | 모듈 파일에 첫줄에 기존 독스트링 형식(""" """)으로 문자열을 넣거나, 20 | 패키지 파일의 __init__.py 파일 첫줄에 독스트링 형식으로 문자열을 넣으면 된다. 21 | 22 | 이럴 경우, 23 | 모듈.__doc__ 24 | 패키지.__doc__ 25 | 로 모듈과 패키지의 독스트링을 반환할 수 있다. 26 | """ -------------------------------------------------------------------------------- /2_ 파이썬의 코어문법/2-2_ 클래스, 객체(기초)/1-클래스,객체,인스턴스.py: -------------------------------------------------------------------------------- 1 | # 클래스(Class) 2 | class ClassName: 3 | pass # pass 키워드를 사용해서 빈 클래스를 생성 할 수 있다. 4 | 5 | 6 | """ 클래스(Class): 7 | 클래스(class)란 객체를 표현하기 위한 문법으로, 객체를 찍어내는 틀과 같다. 8 | 객체(object)는 특정한 개념이나 모양으로 존재하는 것이며, 프로그래밍으로 클래스를 통해서 만들수 있다. 9 | 10 | 파이썬에서처럼 클래스와 객체로 객체를 프로그래밍할는 것을 객체지향(object oriented)프로그래밍 이라 말한다. 11 | (프로그래밍의 복잡한 문제를 잘게 나누어 객체로 만들고, 그러한 객체들을 조합해서 문제를 해결함) 12 | 13 | 클래스는 14 | 15 | class 클래스이름: 16 | 과 같이 만들며, 클래스이름의 규칙은 변수와 같다. (보통 클래스이름의 스타일로 맨앞은 대문자를 사용한다) 17 | 클래스 안에서는 속성(attribute)과 메쏘드(method)가 들어가는데, 각각 클래스안에서 쓰이는 변수와 함수다. 18 | 19 | 클래스가 객체를 표현하는 문법, 형태이고, 클래스를 구현한 것이 객체라 했는데, 인스턴스(instance)라는 표현도 사용한다. 20 | 인스턴스는 객체와 같은 의미지만, 객체만 말할땐 객체라고 쓰고, 클래스랑 연관지어 말할 땐 인스턴스라 표현한다. 21 | 22 | 23 | 참고로 지금까지 배웠던 자료형(int, list, dict)으로 표현되는 값들은 모두 객체(자료형 클래스의 인스턴스)에 속한다. 24 | 그래서 자료형마다의 메쏘드가 있었고, 속성도 있었던 것이다. 25 | (type()함수로 인자값이 어떤 클래스인지 반환하는데, 자료형객체를 넣으면 자료형 클래스를 반환) 26 | 27 | 클래스를 통해서 인스턴스를 생성할 때는 28 | """ 29 | 30 | temp = ClassName() # 인스턴스 = 클래스() 식으로 인스턴스를 생성 31 | 32 | print(isinstance(temp, ClassName)) # ininstance(인스턴스, 클래스)로 인스턴스가 클래스에 속하는지 반환값을 출력 33 | """ 34 | 인스턴스이름 = 클래스이름() 35 | 과 같은 형식으로 인스턴스(객체)를 생성한다. 클래스는 개념을 표현(정의)하는 것 뿐이지, 실제로 클래스를 사용하려면 36 | 위같이 인스턴스를 생성해야한다. 37 | 38 | 참고로 특정 클래스의 인스턴스인지 확인하려면 isinstance() 함수를 이용해서 판별할 수 있다. 39 | isinstance(인스턴스, 클래스)와 같이 인자값을 넘기면, 맞을때 True, 다른 클래스의 인스턴스면 False를 반환한다. 40 | """ -------------------------------------------------------------------------------- /2_ 파이썬의 코어문법/2-2_ 클래스, 객체(기초)/3-생성자,소멸자.py: -------------------------------------------------------------------------------- 1 | class Car: 2 | def __init__(self, speed, color, model): 3 | print("생성자 호출") 4 | self.speed = speed 5 | self.color = color 6 | self.model = model 7 | 8 | def drive(self): 9 | self.speed = 60 10 | 11 | def __del__(self): 12 | print("소멸자 호출") 13 | 14 | 15 | myCar = Car(0, 'blue', 'Sonata') 16 | print(f"자동차의 속도는 {myCar.speed}km/h") 17 | print(f"자동차의 색상은 {myCar.color}") 18 | print(f"자동차의 모델은 {myCar.model}") 19 | myCar.drive() 20 | print(f"자동차의 속도가 올라서 현재는 {myCar.speed}km/h 입니다.") 21 | 22 | 23 | """ 생성자(constructor), 소멸자(destructor): 24 | 생성자는 클래스의 인스턴스(객체)를 생성할 때 파이썬에서 자동으로 호출되는 함수다. 25 | 객체를 생성하면서 초기화 작업을 바로 생성자 안에서 할 수 있으며, 문법은 26 | 27 | def __init__(self): 28 | 코드 29 | 30 | 와 같다. __init__ 의 매개변수를 추가해서, 객체를 생성할 때 인자값을 전달 받을 수 있다. 31 | 생성자에서 인스턴스 속성들을 생성하게 되는데, 생성하는 속성들의 값을 전달받은 인자값으로 처리해 줄수도 있다. (위 코드 참고) 32 | 33 | 소멸자는 반대로 클래스의 인스턴스(객체)가 소멸될 때 파이썬에서 자동으로 호출되는 함수다. 34 | del 인스턴스 와 같이 인스턴스를 소멸시키거나, 프로그램이 끝나서 자동으로 인스턴스가 소멸되는 때에 자동으로 호출되며. 35 | 36 | def __del__(self): 37 | 코드 38 | 39 | 와 같은 문법이다. 생성자와 소멸자 모두 __가 메쏘드 앞뒤에 붙게 되는데, 이러한 메쏘드들을 스페셜 메쏘드, 매직 메쏘드라 한다. 40 | 41 | """ 42 | # (스페셜 메쏘드, 매직 메쏘드에는 이것말고도 많은 메쏘드가 있으며, 파이썬에서 중요한 문법중 하나다. 이부분에 대해서는 다음 파일 참고.) 43 | -------------------------------------------------------------------------------- /2_ 파이썬의 코어문법/2-3_ 클래스, 객체(심화)/1-클래스의_클래스속성.py: -------------------------------------------------------------------------------- 1 | class Dump: 2 | class_attr = [] 3 | 4 | def __init__(self, n, m): 5 | self.attr = m 6 | Dump.class_attr.append(n) 7 | 8 | 9 | a = Dump(10, 10) 10 | print(a.attr, a.class_attr) 11 | b = Dump(5, 5) 12 | print(b.attr, b.class_attr) 13 | print("클래스속성 :", Dump.class_attr) 14 | 15 | """클래스 속성: 16 | 속성에는 사실 인스턴스 속성 뿐만이 아니라, 클래스 속성도 있으며, 속성은 위같이 2가지 종류로 구분된다. 17 | (지금까지 사용했던 속성은 __init__ 메쏘드에서 만드는 인스턴스 속성이다.) 18 | 19 | 클래스 속성은 20 | 21 | class 클래스이름: 22 | 속성 = 값 23 | 과 같이, 따로 메쏘드안에서가 아니라, 클래스에 바로 속성을 생성하는데, 24 | 인스턴스 속성과 다른점은, 클래스 속성은 클래스에 속해있기 때문에, 클래스의 모든 인스턴스가 공유하는 속성이다. 25 | 26 | 따라서 인스턴스가 여러개여도, 인스턴스의 클래스 속성은 모두 1개를 같이 사용한다. 27 | 28 | 클래스 속성을 접근할 때는 29 | 30 | self.속성이름 31 | 인스턴스.속성이름 32 | 같이 해도 되지만, 코드상으로 클래스 속성으로 접근하는 걸 알수 있게, 33 | 34 | 클래스.속성이름 35 | 과 같이 클래스 안에서나 밖에서나 접근할 수 있다. (이럴경우 한눈에 클래스 속성임을 알 수 있다) 36 | 37 | * 파이썬에서 속성, 메쏘드 이름을 찾을 때는 인스턴스, 클래스 순으로 찾는다. 38 | 그래서 인스턴스 속성이 없으면 클래스 속성을 찾으므로 인스턴스.속성이름 도 문제없이 동작하는 것이다. 39 | """ 40 | 41 | print("a 인스턴스 속성:", a.__dict__) 42 | print("Dump 클래스 속성:", Dump.__dict__) 43 | """ 44 | 참고로 인스턴스, 클래스에서 __dict__ 속성을 출력해보면, 45 | 인스턴스와 클래스의 속성을 딕셔너리 구조로 확인할 수 있다. 46 | 47 | 인스턴스.__dict__ 하면 인스턴스 속성을 확인 할수 있고, 48 | 클래스.__dict__ 하면 클래스 속성을 확인 할 수 있다. 49 | """ 50 | -------------------------------------------------------------------------------- /2_ 파이썬의 코어문법/2-3_ 클래스, 객체(심화)/10-2-메타클래스사용법.py: -------------------------------------------------------------------------------- 1 | """ 2 | 우리는 __metaclass__ 속성을 이용해서 클래스를 원하는 메타클래스로 생성할 수 있다. 3 | 파이썬은 클래스를 생성할 때 __metaclass__가 있는지 먼저 확인하고, 발견된 경우에 해당 메타클래스를 사용하고, 발견되지 않은 경우 type을 사용하게된다. 4 | 5 | 만약, 아래 클래스를 생성하기 위해 파이썬은 다음과 같이 작동한다. 6 | class Foo(Bar): 7 | pass 8 | 9 | 10 | Foo에 __metaclass__ 속성이 있나요? 11 | 있다면, __metaclass__ 속성에 있는 걸로 Foo 클래스 객체를 만든다. 12 | 없다면, 파이썬이 모듈 레벨에서 __metaclass__를 찾는다. 그래도 찾지 못했다면 파이썬이 가장 첫번째 부모 클래스(Bar)의 메타클래스(일반적으로 type)를 사용해 13 | 클래스 객체를 만든다. 클래스를 만드는 무언가인 메타클래스의 주 목적은 클래스를 만들 때 클래스를 자동으로 조정하기 위한 것이다.(보통 현재 컨텍스트와 알맞은 클래스를 만들기 위해 14 | API에서 메타클래스를 커스텀해서 사용한다고 합니다.) 메타클래스를 만들기위해서 특별한 형식이 있는 것이 아니라 그저 호출할 수 있는 형태(callable)이면 된다. 15 | 보통 메타클래스는 type에 전달하는 객체와 같은 객체를 받는다. 그렇다면 인스턴스를 하나만 만들 수 있는 클래스(Singleton)를 만드는 메타 클래스 예제를 보자 16 | """ 17 | # 18 | class Singleton(type): # type을 상속받음 19 | __instances = {} # 클래스의 인스턴스를 저장할 속성 20 | def __call__(cls, *args, **kwargs): # 클래스로 인스턴스를 만들 때 호출되는 메서드 21 | if cls not in cls.__instances: # 클래스로 인스턴스를 생성하지 않았는지 확인 22 | cls.__instances[cls] = super().__call__(*args, **kwargs) # 생성하지 않았으면 인스턴스를 생성하여 속성에 저장 23 | return cls.__instances[cls] # 클래스로 인스턴스를 생성했으면 인스턴스 반환 24 | 25 | class Hello(metaclass=Singleton): # 메타클래스로 Singleton을 지정 26 | pass 27 | 28 | a = Hello() # 클래스 Hello로 인스턴스 a 생성 29 | b = Hello() # 클래스 Hello로 인스턴스 b 생성 30 | print(a is b) # True: 인스턴스 a와 b는 같음 31 | 32 | """ 33 | 정리하자면 클래스가 인스턴스를 생성하는 객체라는 것을 알게 되었다. 클래스는 객체이므로 type()을 이용해 생성할 수 있다. 34 | 즉, 클래스는 메타클래스의 인스턴스다. 파이썬에서는 type을 제외한 모든 것이 객체이고 모든 객체는 클래스의 인스턴스거나 메타클래스의 인스턴스다. 35 | (type이 객체라면 type 인스턴스를 생성하는 무언가가 있어야하므로 말이 되지 않는다.) 36 | """ -------------------------------------------------------------------------------- /2_ 파이썬의 코어문법/2-3_ 클래스, 객체(심화)/2-1-클래스메쏘드,정적메쏘드.py: -------------------------------------------------------------------------------- 1 | class Class1: 2 | class_attr = 10 3 | @classmethod 4 | def class_method(cls, n): 5 | print(n + cls.class_attr) 6 | 7 | 8 | Class1.class_method(10) 9 | Class1.class_method(5) 10 | Class1.class_method(0) 11 | """클래스 메쏘드: 12 | 클래스 속성처럼, 클래스 메쏘드도 존재한다. 13 | 클래스메쏘드는 메쏘드위에 @classmethod 를 붙이며, (여기서 @를 붙여 사용하는 것을 데코레이터라고 하며, 자세한건 다음에 언급된다.) 14 | 15 | 클래스 메쏘드의 첫번째 매개변수는 인스턴스 자신을 나타내는 self 대신, cls (Class 의 약자,클래스 자신) 16 | 를 지정한다. (인스턴스 메쏘드가 아닌, 클래스 메쏘드이니까) 17 | 18 | 클래스.메쏘드(인자값) 19 | 과 같이 클래스 메쏘드에 접근할 수 있으며, 20 | 21 | 클래스 메쏘드의 매개변수 cls 를 이용해서, 클래스 속성(cls.클래스속성이름) 이나, 클래스 메쏘드(cls.클래스 메쏘드()) 를 접근할 수 있다. 22 | 또한 인스턴스 매쏘드가 아니다 보니까, 인스턴스 없이 호출할 수 있다. (인스턴스 생성없이도 호출가능) 23 | """ 24 | 25 | 26 | class Temp: 27 | def __init__(self, n): 28 | print("인스턴스 생성", n, "전달받음") 29 | 30 | @classmethod 31 | def create_instance(cls, n): 32 | ins = cls(n) 33 | return ins 34 | 35 | 36 | Temp.create_instance(5) 37 | Temp.create_instance(10) 38 | """ 39 | 추가로 cls 를 이용해서, 현재 클래스의 인스턴스를 만들수도 있다. (인스턴스의 매개변수도 넘겨받을 수 있다.) 40 | cls 자체가 클래스 이므로, cls() 는 현재클래스() 와 같기 때문이다. 41 | """ 42 | 43 | 44 | class Class2: 45 | @staticmethod 46 | def static_method(n, m): 47 | print(n + m) 48 | 49 | 50 | Class2.static_method(1, 2) 51 | Class2.static_method(2, 3) 52 | """ 정적메쏘드: 53 | 정적 메쏘드는 클래스 메쏘드와 비슷하다. 54 | 클래스 메쏘드처럼 메쏘드 위에 @staticmethod 를 붙여야 하며, 정적메쏘드는 self를 매개변수에 지정하지 않는다. 55 | 56 | 다시말해서 self를 매개변수로 받지 않으므로, 인스턴스 속성, 메쏘드에 접근할 수 없다. 57 | 그래서 보통 정적 메쏘드는 메쏘드의 실행이 외부 상태에 영향을 끼치지 않는 순수함수(pure function)를 만들 때 사용한다. 58 | (쉽게말해 인스턴스의 상태를 변화시키지 않는 메쏘드를 만들때 정적 메쏘드를 활용한다.) 59 | 60 | 대신에 정적 메쏘드도 클래스 속성과 메쏘드는 61 | 62 | 클래스이름.속성이름 63 | 클래스이름.메쏘드이름 64 | 과 같이 접근할 수 있다. 65 | (대신에 정적메쏘드와 비슷한 클래스 메쏘드에서 클래스 속성과 메쏘드를 참조하는 목적으로 사용하며, 66 | 정적메쏘드는 목적이 외부 메쏘드, 속성에 영향을 주지않는 메쏘드를 만드는 목적으로 사용법이 갈린다.) 67 | """ -------------------------------------------------------------------------------- /2_ 파이썬의 코어문법/2-3_ 클래스, 객체(심화)/2-2-(정적메쏘드,클래스메소드예제).py: -------------------------------------------------------------------------------- 1 | class Time: 2 | def __init__(self, hour, minute, second): 3 | self.hour = hour 4 | self.minute = minute 5 | self.second = second 6 | 7 | @staticmethod 8 | def is_time_valid(t_str): 9 | h, m, s = map(int, t_str.rstrip().split(':')) 10 | if 25 > h >= 0 and 60 > m >= 0 and 60 >= s >= 0: 11 | return True 12 | else: 13 | return False 14 | 15 | @classmethod 16 | def from_string(cls, t_str): 17 | h, m, s = map(int, t_str.rstrip().split(':')) 18 | t = cls(h, m, s) 19 | return t 20 | 21 | 22 | time_string = input() 23 | 24 | if Time.is_time_valid(time_string): 25 | t = Time.from_string(time_string) 26 | print(t.hour, t.minute, t.second) 27 | else: 28 | print('잘못된 시간 형식입니다.') 29 | 30 | """ 파이썬 코딩도장 35.6 심사문제: 31 | 정적메쏘드와 클래스 메쏘드를 활용한 예제, 32 | 어렵진 않아도 문법과 개념을 까먹었으면 난감한 좋은 예제여서 추가함. 33 | """ -------------------------------------------------------------------------------- /2_ 파이썬의 코어문법/2-3_ 클래스, 객체(심화)/3-클래스상속.py: -------------------------------------------------------------------------------- 1 | class BaseClass: 2 | def base_func(self): 3 | print("부모클래스의 메쏘드") 4 | 5 | 6 | class DerivedClass(BaseClass): 7 | def derived_func(self): 8 | print("자식클래스의 메쏘드") 9 | 10 | 11 | temp = DerivedClass() 12 | temp.base_func() # 자식 클래스에서 부모클래스의 메쏘드도 그대로 사용가능. 13 | temp.derived_func() 14 | """ 클래스 상속(inheritance): 15 | 상속은 무언가를 물려받는 다는 뜻으로, 클래스 상속도 마찬가지로 클래스를 물려받은 것이다. 16 | 17 | 이때 기능을 물려주는 클래스는 기반클래스(base class = 부모 클래스(parent class), 슈퍼 클래스(superclass)) 18 | 기능을 물러(상속)받는 클래스는 파생클래스(derived class = 자식 클래스(child class), 서브 클래스(subclass))라고 한다. 19 | 20 | 새로운 클래스를 만들지 않고 상속 개념을 만든 이유는, 21 | 클래스 마다 중복되는 부분을 반복해서 만들 필요없이 상속을 사용한다면, 중복되는 기능을 생략할 수 있기 때문. 22 | (상속으로 기반클래스의 기존 기능들을 파생클래스에서도 똑같이 사용할 수 있어 효율적) 23 | 24 | 참고로 클래스의 상속관계를 확인할 때는 issubclass() 함수를 사용한다. 25 | issubclass(파생클래스, 기반클래스) 같은 형식으로 인자값을 넘기며, 파생클래스와 기반클래스(상속)관계가 맞을경우, 26 | 참(True), 아니면 거짓(False)를 반환하는 함수. 27 | """ 28 | print(issubclass(DerivedClass, BaseClass)) 29 | # 인자값으로 인스턴스가 올 수는 없다. (인자값으로 클래스가 와야됨) 30 | -------------------------------------------------------------------------------- /2_ 파이썬의 코어문법/2-3_ 클래스, 객체(심화)/4-클래스상속과포함관계.py: -------------------------------------------------------------------------------- 1 | class BaseClass: 2 | def base_func(self): 3 | print("부모클래스의 메쏘드") 4 | 5 | 6 | class DerivedClass(BaseClass): 7 | def derived_func(self): 8 | print("자식클래스의 메쏘드") 9 | 10 | 11 | temp = DerivedClass() 12 | temp.base_func() # 자식 클래스에서 부모클래스의 메쏘드도 그대로 사용가능. 13 | temp.derived_func() 14 | """ 상속관계 vs 포함관계: 15 | 상속은 같은종류, 동등한 관계일 때 사용하며, is-a 관계라고 부른다. 16 | (ex> 부모클래스가 사람, 자식클래스가 학생이면, 학생은 사람이다. 학생 is-a 사람) 17 | """ 18 | 19 | 20 | class Three: 21 | def prt_num(self): 22 | print(3) 23 | 24 | 25 | class Number: 26 | def __init__(self): 27 | self.number_list = [] 28 | 29 | def append_num(self): 30 | self.number_list.append(Three()) # Three 클래스의 인스턴스를 속성에 포함. 31 | 32 | 33 | num = Number() 34 | num.append_num() 35 | print(num.number_list) 36 | num.number_list[0].prt_num() # 포함된 클래스의 메쏘드를 호출 37 | """ 38 | 포함은 상속을 사용하지않고, 클래스안에서 다른 클래스를 포함하는 관계로, has-a 관계라고 부른다. 39 | 상속을 사용하지 않고, 속성에 인스턴스를 만들고, 넣어서 관리하므로, 동등한 관계가 아닌 포함하는 관계다. 40 | (ex> 포함하는클래스가 숫자, 포함되는 클래스가 셋이라면, 숫자는 셋을 포함하고 있다. 숫자 has-a 셋) 41 | 42 | 포함을 사용할 때는, 클래스 전체를 상속받고 싶지 않을때, (클래스의 일부만(속성, 메소드)사용할 때) 사용하며, 43 | 포함된 인스턴스를 속성에 담아서, 44 | 45 | 클래스 안에서는 46 | 47 | 속성.포함된인스턴스의메쏘드() 48 | 속성.포함된인스턴스의속성 49 | 50 | 클래스 바깥에서는 51 | 52 | 포함하는인스턴스.속성.포함된인스턴스의메쏘드() 53 | 포함하는인스턴스.속성.포함된인스턴스의속성 54 | 와 같이 포함된 인스턴스의 메쏘드와 속성을 사용할 수 있다. 55 | """ 56 | -------------------------------------------------------------------------------- /2_ 파이썬의 코어문법/2-3_ 클래스, 객체(심화)/5-super(),부모클래스속성사용.py: -------------------------------------------------------------------------------- 1 | class BaseClass: 2 | class_attr = "부모클래스의 클래스 속성" 3 | 4 | def __init__(self): 5 | self.base_attr = "부모클래스의 인스턴스 속성" 6 | print("부모클래스 생성자 호출") 7 | 8 | def func_base(self): 9 | print("부모클래스의 인스턴스 메쏘드") 10 | 11 | @classmethod 12 | def class_base(cls): 13 | print("부모클래스의 클래스 메쏘드") 14 | 15 | @staticmethod 16 | def static_base(): 17 | print("부모클래스의 정적 메쏘드") 18 | 19 | 20 | class DerivedClass(BaseClass): 21 | 22 | def __init__(self): 23 | print("자식클래스 생성자 호출") 24 | 25 | 26 | temp = DerivedClass() 27 | temp.static_base() 28 | temp.class_base() 29 | temp.func_base() 30 | print(temp.class_attr) 31 | # print(temp.base_attr) # 에러 32 | """ 부모클래스의 인스턴스 속성 사용: 33 | 상속한 자식클래스에서 부모클래스의 요소들을 참고할 때, 34 | 메쏘드는 부모의 클래스, 인스턴스, 정적 메쏘드 모두 호출할 수 있지만, 35 | 속성은 부모의 클래스 속성만 접근할 수 있지, 인스턴스 속성은 접근할 수 없다. 36 | 37 | 인스턴스 속성을 실행하면 에러가 발생하는데, 그 이유는 사실 부모클래스의 __init__ 메쏘드가 호출되지 않았기 때문이다. 38 | (실행 결과를 보면, 자식클래스의 __init__ 메쏘드만 호출됬고, 부모클래스의 __init__ 메쏘드는 호출되지 않았다. 39 | 인스턴스 속성은 __init__ 메쏘드가 생성되어야 같이 생성되기에, 인스턴스 속성도 생성되지 않았었고, 그래서 접근할 수 없던 것이다. 40 | 41 | 그러면 상속된 자식클래스에서 부모클래스의 __init__ (생성자)를 호출하려면, super() 함수를 이용한다. 42 | 43 | super().메쏘드() 44 | 라고 하면, 부모클래스의 원하는 메쏘드를 호출 할 수 있다. 45 | 이때 super().__init__() 46 | 로 부모클래스의 생성자를 호출하면, 비로소 인스턴스 속성도 생성되고, 접근할 수 있게된다. 47 | 48 | 49 | super() 를 더 명확하게 사용할 수도 있는데, 50 | 51 | super(자식클래스, self).메쏘드 52 | 로 super()와 가능은 같지만, 현재 클래스가 어떤 클래스인지 명확하게 표시할 수 있다. 53 | """ 54 | 55 | 56 | class Parents: 57 | def __init__(self): 58 | self.parents_attr = '와우' 59 | 60 | 61 | class Child(Parents): 62 | def prt_parents_attr(self): 63 | print(self.parents_attr) 64 | 65 | 66 | ins = Child() 67 | ins.prt_parents_attr() 68 | """ 69 | 참고로 자식클래스에서 __init__ 메쏘드를 생략하면, 70 | 부모클래스의 __init__ 이 자동으로 호출되서 super()를 사용할 필요가 없다. 71 | """ -------------------------------------------------------------------------------- /2_ 파이썬의 코어문법/2-3_ 클래스, 객체(심화)/6-메쏘드오버라이딩.py: -------------------------------------------------------------------------------- 1 | class Parents: 2 | def func(self): 3 | print("부모클래스 메쏘드 입니다.") 4 | 5 | 6 | class Child(Parents): 7 | def func(self): 8 | print("자식클래스 메쏘드 입니다.") 9 | 10 | 11 | temp = Child() 12 | temp.func() 13 | """ 메소드 오버라이딩(Overriding): 14 | 자식 클래스에서 부모 클래스의 메쏘드를 재정의하는 것을 오버라이딩(Overriding) 이라 한다. 15 | 오버라이딩은 무시하다, 우선하다라는 의미를 가지는데, 뜻과 같이 부모클래스의 원래 메쏘드를 무시하고, 16 | 자식클래스에서 새로 정의한 메쏘드대로 사용하는 것이다. 17 | 18 | 이러는 방법은 부모 클래스의 메쏘드 이름과 똑같은 이름으로 자식 클래스에 메쏘드를 만들면 되는데, 19 | 프로그램에서 메쏘드 오버라이딩은 어떤기능이 같은 메쏘드이름으로 계속 사용되어야할 때 활용한다. 20 | """ 21 | 22 | 23 | class Parents: 24 | def func(self): 25 | print("부모클래스 메쏘드 입니다.") 26 | 27 | 28 | class Child(Parents): 29 | def func(self): 30 | super().func() 31 | print("자식클래스 메쏘드 입니다.") 32 | 33 | 34 | temp = Child() 35 | temp.func() 36 | """ 37 | 만약에 부모클래스의 메쏘드를 자식클래스의 메쏘드로 오버라이딩할 때 부모클래스 메쏘드를 재활용 할 수도 있다. 38 | 마찬가지로 super().메쏘드 39 | 를 사용해서 부모클래스의 오버라이딩할 메쏘드를 호출하는 것이다. 40 | 41 | 이런방법처럼 메쏘드 오버라이딩은 원래기능을 유지하면서 새로운 기능을 덧붙일 때 사용할 수 있다. 42 | """ -------------------------------------------------------------------------------- /2_ 파이썬의 코어문법/2-3_ 클래스, 객체(심화)/8-추상(가상)클래스.py: -------------------------------------------------------------------------------- 1 | from abc import * 2 | # import 에 대한 정보는 모듈 파트 참조 3 | 4 | 5 | class AbstractClass(metaclass=ABCMeta): 6 | @abstractmethod 7 | def abstractmethod(self): 8 | pass 9 | 10 | 11 | """추상클래스(abstract class): 12 | 파이썬에서 존재하는 기능인 추상클래스(= 가상클래스)는 추상(가상)메쏘드의 목록만 가진 클래스다. 13 | 14 | 구현하려면, abc 모듈을 가져와야 한다.(abc 는 초콜릿이 아니라, Abstract Base Class 의 약자다.) 15 | 그후 클래스를 구현할 때 클래스 괄호() 안에 metaclass=ABCMeta 를 넣어주고, 16 | 추상클래스 안의 메쏘드를 만들 때 @abstractmethod 를 붙여서 가상 메쏘드로 지정한다. 17 | 18 | 추상클래스는 자신을 상속하는 자식 클래스가 반드시 구현해야하는 메쏘드를 가상메쏘드로 정해줄 수 있으며, 19 | (자식 클래스가 추상클래스의 가상메쏘드를 모두 구현안하면 자식 클래스의 인스턴스를 생성할 때 에러(TypeError)가 남) 20 | 21 | 22 | 중요한 것은 추상 클래스는 인스턴스(객체)로 만들 수 없으며, 오로지 상속에만 사용된다. 23 | 인스턴스를 만들 수 없으니, 가상 메쏘드도 호출할 경우가 없고, 그래서 가상 메쏘드는 빈 메쏘드로 만듬. 24 | 25 | 26 | 객체지향 프로그래밍에서 추상 클래스는 컨셉(개념, 맥락)만 구현하고, 27 | 실제 기능의 개발은 추상클래스를 상속받는 자식클래스에서 구현할 때 사용하며, 28 | 어떤 기능을 개발할지에 대해 추상 클래스로 미리 설계할 수 있음. 29 | """ -------------------------------------------------------------------------------- /2_ 파이썬의 코어문법/2-3_ 클래스, 객체(심화)/9-2-(스페셜메쏘드예제).py: -------------------------------------------------------------------------------- 1 | # 클래스(Class) 2 | class Car: 3 | def __init__(self, speed, color, model): # __init__ : 생성자(객체 생성시 값 초기화) 4 | self.speed = speed 5 | self.color = color 6 | self.model = model 7 | 8 | def drive(self): # 메소드 : 클래스내 함수(self는 객체의 이름이 들어감) 9 | self.speed = 60 10 | 11 | def __str__(self): # __str__ : 객체를 print()로 출력할 때 자동 호출 12 | msg = f"속도: {self.speed}, 색상: {self.color}, 모델: {self.model}" 13 | return msg 14 | 15 | 16 | myCar = Car(0, 'blue', 'Sonata') 17 | momCar = Car(0, 'gray', 'Morning') 18 | dadCar = Car(0, 'red', 'Avante') 19 | print(myCar) 20 | print(momCar) 21 | print(dadCar) 22 | 23 | """ 24 | 스페셜메쏘드 예제: 25 | 스페셜 메쏘드 __str__를 사용하는 예제로, 26 | print()로 객체를 출력할 때 자동 호출되는 __str__ 스페셜 메쏘드가 정의되어 있다. 27 | """ -------------------------------------------------------------------------------- /2_ 파이썬의 코어문법/2-4_ 예외처리/1-예외처리 try, except, as.py: -------------------------------------------------------------------------------- 1 | # 예외 처리 2 | try: 3 | print(ppap) 4 | except: 5 | print("예외 발생!") 6 | 7 | """ 예외(exception)처리: 8 | 예외란, 코드를 실행중에 발생한 에러를 말하며, 예외에도 다양한 종류가 있는데(ex> TypeError, NameError,...) 9 | 이러한 예외가 발생했을때 원래처럼 에러를 띄으며 스크립트 실행을 중단하지 않고, 10 | 계속실행하게 해주는 방법이 바로 '예외처리'다. 11 | 12 | 예외 처리는 try except 문을 사용해서 13 | # try: 14 | # 실행할 코드 15 | # except: 16 | # 예외가 발생했을 때 처리하는 코드 17 | 위같은 형식으로 예외처리르 할 수 있으며, try: 안의 코드에서 예외가 발생하면, except: 안의 코드를 실행한다. 18 | 이때 try: 코드중 예외가 발생하면 해당 줄에서 코드실행을 중단하고(그 아래 코드들은 무시된다) 19 | 바로 except: 안의 코드를 실행한다. 20 | 21 | except 에 예외 이름을 지정해서 특정 예외가 발생했을 때만 처리코드를 실행하도록 할 수 있는데, 22 | except: 를 except 예외이름: 과 같이 나타내면된다. (ex> except IndexError: ) 23 | except 예외이름: 은 예외 이름의 종류에 따라서 여러개를 사용할 수 있다. 24 | """ 25 | try: 26 | a = int(input()) 27 | print(10 / a) 28 | except ZeroDivisionError: # 입력받은 값이 0이면 0으로 나눌때의 에러 29 | print("숫자를 0으로 못나눠요.. ㅡㅡ") 30 | except ValueError: # 입력받은 값이 숫자로 변환할 수 없을때의 에러 31 | print("숫자가 아닌 값을 입력했네요.. ㅡㅡ") 32 | 33 | """ 34 | 예외처리에서 except 에서 as 뒤에 변수를 지정하면 발생한 예외의 에러 메시지를 받아 올수도 있다. 35 | 36 | except 예외이름 as e: 37 | 같이 하면, (변수이름으로 보통 예외(Exception)의 앞글자를 딴 e를 사용) 38 | e 변수에서 에러 메시지가 담기게 된다. 39 | 40 | 그리고 e 변수를 type()함수의 인자값으로 넘기면, e 변수에 담긴 에러메시지에서 에러의 종류를 반환할 수 있다. 41 | 42 | 만약 모든 예외의 에러 메시지를 가져오고 싶다면 43 | 44 | except Exception as e: 45 | 와 같이 하면 된다. 46 | """ 47 | try: 48 | int('python') 49 | except NameError as e: 50 | print(e) 51 | print(type(e)) 52 | except ValueError as e: 53 | print(e) 54 | print(type(e)) 55 | 56 | # 참고로 예외도 클래스 상속으로 구현되고, 여러 개충으로 구현되어 있다. 57 | # 나중에 새로운 예외를 만들 때는 Exception 을 상속받아서 구현한다. 58 | -------------------------------------------------------------------------------- /2_ 파이썬의 코어문법/2-4_ 예외처리/2-예외처리 else, finally.py: -------------------------------------------------------------------------------- 1 | # 예외 처리 2 | try: 3 | int('10') 4 | except: 5 | print("예외 발생!") 6 | else: 7 | print("예외가 발생 안함!") 8 | 9 | """ 예외처리에서 else, finally: 10 | try 문에서 반대로 예외가 발생하지 않았을 때 코드를 실행하는 else: 문도 있다. 11 | else 는 except 바로 다음에 오며, except 를 생략하고 else 문을 사용할 수 없다. 12 | """ 13 | try: 14 | int(input()) 15 | except: 16 | print("예외 발생!") 17 | else: 18 | print("예외가 발생 안함!") 19 | finally: 20 | print("예외처리가 끝났습니다.") 21 | 22 | """ 23 | 또한 finally: 문으로 에외가 발생하는지 말든지 마지막에 실행할 코드를 쓸수 있다. 24 | finally: 문은 except 와 else 문을 생략하고도 사용할 수 있는데, 25 | 26 | except 가 실행되든지, else 가 실행되는지, 27 | finally 문이 있으면 마지막에 항상 finally 문을 실행한다. 28 | """ -------------------------------------------------------------------------------- /2_ 파이썬의 코어문법/2-4_ 예외처리/3-예외발생, raise, assert.py: -------------------------------------------------------------------------------- 1 | try: 2 | ppap = input("ppap를 입력하세요: ") 3 | if ppap != "ppap": 4 | raise Exception("에잇! ppap가 아니잖아!") 5 | print(ppap) 6 | except Exception as e: 7 | print("에러메시지 :", e) 8 | 9 | """예외발생: 10 | 예외를 직접 발생시킬 수도 있는데, 11 | 12 | raise 예외이름("에러메시지") 13 | raise 예외이름() 14 | 와 같이 사용하면, 해당에러가 발생(+ 원하는 에러메시지를 반환)되게 할 수 있다. 15 | 16 | raise 는 try except 가 없는 상태에서도 사용할 수 있는데, 17 | 이렇게 예외를 발생시키면, 현재 코드블럭에서 처리해줄 except 를 찾을 때까지 계속 상위 코드 블록으로 올라가며, 18 | 결국에 처리해줄 except 가 없다면 코드 실행이 중지되고 에러가 표시됨. 19 | 20 | 이것을 이용해서 예외를 다시 발생(re-raise)시킬 수도 있는데, 21 | """ 22 | 23 | 24 | def input_ppap(): 25 | try: 26 | ppap = input("ppap를 입력하세요: ") 27 | if ppap != "ppap": 28 | raise Exception("에잇! ppap가 아니잖아!") 29 | print(ppap) 30 | except Exception as e: 31 | print("함수에서 에러가 발생했네요. 에러메시지 :", e) 32 | raise 33 | 34 | 35 | try: 36 | input_ppap() 37 | except Exception as e: 38 | print("스크립트에서 예러가 발생했네요. 에러메시지:", e) 39 | """ 40 | 이렇게 하면 except 안에서 raise 를 다시 사용했기에, 거기서 발생한 예외를 다시 발생시킨다.(re-raise) 41 | 그렇게 하면 상위 코드블럭의 except 를 찾아서 다시 발생한 예외를 처리하기에, 상위 코드블럭에서도 또한번 예외 처리가 된다. 42 | 43 | 참고로 except 에서 raise 를 사용하면 이전에 발생한 똑같은 예외를 다시 발생시키지만, 44 | 45 | raise 예외이름("예외메시지") 46 | 로 또다른 예외를 지정(새로운 에러 메시지도 추가)할 수 있다. 47 | """ 48 | 49 | ppap = input("또다시 ppap를 입력하세요: ") 50 | assert ppap == 'ppap', "ppap가 아니잖아!" 51 | print(ppap) 52 | """ assert: 53 | 예외를 assert를 이용해 발생시킬 수도 있다. 54 | 55 | assert 조건식 56 | assert 조건식, "에러메시지" 57 | 와 같은 형식으로, 58 | 지정된 조건식이 거짓일 경우에 AssertionError 를 발생시키며, (에러메시지를 추가했을 경우, 에러메시지도 함께 출력) 59 | 조건식이 참일 경우는 에러가 발생되지 않고 그냥 넘어간다. 60 | 61 | (assert 는 디버깅 모드에서만 실행되며(파이썬은 기본적으로 디버깅모드(__debug__ == True)임) 62 | (스크립트 파일에서 assert 가 실행되지않게 하려면, python -O 스크립트파일.py 과 같은 형식으로 실행(O는 영문대문자)) 63 | """ -------------------------------------------------------------------------------- /2_ 파이썬의 코어문법/2-4_ 예외처리/4-사용자정의예외,예외만들기.py: -------------------------------------------------------------------------------- 1 | # 직접 예외 처리 만들기 2 | class KimDongError(Exception): 3 | pass 4 | 5 | 6 | try: 7 | word = input() 8 | if word == 'kimdong': 9 | raise KimDongError('오류입나이다') 10 | except KimDongError as e: 11 | print(e) 12 | 13 | """ 사용자 정의 예외: 14 | 파이썬에는 내장된 함수가 있으면 사용자 정의 함수가 있듯이, 15 | 내장된 예외(지금까지 사용했던 예외)가 있으면 사용자 정의 예외도 있다. 16 | 17 | 사용자 정의 예외는 클래스에 Exception 을 상속받아서 만들 수 있으며, 18 | 에러이름은 클래스의 이름이며, 19 | 에러메시지는 20 | 21 | raise 에러이름("에러메시지") 22 | 로 raise 문에서 에러메시지를 넣을 수도 있고, 23 | 에외 class의 __init__ 안에서 24 | 25 | super().__init__("에러메시지") 26 | 로 예외 class 부모클래스(Exception)의 __init__ 메쏘드를 호출하면서 인자값으로 에러 메시지를 넣어 줄수도 있다. 27 | """ 28 | 29 | 30 | class KimSeungError(Exception): 31 | def __init__(self): 32 | super().__init__("김승현에러다!으악!") 33 | 34 | 35 | try: 36 | word = input() 37 | if word == 'kimseung': 38 | raise KimSeungError 39 | except KimSeungError as e: 40 | print(e) -------------------------------------------------------------------------------- /2_ 파이썬의 코어문법/2-5_ 이터레이터, 제너레이터/1-1-이터레이터(iterator).py: -------------------------------------------------------------------------------- 1 | print([1, 2, 3].__iter__()) # 리스트 뿐만 아니라, 2 | 3 | print((1, 2, 3).__iter__()) # 튜플(tuple), 4 | print({1, 2, 3}.__iter__()) # 집합(set), 5 | print('123'.__iter__()) # 문자열(str), 6 | print({1: '1', 2: '2', 3: '3'}.__iter__()) # 딕셔너리(dict), 7 | print(range(1, 4).__iter__()) # range() 함수도 이터레이터(반복자)로 만들 수 있음. 8 | 9 | """ 10 | 이터레이터(iterator = 반복자) 는 값을 차례대로 꺼낼 수 있는 객체임. 11 | 반복가능한 객체(iterable) 에서 얻어내며, 12 | 13 | 반복가능한객체(군집자료형) 안에 있는 메쏘드 __iter__() 를 이용해서 이터레이터를 가져올 수 있음. 14 | ( dir(객체) 와 같이하면, 객체의 메쏘드, 속성들을 반환하는데, 거기에 __iter__ 메쏘드가 있으면 반복가능한 객체임.) 15 | 16 | 이터레이터를 변수에 저장한 뒤에, __next__() 메쏘드를 호출해서 요소들을 차례대로 꺼낼 수 있음. 17 | 요소를 하나씩 차례대로 꺼내다가 마지막 요소까지 꺼내고, 더이상 꺼낼 요소가 없는데 __next__() 메쏘드를 호출하면, 18 | 19 | StopIteration 예외를 발생시키며 반복을 끝냄, 20 | """ 21 | 22 | temp_iter = [1, 2, 3].__iter__() 23 | print(temp_iter.__next__()) 24 | print(temp_iter.__next__()) 25 | print(temp_iter.__next__()) 26 | # print(temp_iter.__next__()) # StopIteration 예외 발생(더이상 꺼낼 요소가 없음) 27 | """ 28 | 반복가능한 객체와 이터레이터(반복자)는 분리되어 (둘은 별개의 객체) 있지만, 29 | __iter__ 메쏘드로 반복가능한 객체의 이터레이터를 얻고, 30 | __next__ 메쏘드로 이터레이터를 반복할 수 있기에 31 | 이 두 메쏘드(__iter__, __next__)를 가진 객체를, 이터레이터 프로토콜 (iterator protocol)을 지원한다고 말함. 32 | 33 | (for 변수 in 반복가능한 객체: 34 | 도 사실 반복가능한 객체를 이터레이터로 만들어서, (__iter__ 메쏘드 실행) 35 | for 문이 반복할 때마다, 이터레이터에서 차례대로 요소를 꺼내서 (__next__ 메쏘드 실행) for 문의 변수에 저장하는 것임.) 36 | 37 | 추가로 이터레이터에서의 값들은 양이 적을 땐 몰라도 많을 때는 미리 만들면 메모리 성능에 불리하기에, 38 | 이터레이터만 생성후, 값이 필요할 시점에 값을 만드는 방식으로 돌아감, 39 | 이런 방식을 지연 평가(lazy evaluation = 느긋한 계산법 = 게으른 연산)이라고 함. 40 | 41 | 이것으로 규모가 큰 값을 다룰때 효율적으로 메모리를 사용할수 있고, 성능도 개선할 수 있음. 42 | """ 43 | -------------------------------------------------------------------------------- /2_ 파이썬의 코어문법/2-5_ 이터레이터, 제너레이터/1-2-이터레이터만들기,이터레이터언패킹.py: -------------------------------------------------------------------------------- 1 | class iter_name: 2 | def __init__(self, stop): 3 | self.current = 0 4 | self.end = stop 5 | 6 | 7 | def __iter__(self): 8 | return self 9 | 10 | def __next__(self): 11 | if self.current < self.end: 12 | r = self.current 13 | self.current += 1 14 | return r 15 | else: 16 | raise StopIteration 17 | 18 | 19 | for i in iter_name(5): 20 | print(i, end=' ') 21 | """ 22 | 클래스와 스페셜 메쏘드 __iter__, __next__ 를 사용해서 직접 이터레이터 객체를 만들 수 있음, 23 | (__init__ 로 이터레이터 객체를 생성하고, __iter__, __next__ 메쏘드에 원하는 기능을 추가해서 24 | 마치 iter_name(n) 이 range(0, n)과 같은 기능을 하게 함.) 25 | """ 26 | 27 | a, b, c = iter_name(3) 28 | print(a, b, c) 29 | 30 | a, b = range(2) 31 | print(a, b) # 반복가능한 객체도 언패킹되는 것처럼, 32 | 33 | a, b = range(2).__iter__() 34 | print(a, b) # 이터레이터도 언패킹할 수 있다. 35 | """ 이터레이터 언패킹: 36 | 이터레이터도 반복가능한 객체와 마찬가지로 언패킹(하나의 반복가능한 객체 -> 여러개의 요소를 각각의 변수에 대입)할 수 있다. 37 | (자세한 언패킹, 패킹은 2폴더 17-2 참고) 38 | 39 | 물론 언패킹할 때의 규칙(이터레이터가 반복하는 횟수 == 변수의 개수)은 동일하며, 40 | 사실 map() 함수도 이터레이터 였기에 언패킹이 가능했던 거임. 41 | (ex> a, b, c = map(int, input().split()) ) 42 | 43 | 44 | *** 참고로 언패킹할 때 변수이름으로 _(언더 스코어, 언더바)를 사용하는 경우가 있는데, 45 | _에 할당하는 것은 _에 할당되는 반환 값은 나중에 사용하지 않고 무시하겠다는 관례적 표현임. 46 | """ 47 | a, _, c, _ = range(4) # ex> 여기서 두번째, 네번째 변수는 사용하지 않겠다는 의미. 48 | print(a, c) 49 | -------------------------------------------------------------------------------- /2_ 파이썬의 코어문법/2-5_ 이터레이터, 제너레이터/1-3-1-이터레이터에인덱스활용,__getitem__.py: -------------------------------------------------------------------------------- 1 | class iter_name: 2 | def __init__(self, stop): 3 | self.end = stop 4 | self.current = 0 5 | 6 | def __getitem__(self, index): 7 | if index < self.end: 8 | return index 9 | else: 10 | raise IndexError 11 | 12 | print(iter_name(5)[0], iter_name(5)[4]) 13 | 14 | for i in iter_name(5): 15 | print(i, end=' ') 16 | 17 | """ 18 | 이터레이터에 인덱스도 활용할 수 있게도 직접 만들수 있다. 19 | __getitem__ 메쏘드를 활용해서, 전달받은 인덱스 값을 출력하게 할 수 있다. 20 | 21 | __getitem__ 메쏘드를 사용한다면, __iter__, __next__ 메쏘드를 생략해도 이터레이터를 만들 수 있다. 22 | (그래서 위같이 for 문에 넣어서 이터레이터를 사용할 수 있다.) 23 | """ 24 | -------------------------------------------------------------------------------- /2_ 파이썬의 코어문법/2-5_ 이터레이터, 제너레이터/1-3-2-(이터레이터,인덱스예제).py: -------------------------------------------------------------------------------- 1 | def time_break(t): 2 | s = t % 60 3 | t //= 60 4 | m = t % 60 5 | t //= 60 6 | h = t % 24 7 | if t // 24 > 0: 8 | h = 0 9 | return f'{h:02}:{m:02}:{s:02}' 10 | 11 | 12 | class TimeIterator: 13 | def __init__(self, start, stop): 14 | self.s = start 15 | self.l = stop 16 | 17 | def __iter__(self): 18 | return self 19 | 20 | def __next__(self): 21 | if self.s < self.l: 22 | r = self.s 23 | self.s += 1 24 | return time_break(r) 25 | else: 26 | raise StopIteration 27 | 28 | def __getitem__(self, item): 29 | if 0 <= item < self.l: 30 | return time_break(self.s + item) 31 | else: 32 | raise IndexError 33 | 34 | 35 | start, stop, index = map(int, input().split()) 36 | 37 | for i in TimeIterator(start, stop): 38 | print(i) 39 | 40 | print('\n', TimeIterator(start, stop)[index], sep='') 41 | """ 42 | 이터레이터를 사용해서, 처음 시간과 끝 시간까지를 시:분:초 형식으로 출력하는 프로그램 43 | 44 | 입력받는 값이 3가지인데 start = 처음 시간(초단위), stop = 끝 시간(초단위), index = 특정시간(인덱스번호) 45 | """ 46 | 47 | -------------------------------------------------------------------------------- /2_ 파이썬의 코어문법/2-5_ 이터레이터, 제너레이터/1-4-내장함수,iter,next.py: -------------------------------------------------------------------------------- 1 | it = iter(range(3)) 2 | print(next(it), next(it), next(it)) 3 | 4 | """ 5 | iter() 함수와 next() 함수는 기본적으로 객체의 __iter__, __next__ 메쏘드를 호출한다. 6 | 하지만 이런 기능이외에도 다양한 방식으로 활용할 수 있다. 7 | """ 8 | 9 | import random 10 | 11 | it = iter(lambda: random.randint(0, 5), 2) 12 | print(next(it)) # 랜덤으로 0 ~ 5 중 반환한 값이 2일 경우 반복멈춤(에러 발생) 13 | """ 14 | iter(반복가능한객체) 말고 15 | iter(호출가능한객체, 반복을 끝낸 값) 16 | 과 같은 방법으로 iter() 를 쓸 수 있다. 호출가능한 객체(함수같이)를 넣어서 반환되는 값이 반복을 끝낸 값이면 17 | 반복을 끝낸다. (반복을 끝낼 값은 sentinel(감시병)이라 부른다. (반환되는 값을 감시하고 걸리면 반복을 끝내서) ) 18 | 19 | 이렇게 하면 if 조건문으로 검사하는 코드를 간단하게 요약할 수 있다. 20 | """ 21 | 22 | it = iter(range(2)) 23 | print(next(it, 10)) 24 | print(next(it, 10)) 25 | print(next(it, 10)) 26 | print(next(it, 10)) 27 | print(next(it, 10)) 28 | print(next(it, 10)) 29 | """ 30 | next(반복가능한객체, 기본값) 31 | 으로 반복이 끝났을 때 대신 출력할 기본값을 지정할 수 있다. 32 | 이터레이터에서 반복이 끝나면 에러가 나는 것이 아니라 기본값을 반환해서 에러를 막을 수 있다. 33 | """ 34 | -------------------------------------------------------------------------------- /2_ 파이썬의 코어문법/2-5_ 이터레이터, 제너레이터/2-2-1-제너레이터만들기,yield로함수호출.py: -------------------------------------------------------------------------------- 1 | def generator_range(end): 2 | n = 0 3 | while n < end: 4 | yield n 5 | n += 1 6 | 7 | 8 | for i in generator_range(5): 9 | print(i) 10 | """ 제너레이터 만들기: 11 | 이터레이터를 만들었던 것보다 간편하게 함수와 yield 로 제너레이터를 만들 수 있다. 12 | (for 문 말고 __next__ 메쏘드로도 사용가능) 13 | """ 14 | 15 | 16 | def upper_words(x): 17 | for i in x: 18 | yield i.upper() 19 | 20 | 21 | words = ['ppap', 'hahaha', 'wow'] 22 | for i in upper_words(words): 23 | print(i) 24 | """ 25 | yield 에서 값을 함수(메쏘드)의 반환값으로도 넘길 수 있다. 26 | 위같이 yield 의 동작 방식만 이해하면 이터레이터 보다 훨씬 간단한 구조로 제너레이터를 만들 수 있다. 27 | """ 28 | 29 | -------------------------------------------------------------------------------- /2_ 파이썬의 코어문법/2-5_ 이터레이터, 제너레이터/2-2-2-(제너레이터예제).py: -------------------------------------------------------------------------------- 1 | def prime_number_generator(s, l): 2 | for i in range(s, l): 3 | for j in range(2, i): 4 | if i % j == 0: 5 | break 6 | elif j == i-1: 7 | yield i 8 | 9 | 10 | start, stop = map(int, input().split()) 11 | 12 | g = prime_number_generator(start, stop) 13 | print(type(g)) 14 | for i in g: 15 | print(i, end=' ') 16 | """ 17 | 제너레이터를 사용해서 시작 숫자와 끝 숫자를 입력받아, 그 수 사이의 소수들을 출력하는 예제. 18 | """ 19 | -------------------------------------------------------------------------------- /2_ 파이썬의 코어문법/2-5_ 이터레이터, 제너레이터/2-3-yield from,제너레이터표현식.py: -------------------------------------------------------------------------------- 1 | def yield_together(): 2 | yield from [1, 2, 3] 3 | 4 | 5 | for i in yield_together(): 6 | print(i) 7 | """ yield from: 8 | 여러개의 값을 yield 로 전달할 때, 파이썬 3.3 이상부터는 yield from 을 사용해서, 9 | 10 | yield from 반복가능한 객체 11 | yield from 이터레이터(제너레이터 객체) 12 | 등으로 여러개의 요소들을 한개 씩 함수 바깥으로 전달 할 수 있다. 13 | 14 | 특히 제너레이터 객체를 yield 의 값으로 반환할 수 있기에, 다른 제너레이터 함수를 호출한 값(반환시 객체가 반환)을 15 | yield 의 값으로 사용할 수 있다. 16 | """ 17 | 18 | print((i for i in range(50) if i % 5 == 0)) 19 | """ 제너레이터 표현식: 20 | 리스트 내포, 표현식을 배우면서 튜플, 딕셔너리, 집합, range() 의 표현식도 배웠었는데, (폴더2 6-2 참고) 21 | 그때 얼핏 나왔던 것이 제너레이터 표현식이다. ()로 감싸서 사용하기에, 이와 형식이 겹치는 튜플(tuple)은 tuple()로 감싸야 됬었다. 22 | 23 | 표현식의 문법은 리스트 내포 확장에서 처럼 표현식 문법 그대로 사용할 수 있다. 24 | 이 제너레이터 표현식을 활용해서 제너레이터를 좀 더 쉽게 사용할 수 있다. 25 | """ 26 | -------------------------------------------------------------------------------- /2_ 파이썬의 코어문법/2-6_ 코루틴/2-코루틴밖으로값전달.py: -------------------------------------------------------------------------------- 1 | def cocoroutine(): 2 | out = 0 3 | while True: 4 | x = (yield out) 5 | out += x 6 | 7 | 8 | co = cocoroutine() 9 | print(next(co)) 10 | print(co.send(1)) 11 | print(co.send(1)) 12 | print(co.send(1)) 13 | """ 14 | 코루틴 안으로 값을 전달받았듯이 반대로 코루틴 바깥으로 값을 전달할 수 있다. 15 | 16 | (yield 변수) 17 | 형식으로 한다면, yield 뒤의 변수가 코루틴(함수) 바깥으로 실행이 전환될 때 값도 전달된다. 18 | 19 | next(코루틴객체) # == 코루틴객체.__next__() 20 | 코루틴객체.send(값) 21 | 같이 코루틴 바깥에서 코루틴을 호출하면, 다시 코루틴에서 바깥으로 반환하면서, 반환값으로 아까의 변수 값이 딸려나온다. 22 | 23 | 이렇게 코루틴 안과 밖으로 실행을 왔다 갔다 하면서, 그 사이에 값을 전달받고 전달할 수 있다. 24 | 25 | 코루틴 바깥에서 코루틴을 실행할 때 __next__ 와 send 의 차이점은, 26 | __next__ 는 코루틴으로 값을 보내지 않으면서 코루틴의 코드를 실행할 때 사용하고, 27 | send 는 코루틴으로 값을 보내면서 코루틴의 코드를 실행할 때 사용한다. 28 | 29 | 그리고 __next__ 만 사용하게 된다면, 일반적인 제너레이터가 되게 된다. 30 | 31 | 32 | *** 제너레이터 vs 코루틴 33 | 제너레이터는 __next__ 를 반복 호출해 값을 차례대로 뽑아내는 방식 34 | 코루틴은 __next__ 에 추가로 send 를 사용해 값을 주고받는 방식 35 | (사실은 코루틴도 제너레이터의 일부로, 코루틴은 제너레이터에서 확장된 것이다. 36 | 이터레이터에서 제너레이터가 나왔고, 그 제너레티어에서 코루틴도 나왔다는 것...) 37 | """ 38 | -------------------------------------------------------------------------------- /2_ 파이썬의 코어문법/2-6_ 코루틴/3-코루틴종료,예외처리,throw.py: -------------------------------------------------------------------------------- 1 | def good_corotin(): 2 | while True: 3 | print((yield), end=' ') 4 | 5 | 6 | coro = good_corotin() 7 | coro.send(None) 8 | 9 | for i in range(10): 10 | coro.send(i) 11 | 12 | coro.close() 13 | print() 14 | """ 15 | 코루틴은 보통 실행 상태가 유지되게 무한루프를 사용하는데, 코루틴을 만약 강제로 종료한다면, .close() 메쏘드를 이용함. 16 | (사실 close() 메쏘드를 사용하지 않아도 코루틴은 파이썬 스크립트가 끝나면 같이 끝남.) 17 | 이를 활용해 코루틴의 종료 시점을 코드로 표현할 때 사용할 수 있음. 18 | 19 | 코루틴이 close() 로 종료된다면 코루틴에선 GeneratorExit 예외가 발생하는데, 20 | 21 | 이 예외를 try except 문으로 처리해서 코루틴의 종료 시점에 원하는 코드를 실행할 수 있음. 22 | """ 23 | 24 | 25 | def haha_corotin(): 26 | try: 27 | while True: 28 | print((yield), end=' ') 29 | except GeneratorExit: # 코루틴이 종료될 때 이 예외가 발생 30 | print("\n코루틴 종료") 31 | 32 | 33 | co = haha_corotin() 34 | co.send(None) 35 | 36 | for i in range(10): 37 | co.send(i) 38 | 39 | co.close() 40 | """ 41 | 위같이 하면 코루틴이 종료될 때 코루틴 종료가 출력되게 함. 42 | 43 | 또한 일부러 예외를 발생 시킬수도 있는데, throw() 메쏘드를 사용함. 44 | 45 | 코루틴객체.throw(예외이름, 에러메시지) 46 | 같이해서 코루틴 바깥에서 에러를 코루틴 안으로 던질 수 있으며, 이렇게 해서 코루틴을 종료시킬 수도 있음. 47 | """ 48 | 49 | 50 | def no_more_corotin(): 51 | sum = 0 52 | try: 53 | while True: 54 | x = (yield) 55 | print(x, '가 누적') 56 | sum += x 57 | except IndexError as e: 58 | print(e) 59 | yield sum 60 | 61 | 62 | cr = no_more_corotin() 63 | next(cr) 64 | 65 | cr.send(1) 66 | cr.send(3) 67 | cr.send(2) 68 | print("누적된 값 :", cr.throw(IndexError, "갑자기 분위기 에러")) 69 | """ 70 | 위같이 해서 코루틴을 throw 로 예외를 만들게 하고, 예외 처리에서 예외를 만날 때 값도 반환하고 에러메시지도 출력하게 함. 71 | """ -------------------------------------------------------------------------------- /2_ 파이썬의 코어문법/2-6_ 코루틴/4-하위코루틴값전달,yield from.py: -------------------------------------------------------------------------------- 1 | def gogo_coroutine(): 2 | total = 0 3 | while True: 4 | x = (yield) 5 | if x is None: 6 | return total 7 | total += x 8 | 9 | 10 | def load_coroutine(): 11 | while True: 12 | x = yield from gogo_coroutine() 13 | print(x) 14 | 15 | 16 | co = load_coroutine() 17 | next(co) 18 | co.send(1) 19 | co.send(2) 20 | co.send(3) 21 | co.send(None) 22 | """ 23 | yield 도 쓸수 있듯이 yield from 도 쓸 수 있는데, 24 | 제너레이터 처럼, 반복가능한 객체등을 반환할 때 쓰는 것이 아니라, 코루틴 바깥에서 하위 코루틴을 잇는 역할로 쓴다. 25 | 26 | yield from 코루틴() 27 | 을 사용한다면 코루틴 바깥과 yield from 뒤의 코루틴과를 연결시키고, 값을 주고 받을 수 있게 한다. 28 | 따라서 코루틴 바깥에서 값을 주면 yield from 코루틴() 으로 하위 코루틴으로 받은 값이 고스란히 전달되고, 29 | 30 | 반대로 하위 코루틴에서 반환한 값을 yield from 코루틴() 에서 전달받아서, 코루틴 바깥으로 전달 할 수 있다. 31 | 정말 하위 코루틴과 코루틴 바깥에서 오고가는 값을 사이에서 연결해주는 느낌이다. 32 | 33 | 34 | 전에서 설명했듯이 코루틴도 제너레이터여서, return 을 사용했을 때 제너레이터처럼 StopIteration 예외가 발생한다. 35 | 그걸 이용해 파이썬 3.6이하 까지는 raise StopIteration(값)으로 return 값 과 같은 효과를 낼 수 있다. 36 | 37 | 대신에 파이썬 3.7부터는 raise StopIteration() 해도 RuntimeError 로 바뀌기 때문에 사용할 수 없다. 38 | """ 39 | 40 | -------------------------------------------------------------------------------- /2_ 파이썬의 코어문법/2-6_ 코루틴/5-(코루틴예제).py: -------------------------------------------------------------------------------- 1 | def calc(): 2 | x = 0 3 | while True: 4 | w = (yield x) 5 | a, oper, b = w.split(' ') 6 | if oper == '+': 7 | x = int(a) + int(b) 8 | elif oper == '-': 9 | x = int(a) - int(b) 10 | elif oper == '/': 11 | x = int(a) / int(b) 12 | elif oper == '*': 13 | x = int(a) * int(b) 14 | 15 | 16 | expressions = input().split(', ') 17 | 18 | c = calc() 19 | next(c) 20 | 21 | for e in expressions: 22 | print(c.send(e)) 23 | 24 | c.close() 25 | """ 26 | 코루틴으로 연속되는 사칙연산을 문자열로 받아서 그에 맞게 처리하는 코루틴 예제. 27 | """ -------------------------------------------------------------------------------- /2_ 파이썬의 코어문법/2-7_ 데코레이터/3-데코레이터클래스구현.py: -------------------------------------------------------------------------------- 1 | class deco: 2 | def __init__(self, func): 3 | self.func = func # 대상 함수가 인스턴스 속성으로 저장되기에, 나중에 접근할때 self. 를 붙여야된다. 4 | 5 | def __call__(self): 6 | print(self.func.__name__, '함수 시작') 7 | self.func() 8 | print(self.func.__name__, '함수 끝') 9 | 10 | @deco 11 | def hi(): 12 | print("hi 함수 동작!") 13 | 14 | 15 | hi() 16 | """ 데코레이터 클래스로 구현 : 17 | 클래스로 데코레이터를 만들 수 있는데, 인스턴스를 함수처럼 호출하게 해주는 __call__ 스페셜 메서드를 활용함. 18 | 19 | __init__ 메서드에서 인스턴스(데코레이터)를 생성하면, 전달받은 함수를 인스턴스 속성에 저장하고, 20 | __call__ 메서드로 인스턴스(데코레이터)가 호출된다면, 전달받은 함수를 호출하고, 추가기능도 작성함. 21 | 이때 대상 함수는 self.~ 꼴로 인스턴스 속성으로 저장했기 때문에, 호출하거나 사용할 때도, self.~ 형식을 지켜야 함. 22 | 23 | (@를 쓰지않으면, 아래처럼 함수로 데코레이터를 호출하면 됨.) 24 | deco(hi)() 25 | 26 | 매개변수, 반환값이 있는 함수의 데코레이터를 클래스를 구현할 때는, 27 | __call__ 의 매개변수로 대상 함수의 매개변수와 똑같이 전달받아, 대상 함수를 호출할 때 그대로 전달해 주면 되고, 28 | 반환값은 __call__ 함수의 반환값으로 대상함수의 반환값을 반환하면 된다. (이부분은 함수로 구현했을 때와 동일하다.) 29 | """ 30 | 31 | 32 | class kaka: 33 | def __init__(self, x): # 데코레이터의 매개변수가 있는 경우면, __init__ 에 대상함수 대신 매개변수를 전달 받는다. 34 | self.x = x 35 | 36 | def __call__(self, func): # __call__에서 대상함수를 전달받고, 안에 내부함수(클로저)를 만든다. 37 | def warpper(a, b): # 내부함수에선 대상함수의 매개변수를 전달받고, 대상함수를 호출, 반환값을 반환한다. 38 | r = func(a, b) 39 | print("결과 : ", str(r) * self.x) 40 | return r 41 | return warpper 42 | # __call__ 함수만 보면 데코레이터를 함수로 구현했던 구조와 비슷하다. (클로저를 사용) 43 | 44 | 45 | @kaka(3) 46 | def add(a, b): 47 | return a + b 48 | 49 | 50 | print(add(1, 2)) 51 | print(add(2, 3)) 52 | """ 매개변수가 있는 데코레이터를 클래스로 구현 : 53 | 대신 매개변수가 있는 데코레이터를 클래스로 구현할때는 다르다. 54 | 55 | @데코레이터(인수) 56 | 와 같이 데코레이터를 사용하면서 바로 인자를 넘겨주기에, __init__ 에서 데코레이터의 매개변수를 전달 받고, 57 | 대신에 데코레이터의 대상 함수는 __call__ 에서 매개변수로 전달받는다. 58 | 그리고 __call__ 메서드 안에 내부함수(wrapper, 클로저)로 대상함수의 매개변수를 전달받고, 59 | 내부함수 안에서 대상함수를 호출하고, 코드를 덧붙이고, 대상함수의 반환값을 내부함수가 반환한다. 60 | 그리고, __call__ 메서드에서 내부 함수 자체를 반환하면 된다. 61 | """ -------------------------------------------------------------------------------- /2_ 파이썬의 코어문법/2-7_ 데코레이터/4-(데코레이터예제,html태그).py: -------------------------------------------------------------------------------- 1 | def html_tag(tag): 2 | def deco(func): 3 | def wrapper(): 4 | return '<' + tag + '>' + func() + '' 5 | return wrapper 6 | return deco 7 | 8 | 9 | a, b = input().split() 10 | 11 | 12 | @html_tag(a) 13 | @html_tag(b) 14 | def hello(): 15 | return 'Hello, world!' 16 | 17 | 18 | print(hello()) -------------------------------------------------------------------------------- /_1 파이썬으로 codeup 기초100제 풀이/11~20번.py: -------------------------------------------------------------------------------- 1 | '''11''' 2 | print(input()) 3 | 4 | '''12''' 5 | print(input()) 6 | 7 | '''13''' 8 | print(input()) 9 | 10 | '''14''' 11 | a,b = input().split(' ') 12 | print(b, a) 13 | 14 | '''15''' 15 | a = float(input()) 16 | a = round(a, 2) 17 | print(a) 18 | 19 | '''17''' 20 | a = input() 21 | print(a, a, a) 22 | 23 | '''18''' 24 | print(input()) 25 | 26 | '''19''' 27 | a,b,c=input().split('.') 28 | 29 | print('%04d' % int(a), end='.') 30 | print('%02d' % int(b), end='.') 31 | print('%02d' % int(c)) 32 | 33 | '''20''' 34 | a,b=input().split('-') 35 | print(a+b) -------------------------------------------------------------------------------- /_1 파이썬으로 codeup 기초100제 풀이/1번~10번.py: -------------------------------------------------------------------------------- 1 | '''1''' 2 | print("Hello") 3 | 4 | '''2''' 5 | print("Hello World") 6 | 7 | '''3''' 8 | print("Hello\nWorld") 9 | 10 | '''4''' 11 | print("\'Hello\'") 12 | 13 | '''5''' 14 | print("\"Hello World\"") 15 | 16 | '''6''' 17 | print("\"!@#$%^&*()\"") 18 | 19 | '''7''' 20 | print("\"C:\\Download\\hello.cpp\"") 21 | 22 | '''10''' 23 | print(input()) -------------------------------------------------------------------------------- /_1 파이썬으로 codeup 기초100제 풀이/21~30번.py: -------------------------------------------------------------------------------- 1 | '''21''' 2 | word = input() 3 | print(word) 4 | 5 | '''22''' 6 | word = input() 7 | print(word) 8 | 9 | '''23''' 10 | a, b = map(int, input().split('.')) 11 | print(a) 12 | print(b) 13 | 14 | '''24''' 15 | mylist = list(input()) 16 | for i in range(len(mylist)): 17 | print(f"'{mylist[i]}'") 18 | 19 | # 코드업(예전 방법) 20 | # mylist = list(input()) 21 | # for i in range(len(mylist)): 22 | # print("'{}'".format(mylist[i])) 23 | 24 | '''25''' 25 | n = input() 26 | for i in range(5): 27 | print(f"[{int(n[i]) * 10 ** (4-i)}]") 28 | 29 | # n = input() #옛 방법 30 | # for i in range(5): 31 | # print("[{}]".format(int(n[i]) * 10 ** (4-i))) 32 | 33 | '''26''' 34 | a = input().split(':') 35 | print(a[1]) 36 | 37 | '''27''' 38 | a = input().split('.') 39 | print(a[2], end='-') #end는 어떻게 끝낼지 정해주는 것( 문자도 가능 ) 40 | print(a[1], end='-') 41 | print(a[0], end='') 42 | 43 | '''28''' 44 | a = input() 45 | print(a) 46 | 47 | '''29''' 48 | a = input() 49 | print(a) 50 | 51 | '''30''' 52 | a = input() 53 | print(a) 54 | -------------------------------------------------------------------------------- /_1 파이썬으로 codeup 기초100제 풀이/31~40번.py: -------------------------------------------------------------------------------- 1 | '''31''' 2 | a = int(input()) 3 | b = list(oct(a)) 4 | for i in range(2, len(b)): 5 | print(b[i], end='') 6 | 7 | '''32''' 8 | a = int(input()) 9 | b = list(hex(a)) 10 | for i in range(2, len(b)): 11 | print(b[i], end='') 12 | 13 | '''33''' 14 | a=input() 15 | n=int(a) 16 | print('%X' % n) 17 | 18 | '''34''' 19 | a = input() 20 | print(int(a, 8)) 21 | 22 | '''35''' 23 | a = input() 24 | b = int(a, 16) 25 | b = oct(b) 26 | for i in range(2, len(b)): 27 | print(b[i], end='') 28 | 29 | '''36''' 30 | a = input() 31 | print(ord(a)) 32 | 33 | '''37''' 34 | a = int(input()) 35 | print(chr(a)) 36 | 37 | '''38''' 38 | a, b = map(int, input().split(' ')) 39 | print(a + b) 40 | 41 | '''39''' 42 | a, b = map(int, input().split(' ')) 43 | print(a + b) 44 | 45 | '''40''' 46 | a = int(input()) 47 | print(-a) -------------------------------------------------------------------------------- /_1 파이썬으로 codeup 기초100제 풀이/41~50번.py: -------------------------------------------------------------------------------- 1 | '''41''' 2 | w = input() 3 | print(chr(ord(w)+1)) 4 | 5 | '''42''' 6 | a, b = map(int,input().split(' ')) 7 | print(a//b) 8 | 9 | '''43''' 10 | a, b = map(int,input().split(' ')) 11 | print(a%b) 12 | 13 | '''44''' 14 | a = int(input()) 15 | print(a+1) 16 | 17 | '''45''' 18 | a, b = map(int, input().split(' ')) 19 | print(a+b) 20 | print(a-b) 21 | print(a*b) 22 | print(a//b) 23 | print(a%b) 24 | print(round(a/b, 2)) 25 | 26 | '''46''' 27 | a, b, c = map(int, input().split(' ')) 28 | print(a+b+c) 29 | print(round((a+b+c)/3, 1)) 30 | 31 | '''47''' 32 | a = int(input()) 33 | print(a*2) 34 | 35 | '''48''' 36 | a, b = map(int, input().split(' ')) 37 | print(a*(2**b)) 38 | 39 | '''49''' 40 | a, b = map(int, input().split(' ')) 41 | if a>b: 42 | print(1) 43 | else: 44 | print(0) 45 | 46 | '''50''' 47 | a, b = map(int, input().split(' ')) 48 | if a==b: 49 | print(1) 50 | else: 51 | print(0) 52 | 53 | -------------------------------------------------------------------------------- /_1 파이썬으로 codeup 기초100제 풀이/51~60번.py: -------------------------------------------------------------------------------- 1 | '''51''' 2 | a, b = map(int, input().split(' ')) 3 | if b >= a: 4 | print(1) 5 | else: 6 | print(0) 7 | 8 | '''52''' 9 | a, b = map(int, input().split(' ')) 10 | if b != a: 11 | print(1) 12 | else: 13 | print(0) 14 | 15 | '''53''' 16 | x=int(input()) 17 | b=bool(x) 18 | x=int(not b) 19 | print(x) 20 | 21 | '''54''' 22 | a, b = map(int, input().split(' ')) 23 | if a == 1 and b == 1: 24 | print(1) 25 | else: 26 | print(0) 27 | 28 | '''55''' 29 | a, b = map(int, input().split(' ')) 30 | if a == 1 or b == 1: 31 | print(1) 32 | else: 33 | print(0) 34 | 35 | '''56''' 36 | a, b = map(int, input().split(' ')) 37 | if a == b: 38 | print(0) 39 | else: 40 | print(1) 41 | 42 | '''57''' 43 | a, b = map(int, input().split(' ')) 44 | if a == b: 45 | print(1) 46 | else: 47 | print(0) 48 | 49 | '''58''' 50 | a, b = map(int, input().split(' ')) 51 | if a == 0 and b == 0: 52 | print(1) 53 | else: 54 | print(0) 55 | 56 | '''59''' 57 | a= int(input()) 58 | print(~a) 59 | 60 | '''60''' 61 | a, b = map(int, input().split(' ')) 62 | print(a & b) 63 | -------------------------------------------------------------------------------- /_1 파이썬으로 codeup 기초100제 풀이/61~70번.py: -------------------------------------------------------------------------------- 1 | # '''61''' 2 | # a, b = map(int, input().split(' ')) 3 | # print(a ^ b) 4 | # 5 | # '''62''' 6 | # a, b = map(int, input().split(' ')) 7 | # print(a | b) 8 | # 9 | # '''63''' 10 | # a, b = map(int, input().split(' ')) 11 | # print(a if a>b else b) 12 | # 13 | # '''64''' 14 | # a, b, c = map(int, input().split(' ')) 15 | # print((b if bb else (c if a>c else a)) 16 | # 17 | # '''65''' 18 | # a = list(map(int, input().split(' '))) 19 | # for i in a: 20 | # if i%2 == 0: 21 | # print(i) 22 | # 23 | # '''66''' 24 | # a = list(map(int, input().split(' '))) 25 | # for i in a: 26 | # if i%2 == 0: 27 | # print("even") 28 | # else: 29 | # print("odd") 30 | # 31 | # '''67''' 32 | # a = int(input()) 33 | # if a > 0: 34 | # print("plus") 35 | # else: 36 | # print("minus") 37 | # 38 | # if a % 2 == 0: 39 | # print("even") 40 | # else: 41 | # print("odd") 42 | 43 | '''68''' 44 | a = int(input()) 45 | if 100 >= a and a >= 90: 46 | print('A') 47 | elif a >= 70: 48 | print('B') 49 | elif a >= 40: 50 | print('C') 51 | elif a >= 0: 52 | print('D') 53 | 54 | '''69''' 55 | def f(x): #자칭 파이썬의 switch_case문 ( .get(x, '출력') 은 default ) 56 | return {'A': 'best!!!', 'B': 'good!!', 'C': 'run!', 'D': 'slowly~'}.get(x, 'what?') 57 | 58 | a = input() 59 | print(f(a)) 60 | 61 | '''70''' 62 | def f(x): #자칭 파이썬의 switch_case문 ( .get(x, '출력') 은 default ) 63 | return {1: 'spring', 2: 'summer', 3: 'fall'}.get(x, 'winter') 64 | 65 | a = int(input()) 66 | print(f(a//3)) 67 | -------------------------------------------------------------------------------- /_1 파이썬으로 codeup 기초100제 풀이/71~80번.py: -------------------------------------------------------------------------------- 1 | '''71''' 2 | a = list(map(int, input().split(' '))) 3 | for i in a: 4 | print(i) 5 | if i == 0: 6 | break 7 | 8 | '''72''' 9 | n = int(input()) 10 | a = list(map(int, input().split(' '))) 11 | for i in range(n): 12 | print(a[i]) 13 | 14 | '''73''' 15 | a = list(map(int, input().split(' '))) 16 | for i in a: 17 | print(i) 18 | if i == 0: 19 | break 20 | 21 | '''74''' 22 | n = int(input()) 23 | for i in range(n, 0, -1): 24 | print(i) 25 | 26 | '''75''' 27 | n = int(input()) 28 | for i in range(n, 0, -1): 29 | print(i-1) 30 | 31 | '''76''' 32 | n = input() 33 | for i in range(97, ord(n)+1): 34 | print(chr(i), end=' ') 35 | 36 | '''77''' 37 | n = int(input()) 38 | for i in range(0, n+1): 39 | print(i) 40 | 41 | '''78''' 42 | sum = 0 43 | n = int(input()) 44 | for i in range(2, n+1, 2): 45 | sum += i 46 | print(sum) 47 | 48 | '''79''' 49 | a = list(input().split(' ')) 50 | for i in a: 51 | print(i) 52 | if i == 'q': 53 | break 54 | 55 | '''80''' 56 | n = int(input()) 57 | sum = 0 58 | for i in range(1, n+1): 59 | sum += i 60 | if sum >= n: 61 | print(i) 62 | break -------------------------------------------------------------------------------- /_1 파이썬으로 codeup 기초100제 풀이/81~90번.py: -------------------------------------------------------------------------------- 1 | '''81''' 2 | a, b = map(int, input().split(' ')) 3 | for i in range(1, a+1): 4 | for j in range(1, b+1): 5 | print(i, j) 6 | 7 | '''82''' 8 | num16 = input() 9 | num10 = int(num16, 16) 10 | for i in range(1, 16): 11 | print(num16, '*', '%X' % (i), '=', '%X' % (num10*i), sep='') 12 | 13 | '''83''' 14 | n = int(input()) 15 | for i in range(1, n+1): 16 | if i == 3 or i == 6 or i == 9: 17 | print('X', end=' ') 18 | else: 19 | print(i, end=' ') 20 | 21 | '''84''' 22 | n = 0 23 | r, g, b = map(int , input().split(' ')) 24 | for i in range(r): 25 | for j in range(g): 26 | for k in range(b): 27 | print(i, j, k) 28 | n = n+1 29 | print(n) 30 | 31 | '''85''' 32 | h, b, c, s = map(int, input().split(' ')) 33 | mb = (h *b *c *s) / (8 *1024 *1024) 34 | print(round(mb, 1), 'MB') 35 | 36 | '''86''' 37 | w, h, b = map(int, input().split(' ')) 38 | mb = (w *h *b) / (8 *1024 *1024) 39 | print(round(mb, 2), 'MB') 40 | 41 | '''87''' 42 | sum = 0 43 | n = int(input()) 44 | for i in range(1, n+1): 45 | sum += i 46 | if sum >= n: 47 | print(sum) 48 | break 49 | 50 | '''88''' 51 | n = int(input()) 52 | for i in range(1, n+1): 53 | if i%3 != 0: 54 | print(i, end=' ') 55 | 56 | '''89''' 57 | n, w, re = map(int, input().split(' ')) 58 | n += w*(re-1) 59 | print(n) 60 | 61 | '''90''' 62 | a, r, n = map(int, input().split(' ')) 63 | a *= r**(n-1) 64 | print(a) -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/1/#1-파이썬기본문법.py: -------------------------------------------------------------------------------- 1 | print("안녕"); print("하세요!") 2 | """ 3 | 파이썬의 기본문법 4 | - 세미클론(;) : 파이썬에서 세미콜론(;)을 쓰는건 필수가 아니다. 5 | 다른언어에선 구문(한줄)이 끝날때마다 세미콜론(;)을 붙여주지만, 파이썬은 꼭 붙여줄 필요는 없다. 6 | 7 | 붙이나 안붙이나 차이가 없고, 보통 세미콜론을 붙이지는 않는다. 8 | 다만 여러구문(여러줄)을 한줄로 합칠때, 구문과 구문사이를 구분하기위해 세미콜론(;)을 사용한다. 9 | """ 10 | 11 | if True: 12 | print("이렇게, 특정 코드의 영역에서는") 13 | print("그 영역에 속한다면 4칸 들어쓰기 후 코드를 표현합니다.") 14 | print("영역에 속하지 않는다면, 들어쓰기를 하지 않습니다.") 15 | """ 16 | - 코드블럭( ) : 파이썬에서 코드블록은 스코프({})가 아닌, 들여쓰기(보통4칸)( )로 나타냅니다. 17 | 다른언어는 코드블록(코드의 영역)을 스코프({})로 묶어서 구분하기도 합니다. 예를들어 c언어만 해도, 18 | 19 | # #include 20 | # 21 | # int main(){ 22 | # printf("안녕하세요!"); 23 | # } 24 | 위같이 스코프({})로 코드의 영역을 구분하고, 들여쓰기와 여백등은 개개인 스타일이지만, 25 | 파이썬은 스코프를 생략하고, 같은 코드블럭은 들여쓰기를 서로 동일하게 함으로써 표현한다. 26 | """ 27 | 28 | if True: # 대표적으로 if, while, for문 안의 실행문 별개의 코드블럭이기에 들어쓰기로 나타내야 함. 29 | a = 10 # 같은 코드블럭이라면(여기선 2~3행이 같은 영역) 들어쓰기한 크기를 맞춰줘야 함. 30 | if a is 10: 31 | print(a) # 위같이 들어쓰기 안에서 새로운 코드블럭을 만든다면 또 들어쓰기를 해야함. 32 | """ 33 | 들어쓰기는 2칸, 4칸을 띄어쓰거나, 탭키를 사용할 수 있는데, 파이썬 PEP8에선 코딩스타일로 4칸 띄어쓰기를 권장한다. 34 | 특이한 경우가 아니라면, 4칸 띄어쓰기를 들어쓰기로 사용하자. 35 | """ 36 | 37 | print("와우") # print("이부분은 주석이라서 실제 코드에 반영되지 않습니다!") 38 | """ 39 | - 주석(#) : 파이썬에서 주석은 #를 앞에 붙여 표시한다. 40 | 41 | 파이썬에서 주석은 #기호를 앞에 붙여서 사용한다. 42 | #이 사용되면, # 뒤로부터 그줄의 끝까지는 주석처리되기에 그부분은 코드로 인식하지 않는다. 43 | #은 한줄만 주석처리할 수 있기에, 여러줄을 주석 처리하려면 줄마다 #을 붙여줘야 한다. 44 | 45 | 46 | 아니면 문자열 여러줄을 처리하는 기호("""""", '''''')를 사용해서 여러줄 주석을 처리할 수 있다. 47 | 이때는 여러줄 주석을 변수에 대입하게 된다면 주석이 아닌 실제 코드로 반영되기에 주의해야 된다. 48 | """ 49 | 50 | # 이렇게 51 | # 샵을 행마다 52 | # 사용해서 53 | # 여러줄 주석을 54 | # 만들거나, 55 | 56 | """ 57 | 이렇게 58 | 여러줄 문자열을 59 | 표시하는 기호를, 60 | """ 61 | 62 | ''' 63 | (이것도 됩니다.) 64 | 사용해서 여러줄 65 | 주석을 만들 수 있습니다. 66 | ''' 67 | 68 | #이렇게 보다는 69 | # 이게 보기에도 좋다. 70 | 71 | """ 72 | 참고로 위같이 #을 이용한 주석에는, #바로 내욜을 다는 것보다, #과 주석내용을 한칸 띄어주는 스타일이 가독성이 좋다. 73 | """ 74 | -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/1/#2-변수.py: -------------------------------------------------------------------------------- 1 | x = 10 2 | """ 변수(variable) 3 | 변수는 값을 저장하는 존재로, 4 | 5 | 변수이름 = 값 6 | 과 같은 형식으로 변수를 생성함과 동시에 변수에 값을 할당(저장)할 수 있다. 7 | 8 | 이때 파이썬의 변수이름에는 규칙이 있다. 9 | - 영문자, 숫자를 사용할 수 있다. (한글도 사용가능한데, 권장안함) 10 | - 영문자의 대소문자가 구별된다. 11 | - 변수의 맨처음 글자로 문자 아니면 _(언더바, 언더스코어)만 올수 있다. (숫자는 맨앞에 올수 없다) 12 | - 특수문자(+, -, *, /, $, @, &, % 등)은 변수이름으로 쓸 수 없다. 13 | - 파이썬 키워드, 예약어(if, for, while, and, or)는 변수이름으로 쓸 수 없다. 14 | 15 | = 는 프로그래밍언어에서 값을 할당하는 대입연산자다. (수학처럼 등호로 쓰고 싶으면 ==를 활용) 16 | left value(왼쪽 값) = right value(오른쪽 값)과 같이 두개의 항(피연산자)를 가지는 연산자로, 17 | 오른쪽 값을, 왼쪽 값에 대입(할당)한다. 원래 있던 값이 있다면 할당할 때 덮어씌우게(새로 할당하게)되는데, 18 | 따라서 오른쪽 값엔 변수, 값 등이 올수 있지만, 왼쪽엔 변수만 올 수 있다. 19 | 20 | 값은 1 2 4 와 같은 정수(int), 1.23 같은 소수(float), 'abc'같은 문자(str)말고도 여러가지를 사용할 수 있다. 21 | 파이썬에서 사용하는 값에 대해선 자료형 파트를 참고. 22 | """ 23 | a = 1 24 | b = '와우' 25 | print(a, b) 26 | 27 | del a, b 28 | """ 29 | 변수를 만들었다면, 다시 삭제할 수 도 있는데, 이때는 30 | 31 | del 변수이름 32 | 같은 형식으로 변수를 삭제할 수 있다. 33 | """ 34 | 35 | x, y, z = 1, 2, 3 36 | print(x, y, z) 37 | x = y = z = 1 38 | print(x, y, z) 39 | 40 | null = None 41 | print(null) 42 | """ 43 | 변수는 x, y, z = 1, 2, 3 과 같이 여러개를 한번에 선언 할 수도 있고, (사실은 이것이 튜플을 언패킹하는 작업일줄을...) 44 | x = y = z =1 과 같이 변수들의 값이 동일하다면, 변수를 = 로 연결해서 한번에 할당 할 수도 있다. 45 | 46 | 빈 변수는 참고로 None 을 값으로 할당한다. 47 | (다른언어에서 null(널)이라 표현하는 것을 파이썬에선 None(논)으로 표현한다.) 48 | """ 49 | 50 | won = 110_000 51 | print(won) 52 | """ 53 | 가격이나 큰 숫자를 표시할 때 100,000,000 같이 세자리마다 콤마(,) 로 구분해서 표현하는 데, 54 | 파이썬은 대신 _를 구분해서 사용할 수 있다. (,를 붙이면 튜플 자료형이 되버리기에 주의) 55 | (반대로 출력할 때 3자리마다 ,를 출력하고 싶으면 문자열 포맷팅중 형식지정자 참고) 56 | """ 57 | 58 | x = 100 59 | y = 100 60 | print(x, y) 61 | print('x의 주소:', id(x), 'y의 주소:', id(y)) 62 | """ 63 | ** 중요한 것은 파이썬은 값도 객체로 존재한다. 64 | 파이썬에서 변수는 그래서 사실은 값을 저장하는 것이 아니라, 객체를 가리키는 방식이다. 65 | 66 | 두 변수에 서로 값은 값을 할당했으면 사실 두 변수는 서로 같은 객체를 가리키고 있는 것이다. 67 | """ -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/1/0-파이썬의 자료형.md: -------------------------------------------------------------------------------- 1 | ### 파이썬의 자료형 2 | 3 | 파이썬에서는 자료형의 종류는 있는데, 다른 언어와 달리 변수 선언시에 따로 자료형을 붙이지 않는다. 4 | 종류를 나누자면, 5 | 6 | 숫자로는 7 | - int(정수 숫자) 8 | - float(실수(소수점아래까지) 숫자) 9 | - complex(복소수 숫자) 10 | 가있고, 추가로 참과 거짓을 저장하는 11 | - bool(불, True or False) 12 | 도있다. 13 | 14 | 요소들이 모여있는 군집적인 자료형에는 15 | - str(문자열) 16 | - list(리스트, 배열) 17 | - tuple(튜플, 읽기전용 리스트) 18 | - set(집합) 19 | - dict(딕셔너리, 사전구조) 20 | 가 있다. 21 | 22 | 그외에도 23 | - bytes (수정불가한 바이트) 24 | - bytearray (수정가능한 바이트) 25 | - frozenset (집합인데 읽기전용) 26 | 가 있다. 27 | 28 | ![파이썬자료현](https://user-images.githubusercontent.com/48408417/76589027-172ccd80-652c-11ea-9aa5-b38d66836db6.png) 29 | 30 | 군집자료형들을 맨처음 보면 서로 헷갈리기도 하고, 이해하기 어려운데... 31 | 간단하게 걔네들의 특징을 정리하자면, 32 | 33 | |자료형|요소 순서|요소 중복|요소 수정|표현| 34 | |:---:|:---:|:---:|:---:|:---:| 35 | |str(스트링, 문자열)|중요|허용|불가|"문자열입니다"| 36 | |list(리스트, 배열)|중요|허용|가능|["리", "스", "트", 1]| 37 | |tuple(튜플)|중요|허용|불가|("튜", "플", 2)| 38 | |set(셋, 집합)|안중요|불가|가능|{1, 2, 4}| 39 | |dict(딕셔너리, 사전)|안중요|불가|가능|{1: '값', '키', 2}| 40 | 41 | 앞으로 정리할 자료형들은 그외의 자료형을 뺀 나머지 자료형들이다. 42 | 다시한번 복습하면서 놓친부분을 챙기고, 부족한 부분은 다시 보충하도록 하자. 43 | 44 | 블로그 링크: 45 | https://bodhi-sattva.tistory.com/58 46 | -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/1/01-숫자자료형, 산술연산자.py: -------------------------------------------------------------------------------- 1 | """ 2 | 블로그 포스팅 : https://bodhi-sattva.tistory.com/59 3 | (좀더 세부적으로 정리했습니다.) 4 | """ 5 | 6 | a = 1 7 | b = 0 8 | c = -9 9 | print(a, type(a), b, type(b), c, type(c)) 10 | # type(변수)는 그변수의 자료형을 반환하는 함수이다. 11 | """ 숫자자료형 12 | 우리가 흔히 사용하는 그 숫자를 담는 자료형이 바로 숫자 자료형이다. 13 | 숫자자료형에는 3가지가 있었는데, 14 | 정수, 실수, 복소수에 따라서 각각 int, float, complex 자료형이 있다. 15 | 16 | 첫번째는 위와 같은 int 자료형으로, 정수형(integer) 숫자다. 17 | (python3 이전 버전에서는 32비트의 저장공간을 차지하며, 범위도 약-21억~21억만큼이고, 대신에 long 18 | 이라는 자료형으로 메모리가 허락하는 선에서 무제한의 범위를 사용할 수 있었는데, python3으로 오면서 19 | long자료형이 없어지고, 대신에 int가 long같이 크기제한이 없어졌다고 한다.) 20 | int()함수 라는것이 있는데 인자값을 int 자료형으로 반환한다. 21 | 22 | 두번째는 float 자료형으로, 실수형(floating-point) 숫자다. 23 | """ 24 | d = -4.2 25 | e = 4.2E1 26 | print(d, type(d), e, type(e)) 27 | n1 = float('nan') 28 | n2 = float('inf') 29 | print(n1, type(n1), n2, type(n2)) 30 | """ 31 | 바로 소수점 아래의 값도 있는 숫자를 말하며, 32 | 유호자릿수는 15자리까지이다. 33 | float()함수로 실수로 변환한 값을 가져올 수 있는데, 이걸 이용해서 34 | inf(양의무한), nan(불가능한수), -inf(음의무한)까지도 대입할 수 있다. 35 | 변수 e 와 같이 부동소수점 표현으로 입력할 수도 있다. 36 | 참, 추가로 8진수와 16진수도 사용할 수 있다. 37 | 2진수도 0b를 쓰면 가능하다. 그리고 대소문자 구별없이 써도된다(0x든 0X든 상관없음) 38 | """ 39 | f = 0o12 40 | # 8진수(0o) 41 | g = 0x12 42 | # 16진수(0x) 43 | print(f, type(f), g, type(g)) 44 | """ 45 | 물론 저장될때 따른 자료형이 있는 것이 아니며, 10진수로 변환되서 저장된다. 46 | 세번째로 복소수도 포함하는 자료형인 complex 도 있덴다. 47 | 허수기호를 j, J로 표현하며, 48 | complex()함수로 복소수를 만들수도 있다. 49 | complex(n)은 n+0j인 복소수로, complex(n, m)은 n+mj인 복소수가 되고, 50 | complex('n+mj')도 n+mj인 복소수가 된다. 51 | .real(실수부), .imag(허수부), .conjugate(컬레복소수), abs(절댓값 반환) 52 | 과 같은 함수로 응용할 수 있다. 53 | """ 54 | h = 2 + 3j 55 | print(h, type(h)) 56 | print(h.real, h.imag, h.conjugate(), abs(h)) 57 | i = 1j 58 | print(i, i**2, i**3, i**4) 59 | """숫자 연산자: 60 | +, -, /, * 61 | 같은 사칙연산은 기본적으로 제공한다. 그리고 추가로 62 | ** : 제곱 연산자 (2**3 == 8) 63 | % : 나머지 연산자 (5%2 == 1) 64 | // : 몫 연산자 (5//2 == 2) 65 | 도 제공한다. 66 | """ 67 | print(float('3.2'), float(2)) 68 | -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/1/02-1-불자료형.py: -------------------------------------------------------------------------------- 1 | """ 2 | 블로그포스팅 : https://bodhi-sattva.tistory.com/61 3 | """ 4 | 5 | b1 = True 6 | b2 = False 7 | print(b1, type(b1), b2, type(b2)) 8 | """불 자료형: 9 | 불은 bool 으로, 2진수처럼 참 또는 거짓, 1 또는 0, True 또는 False 를 가진다. 10 | 이거 자체로 if 나 while 문의 조건식에 넣을 수도 있다. 11 | 근데 불 자료형을 쓰지않아도 참과 거짓이 이미 구분되어 있는데, 12 | [], (), {}, 0, "", None 같은 것은 자료형에서 비여있는 형태로 거짓으로 인식하고, 13 | 반대로 비여있지 않거나, 0이 아닌 값을 가지면 참으로 인식한다. 14 | bool()함수의 인자로 값을 넘기면, 그 값이 참또는 거짓으로 인식하는지 판별할 수 있다. 15 | 16 | 그리고 이러한 불 자료형으로 반환되는게, 비교, 논리연산자다. 17 | (연산자들을 별개로 묶어서 코드를 분할했다.) 18 | """ 19 | print(bool([]), bool({}), bool(0), bool(""), bool(None)) 20 | print(bool([1]), bool({1}), bool(-3), bool("wow"), bool(0.1)) 21 | 22 | print(not None) 23 | -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/1/02-2-파이썬기본연산자.py: -------------------------------------------------------------------------------- 1 | """ 2 | 블로그포스팅 : https://bodhi-sattva.tistory.com/62 3 | """ 4 | 5 | a = 10 6 | b = 6 7 | print(a + b, a - b, a * b, a / b, a ** b, a // b, a % b) 8 | """산술연산자 9 | 사칙연산(+,-,/,*)말고도 제곱(**), 몫(//), 나머지(%)연산자도 있다. 10 | """ 11 | 12 | a += 10 13 | print(a) 14 | a -= 10 15 | print(a) 16 | a *= 2 17 | print(a) 18 | a /= 2 19 | print(a) 20 | a **= 2 21 | print(a) 22 | a //= 10 23 | print(a) 24 | a %= 2 25 | print(a) 26 | """대입연산자 27 | 익히 쓰는 단순대입(=) 오른쪽피연산자를 왼쪽 피연산자에 대입(copy) 28 | 산술연산자가 붙어 두 피연산자를 산술연산한 후의 값을 대입하는 연산자다. 29 | """ 30 | 31 | print(a > b, a < b, a >= b, a <= b, a == b, a != b, a > b > 1) 32 | """비교연산자 33 | 둘의 관계를 부등호나 등호로 확인해서 참인지 거짓인지를 반환하는 연산자다. (한번에 두 비교연산자도 사용가능하다) 34 | """ 35 | 36 | b1 = 0b1010 # 2진수 1010 37 | b2 = 0b0101 # 2진수 0101 38 | print(b1 & b2) 39 | print(b1 ^ b2) 40 | print(b1 | b2) 41 | print(~b1) 42 | print(b1 << 1) 43 | print(b1 >> 1) 44 | """비트연산자 45 | 게이트회로에서 봤던 불대수 논리함수(and, or, not, xor)를 비트단위로 수행하는 연산자다. 46 | """ 47 | 48 | bo1 = True 49 | bo2 = False 50 | print(bo1 and bo2) 51 | print(bo1 or bo2) 52 | print(not bo1) 53 | """논리연산자 54 | 논리함수(and. or, xor)를 비트단위가 아닌, 값과 값 단위로 수행하는 연산자다. 55 | &&, ||, ^^같은 형식과 다르게 영어로 and, or, not을 사용한다. 56 | """ 57 | 58 | yo = 1 59 | print(yo in [1, 2, 3]) 60 | print(yo not in [1, 2, 3]) 61 | print([1, 2] in [1, 2, 3]) 62 | """맴버연산자 63 | in 으로 왼쪽 값(요소)이 오른쪽 값(요소들)중에 있는지 참거짓으로 반환한다. 64 | """ 65 | 66 | n1 = 256 67 | n2 = 256 68 | print(id(n1), id(n2)) 69 | print(n1 is n2) 70 | print(n1 is not n2) 71 | """식별연산자 72 | is, is not 으로 둘이 같은지 아닌지를 구분한다. 정확히는 둘의 메모리 위치를 비교한다. 73 | """ 74 | 75 | t1 = 4 76 | t2 = 5 77 | print("짝수" if t1 % 2 == 0 else "홀수") 78 | print("짝수" if t2 % 2 == 0 else "홀수") 79 | """삼항연산자 80 | [참일때값] if [조건문] else [거짓일때값] 으로 if else 문과 같은 분기문을 구현할 수 있다. 81 | 차이점은 if else 에 따른 실행문이 아니라, 지정해준 값이 반환된다. 82 | """ 83 | -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/1/03-1-문자열자료형, 연산자.py: -------------------------------------------------------------------------------- 1 | """ 2 | 블로그 포스팅 : https://bodhi-sattva.tistory.com/64 3 | """ 4 | 5 | s1 = "hi" 6 | s2 = 'five' 7 | s3 = '''ㅋ''' 8 | s4 = """이것이 문자열이다.""" 9 | print(s1, type(s1), s2, type(s2), s3, type(s3), s4, type(s4)) 10 | """문자열 자료형 11 | 문자열 자료형은 str 하나 밖에 없는데 활용법과 문법이 어마무시하다. 12 | 심지어 문자열의 선언 방법도 4가지나 된다. 13 | 물론 이런 선언 방법으로 14 | 1. 문자열 선언을 중복되지 않는 선언방법으로 문자열 안에 '또는 "를 포함시킬 수 있으며 15 | (물론 \', \"와 같은 방법으로 해도 문제는 없다.) 16 | 2. 특히 연속으로 따옴표를 사용한 것은 한줄이 아닌 여러줄을 개행문자(\n)없이 사용할 수 있다. 17 | """ 18 | 19 | s5 =''' 20 | 이렇게 21 | 개행문자 없이도 22 | 여러줄을 사용할 수 있습니다.''' 23 | print(s5) 24 | """ 25 | 이렇게 말이다. 그리고 문자열 선언으로 # 말고 지금 이런 글처럼, 26 | 3. 여러줄 주석으로도 사용할 수도 있다. 27 | 그 원리는 문자열을 변수에 넣지 않고, 이렇게 쓰기만 하는 것은 컴파일러가 무시해버리기 때문이다. 28 | 이와 반대로 문자열을 개행없이 그대로 이어붙이고 싶다면 29 | """ 30 | 31 | s6 = "떨어졌지만 \ 32 | 사실 붙어있습니다" 33 | s7 = "이것도""그렇구요" 34 | print(s6, s7) 35 | """ 36 | 와 같이 '\'를 사용하거나 "" 을 사용해서 이어붙일 수 있다. 37 | 그리고 문자열에서 사용할 수 있는 이스케이프(특수)문자는 c언어와 동일하다. 38 | """ 39 | 40 | print(s1 + s2) 41 | print(s3 * 5) 42 | print(len(s4)) 43 | """문자열 연산자: 44 | 문자열은 독특하게도 더하거나(연결) 곱하거나(반복) 길이만 반환할 수 있다. 45 | 그리고 이걸 응용해서 print('-' * 20) 과 같이 구분선 등을 간단하게 만들 수 있다. 46 | """ 47 | -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/1/03-2-문자열 인덱싱, 슬라이싱, 함수.py: -------------------------------------------------------------------------------- 1 | """ 2 | 블로그 포스팅 : https://bodhi-sattva.tistory.com/65 3 | """ 4 | 5 | no_char = "언젠가 파이썬 정리도 끝나겠지?" 6 | print(no_char[2], no_char[-4]) 7 | """인덱싱, 슬라이싱: 8 | 인덱싱(Indexing, 가리킴)과 슬라이싱(Slicing, 잘라냄)은 각각 문자열에서 한개 또는 여러개를 뽑아내는 방법이다. 9 | 인덱싱은 그중 1개의 값을 뽑아내는 것으로, (변수이름)[n] 과 같이 쓴다. 10 | [n]이라고 하면, 문자열의 인덱스 n 번째에 있는 값을 가리킨다. (참고로 인덱스는 0 ~ 문자열의개수-1 으로 차례대로 존재한다) 11 | 참고로 n가 음수라면, 문자열의 맨끝부터 거꾸로 해서 -n 번째에 있는 값을 가리킨다. 12 | """ 13 | print(no_char[:], no_char[3:], no_char[3:7], no_char[4:7:2], no_char[6:3:-2]) 14 | """ 15 | 슬라이싱은 여러개의 값을 뽑아내는 것으로, 다양한 방법으로 쓸 수 있는데, 16 | (변수이름)[:] 비워놓으면 끝을 의미한다. 따라서 맨처음부터 맨끝까지 이다. 17 | (변수이름)[n:] n번째 인덱스부터 맨 끝까지 가리킨다. 18 | (변수이름)[n:m] n번째 인덱스부터 m-1번째 인덱스까지 가리킨다. 19 | (변수이름)[n:m;s] n번째 인덱스부터 m-1번째 인덱스까지 s 간격만큼 건너뛰어서 가리킨다. 20 | * 여기서 특징은 n <= 출력되는 문자열 인덱스 < m 라는 점이다. [:m]를 해도 인덱스 m-1까지 문자열이 출력된다. 21 | 와 같다. 인덱싱처럼 n, m, s가 음수일 수도 있고, 특히 s(간격)이 음수면, 거꾸로 진행한다. 22 | """ 23 | 24 | 25 | """문자열 내장 함수: 26 | 문자열 변수에 .을 붙이고 특정 함수를 달면, 문자열만 있는 함수를 실행할 수 있다. (이걸 내장 함수라 한다) 27 | 대표적이고, 자주쓰이는 함수는 아래와 같다. 28 | 확실하게 알아볼 셈이면 03-3을 확인하자. 29 | """ 30 | ex = "Hello! Omm... PPAP?" 31 | print(ex.count('.')) 32 | # 인자 값(문자, 문자열)이 문자열에 몇번 쓰이는지 숫자 반환 33 | 34 | print(ex.find('e')) 35 | # 인자 값(문자, 문자열)이 가장 처음 쓰인 문자열 인덱스를 반환 (없을시 -1 반환) 36 | 37 | print(ex.index('e')) 38 | # find 와 같은 역할 (찾을려는 것이 없으면 오류 발생) 39 | 40 | print('-'.join(ex)) 41 | # 인자 값(리스트, 문자열)에 점 앞에 있는 문자, 문자열(ex> '-')을 요소 사이사이에 삽입 42 | 43 | print(ex.upper()) 44 | # 문자열의 문자를 모두 대문자로 변환 45 | 46 | print(ex.lower()) 47 | # 문자열의 문자를 모두 소문자로 변환 48 | 49 | print(ex.replace('PPAP', '샌즈')) 50 | # 문자열의 모든 첫번째 인자 값(문자, 문자열)을 두번째 인자 값으로 수정 51 | 52 | print(ex.split(' ')) 53 | # 문자열을 인자 값(문자, 문자열(괄호 비워놓을시 화이트 스페이스가 인자))을 기준으로 나누어서 리스트로 반환 54 | 55 | ex2 = " 널널 하쥬? " 56 | print(ex2.lstrip(), "<문자열 끝") 57 | # 왼쪽 공백 삭제 58 | 59 | print(ex2.rstrip(), "<문자열 끝") 60 | # 오른쪽 공백 삭제 61 | 62 | print(ex2.strip(), "<문자열 끝") 63 | # 양쪽 공백 삭제 64 | 65 | -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/1/03-6-시퀀스자료형공통문법.py: -------------------------------------------------------------------------------- 1 | print("주석 참고") 2 | """ 3 | 시퀀스자료형(리스트, 튜플, 문자열, range())의 공통되는 문법 4 | 5 | 값 in 시퀀스객체 # 시퀀스 객체에 특정 값이 있는지 확인 6 | 값 not in 시퀀스객체 # 시퀀스 객체에 특정 값이 없는지 확인 7 | 8 | 시퀀스객체1 + 시퀀스객체2 # 시퀀스 객체를 서로 연결하여 새 시퀀스 객체를 만듦 9 | 시퀀스객체 * 정수 # 시퀀스 객체를 특정 횟수만큼 반복하여 새 시퀀스 객체를 만듦 10 | 정수 * 시퀀스객체 # 시퀀스 객체를 특정 횟수만큼 반복하여 새 시퀀스 객체를 만듦 11 | 12 | len(시퀀스객체) # 시퀀스 객체의 요소 개수(길이) 구하기 13 | max(시퀀스객체) # 시퀀스 객체중 최대값인 요소 구하기 14 | min(시퀀스객체) # 시퀀스 객체중 최소값인 요소 구하기 15 | 16 | 인덱싱: 17 | 시퀀스객체[인덱스] # 시퀀스 객체의 요소에 접근 18 | 시퀀스객체[0] # 시퀀스 객체의 인덱스는 0부터 시작하므로 첫 번째 요소 19 | 시퀀스객체[-음수] # 인덱스를 음수로 지정하면 뒤에서부터 요소에 접근, -1은 뒤에서 첫 번째 20 | 시퀀스객체[인덱스] = 값 # 시퀀스 객체의 요소에 값 저장 21 | del 시퀀스객체[인덱스] # 시퀀스 객체의 요소를 삭제 22 | 23 | 슬라이싱: 24 | 시퀀스객체[시작인덱스:끝인덱스] # 지정된 범위의 요소를 잘라서 새 시퀀스 객체를 만듦 25 | 시퀀스객체[시작인덱스:끝인덱스:인덱스증가폭] # 인덱스 증가폭을 지정하면 해당 값만큼 인덱스를 증가시키면서 요소를 가져옴 26 | 27 | 시퀀스객체[:끝인덱스] # 시작 인덱스를 생략하여 객체의 처음부터 끝 인덱스 - 1까지 가져옴 28 | 시퀀스객체[시작인덱스:] # 끝 인덱스를 생략하여 시작 인덱스부터 마지막 요소까지 가져옴 29 | 시퀀스객체[:] # 시작 인덱스와 끝 인덱스를 생략하여 객체 전체를 가져옴 30 | 31 | 시퀀스객체[0:len(시퀀스객체)] # len을 응용하여 객체 전체를 가져옴 32 | 시퀀스객체[:len(시퀀스객체)] # 시작 인덱스 생략, len을 응용하여 객체 전체를 가져옴 33 | 34 | 시퀀스객체[:끝인덱스:증가폭] # 객체의 처음부터 증가폭만큼 인덱스를 증가시키면서 끝 인덱스 - 1까지 요소를 가져옴 35 | 시퀀스객체[시작인덱스::증가폭] # 시작 인덱스부터 증가폭만큼 인덱스를 증가시키면서 마지막 요소까지 가져옴 36 | 시퀀스객체[::증가폭] # 객체 전체에서 증가폭만큼 인덱스를 증가시키면서 요소를 가져옴 37 | 시퀀스객체[::] # 객체 전체를 가져옴, 시퀀스객체[:]와 같음 38 | 39 | 시퀀스객체[시작인덱스:끝인덱스] = 시퀀스객체 # 범위를 지정하여 여러 요소에 값 할당 40 | 시퀀스객체[시작인덱스:끝인덱스:인덱스증가폭] = 시퀀스객체 # 증가폭만큼 인덱스를 건너뛰면서 할당 41 | 42 | del 시퀀스객체[시작인덱스:끝인덱스] # 특정 범위의 요소를 삭제(원본 객체가 변경됨) 43 | 44 | """ -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/1/04-1-리스트자료형, 연산자.py: -------------------------------------------------------------------------------- 1 | """ 2 | 블로그 링크 : https://bodhi-sattva.tistory.com/69 3 | """ 4 | 5 | list_1 = [1, 2, 3, 4, 5] 6 | list_2 = [] 7 | list_3 = list() 8 | list_4 = ['hi', 5] 9 | list_5 = [1, [2, [3, 4]]] 10 | print(list_1, list_2, list_3, list_4, list_5) 11 | """리스트(list): 12 | 리스트는 여러개의 객체들을 묶어서 하나로 나타낸 것으로, c언어의 배열과 비슷하다. 13 | 여기서 다른 트깅은 다른 자료형들이라도 하나의 리스트로 저장할 수 있다는 것이다. 14 | 그리고 다차원 리스트(리스트 안에 리스트를 만드는 것)도 할 수 있는데, 정적이지 않고 각 각 다른 길이를 가질 수 있다. 15 | 빈 리스트는 []로, 선언할 수 있고, list()로도 선언할 수 있다. (list()함수는 아래 참조) 16 | 17 | 리스트도 문자열처럼 연결(+), 반복(*) 및 길이 측정(len())이 가능하다. 18 | 인덱싱과 슬라이싱도 문자열과 같은 방식으로 할 수 있는데, 추가된 점은 다차원 리스트일시 가장 바깥 리스트에서 안쪽 리스트 순으로 19 | [n][m]과 같이 []를 여러번 사용해주어야 한다. 20 | """ 21 | li = [1, 2, 3] 22 | li[1] = '둘' 23 | del li[2] 24 | print(li) 25 | """ 요소 수정, 삭제: 26 | 인덱싱으로 가리킨 리스트의 요소를 수정, 삭제하는 문법은 위와 같다. 27 | 수정은 간단히 = 연산자를 사용하면 되고, 28 | 삭제는 'del 삭제할 요소'와 같이 하면 된다. 29 | """ 30 | lis = [1, 2, 3, 4, 5] 31 | lis[1:4] = ['오', '예', '스'] 32 | del lis[3:5] 33 | print(lis) 34 | """ 35 | 물론 슬라이싱한 요소들도 수정, 삭제가 가능하다. 36 | """ 37 | -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/1/05-2-(집합으로공약수구하기).py: -------------------------------------------------------------------------------- 1 | n, m = map(int, input().split()) 2 | a = {i for i in range(1, n+1) if n % i == 0} 3 | b = {i for i in range(1, n+1) if m % i == 0} 4 | divisor = a & b 5 | print(divisor) 6 | """ 7 | 집합연산(&)으로 공약수 구하는 코드 8 | """ 9 | -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/1/06-튜플자료형.py: -------------------------------------------------------------------------------- 1 | t1 = (1,) 2 | t2 = (1, 2) 3 | t3 = 1, 2, 3 4 | t4 = ('a', 'b', ('ab', 'cd')) 5 | t5 = tuple('ppap') 6 | t6 = tuple([1, 2, 3, 4]) 7 | print(t1, t2, t3, t4, t5, t6) 8 | """튜플(typle) : 9 | 리스트랑 비슷한데, 다른점이라면 튜플은 요소 값을 삭제, 수정할 수 없다.(읽기전용이다) 10 | 요소 값을 중간에 못바꿔서 리스트를 튜플대신에 많이 쓰지만, 튜플이 속도가 빠르덴다. 11 | tuple() 함수로 군집자료형(연속되는 값들)을 튜플자료형으로 변환할 수 있다. 12 | 13 | 생성하는 법이 독특한데, 리스트는 []가 테두린데, 튜플은 ()가 테두리다. 근데 ()없이도 생성이 가능하다. 14 | (왜냐면 괄호 없이 값을 콤마로 구분하면, 그걸 하나로 묶어서 튜플 객체로 생각한다.) 15 | 그리고 한개 요소에서는 ,를 뒤에 붙이는데, 왜그런지 생각해보니까 숫자, 문자열이랑 차별을 두는 거였다. 16 | (튜플을 선언할때 ()없이 생성가능하다 보니까 요소가 1개일때 비군집 자료형이랑 생성방식이 겹치게 된다.) 17 | t01 = 1 # type(t01) == int 18 | t02 = 1, # type(t02) == tuple 19 | 20 | 튜플도 시퀀스(순서가 있는 군집)자료형이기 때문에 아래 문법을 사용 가능하다. 21 | 인덱싱과 슬라이싱이 가능하다. 다차원 튜플도 된다. 22 | 그리고 기본연산인 +(더하기), *(곱하기)도 리스트처럼 된다. 23 | 리스트에서 봤던 내장함수도 튜플과 동일하다. 24 | """ 25 | 26 | 27 | def ppap(li): 28 | return li[0], li[-1] 29 | 30 | 31 | print(ppap("ppap!")) 32 | first, last = ppap("ppap!") 33 | print(first, last) 34 | """튜플에 대한 알쓸잡지: 35 | 함수의 반환 값이 위같이 여러개일 경우 튜플로 반환된다. 36 | 이걸 변수들에게 대입하면 각각 변수에 각각의 값이 들어간다. (해체 할당과 비슷하덴다) 37 | (a, (b,(c, d))) = (4,(3,(2,1))) 38 | 이렇게도 가능하다. 39 | """ 40 | a = '국' 41 | b = '밥' 42 | a, b = b, a 43 | print(a, b) 44 | ''' 45 | 예전에 신발끈공식으로 두 변수의 값을 바꿀때 temp 변수를 선언해서 바꿔줄 필요가 없다! 46 | 튜플을 이용해서 한줄로 해결 가능하다. 47 | ''' 48 | 49 | tp = (1, 3, 5, 7, 9) 50 | print(len(tp), max(tp), min(tp)) 51 | """ 튜플 내장함수, 메쏘드: 52 | 튜플 내장함수는, 리스트에서 사용했던 그대로 len(), max(), min()을 사용할 수 있다. 53 | 메쏘드는 다른자료형과 다르게 다행이도(?) .count(), .index()만 있다. 54 | """ 55 | 56 | print(tp.count(1), tp.index(1)) 57 | """ 58 | .count(), .index() 함수도 사실 리스트와 같이 사용할 수 있다. 59 | """ 60 | 61 | 62 | -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/1/08-print()함수와인자.py: -------------------------------------------------------------------------------- 1 | import sys 2 | 3 | print("뭔""차이여") 4 | print("뭔", "차이야") 5 | print("뭔" + "차인겨") 6 | """print()함수: 7 | c언어의 printf()함수 처럼, 파이썬에서 화면에 뭔가를 띄우려면 반드시 사용하는 함수는 print()다. 8 | 여기서 프린트에서 같은 따옴표로 묶은 문자열을 연달아 놓거나, +로 문자열 결합을 해준채로 출력하면 공백없이 나온다. (+로 숫자, 문자를 더하면 에러난다) 9 | 아니면 ,을 사용해서 한칸의 공백으로 다른 요소를 같이 출력할 수 있다. 10 | (문자열을 입맛에 맛게 출력하려면 문자열자료형에 붙인 설명을 참고해라) 11 | """ 12 | num = 1 13 | chars = "일은" 14 | print(chars, num) 15 | # print(chars + num) # 오류남! 16 | print(chars + str(num)) # 이렇게 같은 자료형으로 형변환 시켜서 + 해줘야 함 17 | """ 18 | 여기서 ,를 사용해서 여러개의 요소들을 print()에서 출력할 때, 인자 값을 추가해 줌으로 형식을 바꿀 수 있다. 19 | 요소에는 end=, sep=, file=, flush= 가 있다. 20 | """ 21 | 22 | print("바", '닐', "라") 23 | print("바", '닐', "라", sep='') 24 | print("바", '닐', "라", sep=".", end='\n') 25 | print("바", '닐', "라", file=sys.stdout, flush=False) 26 | """ 27 | sep= 에서는 요소 사이사이에 있는 틈에 무엇을 출력할지 정해주며, 기본값은 ' '(한칸 공백) 입니다. 28 | end= 에서는 print() 함수 마지막에 무엇을 출력할지 정해주며, 기본값은 '\n'(한줄 개행) 입니다. 29 | file= 에서는 출력될 방향을 설정하며, 기본값은 sys.stdout(표준 출력장치 = 모니터) 입니다. 30 | flush= 에서는 스트림(stream, 데이터 입출력 처리의 중간자)을 강제적으로 flush(버퍼상태의 데이터들을 모두 출력으로 날려버릴지) 설정하며, 31 | 기본값은 False 입니다. 32 | 33 | 위 코드처럼 sep= 으로 요소 사이의 출력을, end= 으로 요소 끝의 출력처리를 지정해줄 수 있기에 많이 써먹고 있습니다. 34 | file= 로는 위에서 코드를 쓰진 않았지만, 이걸로 file=(파일객체) 와 같이 한다면, open 했던 파일에 데이터를 보낼수 있습니다. 35 | flush= 는 sys.stdout.flush() 로도 할 수 있는데, 버퍼를 비우는(flush) 수행을 해줍니다. (3.0버전부터 지원한다네요) 36 | 근데 file= 이랑 flush= 는 다른 함수로 대체해서 쓰는것 같아서 그렇게는 안쓰는 것 같기도 합니다.. 37 | """ -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/2/#1-터틀그래픽스 모듈.py: -------------------------------------------------------------------------------- 1 | import turtle as t 2 | """ 3 | 터틀(turtle) 그래픽스 모듈: 4 | 파이썬에서 지원하는 기본 모듈로, 5 | 거북이가 기어가는 모양대로 그림을 그려줌. 6 | 7 | .shape() 함수: 8 | 그림을 그리는 아이콘의 모양을 설정 9 | 'classic' (기본값), 'triangle' (삼각형), 'circle'(원), 'arrow'(화살표), 'turtle'(거북이)... 10 | .shape()만 쓰면, 현재 모양을 문자열로 반환함. 11 | 12 | .forward() 함수 (=.fd()) 13 | 거북이 머리방향으로 입력한 인자값 만큼 이동 14 | 15 | .backward() 함수 (=.bk()) 16 | 거북이 꼬리방향으로 입력한 인자값 만큼 이동 17 | 18 | .right() 함수 (=.rt()) 19 | 거북이를 오른쪽으로 입력한 인자값(도)만큼 회전 20 | 21 | .left() 함수 (=.lf()) 22 | 거북이를 왼쪽으로 입력한 인자값(도)만큼 회전 23 | 24 | .setheading() 함수 25 | 인자값 각도롤 회전, (오른쪽 기준, x축 양의 방향을 0도(기준)으로 시계 반대방향의 각을 말함) 26 | 27 | .circle() 함수 28 | 인자값 만큼의 반지름을 가지는 원을 그림 29 | 30 | .color(펜색깔, 칠하는색깔) 함수 31 | 색이름을 인자값으로 사용('red', 'blue', 'green'...) (기본값 검정) 32 | (웹 색상(#RRGGBB)를 이용해서 세밀한 색상을 인자값으로 쓸 수 있음) 33 | 인자값이 하나일 경우 그 색으로 펜과 칠하는 색깔을 통일함. 34 | 35 | .pencolor() 함수 36 | 색이름을 인자값으로, 도형을 그릴때의 선 색깔을 지정 37 | 38 | .fillcolor() 함수 39 | 도형 내부를 칠하는 색을 지정 40 | 41 | .turtle.speed() 함수 42 | 움직이는 속도를 조절 (1이 느림 ~ 10이 빠름, 10을 넘어서면 0으로 취급(0은 가장빠름)) 43 | 44 | 외에도 메쏘드가 너무 많다... 45 | https://m.blog.naver.com/PostView.nhn?blogId=python_math&logNo=221214856867&proxyReferer=https%3A%2F%2Fwww.google.com%2F 46 | 47 | 링크로 축약한다. 48 | """ 49 | t.shape('turtle') 50 | n = int(input("n각형의 각 : ")) 51 | for i in range(n): 52 | t.right(360 / n) 53 | t.forward(800 / n) 54 | 55 | t.mainloop() 56 | """ 57 | 위는, 각을 입력받아서 n각형을 그리는 코드 58 | * 파이참같은 환경에서는 터틀 그래픽스 창이 열렸다가 바로 닫히기도 하는데, 창을 유지시키기 위해 .mainloop() 함수를 마지막에 덧붙임 59 | """ -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/2/#2-(터틀그래픽스로n각별그리기).py: -------------------------------------------------------------------------------- 1 | import turtle as t 2 | 3 | t.shape('turtle') 4 | t.speed('fastest') 5 | 6 | n, length = map(int, input("별의 꼭짓점 개수와 선의 길이를 입력하세요(둘은 공백으로 구본해서) : ").split()) 7 | for i in range(n): 8 | t.forward(length) 9 | t.right((360/n) * 2) 10 | t.forward(length) 11 | t.left(360/n) 12 | 13 | t.mainloop() 14 | 15 | """ 16 | n개의 꼭짓점을 가지는 별을 그리는 코드 17 | """ -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/2/#3-단순복사vs얕은복사vs깊은복사.py: -------------------------------------------------------------------------------- 1 | import copy 2 | """ 3 | 단순복사 vs 얕은복사(shallow copy) vs 깊은복사(deep copy) 4 | """ 5 | print("단순복사") 6 | a = b = [1, 2, 3] 7 | # 집합(set), 리스트, 딕셔너리 같이 값을 수정할수 있는(불변하지 않는) 자료형은 마찬가지. 8 | print(a, b) 9 | del a[0] 10 | print(a, b) 11 | 12 | """단순복사: 13 | 동일한 주소를 가지는 객체를 복사함. 14 | 파이썬에서 모든 값은 자료형 객체이며, 변수는 객체를 참조하는 것이다. 15 | 그리고, = 은 객체를 변수로 접근(참조)하게 해준다. (할당) 16 | 그래서 변수1 = 변수2 같이하면, 변수1에서도 변수2가 가리키는 값을 똑같이 가리킬수 있는 것이다. 17 | 그렇기에 변수2가 가리키는 값을 수정하면, 수정한 객체가 변수2와 변수1 모두 같이 가리키는 값이기에, 변수1도 변한다. 18 | 19 | (대신에 불변하는 값, immutable(숫자자료형, 불자료형, 튜플(읽기전용자료형), 문자열(수정불가능))은 예외, 20 | 값을 수정하면, 그 객체가 변할 수가 없기에(불변), 수정하려는 새로운 객체(값)을 할당하게 된다.) 21 | """ 22 | 23 | print("\n얕은복사") 24 | kiki = [1, 2, 3] 25 | kuku = kiki.copy() 26 | print(kiki, kuku) 27 | del kiki[0] 28 | print(kiki, kuku) 29 | 30 | eo = [1, [2, 3, 4]] 31 | ei = eo.copy() 32 | print(eo, ei) 33 | del eo[1][1] 34 | print(eo, ei) 35 | """얕은복사: 36 | 수정가능한 자료형에서 메쏘드로 존재하는 .copy()메쏘드, 37 | 사실 얘의 역할은 얕은복사한 값을 반환한다. 38 | 얕은복사는 단순복사처럼 1개의 객체를 주는 것이 아니라, 1개의 객체를 복제해 2개로 만들어 넘겨준다. 39 | 대신에 표면적인(복합객체라고 합니다)객체 틀만 복사해서 주기에, 중첩리스트, 딕셔너리일 경우에 40 | 표면적인 리스트 안에 있는 내부리스트(내부객체라고 합니다.)는 2개로 복제하지 않는다. (참조객체) 41 | 그래서 다차원에서 얕은복사를 하면, 내부객체들은 제대로 복사할 수 없다. 42 | """ 43 | 44 | print("\n깊은복사") 45 | yeo = copy.deepcopy(eo) 46 | print(eo, yeo) 47 | del eo[1][0] 48 | print(eo, yeo) 49 | """깊은복사: 50 | copy 모듈의 .deepcopy()함수로 깊은복사한 값을 반환할 수 있다. 51 | 깊은복사는 얕은복사에서 1차적인 리스트들만 복사하는 수준에서 벗어나, 객체 전체를 복사해준다. 52 | 따라서 중첩리스트, 딕셔너리의 2차, 3차적인 내부객체도 모두 2개로 복제해서 넘겨준다. (참조하는 것따윈 없다) 53 | """ 54 | 55 | print("\niu(이유)") 56 | huhu = [1] 57 | huhu.append(huhu) 58 | print(huhu) 59 | print(huhu.copy()) 60 | print(copy.deepcopy(huhu)) 61 | -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/2/#4-(지뢰찾기).py: -------------------------------------------------------------------------------- 1 | x, y = map(int, input().rstrip().split()) 2 | mine_map = [] 3 | for i in range(x): 4 | mine_map.append(list(input())) 5 | 6 | for i in range(x): 7 | for j in range(y): 8 | if mine_map[i][j] is not '*': 9 | around = 0 10 | if i > 0: 11 | around += (1 if mine_map[i-1][j] is '*' else 0) 12 | if j > 0: 13 | around += (1 if mine_map[i-1][j - 1] is '*' else 0) 14 | if j < x-1: 15 | around += (1 if mine_map[i-1][j + 1] is '*' else 0) 16 | if i < x-1: 17 | around += (1 if mine_map[i+1][j] is '*' else 0) 18 | if j > 0: 19 | around += (1 if mine_map[i+1][j - 1] is '*' else 0) 20 | if j < x-1: 21 | around += (1 if mine_map[i+1][j + 1] is '*' else 0) 22 | if j > 0: 23 | around += (1 if mine_map[i][j-1] is '*' else 0) 24 | if j < x-1: 25 | around += (1 if mine_map[i][j+1] is '*' else 0) 26 | mine_map[i][j] = around 27 | 28 | for col in mine_map: 29 | for cell in col: 30 | print(cell, end='') 31 | print() 32 | 33 | """ 34 | 1시간컷,, 35 | 나는 아직도 코딩보단 삽질을 더 잘한다. 36 | """ -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/2/0-파이썬제어문_기초함수.md: -------------------------------------------------------------------------------- 1 | ## 파이썬의 제어문_기초함수 2 | 3 | 파이썬의 제어문인, if문과 for, while문에 대해서, 4 | 그리고 여기서 활용되는 pass, continue, break와 range(), enumerate()함수로 5 | 제어문을 더 활용도 높게 쓰는 방법에 대해서 정리했습니다. 6 | 7 | 그외에도, map()함수등 기초적인 함수를 다루고, 8 | 9 | 파이썬 스타일의 별찍기 예제도 정리했고, 10 | 11 | 마지막으로 함수에 대해, 간단한 기초를 알아보도록 했습니다. 12 | -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/2/01-map()함수.py: -------------------------------------------------------------------------------- 1 | """ 2 | map() 함수는 iterable(반복가능한 객체, ex> list, dict, ... )의 데이터들을 3 | 하나 하나의 데이터로 쪼개서 그 데이터를 전달받은 방법으로 변환해서 다시 데이터들로 반환하는 함수다. 4 | ex)""" 5 | list_a = [1, 2, 3] 6 | a, b, c = map(str, list_a) 7 | print(a, "의 타입:", type(a), b, "의 타입:", type(b), c, "의 타입:", type(c)) 8 | 9 | """(map 동작 구조) 10 | 11 | 데이터들(인자) 1 ->(처리)-> '1' 데이터들(반환) 12 | [1, 2, 3] -> 2 ->(처리)-> '2' -> ['1'. '2', '3'] 13 | 3 ->(처리)-> '3' 14 | 15 | 형식은 map(변환할 형식, 변환할 값들) 과 같으며 16 | 변환할 형식은 함수, 자료형 같은 인자가 들어갈 수 있고, 17 | ex)""" 18 | def func(x): 19 | return x * 2 20 | 21 | 22 | print(list(map(func, [1, 2, 3]))) 23 | # -> [2, 4, 6] 변환에 함수를 사용 24 | """ 25 | 변환할 값은 리스트나 dict 같은 인자가 들어갈 수 있다. 26 | ex)""" 27 | x = {1: 10, 2: 20, 3: 30} 28 | print(list(map(str, x))) 29 | # -> ['1', '2', '3'] dict 의 key 값을 사용 30 | print(list(map(str, [x[i] for i in x]))) 31 | # -> ['10', '20', '30'] dict 의 value 값을 사용 32 | 33 | 34 | """ 35 | map()함수에 변환할 객체를 여러개 사용할 수도 있다. 36 | 람다표현식이랑 주로 합해서 사용하는데(3>4 람다표현식응용 참고) 변환할 객체가 제한이 없다. 37 | """ 38 | a = [1, 2, 3, 4] 39 | b = [4, 3, 2, 1] 40 | print(list(map(lambda a1, a2: a1+a2, a, b))) 41 | c = [10, 20, 30, 40] 42 | d = reversed(c) 43 | print(list(map(lambda b1, b2, b3, b4: b1+b2+b3+b4, a, b, c, d))) 44 | -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/2/02-1-range()함수.py: -------------------------------------------------------------------------------- 1 | sum = 0 2 | for i in range(1, 11, 2): 3 | # 반복문은 03-2에서... 4 | # i -> 1, 3, 5, 7, 9 5 | sum += i 6 | print(sum) 7 | # -> 25 8 | """range()함수: 9 | range()함수는 10 | 11 | range(마지막 값) 처음값 = 0, 간격 = 1 12 | range(처음값, 마지막 값) 간격 = 1 13 | range(처음값, 마지막 값, 간격) 14 | 15 | 과 같은 형식으로 간격(공차)만큼 연속되는 값(등차수열)을 차례대로 반환하는 함수다. 16 | 처음값에서 시작해서, 마지막 값-1까지 생성한다.(마지막 값은 포함하지 않음) 17 | """ 18 | n = 10 19 | for i in range(1, n+1): 20 | print(i, end=' ') 21 | print() 22 | # 1~n(10)까지 range(범위) 출력 23 | """ 24 | 간격이 음수일 경우 증가가 아니고 감소하는 방향이 된다. 25 | """ 26 | n = 10 27 | for i in range(n, 0, -1): 28 | print(i, end=' ') 29 | # n(10)~1까지 range(범위) 출력 30 | -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/2/02-2-enumerate()함수.py: -------------------------------------------------------------------------------- 1 | lis = [1, 1, 2, 3, 5, 8, 13, 21] 2 | for li in enumerate(lis): 3 | print(li, end=' ') 4 | print() 5 | """enumerate() 함수: 6 | for li in lis: 7 | 라고 하면 리스트의 원소들을 차례대로 li 에 넣어서 원소들이 모두 끝나면 반복문이 끝나는데, 8 | enumerate(열거하다)의 함수를 사용하면, 리스트의 인덱스와 원소 모두 사용할 수 있다. 9 | lis.index(li) 같이 보기도, 쓰기도 힘들게 원소값의 인덱스를 다룰 필요가 없는 것이다. 10 | enumerate()는 인자값으로 군집자료형(문자열, 튜플, 리스트)를 전달받으면, 인덱스와 요소 값을 차례대로 튜플로 반환한다. 11 | (딕셔너리를 인자로 하면, 키 인덱스와 키 값을 반환한다. 아쉽...) 12 | """ 13 | for index, num in enumerate(lis): 14 | print(index, "번째 : ", num, sep='', end=' ') 15 | """ 16 | 튜플자료형에서 해체할당 같이 튜플을 각각의 변수로 할당하는 문법이 가능한데, 17 | 그걸 활용해서 위같이 좀더 보기쉽게 표현할 수 있다. 18 | """ -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/2/03-1-조건문 if.py: -------------------------------------------------------------------------------- 1 | a, b = map(int, input("a와 b를 입력하세요: ").split(' ')) 2 | if a > b: 3 | print(a*b) 4 | else: 5 | print(b-a) 6 | """ if else: 7 | 조건문은 c언어 처럼 if 문을 사용할 수 있다. switch case 문은 없다. 8 | (대신에 딕셔너리(dic)을 사용한 함수로 구현가능하다.) 9 | 추가로 else if 문은 파이썬에서 elif 로 표현한다. 10 | """ 11 | -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/2/03-2-반복문 for, while + pass, continue.py: -------------------------------------------------------------------------------- 1 | for i in range(1, 10): 2 | print(i) 3 | """반복문: 4 | 반복문으로는 while 문과 for 문이 있다. 5 | for 문은 유용하고 구조도 보기쉬운데, 여기서 같이 쓰이는 함수가 range 다. 6 | for i in [1,2,3]: 7 | 과 같은 코드는 []같은 iterable(반복가능한 객체)의 요소(1, 2, 3)를 처음부터 끝까지 i라는 변수로 뽑아내면서 for 문의 실행문을 반복한다. 8 | 여기서 리스트 요소를 간편하게 range()함수를 사용해서 나타낼 수 있다. 9 | """ 10 | j = 0 11 | while j <= 10: 12 | print(j) 13 | j += 1 14 | """ 15 | while 문도 있는데, c언어 에서와 같다. 16 | 그리고 반목문과 조건문에서 쓰이는 예악어들도 있는데, break, continue 추가로 pass 도 있다. 17 | break 는 가까운 반복문을 탈출 하고, 18 | pass 와 continue 모두 아래 실행문을 무시하고 건너뛰는데, 이때 둘의 차이점은 19 | pass 는 다음 루프를 실행시키지 않지만, continue 는 다음 루프로 넘어간다. 20 | """ 21 | n = 0 22 | while True: 23 | n += 1 24 | if n > 5: 25 | print("break!") 26 | break 27 | print(n) 28 | # break 문 29 | 30 | pas = True 31 | for i in range(1, 3): 32 | if pas: 33 | print("pass 전 i값: ", i) # -> 1 34 | pas = False 35 | pass 36 | print("pass 후 i값: ", i) # -> 1 37 | break 38 | # pass 문 39 | 40 | con = True 41 | for i in range(1, 3): 42 | if con: 43 | print("continue 전 i값: ", i) # -> 1 44 | con = False 45 | continue 46 | print("continue 후 i값: ", i) # -> 2 47 | break 48 | # continue 값 49 | 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/2/04-리스트내포.py: -------------------------------------------------------------------------------- 1 | data = [1, 2, 3, 4] 2 | print(data, [n+1 for n in data], [n for n in data if n % 2 is 0], sep='\n', end="\n"*2) 3 | """ 리스트 내포: 4 | 리스트 컴프리헨션(list comprehension), 리스트 내장, 리스트 축약, 리스트 해석이라고도 하는데, 5 | 리스트 안에 for 반복문이나 if 조건문을 사용하는 파이썬만의 리스트 표현식이다. 6 | 7 | * [n+1 for n in data] 8 | for 반복문을 복습하자면, 반복되는 여러가지 요소들(data)에서 요소를 하나하나 차례대로 변수(n)에 가져와서 반복문 아래서 쓰는 과정이였는데, 9 | 리스트 내포는 요소들에서 가져온 요소가 있는 변수(n)을 맨 앞에 위치시켜 반환한다. 이때 n에 산술연산을 덧붙이면, 변환된 상태로 반환된다(n+1). 10 | 반환된 요소들이 모여서 리스트가 만들어진다. 11 | 12 | * [n for n in data if n % 2 is 0] 13 | for 문으로 data 를 가져와 차례대로 n 변수에 가져오는 것은 동일한데, if 조건문 뒤에 붙은 조건식이 거짓이면 반환하지 않고 참인 경우에만 반환한다. 14 | 반환된 요소들끼리 리스트가 만들어지는 것이다. 15 | """ 16 | 17 | print([n for n in [1, 2, 3]], [n for n in (1, 2, 3)], [n for n in range(1, 4)], [n for n in "123"], sep='\n') 18 | print([n for n in {1: '일', 2: '이', 3: '삼'}], [n for n in {1, 2, 3}], sep='\n') 19 | 20 | print([i for i in enumerate([1, 2, 3])], [i+n for i, n in enumerate([1, 2, 3])], sep='\n') 21 | """ 22 | range()함수를 활용해도 좋고, 기타 군집자료형들을 활용해도 된다. (딕셔너리는 역시 키 값이 차례대로 반환된다) 23 | enumerate()함수같이 인덱스와 값을 묶어 튜플로 반환하는 경우도 된다. 두 변수로 전달받아 활용해도 된다. 24 | """ 25 | -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/2/05-(대각선 출력하기).py: -------------------------------------------------------------------------------- 1 | v = [] 2 | for a in range(10): 3 | for b in range(10): 4 | if a is b: 5 | v.append(1) 6 | else: 7 | v.append(0) 8 | print(v) 9 | v.clear() 10 | ''' 11 | for 문과 range()함수, 리스트 함수를 응용한 코드다. 12 | 대각선 출력! 13 | ''' -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/2/06-1-리스트내포심화, 다중리스트내포.py: -------------------------------------------------------------------------------- 1 | # for x1, x2, y in [(0, 0, 0), (0, 1, 0), (1, 0, 0), (1, 1, 1)]: 2 | # print(x1, x2, '|', y) 3 | # """ 4 | # == for x1, x2 in [(0,0), (0,1), (1,0), (1,1)]: 5 | # print(x1, x2, '|', x1 and x2) 6 | # 의 코드로도 같은 실행 결과를 볼 수 있다. (리스트 안의 값이 두 변수의 and 연산 결과를 가지고 있다.) 7 | # """ 8 | test = [[1, 2], [3, 4], [5, 6]] 9 | print([n2-n1 for n1, n2 in test]) 10 | """리스트내포 심화: 11 | 위처럼 리스트내포로 한번에 여러값을 받을 수 있는 것쯤은 알것이다. 12 | 이건 아까 했던 거니까 그렇다 치고, 이젠 더 고급지게, 리스트 내포를 이중으로도 해보자. 13 | """ 14 | 15 | print([x*y for x in range(1, 10) for y in range(1, 10)]) # 이렇게 구구단의 모든 출력 내용을 파이썬에선 한줄로 소화해낼 수 있다. 16 | # 위의 한줄이 아래 세줄 코드와 동일하다. 17 | # for y in range(1, 10): 18 | # for x in range(1, 10): 19 | # print(x*y, end=' ') 20 | """이중 리스트내포: 21 | 말그대로, 이중 for 문처럼, for 문을 연달아서 두번 사용하는 것이다. 22 | 이 상황에서 오른쪽의 for 문이 바깥 반복문이고, 왼쪽의 for 문이 안쪽 반복문이다. 23 | 물론 여기서도 if 문을 혼합할 수 있다. 24 | """ 25 | 26 | print([x*y for x in range(1, 10) if x is not 1 for y in range(1, 11) if y is not 10]) 27 | """ 28 | 여기서 if 문은 자신의 왼쪽에 위치한 for 문에 속해있는 것같다. 29 | if 문까지 들어가니까 좀 보기 어려워 졌는데... 30 | """ 31 | 32 | print([x+y+z for x in range(1, 11) for y in range(1, 11) for z in range(1, 11)]) 33 | print([x+y+z+a for x in range(1, 11) for y in range(1, 11) for z in range(1, 11) for a in range(1, 11)]) 34 | print([x+y+z for x in range(1, 11) if x is not 10 35 | for y in range(1, 11) if y is not 10 36 | for z in range(1, 11) if z is not 10]) 37 | """ 38 | 삼중, 사중 리스트도 가능하고, 한술 더떠서 if 문을 넣는것도 된다. 39 | 이정도 되니까 한줄로 가독성좋던 리스트 내포가 복잡해졌다. 40 | 다중 리스트에서는 for 문 단위로 끊어주는 센스가 필요할 것 같다. 41 | """ 42 | print([a+b+c+d+e+f+g+h+i+j+k+l+m+n+o for a in range(1, 3) for b in range(1, 3) for c in range(1, 3) for d in range(1, 3) 43 | for e in range(1, 3) for f in range(1, 3) for g in range(1, 3) for h in range(1, 3) for i in range(1, 3) 44 | for j in range(1, 3) for k in range(1, 3) for l in range(1, 3) for m in range(1, 3) for n in range(1, 3) 45 | for o in range(1, 3)]) 46 | """ 47 | 근데 다중리스트에도 끝이 있을까? 15중첩 리스트내포까지 갔는데도 멀쩡하다. 슬슬 무서워 지는것 같아서 여기까지만 하고 그만둬야 겠다. 48 | """ -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/2/06-2-리스트내포확장.py: -------------------------------------------------------------------------------- 1 | print("딕셔너리내포") 2 | print({k*2: v*3 for k, v in {1: 1, 2: 2, 3: 3}.items()}) 3 | print({v: k for k, v in {1: '값', 2: '값2', 3: '값3'}.items()}) # 키와 값을 뒤집어서 응용 할 수도 있다. 4 | print({0: value for value in {1: '1', 2: '2', 3: '3'}.values()}) # 참고로 딕셔너리 내포에서 반복되는 값을 값으로 해도, 값은 1개만 들어간다. 5 | print({value: 0 for value in {1: '1', 2: '2', 3: '3'}.values()}) 6 | print({key: 0 for key in {1: '1', 2: '2', 3: '3'}.keys()}) 7 | 8 | print("집합내포") 9 | print({n for n in 'ppap!'}) 10 | print({n for n in 'ppap!' if n is not '!'}) 11 | 12 | print("튜플내포") 13 | print(tuple(n*2 for n in range(1, 6))) 14 | """ 15 | 리스트 내포는 사실 문자열을 뺀 모든 군집자료형(리스트, 딕셔너리, set, 튜플) 16 | 에서도 사용가능하다. 17 | 18 | 딕셔너리는 19 | {키: 값 for 키, 값 in 딕셔너리} 아니면, 20 | dict({키: 값 for 키, 값 in 딕셔너리}) 같은 형식이다. 21 | (딕셔너리 부분에는 달랑 {~~}같은 딕셔너리 객체가 들어가면 에러가 난다. 22 | 항상 뒤에, .items()로 키-값 쌍아니면, .keys()로 키들 아니면, .values()로 값들을 반환하게 해야한다.) 23 | if문을 활용할 수 있으며, if문의 조건식으로 키 또는 값을 활용하면 된다. 24 | 25 | 26 | set(집합)에서는 27 | {식 for 변수 in 반복가능한객체} 28 | set(식 for 변수 in 반복가능한객체) 같은 형식이다. 29 | 반복가능한 객체는 문자열이든 리스트, 튜플이든 다 올수 있다. 30 | 31 | 튜플에서는 32 | tuple(식 for 변수 in 반복가능한객체) 같이 사용한다. 33 | (식 for 변수 in 반복가능한객체) 같이 사용하면 제너레이터 표현식(튜플이 아니게)이 된다. 34 | """ -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/2/08-(회문판별코드).py: -------------------------------------------------------------------------------- 1 | word = input('단어를 입력하세요: ') 2 | 3 | oh = True 4 | for i in range(len(word) // 2): 5 | if word[i] != word[-1 - i]: 6 | oh = False 7 | break 8 | 9 | if oh == True: 10 | print("회문입니다") 11 | else: 12 | print("회문이 아닙니다") -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/2/09-(회문판별코드+).py: -------------------------------------------------------------------------------- 1 | words = input('단어를 입력하세요: ') 2 | 3 | rewords = ''.join(reversed(words)) 4 | print(words, rewords) 5 | if words == rewords: 6 | print("회문입니다") 7 | else: 8 | print("회문이 아닙니다") 9 | -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/2/10-(별찍기1-1).py: -------------------------------------------------------------------------------- 1 | # 별찍기 문제 (직각삼각형) 2 | n = int(input("높이를 입력하세요 : ")) 3 | for i in range(1, n+1): 4 | print("*"*i) 5 | -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/2/11-(별찍기1-2).py: -------------------------------------------------------------------------------- 1 | # 별찍기 문제 (직각삼각형 좌우대칭) 2 | n = int(input("높이를 입력하시오 : ")) 3 | for i in range(1, n+1): 4 | print(f"{'*'*i : >10}") 5 | # 포맷팅 f-string에서는 (출력할 것) or (출력할 것 : 출력 형식) 6 | -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/2/12-(별찍기1-3).py: -------------------------------------------------------------------------------- 1 | # 별찍기 문제 (직각삼각형 상하대칭) 2 | n = int(input("높이를 입력하시오 : ")) 3 | for i in range(n, 0, -1): 4 | print("*"*i) 5 | -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/2/13-(별찍기1-4).py: -------------------------------------------------------------------------------- 1 | # 별찍기 문제 (직각삼각형 상하좌우대칭) 2 | n = int(input("높이를 입력하시오 : ")) 3 | for i in range(n, 0, -1): 4 | print(f"{'*'*i : >10}") 5 | -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/2/14-(별찍기2).py: -------------------------------------------------------------------------------- 1 | # 별찍기 문제 (정삼각형) 2 | n = int(input("폭을 입력하시오 : ")) 3 | for i in range(1, n+1, 2): 4 | print(f"{'*'*i : ^10}") 5 | # print(f"{format('*'*(i), '^10'}") 과 같다. 6 | -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/2/15-(별찍기3).py: -------------------------------------------------------------------------------- 1 | # 별찍기 문제 (마름모) 2 | n = int(input("폭을 입력하시오 (홀수) : ")) 3 | for i in range(1, n+1, 2): 4 | print(f"{'*' * i : ^10}") 5 | for i in range(n-2, 0, -2): 6 | print(f"{'*' * i : ^10}") 7 | 8 | # .ljust(n) n만큼(n은 변수도 가능) 왼쪽 정렬 .ljust(n, 'X')하면 공백을 X로 채워줌 9 | # .center(n) 가운데 정렬 10 | # .rjust(n) 오른쪽 정렬 11 | -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/2/16-2-함수매개변수,반환값.py: -------------------------------------------------------------------------------- 1 | def sum_mul(a, b): 2 | return a + b, a * b 3 | # 튜플에서 배웠듯이 반환 값이 여러개면 튜플로 반환 4 | 5 | 6 | result = sum_mul(3, 4) 7 | # result = (7,12) 8 | sum, mul = sum_mul(3, 4) 9 | # sum = 7, mul = 12 10 | print(result, sum, mul) 11 | """함수의 매개변수(parameter), 반환값(return 문): 12 | 13 | 지금까지 파이썬 함수에서 괄호()안에 인자값을 넘겨주는 경우가 많았는데, 14 | 마찬가지로, 사용자가 만든 함수에서도 인자값을 넘겨받아서, 함수 안에서 활용 할 수 있음. 15 | 이를 파라미터(parameter, 매개변수라고 함. 16 | def 함수이름(매개변수): 17 | 코드 18 | 같이 함수를 정의할 때 괄호 안에 매개변수를 선언할 수 있다. (매개변수가 여러개도 가능하다.) 19 | 이러한 매개변수는 함수를 호출할 때 (ex> 함수이름(전달인자) ) 괄호안에 전달인자로 넘겨받은 인자값을 매개변수에 저장한다. 20 | 21 | ** 매개변수 = Parameter(파라미터) = 가인수(Dummy argument) = 형식매개변수 22 | ** 전달인자 = Argument(아규먼트) = 실인수(인수) = 실매개변수 23 | 24 | *** 인자, 인자값은 논란이 많은데, 인자가 전달인자의 줄임말로 쓰기도 하고, 인수(값)과 대조되기도 하는데, 25 | 나는 가볍게, 인수(값) vs 인자(변수)로 생각할련다. 인자 = 파라미터 vs 인자값 = 아규먼트 26 | 27 | 28 | 그리고 스크립트에서 함수로 값을 전달(인자)할 수 있듯이, 함수에서 거꾸로 스크리브로 값을 전달할 수 있다. 29 | 이렇게 함수가 종료되면서 가져오는, 반환하는 값을 반환 값이라 하며, return 문을 이용하면 된다. 30 | 31 | return 반환할 값(or변수) 32 | 와 같이 하며, 여러개를 사용할 수 있다. (여러개일 경우 튜플로 반환한다.)(파이썬은 괄호없이 값을 콤마로 구분하면 튜플이 된다.) 33 | return 을 만나면 함수는 반환하게 되는데, 이를 이용해 함수 중간에 return 문을 넣어 함수를 종료하고 반환 할 수 있다. 34 | (보통 분기문(if)의 조건식을 만족할 때 return 문으로 빠져나오게 한다.) 35 | 36 | 37 | 정리해서 함수의 흐름을 파악하자면, 38 | 함수는 호출 됬을 시에, 원래 파이썬 스크립트(코드)의 순서대로 읽다가, 호출되는 행에서 함수로 넘어가서, 39 | (인자값도 있다면, 함수로 넘어갈 때 같이 넘어감) 함수 부분에 있는 모든 코드를 순서대로 처리하고, 40 | return 을 만나거나, 함수의 마지막 코드까지 실행이 끝났으면 함수를 종료하고, 41 | (반환 값이 있으면 스크립트로 넘어갈 때 같이 넘어감) 아까 스크립트에서 함수를 호출했던 행으로 넘어감. 42 | """ -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/2/16-3-함수독스트링.py: -------------------------------------------------------------------------------- 1 | def remove_space(words): 2 | """전달받은 인자(문자열)의 앞 뒤 공백을 3 | 정리한 값을 반환합니다.""" 4 | return words.strip() 5 | 6 | 7 | s = input("문자열 입력 : ") 8 | print(remove_space(s)) 9 | 10 | print(remove_space.__doc__) 11 | help(remove_space) 12 | """함수 독스트링(docstring): 13 | 파이썬에선 함수정의 시에, 콜론: 바로 다음 줄에 """"""(문자열 주석)으로 함수에 대한 설명을 넣을 수 있는데, 14 | 이런 문자열을 독스트링(= 문서화 문자열, documentation strings, docstrings(독스트링))이라고 함. 15 | (대신 독스트링 위에 다른 코드가 오면 안됨, 독스트링이 가장 먼저) 16 | 17 | 물론 '', "", '''''' 을 활용해서 만들어도 되지만, PEP 8(코딩스타일규칙)에서는 큰따옴표 세개를 활용하는 걸 권장한다. 18 | 19 | 독스트링은 함수의 사용방법만 기록하고, 함수의 코드에는 영향을 주지 않는데, 20 | 함수이름.__doc__ 와 같이하면, 함수의 독스트링을 반환할 수 있다. 21 | 22 | 아니면 heip(함수이름)과 같이, help()함수에 함수이름을 넣으면, 23 | 인자값으로 받은 함수의 독스트링을 도움말 형태로 출력할 수 있다. 24 | """ -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/2/17-1-함수타입힌팅.py: -------------------------------------------------------------------------------- 1 | def count_length(word: str, num: int) -> int: 2 | return len(word) * num 3 | # 함수 타입 힌팅(Type hinting) 4 | # def 함수이름 (파라미터이름 : 파라미터타입) -> 반환타입: 5 | 6 | 7 | print(count_length("CHANIK", 5)) 8 | print(count_length([1, 2], 3)) 9 | """ 함수 타입 힌팅(Type hinting): 10 | python 3.5 버전에서는 코드 가독성에 도움을 주는, 파라미터, 아규먼트에 대한 타입 힌트가 도입됨. 11 | python 3.6 버전에서는 함수의 변수에서도 타입 힌트를 표시할 수 있음. 12 | 이것을 타입 힌트(Type hint), 그리고 힌트를 표시하는 것을 타입 힌팅(Type hinting)이라함. 13 | 14 | 이게 생긴 이유는 타입(자료형) 표시하는 표준적인 구문을 던져줘서 15 | 정적 분석을 쉽게하고, 리펙토링(소프트웨어를 이해하기 쉽게, 디자인을 개선시키는 기법)에도 도움을 줌. 16 | (그렇다고 파이썬이 정적 타입을 지향하는 것은 아님.) 17 | 18 | 근데 타입 힌트는 말그대로 힌트기능이다. (런타임에 영향을 주지 않는다) 19 | 다르게 말하면 코드에 붙은 주석 기능으로, 타입 힌트와 다른 타입(자료형)을 사용해도 코드가 에러나지는 않는다. 20 | (대신 개발환경에서 (파이참에선 노란색 바탕으로) 표시된다,) 21 | 22 | 23 | 함수의 독스트링을 __doc__로 가져왔듯이, 타입 힌트도 __annotations__로 가져올 수 있다. 24 | """ 25 | print(count_length.__annotations__) 26 | """ 27 | 함수의 매개변수에 타입 힌트를 붙일 때는, 함수의 정의 부분에서 괄호안에 28 | 29 | 함수이름(매개변수: 타입, 매개변수: 타입...): 30 | 와 같이 하며, 31 | 32 | 함수의 반환값에 타입 힌트를 붙일 때는, 함수의 정의 부분에서 콜론 바로 뒤에 33 | 34 | 함수이름(매개변수...) -> 타입 35 | 과같이 한다. 36 | 37 | 변수에 타입 힌트를 붙일 때도, 매개변수와 같이, 38 | 39 | 변수: 타입 = 값 40 | 과 같이 하면 된다. 41 | 그외에도 클래스 맴버 변수(변수와 같은 방법)나, 클래스 메쏘드의 매개변수(함수 매개변수와 같은 방법)에서도 타입 힌트를 적용 할 수 있다. 42 | """ 43 | 44 | """typing 모듈 45 | typing 모듈을 사용해서 좀더 다양한 타입 기능을 이용할 수 있다. 46 | 47 | 타입중에서 키워드를 쓰는 것도 가능하다. Any(아무 타입) NoReturn(반환값에서 쓰는데, 리턴이 안될때) 48 | 그외에도 타입을 별명으로 만들어서 사용하거나, 블로그에 찾으니까 넘쳐나는 정보가 있었다. (정리할 훗날을 기약하자) 49 | 50 | 참고 : 51 | https://lewisxyz000.tistory.com/35 52 | """ -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/2/17-3-함수의위치인수,키워드인수+딕셔너리언패킹.py: -------------------------------------------------------------------------------- 1 | def func(a, b, c): 2 | print(a, b, c) 3 | 4 | 5 | func(1, 2, 3) # 위치인수로 함수 호출 6 | func(a=3, b=2, c=1) # 키워드 인수로 함수 호출 7 | func(1, c=2, b=3) # 인수를 짬뽕(위치인수 + 키워드 인수)해도 가능 8 | """ 위치인수(positional argument), 키워드 인수(keyword parameter) 9 | 위치 인수는 함수를 호출할 때 받은 인수의 순서대로, 매개변수에 대입하는 것을 말함. 10 | 함수를 배우면서 지금까지 대부분 이 방법을 사용했으며, 11 | 인수의 순서가 중요하며, 순서가 바뀌면, 변수에 값이 뒤바껴 들어갈 수 있기에 조심해야함. 12 | 13 | 대신에 키워드 인수는 인수의 위치(순서)에 신경 쓸 필요 없음. 14 | 말그대로 키워드 인수는 인수에 키워드(이름)을 붙이는 기능으로, 함수를 호출할 때도 매개변수=인자값 형식으로 사용. 15 | 함수를 정의할 때는 따로 건들 필요 없음. 16 | (위치인수와 키워드 인수는 짬뽕해서 사용가능하다.) 17 | """ 18 | dic = {'a': '에이', 'b': '비', 'c': '씨'} 19 | func(*dic) 20 | func(**dic) 21 | """ 딕셔너리 언패킹: 22 | 지난번 시퀀스데이터에 *를 앞에 붙여 시퀀스데이터의 요소들을 언패킹 했었는데, 딕셔너리 자료형도 가능하다. 23 | *딕셔너리 와 같이하면, 키들만 언패킹한다. 24 | 그래서 딕셔너리는 *를 추가로 더 붙여서 **딕셔너리와 같이 해야 키:값 쌍들을 언패킹 할 수 있다. (이렇게 하면 가변+키워드 인수가 된다.) 25 | 26 | 함수의 정의에서 가변 키워드 인수(딕셔너리 인자들을)를 받아온다면, 언패킹을 활용하면 된다. **매개변수와 같이 한다. 27 | 28 | 매개변수 이름도 자유지만 관례적으로 KeyWord ARGumentS 를 줄여서 kwargs 를 사용한다. 29 | kwargs 는 딕셔너리 자료형으로 for문에서 반복 할 수 있다. (.items()함수 없으면 에러) 30 | 31 | 32 | 또한 마찬가지로 고정위치인수와 가변키워드인수를 함께 사용해도 되고, 33 | 가변위치인수와 가변키워드인수를 함께 사용해도 된다. 34 | """ 35 | 36 | 37 | def intro(name, **kwargs): 38 | """ 39 | :param name: 위치 고정 인수 40 | :param kwargs: 키워드 가변 인수 41 | """ 42 | print('<인적사항> \n이름:', name) 43 | for key, value in kwargs.items(): 44 | print(key, ":", value) 45 | 46 | 47 | intro("김동") 48 | intro("김동", **{'사는곳': '참나의직관속', '진짜사는곳': '대전'}) 49 | 50 | 51 | def prt(*args, **kwargs): 52 | """ 53 | :param args: 위치 가변 인수 54 | :param kwargs: 키워드 가변 인수 55 | """ -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/2/17-4-디폴트매개변수,매개변수초깃값.py: -------------------------------------------------------------------------------- 1 | def func(head="제목없음", body="설명없음"): 2 | print("제목:", head) 3 | print("설명:", body, sep='\n') 4 | print() 5 | 6 | 7 | func("이래도 되는가", "이렇게 하루종일 쉬면서 보내도 되는가") 8 | func("제목만 있음") 9 | func() 10 | """ 디폴트 매개변수 11 | 함수를 호출할 때 경우에 따라서 인수를 생략할 수 있게 하고 싶으면, 함수 매개변수에 초깃값을 지정하면 된다. 12 | 이를 디폴트 매개변수라고 하며, 이런 함수는 호출할때 인자값을 줘도 되고 없어도 된다. 13 | (언뜻보면 가변인자와 비슷하지만, 디폴트 매개변수는 아무것도 주어지지 않을 때, 초깃값을 가진다.) 14 | 15 | 이러한 디폴트 매개변수는 일반 변수랑 혼합해서도 사용할 수 있다. 16 | 대신에 일반변수가 디폴트 매개변수의 뒤에 올 수 없다. 그렇게되면 에러가 난다. 17 | """ 18 | 19 | 20 | def function(name, sex="알수없음", age="알수없음"): 21 | print("이름:", name) 22 | print("성별:", sex, "/ 나이:", age) 23 | 24 | 25 | function("김숭") 26 | function("김승", "남자") 27 | function("김송", "남자", '14살') 28 | -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/2/18-1-파일,파일모드,with_as문.py: -------------------------------------------------------------------------------- 1 | file = open('18.txt', 'w') 2 | file.write('예시 파일입니다.') 3 | file.close() 4 | 5 | """파일(file) 6 | 프로그래밍에서 중요한 부분중 하나가 파일처리임. 7 | 파이썬에서 파일은 파일객체로 사용할 수 있으며, open()함수로 파일을 열고, .close()메쏘드로 파일을 닫을 수 있음. 8 | 9 | 파일객체 = open(파일이름, 파일모드) 10 | 파일객체.close() 11 | 12 | 파일이름은 절대주소, 상대주소중 하나를 사용함. 13 | 그리고 파일의 이름과 확장자까지 들어가야함 (ex> '파일이름.txt') 14 | 15 | 16 | 파일모드는 종류가 다양함, 17 | 파일 : 18 | 읽기 전용 : 'r', 19 | 쓰기 전용 : 20 | 파일 덮어쓰기(새로만듬) : 'w', 21 | 파일 끝에 추가(덧붙이기) : 'a', 22 | 파일이 있으면 에러 : 'x' 23 | 파일 모드 오른쪽에 +를 붙이면 읽기/쓰기 혼합 (ex> 'r+', 'w+', 'a+' ...) 24 | 파일 모드 맨오른쪽에 파일 종류를 붙여서 종류 지정 가능(기본값 텍스트파일(t)) b: 바이너리 파일 (ex> 'wb', 'w+b', 'a+b' ...) 25 | 26 | 27 | 파일의 종류는 텍스트(text)파일과 바이너리(binary)파일이 있는데, 28 | 텍스트 파일은 문자를 기반으로 하는 코드값을 저장하는 형식으로, txt파일등이 해당됨. 29 | 이런 텍스트 파일은 문자열 개념을 그대로 사용할 수 있음. 30 | 31 | 바이너리(binary) 파일은 정보, 숫자값을 특별한 가공없이 저장하는 형식으로, 32 | jpg, png같은 그림파일, mp3같은 음악파일, exe같은 실행파일이 해당됨. 33 | 34 | 파이썬에서 파일을 열때 기본적으로 텍스트 모드로 읽고, b를 파일모드에 추가하면 바이너리 모드로 읽음. 35 | 36 | 37 | 그리고 파일객체를 사용해서 문자열을 읽고 쓸수 있음. (open()함수 뒤에, .close()메쏘드 전에 사용함) 38 | 39 | .write() 메쏘드로 파일에 문자열을 쓸수 있고, 40 | .read() 메쏘드로 파일에서 문자열을 읽은 값을 반환할 수 있음. (문자열로 반환) 41 | """ 42 | file = open('18.txt', 'r') 43 | s = file.read() 44 | print(s) 45 | file.close() 46 | 47 | """with as 문 48 | with open(파일이름, 파일모드) as 파일객체: 49 | 실행문 50 | 51 | 과 같은 형식으로 자동으로 파일 객체를 열고 닫을 수 있음. (파이썬 2.5 부터 추가된 기능) 52 | 이러한 것을 context manager(특정작업(여기선 파일)의 context(파일을 열고 닫고, 예외처리)를 관리하는 객체), 53 | 컨텍스트 매니저라고 함. (컨텍스트 매니저에 대해선 심화 내용이다 보니, 나중에 알아보도록 함. 6폴더의 04-9-1 참고.) 54 | """ 55 | 56 | with open('18.txt', 'r') as f: 57 | print(f.read()) 58 | print("이렇게 with as 문을 빠져나가면 파일객체가 자동으로 닫힙니다. (close()함수 필요없이)") 59 | -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/2/18-2-파일함수,피클링,언피클링.py: -------------------------------------------------------------------------------- 1 | import pickle 2 | 3 | lines = ["세\n", "로\n", "로\n", "보\n", "세\n", "요\n"] 4 | with open('19.txt', 'w', encoding='utf-8') as file: 5 | # 파일을 open 할 때, encoding(인코딩)인자를 추가하면, 인코딩을 utf-8(한글지원)등으로 지정할 수 있다. 6 | file.writelines(lines) 7 | 8 | """파일(file) 문자열 여러개 읽고 쓰기 9 | 반복문과 .write()를 활용해서 문자열을 여러줄도 쓸 수 있다. (개행문자 '\n'가 필수) 10 | 하지만 간편하게 .writelines()를 활용해서 문자열 여러개를 한번에 입력할 수 있다. (마찬가지로 줄을 바꿀때 개행문자 필수) 11 | 12 | 대신 두 방법의 특징은, 개행문자를 넣지 않으면, 텍스트가 한줄로 붙여서 저장된다. 유의. 13 | """ 14 | 15 | with open('19.txt', 'r', encoding="utf-8") as file: 16 | # encoding 인자를 넣어서 txt 파일을 작성했으면, 읽을때도 필요하다. 없으면 에러남. 17 | line = None # line 초기화 18 | while line != '': # 읽어온 값이 ''(더이상 문자열이 없음)이 아닐때까지 반복 19 | line = file.readline() 20 | print(line.strip('\n')) 21 | # 여기서 .strip()함수는 별게 아니고, 문자열 메쏘드로 \n(개행문자)를 삭제하는 역할 22 | """ 23 | .readline() 메쏘드를 쓴다면, 문자열을 한 줄씩 순서대로 읽을 수 있다. 24 | 근데 for 반복문으로 똑같이 파일의 내용을 읽을 수 있음, 파일 객체를 for 문의 반복가능한 객체로 넣는 것, 25 | 26 | 참고로 이외에도 파이썬 파일 메쏘드는 많으며, c언어랑 비슷함. 27 | 참고 : https://simplesolace.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC-python-%ED%8C%8C%EC%9D%BC 28 | """ 29 | with open('19.txt', 'r', encoding="utf-8") as file: 30 | for line in file: 31 | print(line.strip('\n')) 32 | 33 | """피클링(pickling), 언피클링(unpickling) 34 | 파이썬은 파이썬 객체를 파일에 저장하는 pickle(피클) 모듈을 제공. 35 | 파이썬 객체를 파일로 저장하는 것을 피클링, 파일에서 파이썬 객체를 읽는 것이 언피클링이라 함. 36 | 37 | .dump()메쏘드를 사용해서 피클링을 할 수 있고, 38 | (.dump(객체, 파일객체) 형식) 39 | .load()메쏘드를 사용해서 언피클링을 할 수 있음. (객체를 반환) 40 | (.dump(파일객체) 형식) 41 | 42 | 파일이름의 확장자는 자유롭게 해도 상관 없으나, 피클링, 언피클링할 때 b(바이너라)파일 형식으로 해야함. 43 | 따라서 파일모드에 b를 붙여줘야 함. 44 | 45 | 피클링 했던 순서대로 언피클링도 이루어지며, (첫번째로 객체1을 피클링 했으면, 첫번째 언피클링때 객체1를 불러올수 있음) 46 | 피클링 횟수 만큼 언피클링 해야함. 47 | """ 48 | word = "삼겹살" 49 | price = {'300g': 5000, '600g': 10000} 50 | with open('pickle.ppap', 'wb') as f: 51 | pickle.dump(word, f) 52 | pickle.dump(price, f) 53 | 54 | with open('pickle.ppap', 'rb') as f: 55 | w = pickle.load(f) 56 | p = pickle.load(f) 57 | print(w, p) 58 | -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/3/01-1-재귀함수.py: -------------------------------------------------------------------------------- 1 | def factorial(a): 2 | if a == 1: 3 | return 1 4 | return a * factorial(a-1) 5 | 6 | 7 | f = int(input("입력값 : ")) 8 | pr = factorial(f) 9 | print(pr) 10 | 11 | """ 재귀함수(recursive call) : 12 | 함수안에서 스스로(함수)를 다시 호출하는 것. (return 이 되지 않는 한 무한반복(호출)) 13 | 14 | 파이썬에서 재귀함수의 최대횟수는 기본적으로 1000 임. 15 | 넘어설경우 RecursionError 에러 발생. (sys 모듈의 setrecursionlimtit(재귀함수 최대호출횟수)함수로 최댓값을 변경해줄 수 있음) 16 | 17 | 따라서 재귀함수를 무한반복 하기 싫다면, 멈추고 싶은 조건을 걸어서 그조건에 함수가 return 하게 만들어야함. 18 | 참고로 return 시 함수가 호출됬던 바로 그 위치로 돌아온다. 19 | (함수가 종료되는 것은 중간에 return 됬거나 or 함수의 마지막 실행문까지 실행이 끝난 후) 20 | ex> 21 | def func(a): 22 | func(a-1) 23 | print(a) 24 | if a is 0: 25 | return 26 | 27 | 28 | 이라는 재귀함수 func()에서 29 | 30 | func(5)의 실행결과는, 31 | 1 32 | 2 33 | 3 34 | 4 35 | 5 36 | 가 될것임. 37 | 38 | """ 39 | -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/3/01-2-(재귀함수피보나치수열).py: -------------------------------------------------------------------------------- 1 | # def fib(i): 2 | # if i < 3: 3 | # return 1 4 | # return fib(i-1) + fib(i-2) 5 | 6 | 7 | def fib(i): 8 | if i in [0, 1]: 9 | return i 10 | return fib(i-1) + fib(i-2) 11 | 12 | 13 | n = int(input()) 14 | print(fib(n)) 15 | 16 | """ 피보나치수열 재귀함수로 반환: 17 | n을 입력하면 n번째의 피보나치수열 값이 출력된다. 18 | 19 | 좀 머리좀 잘써야 대가리가 돌아갈듯? https://dojang.io/mod/quiz/view.php?id=2356 20 | """ -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/3/02-딕셔너리응용(메쏘드).py: -------------------------------------------------------------------------------- 1 | '''책 딕셔너리''' 2 | books = {'394039': {'title': '파이썬 코딩의 기술', 'year': 2016, 'author': '브렛 슬라킨', 'price': 21600}, 3 | '230999': {'title': '골빈해커의 3분 딥러닝', 'year': 2017, 'author': '김진중', 'price': 19800}, 4 | '220333': {'title': 'c언어 트레이닝', 'year': 2017, 'author': '아서 줄리아니', 'price': 16200}, 5 | '551139': {'title': '웹 해킹 입문', 'year': 2016, 'author': '이상환', 'price': 20500}, 6 | } 7 | 8 | # print(books.keys()) 9 | # print(books.values()) 10 | # print(books.items()) 11 | 12 | for k, v in books.items(): 13 | if v['price'] > 20000: 14 | print(f"ISBN :{k} 책 제목 : {v['title']} 가격 : {v['price']}") 15 | 16 | #두번째 방법 17 | for k, v in books.items(): 18 | if v.get('price') > 20000: 19 | print("ISBN :", k, "책 제목 :", v['title'], "가격 :", v['price']) 20 | -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/3/03-람다표현식.py: -------------------------------------------------------------------------------- 1 | i = list(filter(lambda x: x > 0, range(-10, 11))) 2 | print(i) 3 | 4 | """람다표현식(lambda expression): 5 | 람다표현식으로 이름없는 익명의 함수(Anonymous function)를 만들수 있음. 1줄로 선언함. 6 | 형식은 7 | lambda 매개변수들: 반환식 8 | ( 9 | 일반 함수로 변환할 시 10 | def <함수이름, 람다에서만 생략됨>(매개변수들): 11 | return 반환식 12 | ) 13 | 과 같음. (매개변수들은 생략 가능하나 반환식은 필수) 14 | ( * 람다 함수에선 함수안의 변수를 선언할 수 없음) 15 | 16 | 이걸로 17 | 함수이름 = lambda 매개변수들: 반환식 18 | 과 같이 해서 함수를 변수에 할당 할 수 있고, 19 | 함수이름(인자값) 과 같이 다른 함수처럼 호출 할 수 있음. 20 | 21 | 아니면 22 | (lambda 매개변수들: 반환식)(인자값) 23 | 과 같이 람다 표현식 자체를 (함수처럼)호출 할 수도 있음. 24 | 25 | 아니면 인수[1]로 람다표현식을 써서 26 | 함수(람다표현식, 다른인자값) 27 | 과 같이 활용 가능. 28 | (대표적인 ex> map 함수, 29 | map(lambda 매개변수들: 반환식, 연속되는값) 30 | ) 31 | 그외에도 reduce, filter 등과 활용가능 (크롤링 함수(find)에서도 활용) 32 | 33 | [1] : 인수 (변수인데 함수에서 쓰이는 변수) = 파라미터(Parameter) 34 | + 실인수(= 실매개변수 = 전달인자 = Argument = 인자) : 가인수(= 형식매개변수 = 매개변수 = Parameter = 인수) 35 | """ 36 | -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/3/04-람다표현식응용.py: -------------------------------------------------------------------------------- 1 | proto_li = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 2 | a = list(map(lambda x: x+1, proto_li)) 3 | print(a) 4 | """ 람다표현식응용: 5 | map 함수의 인자로 람다 표현식을 사용한다면, 6 | map 함수 자체가 두번째 인자값으로 받은 반복가능한 객체를 7 | 첫번째 인자값의 형식으로 각각의 요소들을 변환해서 map 객체로 반환하는데, (2폴터 1 참고) 8 | 9 | 첫번째 인자값으로 람다 표현식을 사용한다면, 인자값으로 전달받은 리스트의 요소하나하나를 각각 람다표현식으로 변환할 수 있다. 10 | 11 | 그리고 2>1에서 배웠듯이 map 함수에 변환할 값(반복가능한 객체)를 여러개 넣을 수도 있다. (주로 람다 표현식과 응용한다.) 12 | """ 13 | 14 | i = list(map(lambda x: "박수" if x % 3 == 0 else x, proto_li)) 15 | # 각각의 요소들을 람다표현식으로 변환하는데, 람다표현식에서 조건식을 넣어서 3의 배수면 '박수' 아니면 숫자를 출력 16 | print(i) 17 | """ 18 | 람다 표현식에서 조건문을 넣을 수 있다. 파이썬의 삼항연산자를 이용한다. 19 | 물론 삼항연산자를 중복해서도 사용할 수 있지만, 원만해선 가독성이 별로라서 안쓴다. 20 | """ 21 | 22 | i = list(filter(lambda x: x % 3 == 0, range(1, 21))) 23 | print(i) 24 | """ 25 | filter 함수와 응용할 수 있다. filter(함수, 반복가능한 객체)는 map()함수와 비슷한데, 26 | 필터라는 이름대로 첫번째인자에서 함수의 반환값이 True 일때(반환 조건을 만족하는 요소)에 속하는 요소들만 묶어서 filter 객체로 반환한다. 27 | 반복하는 객체중에서 조건에 만족하는 요소들만 가져오고, 만족하지 않는 요소들은 걸러내는 함수다. 28 | 29 | 여기서 함수 인자에 람다 표현식을 사용할 수 있으며, 마찬가지로 람다 표현식의 반환 값에 만족하는 요소만 가져와서 filter 객체로 반환한다. 30 | """ 31 | 32 | l = [1, 2, 3, 4] 33 | from functools import reduce # 파이썬 3부터는 reduce 는 내장함수가 아니라서, functools 모듈에서 가져와야 된다. 34 | print(reduce(lambda x, y: x*y, l)) 35 | """ 36 | reduce 함수와도 응용할 수 있다. reduce(함수, 반복가능한 객체)는 얼핏 다른 함수와도 비슷한데, 37 | 반복가능한 객체의 모든 요소를 첫번째 인자로 받는 함수의 매개변수들로 대입해서, 결국 모든 요소를 매개변수로 넣었을 때 누적되는 값을 반환한다. 38 | 39 | ex) reduce(lambda x, y: x+y, [1, 2, 3,]) 같은 경우에선 40 | [1, 2, 3]을 lambad x, y로 받아서 x+y로 반환하니까 , 41 | (1 + 2)+ 3 의 결과가 된다. (반복문 처럼 반복가능한 객체의 모든 요소를 누적 할 때 까지 반복한다.) 42 | 추가로 세번째 인자값으로 누적되는 값의 초깃값을 지정할 수 있다. (기본값은 0) 43 | 44 | (솔직히 반복문으로 나타내는것이 보기에 좋다) 45 | """ 46 | 47 | # 팩트는. 48 | # map, filter와 람다표현식을 응용 하는 것보다, 리스트 내포(표현식)을 응욯하는 것이 더 빠르고, 가독성도 좋다(상위호환) 49 | # 그리고 reduce 보다 for, while 반복문을 응용하는 것이 가독성에 좋다,(reduce 함수는 복잡해지기만 해도 가독성이 맣이 떨어진다) 50 | -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/3/05-N-gram.py: -------------------------------------------------------------------------------- 1 | print("N-gram - N개의 연속된 요소 추출기") 2 | n = int(input("끊어 읽을 수를 입력하세요 : ")) 3 | word = list(input("문장을 입력하세요 : ").rstrip()) 4 | print(word) 5 | if n < 0: 6 | print("<에러>끊어 읽을 수가 음수 입니다.") 7 | elif len(word) < n: 8 | print("<에러>끊어 읽을 수가 전체 문장보다 큽니다.") 9 | else: 10 | for i in range(len(word)+1-n): 11 | for j in range(i, n+i): 12 | print(word[j], end='') 13 | print() 14 | 15 | """N-gram: 16 | 2-gram, 3-gram, ... 같은 걸 묶어서 부르는 건데, 17 | 문장의 글자를 N개씩 묶은 것들을 추출하는 것. 18 | """ 19 | -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/3/06-(요소중최댓값).py: -------------------------------------------------------------------------------- 1 | nums = list(map(int, input("입력: ").rstrip().split(','))) 2 | max_num = nums[0] 3 | for num in nums: 4 | max_num = num if num > max_num else max_num 5 | print(max_num) 6 | 7 | # 걍 max(nums) 로 해도 됨. (max() : 요소들 중에서 가장 큰 값 반환) 8 | 9 | """ 10 | 리스트의 요소중에서 가장 큰 값을 반환하는 코드, 11 | 이렇게 보다는 파이썬 내장함수인 max(), min()등을 활용하자. 12 | """ 13 | -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/3/07-1-지역변수,전역변수,global,네임스페이스.py: -------------------------------------------------------------------------------- 1 | x = 10 # 여기서 x는 전역변수(파이썬 스크립트(파일) 어디서든지 접근할 수 있음) 2 | 3 | 4 | def func(): 5 | y = 20 # 여기서 y는 지역변수(변수를 선언한 함수에서만 접근할 수 있고, 함수 바깥에서는 접근할 수 없음) 6 | print(x, y) 7 | 8 | 9 | func() 10 | print(x) 11 | """ 지역변수(local variable), 전역변수(global variable): 12 | 전역변수는 일반적으로 파이썬 스크립트에서 변수를 만들었을 때 해당되며, 13 | 함수 안에서도 함수 바깥에서도 어디든지 사용할 수 있음. (물론 변수 선언 전에선 사용할 수 없음) 14 | 15 | 이런 전역변수에 접근할 수 있는 범위를 전역 범위(global scope)라고 함. 16 | 17 | 18 | 지역변수는 함수 안에서 변수를 만들었을 때 해당되며, 19 | 만든 지역변수는, 변수를 만든 함수의 지역변수로, 그 함수에서만 접근 할 수 있고, 함수 바깥에선 사용할 수 없음. 20 | 21 | 마찬가지로 지역변수에 접근할 수 있는 범위를 지역 범위(local scope)라고 함. 22 | 23 | 24 | 참고로 지역변수와 전역변수 둘다 같은 이름일 수도 있는데, 그럴경우, 해당함수에선 지역변수가 우선임. 25 | 함수 안에선 전역변수를 읽고 참조하기만 할 뿐 전역변수의 값을 변경할 수 없음. 26 | 함수 안에서 전역변수를 변경하려면 global 키워드를 사용함. 27 | """ 28 | n = 10 29 | 30 | 31 | def n_func(): 32 | global n 33 | n += 10 34 | 35 | 36 | n_func() 37 | print(n) 38 | """ 39 | 함수 안에서 40 | global 전역변수 41 | 를 붙이면 해당 전역변수를 함수안에서 사용할 수 있음. 42 | """ 43 | # 참고로 이럴때 함수안에서 사용하는 전역변수는 프리변수(free variable)이라고 함. 44 | # 프리변수는 어떤 코드블럭 안에서 사용은 됬는데, 그 코드블럭 안에서 정의되지는 않은 변수를 말함. 45 | 46 | 47 | def m_func(): 48 | global m 49 | m = 10 50 | 51 | 52 | m_func() 53 | print(m) 54 | """ 55 | 해당 전역변수가 없다면, global 에서 붙인 변수이름을 가지고 새로운 전역변수를 선언함. 56 | (대신에 함수를 호출해야만 해당 전역변수가 선언됨.) 57 | """ 58 | print(locals()) 59 | 60 | 61 | def f(): 62 | f1, f2 = 1, 2 63 | print(locals()) 64 | 65 | 66 | f() 67 | """ 네임스페이스(namespace): 68 | 파이썬에서 변수는 네임스페이스(이름을 모아놓은 공간)에 저장되며, locals 함수를 이용해서 현재 네임스페이스를 반환할 수 있음. 69 | 함수 바깥 뿐만아니라, 함수안에서도 locals 함수를 사용할 수 있으며, 그럴시 지역범위에서의 네임스페이스를 반환함. 70 | (지역 네임스페이스를 반환함) 71 | """ -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/3/07-2-함수중첩,지역변수구분,nonlocal.py: -------------------------------------------------------------------------------- 1 | def func1(): 2 | word = "외부 함수" 3 | print(word) 4 | 5 | def func2(): 6 | print(word, "가 호출한 내부 함수", sep='') 7 | func2() 8 | 9 | 10 | func1() 11 | """ 함수에서 함수 정의(함수 중첩): 12 | 함수안에서 함수도 만들수 있으며, 이때 외부함수에서 만든 지역함수는 내부함수에서도 사용할 수 있다. 13 | 외부함수의 지역 범위는 외부함수의 시작부터 끝이며, 외부함수에서 정의하고 호출한 내부함수도 범위 내에 속한다. 14 | (간단히, 함수의 지역변수는, 그안에서 정의한 모든 함수에서 접근할 수 있음) 15 | """ 16 | 17 | 18 | def func1(): 19 | x = 1 20 | 21 | def func2(): 22 | x = 10 23 | print(x) 24 | func2() 25 | print(x) 26 | 27 | 28 | func1() 29 | """ 30 | 내부함수에서 외부함수 지역변수의 값을 수정할 수 없음, 시도하면 외부함수 지역변수와는 이름만 같은 내부함수의 지역변수를 만듬. 31 | (함수에서 변수를 선언하면 현재 함수의 지역변수가 됨) 32 | 33 | 그래서 내부함수에서 외부함수의 지역변수를 수정하려면, nonlocal 키워드를 사용해야 함. 34 | nonlocal 지역변수 35 | 에서 nonlocal 의 의미는 오른쪽에 적힌 지역변수가 현재 함수의 지역변수가 아니라는 것을 의미함. 36 | """ 37 | 38 | 39 | def A(): 40 | """x, y 모두 A의 지역변수로 선언 됬다.""" 41 | x = 10 42 | y = 100 43 | 44 | def B(): 45 | """x 가 B의 지역변수로 선언됬다.""" 46 | x = 20 47 | 48 | def C(): 49 | nonlocal x 50 | # 이때 x는 A함수, B함수 에서 같은 지역변수가 있지만, 가까운 함수우선으로, B 함수의 지역변수를 불러온다. 51 | nonlocal y 52 | # y는 A함수 에서는 같은 이름의 지역변수가 없고, B함수 에만 있기에 B 함수의 지역변수를 불러온다. 53 | print(x, y) 54 | 55 | C() 56 | 57 | B() 58 | 59 | 60 | A() 61 | """ 62 | nonlocal 은 현재함수 바깥에 있는 지역변수를 찾을 때 가장 가까운 함수 우선으로 불러옴. 63 | 64 | 참고로 함수가 여러단계 중첩되도, global 키워드는 항상 전역변수를 사용함. (지역변수는 모두 무시) 65 | 66 | ** 전역변수를 global 로 접근하는 대신 함수의 매개변수, 반환값을 이용하는 것이 좋음(권장함) 67 | ** 나중에 코드가 복잡해질때 global 이 있으면, 변수 값이 어디서 바뀌는지 알기 어려워짐. 68 | """ -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/4/#1-모듈,패키지,라이브러리.py: -------------------------------------------------------------------------------- 1 | summary = """ 2 | 모듈 vs 패키지 vs 라이브러리: 3 | 파이썬에서 볼수 있는 개념들로, 서로 비슷하면서도 차이가 있다. 4 | 5 | * 모듈(module): 6 | 특정 기능을 .py 파일 단위로 작성한 것. 7 | (함수, 변수, 클래스 같은 것들이 모여있는 파일) 8 | 9 | 파이썬이 제공하는 모듈 -> 표준 모듈 10 | 설치해서 사용하는 모듈 -> 서드파티 모듈 11 | 사용자가 만들어쓰는 모듈 -> 사용자 생성 모듈 12 | 13 | 14 | * 패키지(package): 15 | 모듈을 묶은 것(관련된 기능끼리). 16 | 디렉토리(패키지)가 다른 디렉토리(모듈)을 포함하는 형태로 구조화함. 17 | 18 | 패키지이름.모듈이름 19 | 형식으로 사용함. 20 | 패키지는 모듈마다에 네임스페이스(namespace)를 제공. 21 | 22 | 파이썬 패키지 인덱스(Python Package Index, PyPI)를 통해 인터넷의 다양한 패키지를 설치후 사용 가능. 23 | 파이썬 패키지 인덱스는 파이썬 패키지들이 모여있는 저장소로, 24 | 2020-4-19일 기준, 229,009 projects(프로젝트)와 1,784,025 releases(릴리즈(=버전)) 가 있음. 25 | (링크 : https://pypi.org/ ) 26 | 27 | 28 | * 라이브러리(library): 29 | 모듈과 패키지를 묶어놓은 것. 30 | 31 | 파이썬의 기본 모듈, 패키지, 내장함수등 -> 파이썬 표준 라이브러리(Python Standard Library, PSL) 32 | """ 33 | print(summary) 34 | 35 | """ 라이브러리 vs 프레임워크: 36 | 라이브러리(library) : 개발할 때 필요한 부속품 (가져다 쓰는 것) 37 | 프레임워크(framework) : 개발할 때 짜여진 기본틀 (이 위에 뭘 덧붙여 만드는 것) 38 | """ -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/4/#2-0-패키지설치.py: -------------------------------------------------------------------------------- 1 | summary = """ 2 | 파이썬 패키지 인덱스에서 패키지 설치하기: 3 | 4 | (방법도 종류가 있는데, 파이참 Settings > Project: (프로젝트이름) > Project Interpreter 에서 설치하거나, 5 | 명령 프롬프트(콘솔, 터미널)에서 설치하는 방법이 있다. 여기선 명령 프롬프트로 설치하는 법에 대해 알아본다.) 6 | 7 | 우선 pip(파이썬 패키지 인덱스의 패키지 관리 명령어)를 설치해야 한다. 8 | 윈도우용 파이썬은 기본적으로 깔려있기에 할 필요 없고, 리눅스, macOS 에서만 pip 를 따로 설치해야 한다. 9 | $ curl -O https://bootstrap.pypa.io/get-pip.py 10 | $ sudo python3 get-pip.py 11 | 위 명령어를 콘솔(터미널)에 치면 되는데, 만약 curl 도 설치되있지 않으면, 12 | 우분투 : $ sudo apt-get install curl 13 | CentOS : $ sudo yum install curl 14 | 같은 방법으로 설치한다. 15 | 16 | 17 | 그리고, 18 | $ pip install 패키지이름 19 | 으로 원하는 패키지를 설치하면 된다. (윈도우는 명령 프롬포트에서, 리눅스, 맥에서는 콘솔(터미널)에서) 20 | 21 | 22 | 마지막으로 다른 패키지 처럼 23 | 파이썬 스크립트 안에서 install 패키지 24 | 형식등으로 설치한 패키지를 가져와서 사용하면 된다. 25 | 26 | 27 | 참고로 파이썬 버전이 2와 3모두 깔려 있다면, (보통 리눅스와 macOS 는 같이 깔려있음.) 28 | python2(python) 에서는 pip2(아니면 pip)로 명령을 사용하고, 29 | python3(python3) 에서는 pip3(아니면 pip)로 명령을 사용한다. 30 | (파이썬 3만 깔려있으면 pip 가 파이썬 3 용 명령으로 쓰임.) 31 | 32 | 33 | * pip 에 대한 추가 명령어 34 | $ pip search 패키지 -> 패키지 검색 35 | $ pip install 패키지==버전 -> 패키지를 특정 버전으로 설치 36 | $ pip list 아니면 $ pip freeze -> 패키지 목록 출력 37 | $ pip uninstall 패키지 -> 패키지 삭제 38 | """ 39 | print(summary) -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/4/#2-1-모듈가져오기.py: -------------------------------------------------------------------------------- 1 | import pprint # pprint 모듈을 가져옴 2 | 3 | pprint.pprint('haha') # 모듈명.함수() 로 모듈에 있는 함수를 사용 4 | # 참고로 import 문은 코드 중간에 사용해도 된다. 모듈과 패키지를 사용하기 이전에서라면 어디든지 사용가능 5 | """ 모듈(module) 가져오기: 6 | 파이썬의 내장함수(built-in function)(ex> input, print)에서 넘어서서 7 | 복잡한 프로그램을 만들기 위해 모듈과 패키지를 불러올 수 있는데, 이때 import 키워드를 사용한다. 8 | 9 | import 모듈 10 | import 모듈1, 모듈2, ... 11 | 으로 모듈을 사용하기 전에 가져온 다음, 12 | 13 | 모듈.변수 14 | 모듈.함수() 15 | 모듈.클래스() 16 | 으로 모듈에 있는 객체들을 활용할 수 있다. 17 | 18 | 19 | import 모듈 as 이름 20 | 으로 모듈명을 그대로 입력하지 않고, 모듈명을 다른 이름으로 대체할 수도 있으며, 이럴땐 21 | 22 | 이름.변수 이름.함수() 23 | 등등 as 에서 정해준 모듈의 이름으로 모듈명 대신 사용할 수 있다. 24 | 25 | 26 | from 모듈 import 변수 27 | from 모듈 import 함수 28 | from 모듈 import 클래스 29 | 등으로 모듈 전체를 가져오는 것이 아니라, 모듈의 일부만 가져올 수 있다. 30 | 이럴때는 모듈. 을 앞에 붙일 필요 없이 31 | 변수 함수() 클래스() 32 | 로 바로 활용 할 수 있다. 33 | 34 | from 모듈 import 변수, 함수, 클래스 35 | 으로 여러개를 가져올 수도 있고, 36 | 37 | from 모듈 import * 38 | 으로 모두 가져올 수도 있다. (이러면 앞에 모듈. 을 붙일 필요 없이 모듈의 모든 객체를 사용할 수 있다.) 39 | 그리고, 40 | 41 | from 모듈 import 변수 as 이름 42 | from 모듈 import 변수 as 이름1, 함수 as 이름2, 클래스 as 이름3 43 | 처럼 여기서도 as 문을 활용해서 가져온 객체를 원하는 이름으로 지정해 사용할 수 있다. 44 | """ -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/4/#2-2-패키지가져오기.py: -------------------------------------------------------------------------------- 1 | from urllib import request 2 | 3 | response = request.urlopen('https://dojang.io/mod/page/view.php?id=2442') 4 | """ 패키지 가져오기: 5 | 마찬가지로 패키지와 그 안의 모듈도 import 로 가져옴. 6 | 7 | import 패키지.모듈 8 | 과 같으며, as from import 문도 동일하게 사용가능, 9 | 10 | 추가로는, 11 | from 패키지 import 모듈 12 | from 패키지.모듈 import 객체 13 | 와 같은 형식도 사용가능. 14 | 15 | (from 상위요소 import 하위요소 16 | 라는 형식만 지키면, 왠만한건 되는듯.) 17 | """ -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/4/#3-0-if __name__=='__main__',프로그램시작점.py: -------------------------------------------------------------------------------- 1 | if __name__ == '__main__': # 위 조건식은 현재 스크립트 파일이 프로그램의 시작점일 때만 참이 됨. 2 | print("여기가 프로그램의 시작점 입니다.") 3 | """ 4 | 인터넷에서 보면 위같은 코드를 자주 사용하는데 왜 쓸까? 5 | 6 | 사실 위 코드는 현재 스크립트 파일이 어디서 실행되는지 파악하기 위에 사욯한다. 7 | 8 | 현재 실행되는 메인 스크립트 파일에서 __name__ 변수에는 '__main__' 이 들어간다. 9 | 대신에 다른곳에서 모듈로 불려서 사용되는 스크립트 파일에서는 __name__ 변수에 모듈 자기자신의 이름이 들어간다. 10 | 11 | 그래서 이걸로 파이썬 코드가 실행될 때, 12 | 여러 스크립트 중에서 누가 메인 프로그램(프로그램의 시작점)인지, 누가 모듈인지 알 수 있는 것이다. 13 | 14 | 15 | 사실 이런 것을 사용하는 이유는, 파이썬에서 프로그램의 시작점이 항상 정해져 있지 않기 때문이다. 16 | 파이썬은 리눅스,유닉스에서 사용하는 스크립트 언어 기반으로 처음 개발되었기에, 프로그램의 시작점이 따로 없었는데, 17 | 그 이유는 리눅스,유닉스의 스크립트 파일은 파일 1개로 이뤄진 경우가 대부분이 였기 때문이다. 18 | (이와 다르게 C, java 같은 언어는 여러 소스 파일의 함수들 중에서 main() 함수(시작 함수)가 따로 지정되어 있어서 19 | 프로그램의 시작점이 항상 main() 으로 정해져 있다.) 20 | """ -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/4/#3-1-모듈만들기.py: -------------------------------------------------------------------------------- 1 | import hi_module 2 | 3 | print(hi_module.hi) # hi_module 의 변수 hi 를 사용 4 | hi_module.hello() # hi_nodule 의 함수 hello() 를 사용 5 | h = hi_module.Hey() # hi_module 의 클래스 Hey() 를 사용(인스턴스 생성) 6 | 7 | h.hey() # hi_module 의 Hey() 클래스 메쏘드 hey() 를 사용 8 | print(h.ha) # hi_module 의 Hey() 클래스 속성 ha 를 사용 9 | """ 10 | 사용자가 직접 모듈을 만든다면, 간단하게 .py 로 끝나는 파일을 저장한 후, 다른 곳에서 11 | 12 | import 파일이름 13 | 으로 그 파일을 모듈로써 가져올 수 있다. 14 | 그러면 그 모듈(파일)의 변수, 함수, 클래스 같은 것들을 모듈처럼 사용할 수 있는 것이다. 15 | (모듈을 가져와 사용하는 것에 대해서는 #2-1, 모듈 가져오기 의 내용과 동일하다.) 16 | """ 17 | -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/4/#3-2-패키지만들기.py: -------------------------------------------------------------------------------- 1 | summary = """ 2 | 패키지 만들기: 3 | 패키지는 모듈로 구성되어 있는 구조이기에, 패키지를 만들 때 4 | 패키지 이름을 폴더로, 폴더안에 모듈들을 .py 파일로 만들면 된다. 5 | (파이썬 3.3 이전에서는 패키지 폴더 안에 __init__.py 파일이 있어야 폴더를 패키지로 인식한다. 6 | 파이썬 3.3 이상부터는 __init__.py 파일이 폴더에 없어도 인식하지만, 7 | 하위버전에도 호환될 수 있게 __init__.py 파일을 작성하는 것이 권장된다.) (__init__.py 는 기본적으로 비워둘 수 있다.) 8 | 9 | ex> 10 | 패키지이름 11 | - __init__.py 12 | - 모듈이름.py 13 | - 모듈2이름.py 14 | - 모듈3이름.py 15 | ...... 16 | 17 | 이런 패키지를 가져오는 메인스크립트는 18 | 19 | import 패키지.모듈 20 | 등과 같이 가져오면 된다. (추가로는 #2-2. 패키지 가져오기 참고) 21 | 22 | 참고로 패키지의 모듈은 일반 모듈과 다르게 23 | __name__ 변수에서 '모듈이름' 이 저장되지 않고, '패키지이름.모듈이름' 이 저장된다. 24 | """ 25 | # 아래는 패키지 from import 응용 26 | """ 27 | 패키지 안의 모듈에서 다른 모듈을 참조할 때, 28 | 29 | from . import 모듈 30 | 로 같은 패키지의 다른 모듈을 가져올 수 있다. 31 | 이때 .(점)은 현재 패키지 라는 뜻이다. 32 | 33 | 이 .을 활용해서 34 | 35 | from .모듈 import 변수(, 함수, 클래스) 36 | 로 같은 패키지의 모듈에 있는 변수(, 함수, 클래스)를 가져올 수 있다. 37 | 38 | from .모듈 import * 39 | 과 같다면 모듈의 모든 객체(변수, 함수, 클래스)를 가져올 수 있다. 40 | 41 | 42 | 이것으로 모듈에서 다른 모듈의 객체를 활용할 때 사용할 수도 있지만, 43 | 메인 스크립트에서 패키지의 모든 변수, 함수, 클래스를 가져오게 할 수도 있다. 44 | 45 | 바로 패키지의 __init__.py 파일에서 46 | 원하는 모듈들의 변수, 함수, 클래스를 가져오게 하면, (ex> from .모듈 import 변수,함수,클래스 또는 from .모듈 import *) 47 | 48 | 나중에 패키지를 가져올 때, 모듈을 거치지 않고 그 모듈의 변수, 함수, 클래스를 이용할 수 있게 된다. 49 | 50 | 패키지.변수 51 | 패키지.함수() 52 | 패키지.클래스() 53 | 와 같이 모듈을 따로 거치지 않고 패키지로 패키지의 모듈 변수, 함수, 클래스를 접근할 수 있는 것이다. 54 | """ 55 | -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/4/#3-3-__all__,하위패키지,패키지와모듈독스트링.py: -------------------------------------------------------------------------------- 1 | """ 2 | from .모듈 import * 으로 해당 모듈의 모든 변수, 함수, 클래스를 가져올 수 있는데 3 | 패키지 외부에 공개하기 싶은 것 까지 공개하게 되는 단점이 있다. 4 | 여기서 패키지에서 공개할 변수, 함수, 클래스를 from import 문 앞에 __all__ 를 선언해서 리스트 형식으로 담아주면 된다. 5 | __all__ = ['사용할', '것들'] 6 | __all__ 은 이름 그대로 모든것을 *으로 가져갈 때의 가져갈 목록을 정할 수 있다. 7 | 8 | 파이썬에선 추가로 패키지 안에 하위 패키지를 만들 수 있다. 9 | 구현하는 법은 패키지 폴더안에 새 폴더를 만들고 거기에 모듈과 __init__.py 를 넣으면 하위 패키지가 도니다. 10 | import 패키지.하위패키지.모듈 11 | 과 같이 하위패키지의 모듈도 가져올 수 있으며, 상위패키지의 모듈에서 하위패키지의 모듈을 가져올 때 12 | import .하위패키지.모듈 from * 13 | 과 같이 하지만, 반대로 하위패키지 모듈에서 상위패키지 모듈을 가져올 때는 14 | import ..상위패키지.모듈 15 | import ..상위모듈 16 | 과 같이 ..(상위 폴더를 의미) 을 이용한다. (.이 한개씩 더 붙을 수록 더 상위 폴더로 올라간다. 17 | 18 | 추가로 모듈과 패키지에도 독스트링을 넣을 수 있다. 19 | 모듈 파일에 첫줄에 기존 독스트링 형식(""" """)으로 문자열을 넣거나, 20 | 패키지 파일의 __init__.py 파일 첫줄에 독스트링 형식으로 문자열을 넣으면 된다. 21 | 22 | 이럴 경우, 23 | 모듈.__doc__ 24 | 패키지.__doc__ 25 | 로 모듈과 패키지의 독스트링을 반환할 수 있다. 26 | """ -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/4/01-zip()함수.py: -------------------------------------------------------------------------------- 1 | name = ['kim', 'dong', 'hyeon'] 2 | age = [19, 31, 26] 3 | 4 | for n, a in zip(name, age): 5 | print(n, a) 6 | print(type(n), type(a)) 7 | 8 | """zip() 내장함수: 9 | zip()함수는 요소의 개수가 동일한 인자들을 전달받아서, (인자로는 반복가능한 객체) 10 | 인자들를 인덱스별로 쪼개서 같은 인덱스끼리 튜플로 묶어서 zip객체로 반환한다. 11 | 12 | list(), tuple()로 묶어서 리스트, 튜플 자료형으로 반환 할수 있다. 13 | """ 14 | -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/4/02-1-zip응용dict변환-1.py: -------------------------------------------------------------------------------- 1 | # keys = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 말고 아래의 리스트 내포를 사용 2 | keys = [i for i in range(1, 11)] 3 | # values = [2, 4, 8, 16, 32, 64, 128, 256, 512, 1024] 4 | values = [2**i for i in range(1, 11)] 5 | myzip = zip(keys, values) 6 | mydict = dict(myzip) 7 | 8 | print(mydict) 9 | 10 | """zip함수 dict응용: 11 | zip의 인자가 2개라면, 2개씩 묶어주기 때문에, dict()함수를 통해 12 | 딕셔너리 자료형을 쉽게 변환할 수 있다. 13 | """ 14 | -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/4/02-2-zip응용dict변환-2.py: -------------------------------------------------------------------------------- 1 | y = dict(zip(range(1, 11), [2**i for i in range(1, 11)])) 2 | for x in y: 3 | print(f"{x} - {y[x]}") # x = 키, y = 전체딕셔너리객체, y[x] = 값 4 | 5 | """zip함수 dict응용 2: 6 | 마찬가지로 zip함수로 딕셔너리 자료형을 만들어서, 7 | 그 키와 값을 출력하는 코드다. 8 | """ 9 | -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/4/03-(zip응용,dict으로구구단).py: -------------------------------------------------------------------------------- 1 | n = int(input("원하는 단의 숫자를 입력하세요: ")) 2 | y = dict(zip(range(1, 11), [n*i for i in range(1, 10)])) 3 | for x in y: 4 | print(f"{n} * {x} = {y[x]}") 5 | 6 | """zip함수 dict응용해서 구구단 출력: 7 | input으로 원하는 숫자를 입력해서, 그 숫자의 구구단을 출력하는 프로그램 8 | """ 9 | -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/4/04-ord(),chr()함수-(암호화,복호화).py: -------------------------------------------------------------------------------- 1 | def lock_(a): 2 | for i in range(len(a)): 3 | if 91 > ord(a[i]) > 64: 4 | a[i] = chr(ord(a[i])+n) 5 | if 96 < ord(a[i]) < 123: 6 | a[i] = chr(ord(a[i])+n) 7 | 8 | 9 | def unlock_(b): 10 | for i in range(len(b)): 11 | if 91 > ord(b[i]) > 64: 12 | print(chr(ord(b[i])-n), end='') 13 | if 123 > ord(b[i]) > 96: 14 | print(chr(ord(b[i])-n), end='') 15 | 16 | 17 | n = int(input("n칸을 입력하세요: ")) 18 | word = list(input("암호화 할 평문을 입력하세요: ")) 19 | lock_(word) 20 | print("암호화 완료:", ''.join(word)) 21 | y = input("복호화 하시겠습니까?(y/n): ") 22 | if y == 'y' or y == 'Y': 23 | unlock_(list(word)) 24 | else: 25 | print("프로그램 종료") 26 | 27 | """영어 암호화/복호화 프로그램: 28 | ord() : 문자(인자값)의 아스키 코드(or 유니코드) 값을 돌려줌. 29 | chr() : 아스키코드(인자값)에 해당하는 문자를 돌려줌. 30 | 31 | 이 두 파이썬 내장함수를 이용해서, 문자의 아스키코드를 수정해서 암호, 복호화를 32 | 하는 프로그램을 작성. 33 | """ 34 | -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/4/05.random모듈.py: -------------------------------------------------------------------------------- 1 | import random as r 2 | 3 | menu = ['떡볶이', '김밥', '김말이', '어묵', '쫄면'] 4 | w = r.choice(menu) 5 | print(w) -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/4/06-time모듈.py: -------------------------------------------------------------------------------- 1 | import time 2 | 3 | print(time.time()) 4 | print(time.asctime()) -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/4/07-calendar모듈.py: -------------------------------------------------------------------------------- 1 | import calendar 2 | 3 | print(calendar.calendar(2019)) -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/4/hi_module.py: -------------------------------------------------------------------------------- 1 | hi = 10 2 | 3 | 4 | def hello(): 5 | print("hello I'm from", __name__) 6 | 7 | 8 | class Hey: 9 | def __init__(self): 10 | self.ha = 'hahaha' 11 | 12 | def hey(self): 13 | print("I'm in Hey class!") 14 | -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/5/01-(randint와리스트응용).py: -------------------------------------------------------------------------------- 1 | import random as r 2 | 3 | r_list = [r.randint(1, 100) for i in range(10)] # 랜덤 기본 리스트 4 | r_list.append(50) # 맨 뒤에 50 추가 5 | r_list.sort() # 정렬 6 | del r_list[::2] # 짝수 자리의 요소 제거 7 | r_list2 = [r.randint(100, 200) for i in range(5)] # 새로운 리스트 8 | f_list = r_list + r_list2 # 두 리스트 합체 9 | print(f_list) 10 | 11 | """ random 모듈 응용: 12 | randint() 함수 : randint(n, m)같이 하면, n~(m-1)사이에서 랜덤숫자 1개를 뽑아냄 13 | 이러한 randint() 함수와 리스트 표현식을 짬뽕해서 응용하는 프로그램. 14 | """ -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/5/02-(randint응용2).py: -------------------------------------------------------------------------------- 1 | import random as r 2 | 3 | rand = r.randint(1,100) 4 | while True: 5 | a = int(input("숫자를 입력하세요\n")) 6 | if a > rand: 7 | print("입력하신 숫자가 큽니다.") 8 | elif a < rand: 9 | print("입력하신 숫자가 작습니다.") 10 | elif a == rand: 11 | print(f"{a} 정답입니다!") 12 | break -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/5/03-(time응용예제).py: -------------------------------------------------------------------------------- 1 | import time as t 2 | 3 | print('30초 세보세요') 4 | t0 = t.time() 5 | print('*'*20, "마음속으로 30초 세신후 엔터 누르세요", '*'*20, sep='\n') 6 | a = input() 7 | if a == '': # 엔터키 입력 받으면 ''이 저장 8 | t1 = t.time() 9 | print(f"{t1-t0 : .2f}초 지났습니다.") 10 | if 30.5 >= t1-t0 >= 29.5: 11 | print("정답입니다!") 12 | 13 | """ 14 | time()함수 : 현재시간을 저장 15 | 서로 다른시간에 호출한 time()함수를 서로 빼서, 그 차이를 시간이 지난정도로 활용하는 프로그램. 16 | 결국에 엔터를 쳤을때 몇초가 지났는지 판별함. 17 | """ -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/5/04-(외부모듈복합응용예제).py: -------------------------------------------------------------------------------- 1 | import time 2 | import datetime 3 | import random 4 | 5 | while True: 6 | time.sleep(random.randint(1, 5)) 7 | t = datetime.datetime.now() # == int(time.time) 8 | print(t.second, '초 - ', sep='', end='') 9 | print("짝수 초" if t.second % 2 == 0 else "홀수 초") 10 | 11 | 12 | # random, time, calendar 모듈 3개를 모두 활용한 예제 프로그램 13 | -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/5/05-(로또 뽑기).py: -------------------------------------------------------------------------------- 1 | import random 2 | 3 | 4 | def lotto_dong(x): 5 | for i in range(x): 6 | lotto = [random.randint(1, 45) for i in range(6)] 7 | lotto = list(set(lotto)) 8 | while len(lotto) < 6: 9 | lotto = [random.randint(1, 45) for i in range(6)] 10 | lotto = list(set(lotto)) 11 | lotto.sort() 12 | print(f'{i+1}번째 뽑은 번호:', lotto) 13 | 14 | 15 | def lotto_hyeon(): 16 | Xlotto = [random.randint(1, 45) for i in range(6)] 17 | Xlotto = list(set(Xlotto)) 18 | while len(Xlotto) < 6: 19 | Xlotto = [random.randint(1, 45) for i in range(6)] 20 | Xlotto = list(set(Xlotto)) 21 | Xlotto.sort() 22 | Xbonus = random.randint(1, 45) 23 | while Xbonus in Xlotto: 24 | Xbonus = random.randint(1, 45) 25 | print("\n이번 회차 로또 번호:", Xlotto, '보너스 번호:', f'[{Xbonus}]') 26 | 27 | 28 | a = int(input("복권 얼마어치 사실거에요?(원단위) : ")) 29 | lotto_dong(a//1000) 30 | lotto_hyeon() 31 | 32 | """ 33 | 입력한 돈만큼 로또(자동)를 구매하고, 34 | 당첨 번호도 출력하는 프로그램. 35 | 36 | random 모듈의 randint 함수 활용 37 | """ 38 | -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/6/#1-3-(정규표현식으로url검사).py: -------------------------------------------------------------------------------- 1 | import re 2 | 3 | isurl = input().rstrip() 4 | if re.match('^https?://(www\.)?(\w|-)+\.(\w|-)+/[\w.?=_/]*', isurl): 5 | print(True) 6 | else: 7 | print(False) 8 | 9 | """ 10 | 링크를 입력받아서 그 링크가 url 의 형식과 일치하는지 True, False 로 반환하는 프로그램. 11 | 12 | 패턴 : ^https?://(www\.)?(\w|-)+\.(\w|-)+/[\w.?=_/]* 13 | 14 | ^https?:// 15 | ^으로 https?:// 로 시작하는 문자열인지 검사 16 | s?으로 http:// 아니면 https:// 으로, s 가 0~1개 들어가는지 검사 17 | 18 | (www\.)? 19 | www. 이 앞에 붙거나 아닌지(www. 가 0~1개 들어가는지) 검사 20 | 21 | (\w|-)+\.(\w|-)+ 22 | (\w|-)+ 으로 \w(모든숫자,문자) |(아니면) -(하이픈) 이 +(1개 이상 들어가는지) 검사하고 23 | \. 으로 점이 중간에 들어가며, 다시 (\w|-)+ 가 들어감 24 | 25 | /[\w.?=_/]* 26 | /가 들어가고 [\w.?=_/]*으로 대괄호안의 값들이 *(0개 이상 들어가는지) 검사 27 | """ -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/6/01-(딕셔너리메쏘드복습).py: -------------------------------------------------------------------------------- 1 | dic = {1: '2', 2: '4', 3: '6'} 2 | target = int(input()) 3 | print(dic.get(target, f'{target}은 읎어요.')) 4 | # 키 값을 못 뽑아 올때 없다고 출력할 수 있다. 5 | 6 | """ 7 | 딕셔너리 복습(.get() 메쏘드) 8 | (솔직히 이부분은 딕셔너리 자료형에 합쳐야 될텐데;;) 9 | (찬익쌤이랑 배웠던 흔적이니까 함부로 지우기도 그렇다...) 10 | """ 11 | -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/6/02-(딕셔너리복습2).py: -------------------------------------------------------------------------------- 1 | dic = {1: '2', 2: '4', 3: '6'} 2 | print("맨 처음 값: ", dic) 3 | del dic[1] 4 | print("del 처리 후 값: ", dic) 5 | # 딕셔너리는 아이템을 사용할 때 키만 이용할 수 있다. 6 | -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/6/03-1-클래스,객체,인스턴스.py: -------------------------------------------------------------------------------- 1 | # 클래스(Class) 2 | class ClassName: 3 | pass # pass 키워드를 사용해서 빈 클래스를 생성 할 수 있다. 4 | 5 | 6 | """ 클래스(Class): 7 | 클래스(class)란 객체를 표현하기 위한 문법으로, 객체를 찍어내는 틀과 같다. 8 | 객체(object)는 특정한 개념이나 모양으로 존재하는 것이며, 프로그래밍으로 클래스를 통해서 만들수 있다. 9 | 10 | 파이썬에서처럼 클래스와 객체로 객체를 프로그래밍할는 것을 객체지향(object oriented)프로그래밍 이라 말한다. 11 | (프로그래밍의 복잡한 문제를 잘게 나누어 객체로 만들고, 그러한 객체들을 조합해서 문제를 해결함) 12 | 13 | 클래스는 14 | 15 | class 클래스이름: 16 | 과 같이 만들며, 클래스이름의 규칙은 변수와 같다. (보통 클래스이름의 스타일로 맨앞은 대문자를 사용한다) 17 | 클래스 안에서는 속성(attribute)과 메쏘드(method)가 들어가는데, 각각 클래스안에서 쓰이는 변수와 함수다. 18 | 19 | 클래스가 객체를 표현하는 문법, 형태이고, 클래스를 구현한 것이 객체라 했는데, 인스턴스(instance)라는 표현도 사용한다. 20 | 인스턴스는 객체와 같은 의미지만, 객체만 말할땐 객체라고 쓰고, 클래스랑 연관지어 말할 땐 인스턴스라 표현한다. 21 | 22 | 23 | 참고로 지금까지 배웠던 자료형(int, list, dict)으로 표현되는 값들은 모두 객체(자료형 클래스의 인스턴스)에 속한다. 24 | 그래서 자료형마다의 메쏘드가 있었고, 속성도 있었던 것이다. 25 | (type()함수로 인자값이 어떤 클래스인지 반환하는데, 자료형객체를 넣으면 자료형 클래스를 반환) 26 | 27 | 클래스를 통해서 인스턴스를 생성할 때는 28 | """ 29 | 30 | temp = ClassName() # 인스턴스 = 클래스() 식으로 인스턴스를 생성 31 | 32 | print(isinstance(temp, ClassName)) # ininstance(인스턴스, 클래스)로 인스턴스가 클래스에 속하는지 반환값을 출력 33 | """ 34 | 인스턴스이름 = 클래스이름() 35 | 과 같은 형식으로 인스턴스(객체)를 생성한다. 클래스는 개념을 표현(정의)하는 것 뿐이지, 실제로 클래스를 사용하려면 36 | 위같이 인스턴스를 생성해야한다. 37 | 38 | 참고로 특정 클래스의 인스턴스인지 확인하려면 isinstance() 함수를 이용해서 판별할 수 있다. 39 | isinstance(인스턴스, 클래스)와 같이 인자값을 넘기면, 맞을때 True, 다른 클래스의 인스턴스면 False를 반환한다. 40 | """ -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/6/03-3-생성자,소멸자.py: -------------------------------------------------------------------------------- 1 | class Car: 2 | def __init__(self, speed, color, model): 3 | print("생성자 호출") 4 | self.speed = speed 5 | self.color = color 6 | self.model = model 7 | 8 | def drive(self): 9 | self.speed = 60 10 | 11 | def __del__(self): 12 | print("소멸자 호출") 13 | 14 | 15 | myCar = Car(0, 'blue', 'Sonata') 16 | print(f"자동차의 속도는 {myCar.speed}km/h") 17 | print(f"자동차의 색상은 {myCar.color}") 18 | print(f"자동차의 모델은 {myCar.model}") 19 | myCar.drive() 20 | print(f"자동차의 속도가 올라서 현재는 {myCar.speed}km/h 입니다.") 21 | 22 | 23 | """ 생성자(constructor), 소멸자(destructor): 24 | 생성자는 클래스의 인스턴스(객체)를 생성할 때 파이썬에서 자동으로 호출되는 함수다. 25 | 객체를 생성하면서 초기화 작업을 바로 생성자 안에서 할 수 있으며, 문법은 26 | 27 | def __init__(self): 28 | 코드 29 | 30 | 와 같다. __init__ 의 매개변수를 추가해서, 객체를 생성할 때 인자값을 전달 받을 수 있다. 31 | 생성자에서 인스턴스 속성들을 생성하게 되는데, 생성하는 속성들의 값을 전달받은 인자값으로 처리해 줄수도 있다. (위 코드 참고) 32 | 33 | 소멸자는 반대로 클래스의 인스턴스(객체)가 소멸될 때 파이썬에서 자동으로 호출되는 함수다. 34 | del 인스턴스 와 같이 인스턴스를 소멸시키거나, 프로그램이 끝나서 자동으로 인스턴스가 소멸되는 때에 자동으로 호출되며. 35 | 36 | def __del__(self): 37 | 코드 38 | 39 | 와 같은 문법이다. 생성자와 소멸자 모두 __가 메쏘드 앞뒤에 붙게 되는데, 이러한 메쏘드들을 스페셜 메쏘드, 매직 메쏘드라 한다. 40 | 41 | """ 42 | # (스페셜 메쏘드, 매직 메쏘드에는 이것말고도 많은 메쏘드가 있으며, 파이썬에서 중요한 문법중 하나다. 이부분에 대해서는 다음 파일 참고.) 43 | -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/6/03-4-(클래스예제).py: -------------------------------------------------------------------------------- 1 | class Car: 2 | def __init__(self, speed, color, model): 3 | self.speed = speed 4 | self.color = color 5 | self.model = model 6 | 7 | def drive(self): 8 | self.speed = 60 9 | 10 | 11 | myCar = Car(0, 'blue', 'Sonata') 12 | print(f"자동차의 속도는 {myCar.speed}km/h") 13 | print(f"자동차의 색상은 {myCar.color}") 14 | print(f"자동차의 모델은 {myCar.model}") 15 | myCar.drive() 16 | print(f"자동차의 속도가 올라서 현재는 {myCar.speed}km/h 입니다.") 17 | 18 | 19 | """ 클래스 예제: 20 | 찬익쌤의 교학상장 수업때 학습한 예제로, 21 | 뼈대부분의 개념(생성자, 인스턴스 속성, 인스턴스 메쏘드)를 사용해서 구현했었다. 22 | """ 23 | 24 | 25 | -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/6/04-1-클래스의_클래스속성.py: -------------------------------------------------------------------------------- 1 | class Dump: 2 | class_attr = [] 3 | 4 | def __init__(self, n, m): 5 | self.attr = m 6 | Dump.class_attr.append(n) 7 | 8 | 9 | a = Dump(10, 10) 10 | print(a.attr, a.class_attr) 11 | b = Dump(5, 5) 12 | print(b.attr, b.class_attr) 13 | print("클래스속성 :", Dump.class_attr) 14 | 15 | """클래스 속성: 16 | 속성에는 사실 인스턴스 속성 뿐만이 아니라, 클래스 속성도 있으며, 속성은 위같이 2가지 종류로 구분된다. 17 | (지금까지 사용했던 속성은 __init__ 메쏘드에서 만드는 인스턴스 속성이다.) 18 | 19 | 클래스 속성은 20 | 21 | class 클래스이름: 22 | 속성 = 값 23 | 과 같이, 따로 메쏘드안에서가 아니라, 클래스에 바로 속성을 생성하는데, 24 | 인스턴스 속성과 다른점은, 클래스 속성은 클래스에 속해있기 때문에, 클래스의 모든 인스턴스가 공유하는 속성이다. 25 | 26 | 따라서 인스턴스가 여러개여도, 인스턴스의 클래스 속성은 모두 1개를 같이 사용한다. 27 | 28 | 클래스 속성을 접근할 때는 29 | 30 | self.속성이름 31 | 인스턴스.속성이름 32 | 같이 해도 되지만, 코드상으로 클래스 속성으로 접근하는 걸 알수 있게, 33 | 34 | 클래스.속성이름 35 | 과 같이 클래스 안에서나 밖에서나 접근할 수 있다. (이럴경우 한눈에 클래스 속성임을 알 수 있다) 36 | 37 | * 파이썬에서 속성, 메쏘드 이름을 찾을 때는 인스턴스, 클래스 순으로 찾는다. 38 | 그래서 인스턴스 속성이 없으면 클래스 속성을 찾으므로 인스턴스.속성이름 도 문제없이 동작하는 것이다. 39 | """ 40 | 41 | print("a 인스턴스 속성:", a.__dict__) 42 | print("Dump 클래스 속성:", Dump.__dict__) 43 | """ 44 | 참고로 인스턴스, 클래스에서 __dict__ 속성을 출력해보면, 45 | 인스턴스와 클래스의 속성을 딕셔너리 구조로 확인할 수 있다. 46 | 47 | 인스턴스.__dict__ 하면 인스턴스 속성을 확인 할수 있고, 48 | 클래스.__dict__ 하면 클래스 속성을 확인 할 수 있다. 49 | """ 50 | -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/6/04-2-1-클래스메쏘드,정적메쏘드.py: -------------------------------------------------------------------------------- 1 | class Class1: 2 | class_attr = 10 3 | @classmethod 4 | def class_method(cls, n): 5 | print(n + cls.class_attr) 6 | 7 | 8 | Class1.class_method(10) 9 | Class1.class_method(5) 10 | Class1.class_method(0) 11 | """클래스 메쏘드: 12 | 클래스 속성처럼, 클래스 메쏘드도 존재한다. 13 | 클래스메쏘드는 메쏘드위에 @classmethod 를 붙이며, (여기서 @를 붙여 사용하는 것을 데코레이터라고 하며, 자세한건 다음에 언급된다.) 14 | 15 | 클래스 메쏘드의 첫번째 매개변수는 인스턴스 자신을 나타내는 self 대신, cls (CLaSs 의 약자,클래스 자신) 16 | 를 지정한다. (인스턴스 메쏘드가 아닌, 클래스 메쏘드이니까) 17 | 18 | 클래스.메쏘드(인자값) 19 | 과 같이 클래스 메쏘드에 접근할 수 있으며, 20 | 21 | 클래스 메쏘드의 매개변수 cls 를 이용해서, 클래스 속성(cls.클래스속성이름) 이나, 클래스 메쏘드(cls.클래스 메쏘드()) 를 접근할 수 있다. 22 | 또한 인스턴스 매쏘드가 아니다 보니까, 인스턴스 없이 호출할 수 있다. (인스턴스 생성없이도 호출가능) 23 | """ 24 | 25 | 26 | class Temp: 27 | def __init__(self, n): 28 | print("인스턴스 생성", n, "전달받음") 29 | 30 | @classmethod 31 | def create_instance(cls, n): 32 | ins = cls(n) 33 | return ins 34 | 35 | 36 | Temp.create_instance(5) 37 | Temp.create_instance(10) 38 | """ 39 | 추가로 cls 를 이용해서, 현재 클래스의 인스턴스를 만들수도 있다. (인스턴스의 매개변수도 넘겨받을 수 있다.) 40 | cls 자체가 클래스 이므로, cls() 는 현재클래스() 와 같기 때문이다. 41 | """ 42 | 43 | 44 | class Class2: 45 | @staticmethod 46 | def static_method(n, m): 47 | print(n + m) 48 | 49 | 50 | Class2.static_method(1, 2) 51 | Class2.static_method(2, 3) 52 | """ 정적메쏘드: 53 | 정적 메쏘드는 클래스 메쏘드와 비슷하다. 54 | 클래스 메쏘드처럼 메쏘드 위에 @staticmethod 를 붙여야 하며, 정적메쏘드는 self를 매개변수에 지정하지 않는다. 55 | 56 | 다시말해서 self를 매개변수로 받지 않으므로, 인스턴스 속성, 메쏘드에 접근할 수 없다. 57 | 그래서 보통 정적 메쏘드는 메쏘드의 실행이 외부 상태에 영향을 끼치지 않는 순수함수(pure function)를 만들 때 사용한다. 58 | (쉽게말해 인스턴스의 상태를 변화시키지 않는 메쏘드를 만들때 정적 메쏘드를 활용한다.) 59 | 60 | 대신에 정적 메쏘드도 클래스 속성과 메쏘드는 61 | 62 | 클래스이름.속성이름 63 | 클래스이름.메쏘드이름 64 | 과 같이 접근할 수 있다. 65 | (대신에 정적메쏘드와 비슷한 클래스 메쏘드에서 클래스 속성과 메쏘드를 참조하는 목적으로 사용하며, 66 | 정적메쏘드는 목적이 외부 메쏘드, 속성에 영향을 주지않는 메쏘드를 만드는 목적으로 사용법이 갈린다.) 67 | """ -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/6/04-2-2-(정적메쏘드,클래스메소드예제).py: -------------------------------------------------------------------------------- 1 | class Time: 2 | def __init__(self, hour, minute, second): 3 | self.hour = hour 4 | self.minute = minute 5 | self.second = second 6 | 7 | @staticmethod 8 | def is_time_valid(t_str): 9 | h, m, s = map(int, t_str.rstrip().split(':')) 10 | if 25 > h >= 0 and 60 > m >= 0 and 60 >= s >= 0: 11 | return True 12 | else: 13 | return False 14 | 15 | @classmethod 16 | def from_string(cls, t_str): 17 | h, m, s = map(int, t_str.rstrip().split(':')) 18 | t = cls(h, m, s) 19 | return t 20 | 21 | 22 | time_string = input() 23 | 24 | if Time.is_time_valid(time_string): 25 | t = Time.from_string(time_string) 26 | print(t.hour, t.minute, t.second) 27 | else: 28 | print('잘못된 시간 형식입니다.') 29 | 30 | """ 파이썬 코딩도장 35.6 심사문제: 31 | 정적메쏘드와 클래스 메쏘드를 활용한 예제, 32 | 어렵진 않아도 문법과 개념을 까먹었으면 난감한 좋은 예제여서 추가함. 33 | """ -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/6/04-3-클래스상속.py: -------------------------------------------------------------------------------- 1 | class BaseClass: 2 | def base_func(self): 3 | print("부모클래스의 메쏘드") 4 | 5 | 6 | class DerivedClass(BaseClass): 7 | def derived_func(self): 8 | print("자식클래스의 메쏘드") 9 | 10 | 11 | temp = DerivedClass() 12 | temp.base_func() # 자식 클래스에서 부모클래스의 메쏘드도 그대로 사용가능. 13 | temp.derived_func() 14 | """ 클래스 상속(inheritance): 15 | 상속은 무언가를 물려받는 다는 뜻으로, 클래스 상속도 마찬가지로 클래스를 물려받은 것이다. 16 | 17 | 이때 기능을 물려주는 클래스는 기반클래스(base class = 부모 클래스(parent class), 슈퍼 클래스(superclass)) 18 | 기능을 물러(상속)받는 클래스는 파생클래스(derived class = 자식 클래스(child class), 서브 클래스(subclass))라고 한다. 19 | 20 | 새로운 클래스를 만들지 않고 상속 개념을 만든 이유는, 21 | 클래스 마다 중복되는 부분을 반복해서 만들 필요없이 상속을 사용한다면, 중복되는 기능을 생략할 수 있기 때문. 22 | (상속으로 기반클래스의 기존 기능들을 파생클래스에서도 똑같이 사용할 수 있어 효율적) 23 | 24 | 참고로 클래스의 상속관계를 확인할 때는 issubclass() 함수를 사용한다. 25 | issubclass(파생클래스, 기반클래스) 같은 형식으로 인자값을 넘기며, 파생클래스와 기반클래스(상속)관계가 맞을경우, 26 | 참(True), 아니면 거짓(False)를 반환하는 함수. 27 | """ 28 | print(issubclass(DerivedClass, BaseClass)) 29 | # 인자값으로 인스턴스가 올 수는 없다. (인자값으로 클래스가 와야됨) 30 | -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/6/04-4-클래스상속과포함관계.py: -------------------------------------------------------------------------------- 1 | class BaseClass: 2 | def base_func(self): 3 | print("부모클래스의 메쏘드") 4 | 5 | 6 | class DerivedClass(BaseClass): 7 | def derived_func(self): 8 | print("자식클래스의 메쏘드") 9 | 10 | 11 | temp = DerivedClass() 12 | temp.base_func() # 자식 클래스에서 부모클래스의 메쏘드도 그대로 사용가능. 13 | temp.derived_func() 14 | """ 상속관계 vs 포함관계: 15 | 상속은 같은종류, 동등한 관계일 때 사용하며, is-a 관계라고 부른다. 16 | (ex> 부모클래스가 사람, 자식클래스가 학생이면, 학생은 사람이다. 학생 is-a 사람) 17 | """ 18 | 19 | 20 | class Three: 21 | def prt_num(self): 22 | print(3) 23 | 24 | 25 | class Number: 26 | def __init__(self): 27 | self.number_list = [] 28 | 29 | def append_num(self): 30 | self.number_list.append(Three()) # Three 클래스의 인스턴스를 속성에 포함. 31 | 32 | 33 | num = Number() 34 | num.append_num() 35 | print(num.number_list) 36 | num.number_list[0].prt_num() # 포함된 클래스의 메쏘드를 호출 37 | """ 38 | 포함은 상속을 사용하지않고, 클래스안에서 다른 클래스를 포함하는 관계로, has-a 관계라고 부른다. 39 | 상속을 사용하지 않고, 속성에 인스턴스를 만들고, 넣어서 관리하므로, 동등한 관계가 아닌 포함하는 관계다. 40 | (ex> 포함하는클래스가 숫자, 포함되는 클래스가 셋이라면, 숫자는 셋을 포함하고 있다. 숫자 has-a 셋) 41 | 42 | 포함을 사용할 때는, 클래스 전체를 상속받고 싶지 않을때, (클래스의 일부만(속성, 메소드)사용할 때) 사용하며, 43 | 포함된 인스턴스를 속성에 담아서, 44 | 45 | 클래스 안에서는 46 | 47 | 속성.포함된인스턴스의메쏘드() 48 | 속성.포함된인스턴스의속성 49 | 50 | 클래스 바깥에서는 51 | 52 | 포함하는인스턴스.속성.포함된인스턴스의메쏘드() 53 | 포함하는인스턴스.속성.포함된인스턴스의속성 54 | 와 같이 포함된 인스턴스의 메쏘드와 속성을 사용할 수 있다. 55 | """ 56 | -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/6/04-5-super(),부모클래스속성사용.py: -------------------------------------------------------------------------------- 1 | class BaseClass: 2 | class_attr = "부모클래스의 클래스 속성" 3 | 4 | def __init__(self): 5 | self.base_attr = "부모클래스의 인스턴스 속성" 6 | print("부모클래스 생성자 호출") 7 | 8 | def func_base(self): 9 | print("부모클래스의 인스턴스 메쏘드") 10 | 11 | @classmethod 12 | def class_base(cls): 13 | print("부모클래스의 클래스 메쏘드") 14 | 15 | @staticmethod 16 | def static_base(): 17 | print("부모클래스의 정적 메쏘드") 18 | 19 | 20 | class DerivedClass(BaseClass): 21 | 22 | def __init__(self): 23 | print("자식클래스 생성자 호출") 24 | 25 | 26 | temp = DerivedClass() 27 | temp.static_base() 28 | temp.class_base() 29 | temp.func_base() 30 | print(temp.class_attr) 31 | # print(temp.base_attr) # 에러 32 | """ 부모클래스의 인스턴스 속성 사용: 33 | 상속한 자식클래스에서 부모클래스의 요소들을 참고할 때, 34 | 메쏘드는 부모의 클래스, 인스턴스, 정적 메쏘드 모두 호출할 수 있지만, 35 | 속성은 부모의 클래스 속성만 접근할 수 있지, 인스턴스 속성은 접근할 수 없다. 36 | 37 | 인스턴스 속성을 실행하면 에러가 발생하는데, 그 이유는 사실 부모클래스의 __init__ 메쏘드가 호출되지 않았기 때문이다. 38 | (실행 결과를 보면, 자식클래스의 __init__ 메쏘드만 호출됬고, 부모클래스의 __init__ 메쏘드는 호출되지 않았다. 39 | 인스턴스 속성은 __init__ 메쏘드가 생성되어야 같이 생성되기에, 인스턴스 속성도 생성되지 않았었고, 그래서 접근할 수 없던 것이다. 40 | 41 | 그러면 상속된 자식클래스에서 부모클래스의 __init__ (생성자)를 호출하려면, super() 함수를 이용한다. 42 | 43 | super().메쏘드() 44 | 라고 하면, 부모클래스의 원하는 메쏘드를 호출 할 수 있다. 45 | 이때 super().__init__() 46 | 로 부모클래스의 생성자를 호출하면, 비로소 인스턴스 속성도 생성되고, 접근할 수 있게된다. 47 | 48 | 49 | super() 를 더 명확하게 사용할 수도 있는데, 50 | 51 | super(자식클래스, self).메쏘드 52 | 로 super()와 가능은 같지만, 현재 클래스가 어떤 클래스인지 명확하게 표시할 수 있다. 53 | """ 54 | 55 | 56 | class Parents: 57 | def __init__(self): 58 | self.parents_attr = '와우' 59 | 60 | 61 | class Child(Parents): 62 | def prt_parents_attr(self): 63 | print(self.parents_attr) 64 | 65 | 66 | ins = Child() 67 | ins.prt_parents_attr() 68 | """ 69 | 참고로 자식클래스에서 __init__ 메쏘드를 생략하면, 70 | 부모클래스의 __init__ 이 자동으로 호출되서 super()를 사용할 필요가 없다. 71 | """ -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/6/04-6-메쏘드오버라이딩.py: -------------------------------------------------------------------------------- 1 | class Parents: 2 | def func(self): 3 | print("부모클래스 메쏘드 입니다.") 4 | 5 | 6 | class Child(Parents): 7 | def func(self): 8 | print("자식클래스 메쏘드 입니다.") 9 | 10 | 11 | temp = Child() 12 | temp.func() 13 | """ 메소드 오버라이딩(Overriding): 14 | 자식 클래스에서 부모 클래스의 메쏘드를 재정의하는 것을 오버라이딩(Overriding) 이라 한다. 15 | 오버라이딩은 무시하다, 우선하다라는 의미를 가지는데, 뜻과 같이 부모클래스의 원래 메쏘드를 무시하고, 16 | 자식클래스에서 새로 정의한 메쏘드대로 사용하는 것이다. 17 | 18 | 이러는 방법은 부모 클래스의 메쏘드 이름과 똑같은 이름으로 자식 클래스에 메쏘드를 만들면 되는데, 19 | 프로그램에서 메쏘드 오버라이딩은 어떤기능이 같은 메쏘드이름으로 계속 사용되어야할 때 활용한다. 20 | """ 21 | 22 | 23 | class Parents: 24 | def func(self): 25 | print("부모클래스 메쏘드 입니다.") 26 | 27 | 28 | class Child(Parents): 29 | def func(self): 30 | super().func() 31 | print("자식클래스 메쏘드 입니다.") 32 | 33 | 34 | temp = Child() 35 | temp.func() 36 | """ 37 | 만약에 부모클래스의 메쏘드를 자식클래스의 메쏘드로 오버라이딩할 때 부모클래스 메쏘드를 재활용 할 수도 있다. 38 | 마찬가지로 super().메쏘드 39 | 를 사용해서 부모클래스의 오버라이딩할 메쏘드를 호출하는 것이다. 40 | 41 | 이런방법처럼 메쏘드 오버라이딩은 원래기능을 유지하면서 새로운 기능을 덧붙일 때 사용할 수 있다. 42 | """ -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/6/04-8-추상(가상)클래스.py: -------------------------------------------------------------------------------- 1 | from abc import * 2 | # import 에 대한 정보는 모듈 파트 참조 3 | 4 | 5 | class AbstractClass(metaclass=ABCMeta): 6 | @abstractmethod 7 | def abstractmethod(self): 8 | pass 9 | 10 | 11 | """추상클래스(abstract class): 12 | 파이썬에서 존재하는 기능인 추상클래스(= 가상클래스)는 추상(가상)메쏘드의 목록만 가진 클래스다. 13 | 14 | 구현하려면, abc 모듈을 가져와야 한다.(abc 는 초콜릿이 아니라, Abstract Base Class 의 약자다.) 15 | 그후 클래스를 구현할 때 클래스 괄호() 안에 metaclass=ABCMeta 를 넣어주고, 16 | 추상클래스 안의 메쏘드를 만들 때 @abstractmethod 를 붙여서 가상 메쏘드로 지정한다. 17 | 18 | 추상클래스는 자신을 상속하는 자식 클래스가 반드시 구현해야하는 메쏘드를 가상메쏘드로 정해줄 수 있으며, 19 | (자식 클래스가 추상클래스의 가상메쏘드를 모두 구현안하면 자식 클래스의 인스턴스를 생성할 때 에러(TypeError)가 남) 20 | 21 | 22 | 중요한 것은 추상 클래스는 인스턴스(객체)로 만들 수 없으며, 오로지 상속에만 사용된다. 23 | 인스턴스를 만들 수 없으니, 가상 메쏘드도 호출할 경우가 없고, 그래서 가상 메쏘드는 빈 메쏘드로 만듬. 24 | 25 | 26 | 객체지향 프로그래밍에서 추상 클래스는 컨셉(개념, 맥락)만 구현하고, 27 | 실제 기능의 개발은 추상클래스를 상속받는 자식클래스에서 구현할 때 사용하며, 28 | 어떤 기능을 개발할지에 대해 추상 클래스로 미리 설계할 수 있음. 29 | """ -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/6/04-9-2-(스페셜메쏘드예제).py: -------------------------------------------------------------------------------- 1 | # 클래스(Class) 2 | class Car: 3 | def __init__(self, speed, color, model): # __init__ : 생성자(객체 생성시 값 초기화) 4 | self.speed = speed 5 | self.color = color 6 | self.model = model 7 | 8 | def drive(self): # 메소드 : 클래스내 함수(self는 객체의 이름이 들어감) 9 | self.speed = 60 10 | 11 | def __str__(self): # __str__ : 객체를 print()로 출력할 때 자동 호출 12 | msg = f"속도: {self.speed}, 색상: {self.color}, 모델: {self.model}" 13 | return msg 14 | 15 | 16 | myCar = Car(0, 'blue', 'Sonata') 17 | momCar = Car(0, 'gray', 'Morning') 18 | dadCar = Car(0, 'red', 'Avante') 19 | print(myCar) 20 | print(momCar) 21 | print(dadCar) 22 | 23 | """ 24 | 스페셜메쏘드 예제: 25 | 스페셜 메쏘드 __str__를 사용하는 예제로, 26 | print()로 객체를 출력할 때 자동 호출되는 __str__ 스페셜 메쏘드가 정의되어 있다. 27 | """ -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/6/05-1-예외처리try,except,as.py: -------------------------------------------------------------------------------- 1 | # 예외 처리 2 | try: 3 | print(ppap) 4 | except: 5 | print("예외 발생!") 6 | 7 | """ 예외(exception)처리: 8 | 예외란, 코드를 실행중에 발생한 에러를 말하며, 예외에도 다양한 종류가 있는데(ex> TypeError, NameError,...) 9 | 이러한 예외가 발생했을때 원래처럼 에러를 띄으며 스크립트 실행을 중단하지 않고, 10 | 계속실행하게 해주는 방법이 바로 '예외처리'다. 11 | 12 | 예외 처리는 try except 문을 사용해서 13 | # try: 14 | # 실행할 코드 15 | # except: 16 | # 예외가 발생했을 때 처리하는 코드 17 | 위같은 형식으로 예외처리르 할 수 있으며, try: 안의 코드에서 예외가 발생하면, except: 안의 코드를 실행한다. 18 | 이때 trp: 코드중 예외가 발생하면 해당 줄에서 코드실행을 중단하고(그 아래 코드들은 무시된다) 19 | 바로 except: 안의 코드를 실행한다. 20 | 21 | except 에 예외 이름을 지정해서 특정 예외가 발생했을 때만 처리코드를 실행하도록 할 수 있는데, 22 | except: 를 except 예외이름: 과 같이 나타내면된다. (ex> except IndexError: ) 23 | except 예외이름: 은 예외 이름의 종류에 따라서 여러개를 사용할 수 있다. 24 | """ 25 | try: 26 | a = int(input()) 27 | print(10 / a) 28 | except ZeroDivisionError: # 입력받은 값이 0이면 0으로 나눌때의 에러 29 | print("숫자를 0으로 못나눠요.. ㅡㅡ") 30 | except ValueError: # 입력받은 값이 숫자로 변환할 수 없을때의 에러 31 | print("숫자가 아닌 값을 입력했네요.. ㅡㅡ") 32 | 33 | """ 34 | 예외처리에서 except 에서 as 뒤에 변수를 지정하면 발생한 예외의 에러 메시지를 받아 올수도 있다. 35 | 36 | except 예외이름 as e: 37 | 같이 하면, (변수이름으로 보통 예외(Exception)의 앞글자를 딴 e를 사용) 38 | e 변수에서 에러 메시지가 담기게 된다. 39 | 40 | 그리고 e 변수를 type()함수의 인자값으로 넘기면, e 변수에 담긴 에러메시지에서 에러의 종류를 반환할 수 있다. 41 | 42 | 만약 모든 예외의 에러 메시지를 가져오고 싶다면 43 | 44 | except Exception as e: 45 | 와 같이 하면 된다. 46 | """ 47 | try: 48 | int('python') 49 | except NameError as e: 50 | print(e) 51 | print(type(e)) 52 | except ValueError as e: 53 | print(e) 54 | print(type(e)) 55 | 56 | # 참고로 예외도 클래스 상속으로 구현되고, 여러 개충으로 구현되어 있다. 57 | # 나중에 새로운 예외를 만들 때는 Exception 을 상속받아서 구현한다. 58 | -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/6/05-2-예외처리else,finally.py: -------------------------------------------------------------------------------- 1 | # 예외 처리 2 | try: 3 | int('10') 4 | except: 5 | print("예외 발생!") 6 | else: 7 | print("예외가 발생 안함!") 8 | 9 | """ 예외처리에서 else, finally: 10 | try 문에서 반대로 예외가 발생하지 않았을 때 코드를 실행하는 else: 문도 있다. 11 | else 는 except 바로 다음에 오며, except 를 생략하고 else 문을 사용할 수 없다. 12 | """ 13 | try: 14 | int(input()) 15 | except: 16 | print("예외 발생!") 17 | else: 18 | print("예외가 발생 안함!") 19 | finally: 20 | print("예외처리가 끝났습니다.") 21 | 22 | """ 23 | 또한 finally: 문으로 에외가 발생하는지 말든지 마지막에 실행할 코드를 쓸수 있다. 24 | finally: 문은 except 와 else 문을 생략하고도 사용할 수 있는데, 25 | 26 | except 가 실행되든지, else 가 실행되는지, 27 | finally 문이 있으면 마지막에 항상 finally 문을 실행한다. 28 | """ -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/6/05-3-예외발생,raise,assert.py: -------------------------------------------------------------------------------- 1 | try: 2 | ppap = input("ppap를 입력하세요: ") 3 | if ppap != "ppap": 4 | raise Exception("에잇! ppap가 아니잖아!") 5 | print(ppap) 6 | except Exception as e: 7 | print("에러메시지 :", e) 8 | 9 | """예외발생: 10 | 예외를 직접 발생시킬 수도 있는데, 11 | 12 | raise 예외이름("에러메시지") 13 | raise 예외이름() 14 | 와 같이 사용하면, 해당에러가 발생(+ 원하는 에러메시지를 반환)되게 할 수 있다. 15 | 16 | raise 는 try except 가 없는 상태에서도 사용할 수 있는데, 17 | 이렇게 예외를 발생시키면, 현재 코드블럭에서 처리해줄 except 를 찾을 때까지 계속 상위 코드 블록으로 올라가며, 18 | 결국에 처리해줄 except 가 없다면 코드 실행이 중지되고 에러가 표시됨. 19 | 20 | 이것을 이용해서 예외를 다시 발생(re-raise)시킬 수도 있는데, 21 | """ 22 | 23 | 24 | def input_ppap(): 25 | try: 26 | ppap = input("ppap를 입력하세요: ") 27 | if ppap != "ppap": 28 | raise Exception("에잇! ppap가 아니잖아!") 29 | print(ppap) 30 | except Exception as e: 31 | print("함수에서 에러가 발생했네요. 에러메시지 :", e) 32 | raise 33 | 34 | 35 | try: 36 | input_ppap() 37 | except Exception as e: 38 | print("스크립트에서 예러가 발생했네요. 에러메시지:", e) 39 | """ 40 | 이렇게 하면 except 안에서 raise 를 다시 사용했기에, 거기서 발생한 예외를 다시 발생시킨다.(re-raise) 41 | 그렇게 하면 상위 코드블럭의 except 를 찾아서 다시 발생한 예외를 처리하기에, 상위 코드블럭에서도 또한번 예외 처리가 된다. 42 | 43 | 참고로 except 에서 raise 를 사용하면 이전에 발생한 똑같은 예외를 다시 발생시키지만, 44 | 45 | raise 예외이름("예외메시지") 46 | 로 또다른 예외를 지정(새로운 에러 메시지도 추가)할 수 있다. 47 | """ 48 | 49 | ppap = input("또다시 ppap를 입력하세요: ") 50 | assert ppap == 'ppap', "ppap가 아니잖아!" 51 | print(ppap) 52 | """ assert: 53 | 예외를 assert를 이용해 발생시킬 수도 있다. 54 | 55 | assert 조건식 56 | assert 조건식, "에러메시지" 57 | 와 같은 형식으로, 58 | 지정된 조건식이 거짓일 경우에 AssertionError 를 발생시키며, (에러메시지를 추가했을 경우, 에러메시지도 함께 출력) 59 | 조건식이 참일 경우는 에러가 발생되지 않고 그냥 넘어간다. 60 | 61 | (assert 는 디버깅 모드에서만 실행되며(파이썬은 기본적으로 디버깅모드(__debug__ == True)임) 62 | (스크립트 파일에서 assert 가 실행되지않게 하려면, python -O 스크립트파일.py 과 같은 형식으로 실행(O는 영문대문자)) 63 | """ -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/6/06-사용자정의예외,예외만들기.py: -------------------------------------------------------------------------------- 1 | # 직접 예외 처리 만들기 2 | class KimDongError(Exception): 3 | pass 4 | 5 | 6 | try: 7 | word = input() 8 | if word == 'kimdong': 9 | raise KimDongError('오류입나이다') 10 | except KimDongError as e: 11 | print(e) 12 | 13 | """ 사용자 정의 예외: 14 | 파이썬에는 내장된 함수가 있으면 사용자 정의 함수가 있듯이, 15 | 내장된 예외(지금까지 사용했던 예외)가 있으면 사용자 정의 예외도 있다. 16 | 17 | 사용자 정의 예외는 클래스에 Exception 을 상속받아서 만들 수 있으며, 18 | 에러이름은 클래스의 이름이며, 19 | 에러메시지는 20 | 21 | raise 에러이름("에러메시지") 22 | 로 raise 문에서 에러메시지를 넣을 수도 있고, 23 | 에외 class의 __init__ 안에서 24 | 25 | super().__init__("에러메시지") 26 | 로 예외 class 부모클래스(Exception)의 __init__ 메쏘드를 호출하면서 인자값으로 에러 메시지를 넣어 줄수도 있다. 27 | """ 28 | 29 | 30 | class KimSeungError(Exception): 31 | def __init__(self): 32 | super().__init__("김승현에러다!으악!") 33 | 34 | 35 | try: 36 | word = input() 37 | if word == 'kimseung': 38 | raise KimSeungError 39 | except KimSeungError as e: 40 | print(e) -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/6/07-01-이터레이터(iterator).py: -------------------------------------------------------------------------------- 1 | print([1, 2, 3].__iter__()) # 리스트 뿐만 아니라, 2 | 3 | print((1, 2, 3).__iter__()) # 튜플(tuple), 4 | print({1, 2, 3}.__iter__()) # 집합(set), 5 | print('123'.__iter__()) # 문자열(str), 6 | print({1: '1', 2: '2', 3: '3'}.__iter__()) # 딕셔너리(dict), 7 | print(range(1, 4).__iter__()) # range() 함수도 이터레이터(반복자)로 만들 수 있음. 8 | 9 | """ 10 | 이터레이터(iterator = 반복자) 는 값을 차례대로 꺼낼 수 있는 객체임. 11 | 반복가능한 객체(iterable) 에서 얻어내며, 12 | 13 | 반복가능한객체(군집자료형) 안에 있는 메쏘드 __iter__() 를 이용해서 이터레이터를 가져올 수 있음. 14 | ( dir(객체) 와 같이하면, 객체의 메쏘드, 속성들을 반환하는데, 거기에 __iter__ 메쏘드가 있으면 반복가능한 객체임.) 15 | 16 | 이터레이터를 변수에 저장한 뒤에, __next__() 메쏘드를 호출해서 요소들을 차례대로 꺼낼 수 있음. 17 | 요소를 하나씩 차례대로 꺼내다가 마지막 요소까지 꺼내고, 더이상 꺼낼 요소가 없는데 __next__() 메쏘드를 호출하면, 18 | 19 | StopIteration 예외를 발생시키며 반복을 끝냄, 20 | """ 21 | 22 | temp_iter = [1, 2, 3].__iter__() 23 | print(temp_iter.__next__()) 24 | print(temp_iter.__next__()) 25 | print(temp_iter.__next__()) 26 | # print(temp_iter.__next__()) # StopIteration 예외 발생(더이상 꺼낼 요소가 없음) 27 | """ 28 | 반복가능한 객체와 이터레이터(반복자)는 분리되어 (둘은 별개의 객체) 있지만, 29 | __iter__ 메쏘드로 반복가능한 객체의 이터레이터를 얻고, 30 | __next__ 메쏘드로 이터레이터를 반복할 수 있기에 31 | 이 두 메쏘드(__iter__, __next__)를 가진 객체를, 이터레이터 프로토콜 (iterator protocol)을 지원한다고 말함. 32 | 33 | (for 변수 in 반복가능한 객체: 34 | 도 사실 반복가능한 객체를 이터레이터로 만들어서, (__iter__ 메쏘드 실행) 35 | for 문이 반복할 때마다, 이터레이터에서 차례대로 요소를 꺼내서 (__next__ 메쏘드 실행) for 문의 변수에 저장하는 것임.) 36 | 37 | 추가로 이터레이터에서의 값들은 양이 적을 땐 몰라도 많을 때는 미리 만들면 메모리 성능에 불리하기에, 38 | 이터레이터만 생성후, 값이 필요할 시점에 값을 만드는 방식으로 돌아감, 39 | 이런 방식을 지연 평가(lazy evaluation = 느긋한 계산법 = 게으른 연산)이라고 함. 40 | 41 | 이것으로 규모가 큰 값을 다룰때 효율적으로 메모리를 사용할수 있고, 성능도 개선할 수 있음. 42 | """ 43 | -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/6/07-02-이터레이터만들기,이터레이터언패킹.py: -------------------------------------------------------------------------------- 1 | class iter_name: 2 | def __init__(self, stop): 3 | self.current = 0 4 | self.end = stop 5 | 6 | 7 | def __iter__(self): 8 | return self 9 | 10 | def __next__(self): 11 | if self.current < self.end: 12 | r = self.current 13 | self.current += 1 14 | return r 15 | else: 16 | raise StopIteration 17 | 18 | 19 | for i in iter_name(5): 20 | print(i, end=' ') 21 | """ 22 | 클래스와 스페셜 메쏘드 __iter__, __next__ 를 사용해서 직접 이터레이터 객체를 만들 수 있음, 23 | (__init__ 로 이터레이터 객체를 생성하고, __iter__, __next__ 메쏘드에 원하는 기능을 추가해서 24 | 마치 iter_name(n) 이 range(0, n)과 같은 기능을 하게 함.) 25 | """ 26 | 27 | a, b, c = iter_name(3) 28 | print(a, b, c) 29 | 30 | a, b = range(2) 31 | print(a, b) # 반복가능한 객체도 언패킹되는 것처럼, 32 | 33 | a, b = range(2).__iter__() 34 | print(a, b) # 이터레이터도 언패킹할 수 있다. 35 | """ 이터레이터 언패킹: 36 | 이터레이터도 반복가능한 객체와 마찬가지로 언패킹(하나의 반복가능한 객체 -> 여러개의 요소를 각각의 변수에 대입)할 수 있다. 37 | (자세한 언패킹, 패킹은 2폴더 17-2 참고) 38 | 39 | 물론 언패킹할 때의 규칙(이터레이터가 반복하는 횟수 == 변수의 개수)은 동일하며, 40 | 사실 map() 함수도 이터레이터 였기에 언패킹이 가능했던 거임. 41 | (ex> a, b, c = map(int, input().split()) ) 42 | 43 | 44 | *** 참고로 언패킹할 때 변수이름으로 _(언더 스코어, 언더바)를 사용하는 경우가 있는데, 45 | _에 할당하는 것은 _에 할당되는 반환 값은 나중에 사용하지 않고 무시하겠다는 관례적 표현임. 46 | """ 47 | a, _, c, _ = range(4) # ex> 여기서 두번째, 네번째 변수는 사용하지 않겠다는 의미. 48 | print(a, c) 49 | -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/6/07-03-1-이터레이터에인덱스활용,__getitem__.py: -------------------------------------------------------------------------------- 1 | class iter_name: 2 | def __init__(self, stop): 3 | self.end = stop 4 | self.current = 0 5 | 6 | def __getitem__(self, index): 7 | if index < self.end: 8 | return index 9 | else: 10 | raise IndexError 11 | 12 | print(iter_name(5)[0], iter_name(5)[4]) 13 | 14 | for i in iter_name(5): 15 | print(i, end=' ') 16 | 17 | """ 18 | 이터레이터에 인덱스도 활용할 수 있게도 직접 만들수 있다. 19 | __getitem__ 메쏘드를 활용해서, 전달받은 인덱스 값을 출력하게 할 수 있다. 20 | 21 | __getitem__ 메쏘드를 사용한다면, __iter__, __next__ 메쏘드를 생략해도 이터레이터를 만들 수 있다. 22 | (그래서 위같이 for 문에 넣어서 이터레이터를 사용할 수 있다.) 23 | """ 24 | -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/6/07-03-2-(이터레이터,인덱스예제).py: -------------------------------------------------------------------------------- 1 | def time_break(t): 2 | s = t % 60 3 | t //= 60 4 | m = t % 60 5 | t //= 60 6 | h = t % 24 7 | if t // 24 > 0: 8 | h = 0 9 | return f'{h:02}:{m:02}:{s:02}' 10 | 11 | 12 | class TimeIterator: 13 | def __init__(self, start, stop): 14 | self.s = start 15 | self.l = stop 16 | 17 | def __iter__(self): 18 | return self 19 | 20 | def __next__(self): 21 | if self.s < self.l: 22 | r = self.s 23 | self.s += 1 24 | return time_break(r) 25 | else: 26 | raise StopIteration 27 | 28 | def __getitem__(self, item): 29 | if 0 <= item < self.l: 30 | return time_break(self.s + item) 31 | else: 32 | raise IndexError 33 | 34 | 35 | start, stop, index = map(int, input().split()) 36 | 37 | for i in TimeIterator(start, stop): 38 | print(i) 39 | 40 | print('\n', TimeIterator(start, stop)[index], sep='') 41 | """ 42 | 이터레이터를 사용해서, 처음 시간과 끝 시간까지를 시:분:초 형식으로 출력하는 프로그램 43 | 44 | 입력받는 값이 3가지인데 start = 처음 시간(초단위), stop = 끝 시간(초단위), index = 특정시간(인덱스번호) 45 | """ 46 | 47 | -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/6/07-04-내장함수,iter,next.py: -------------------------------------------------------------------------------- 1 | it = iter(range(3)) 2 | print(next(it), next(it), next(it)) 3 | 4 | """ 5 | iter() 함수와 next() 함수는 기본적으로 객체의 __iter__, __next__ 메쏘드를 호출한다. 6 | 하지만 이런 기능이외에도 다양한 방식으로 활용할 수 있다. 7 | """ 8 | 9 | import random 10 | 11 | it = iter(lambda: random.randint(0, 5), 2) 12 | print(next(it)) # 랜덤으로 0 ~ 5 중 반환한 값이 2일 경우 반복멈춤(에러 발생) 13 | """ 14 | iter(반복가능한객체) 말고 15 | iter(호출가능한객체, 반복을 끝낸 값) 16 | 과 같은 방법으로 iter() 를 쓸 수 있다. 호출가능한 객체(함수같이)를 넣어서 반환되는 값이 반복을 끝낸 값이면 17 | 반복을 끝낸다. (반복을 끝낼 값은 sentinel(감시병)이라 부른다. (반환되는 값을 감시하고 걸리면 반복을 끝내서) ) 18 | 19 | 이렇게 하면 if 조건문으로 검사하는 코드를 간단하게 요약할 수 있다. 20 | """ 21 | 22 | it = iter(range(2)) 23 | print(next(it, 10)) 24 | print(next(it, 10)) 25 | print(next(it, 10)) 26 | print(next(it, 10)) 27 | print(next(it, 10)) 28 | print(next(it, 10)) 29 | """ 30 | next(반복가능한객체, 기본값) 31 | 으로 반복이 끝났을 때 대신 출력할 기본값을 지정할 수 있다. 32 | 이터레이터에서 반복이 끝나면 에러가 나는 것이 아니라 기본값을 반환해서 에러를 막을 수 있다. 33 | """ 34 | -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/6/07-06-1-제너레이터만들기,yield로함수호출.py: -------------------------------------------------------------------------------- 1 | def generator_range(end): 2 | n = 0 3 | while n < end: 4 | yield n 5 | n += 1 6 | 7 | 8 | for i in generator_range(5): 9 | print(i) 10 | """ 제너레이터 만들기: 11 | 이터레이터를 만들었던 것보다 간편하게 함수와 yield 로 제너레이터를 만들 수 있다. 12 | (for 문 말고 __next__ 메쏘드로도 사용가능) 13 | """ 14 | 15 | 16 | def upper_words(x): 17 | for i in x: 18 | yield i.upper() 19 | 20 | 21 | words = ['ppap', 'hahaha', 'wow'] 22 | for i in upper_words(words): 23 | print(i) 24 | """ 25 | yield 에서 값을 함수(메쏘드)의 반환값으로도 넘길 수 있다. 26 | 위같이 yield 의 동작 방식만 이해하면 이터레이터 보다 훨씬 간단한 구조로 제너레이터를 만들 수 있다. 27 | """ 28 | 29 | -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/6/07-06-2-(제너레이터예제).py: -------------------------------------------------------------------------------- 1 | def prime_number_generator(s, l): 2 | for i in range(s, l): 3 | for j in range(2, i): 4 | if i % j == 0: 5 | break 6 | elif j == i-1: 7 | yield i 8 | 9 | 10 | start, stop = map(int, input().split()) 11 | 12 | g = prime_number_generator(start, stop) 13 | print(type(g)) 14 | for i in g: 15 | print(i, end=' ') 16 | """ 17 | 제너레이터를 사용해서 시작 숫자와 끝 숫자를 입력받아, 그 수 사이의 소수들을 출력하는 예제. 18 | """ 19 | -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/6/07-07-yield from,제너레이터표현식.py: -------------------------------------------------------------------------------- 1 | def yield_together(): 2 | yield from [1, 2, 3] 3 | 4 | 5 | for i in yield_together(): 6 | print(i) 7 | """ yield from: 8 | 여러개의 값을 yield 로 전달할 때, 파이썬 3.3 이상부터는 yield from 을 사용해서, 9 | 10 | yield from 반복가능한 객체 11 | yield from 이터레이터(제너레이터 객체) 12 | 등으로 여러개의 요소들을 한개 씩 함수 바깥으로 전달 할 수 있다. 13 | 14 | 특히 제너레이터 객체를 yield 의 값으로 반환할 수 있기에, 다른 제너레이터 함수를 호출한 값(반환시 객체가 반환)을 15 | yield 의 값으로 사용할 수 있다. 16 | """ 17 | 18 | print((i for i in range(50) if i % 5 == 0)) 19 | """ 제너레이터 표현식: 20 | 리스트 내포, 표현식을 배우면서 튜플, 딕셔너리, 집합, range() 의 표현식도 배웠었는데, (폴더2 6-2 참고) 21 | 그때 얼핏 나왔던 것이 제너레이터 표현식이다. ()로 감싸서 사용하기에, 이와 형식이 겹치는 튜플(tuple)은 tuple()로 감싸야 됬었다. 22 | 23 | 표현식의 문법은 리스트 내포 확장에서 처럼 표현식 문법 그대로 사용할 수 있다. 24 | 이 제너레이터 표현식을 활용해서 제너레이터를 좀 더 쉽게 사용할 수 있다. 25 | """ 26 | -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/6/07-09-코루틴밖으로값전달.py: -------------------------------------------------------------------------------- 1 | def cocoroutine(): 2 | out = 0 3 | while True: 4 | x = (yield out) 5 | out += x 6 | 7 | 8 | co = cocoroutine() 9 | print(next(co)) 10 | print(co.send(1)) 11 | print(co.send(1)) 12 | print(co.send(1)) 13 | """ 14 | 코루틴 안으로 값을 전달받았듯이 반대로 코루틴 바깥으로 값을 전달할 수 있다. 15 | 16 | (yield 변수) 17 | 형식으로 한다면, yield 뒤의 변수가 코루틴(함수) 바깥으로 실행이 전환될 때 값도 전달된다. 18 | 19 | next(코루틴객체) # == 코루틴객체.__next__() 20 | 코루틴객체.send(값) 21 | 같이 코루틴 바깥에서 코루틴을 호출하면, 다시 코루틴에서 바깥으로 반환하면서, 반환값으로 아까의 변수 값이 딸려나온다. 22 | 23 | 이렇게 코루틴 안과 밖으로 실행을 왔다 갔다 하면서, 그 사이에 값을 전달받고 전달할 수 있다. 24 | 25 | 코루틴 바깥에서 코루틴을 실행할 때 __next__ 와 send 의 차이점은, 26 | __next__ 는 코루틴으로 값을 보내지 않으면서 코루틴의 코드를 실행할 때 사용하고, 27 | send 는 코루틴으로 값을 보내면서 코루틴의 코드를 실행할 때 사용한다. 28 | 29 | 그리고 __next__ 만 사용하게 된다면, 일반적인 제너레이터가 되게 된다. 30 | 31 | 32 | *** 제너레이터 vs 코루틴 33 | 제너레이터는 __next__ 를 반복 호출해 값을 차례대로 뽑아내는 방식 34 | 코루틴은 __next__ 에 추가로 send 를 사용해 값을 주고받는 방식 35 | (사실은 코루틴도 제너레이터의 일부로, 코루틴은 제너레이터에서 확장된 것이다. 36 | 이터레이터에서 제너레이터가 나왔고, 그 제너레티어에서 코루틴도 나왔다는 것...) 37 | """ 38 | -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/6/07-10-코루틴종료,예외처리,throw.py: -------------------------------------------------------------------------------- 1 | def good_corotin(): 2 | while True: 3 | print((yield), end=' ') 4 | 5 | 6 | coro = good_corotin() 7 | coro.send(None) 8 | 9 | for i in range(10): 10 | coro.send(i) 11 | 12 | coro.close() 13 | print() 14 | """ 15 | 코루틴은 보통 실행 상태가 유지되게 무한루프를 사용하는데, 코루틴을 만약 강제로 종료한다면, .close() 메쏘드를 이용함. 16 | (사실 close() 메쏘드를 사용하지 않아도 코루틴은 파이썬 스크립트가 끝나면 같이 끝남.) 17 | 이를 활용해 코루틴의 종료 시점을 코드로 표현할 때 사용할 수 있음. 18 | 19 | 코루틴이 close() 로 종료된다면 코루틴에선 GeneratorExit 예외가 발생하는데, 20 | 21 | 이 예외를 try except 문으로 처리해서 코루틴의 종료 시점에 원하는 코드를 실행할 수 있음. 22 | """ 23 | 24 | 25 | def haha_corotin(): 26 | try: 27 | while True: 28 | print((yield), end=' ') 29 | except GeneratorExit: # 코루틴이 종료될 때 이 예외가 발생 30 | print("\n코루틴 종료") 31 | 32 | 33 | co = haha_corotin() 34 | co.send(None) 35 | 36 | for i in range(10): 37 | co.send(i) 38 | 39 | co.close() 40 | """ 41 | 위같이 하면 코루틴이 종료될 때 코루틴 종료가 출력되게 함. 42 | 43 | 또한 일부러 예외를 발생 시킬수도 있는데, throw() 메쏘드를 사용함. 44 | 45 | 코루틴객체.throw(예외이름, 에러메시지) 46 | 같이해서 코루틴 바깥에서 에러를 코루틴 안으로 던질 수 있으며, 이렇게 해서 코루틴을 종료시킬 수도 있음. 47 | """ 48 | 49 | 50 | def no_more_corotin(): 51 | sum = 0 52 | try: 53 | while True: 54 | x = (yield) 55 | print(x, '가 누적') 56 | sum += x 57 | except IndexError as e: 58 | print(e) 59 | yield sum 60 | 61 | 62 | cr = no_more_corotin() 63 | next(cr) 64 | 65 | cr.send(1) 66 | cr.send(3) 67 | cr.send(2) 68 | print("누적된 값 :", cr.throw(IndexError, "갑자기 분위기 에러")) 69 | """ 70 | 위같이 해서 코루틴을 throw 로 예외를 만들게 하고, 예외 처리에서 예외를 만날 때 값도 반환하고 에러메시지도 출력하게 함. 71 | """ -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/6/07-11-하위코루틴값전달,yield from.py: -------------------------------------------------------------------------------- 1 | def gogo_coroutine(): 2 | total = 0 3 | while True: 4 | x = (yield) 5 | if x is None: 6 | return total 7 | total += x 8 | 9 | 10 | def load_coroutine(): 11 | while True: 12 | x = yield from gogo_coroutine() 13 | print(x) 14 | 15 | 16 | co = load_coroutine() 17 | next(co) 18 | co.send(1) 19 | co.send(2) 20 | co.send(3) 21 | co.send(None) 22 | """ 23 | yield 도 쓸수 있듯이 yield from 도 쓸 수 있는데, 24 | 제너레이터 처럼, 반복가능한 객체등을 반환할 때 쓰는 것이 아니라, 코루틴 바깥에서 하위 코루틴을 잇는 역할로 쓴다. 25 | 26 | yield from 코루틴() 27 | 을 사용한다면 코루틴 바깥과 yield from 뒤의 코루틴과를 연결시키고, 값을 주고 받을 수 있게 한다. 28 | 따라서 코루틴 바깥에서 값을 주면 yield from 코루틴() 으로 하위 코루틴으로 받은 값이 고스란히 전달되고, 29 | 30 | 반대로 하위 코루틴에서 반환한 값을 yield from 코루틴() 에서 전달받아서, 코루틴 바깥으로 전달 할 수 있다. 31 | 정말 하위 코루틴과 코루틴 바깥에서 오고가는 값을 사이에서 연결해주는 느낌이다. 32 | 33 | 34 | 전에서 설명했듯이 코루틴도 제너레이터여서, return 을 사용했을 때 제너레이터처럼 StopIteration 예외가 발생한다. 35 | 그걸 이용해 파이썬 3.6이하 까지는 raise StopIteration(값)으로 return 값 과 같은 효과를 낼 수 있다. 36 | 37 | 대신에 파이썬 3.7부터는 raise StopIteration() 해도 RuntimeError 로 바뀌기 때문에 사용할 수 없다. 38 | """ 39 | 40 | -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/6/07-12-(코루틴예제).py: -------------------------------------------------------------------------------- 1 | def calc(): 2 | x = 0 3 | while True: 4 | w = (yield x) 5 | a, oper, b = w.split(' ') 6 | if oper == '+': 7 | x = int(a) + int(b) 8 | elif oper == '-': 9 | x = int(a) - int(b) 10 | elif oper == '/': 11 | x = int(a) / int(b) 12 | elif oper == '*': 13 | x = int(a) * int(b) 14 | 15 | 16 | expressions = input().split(', ') 17 | 18 | c = calc() 19 | next(c) 20 | 21 | for e in expressions: 22 | print(c.send(e)) 23 | 24 | c.close() 25 | """ 26 | 코루틴으로 연속되는 사칙연산을 문자열로 받아서 그에 맞게 처리하는 코루틴 예제. 27 | """ -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/6/08-3-데코레이터클래스구현.py: -------------------------------------------------------------------------------- 1 | class deco: 2 | def __init__(self, func): 3 | self.func = func # 대상 함수가 인스턴스 속성으로 저장되기에, 나중에 접근할때 self. 를 붙여야된다. 4 | 5 | def __call__(self): 6 | print(self.func.__name__, '함수 시작') 7 | self.func() 8 | print(self.func.__name__, '함수 끝') 9 | 10 | @deco 11 | def hi(): 12 | print("hi 함수 동작!") 13 | 14 | 15 | hi() 16 | """ 데코레이터 클래스로 구현 : 17 | 클래스로 데코레이터를 만들 수 있는데, 인스턴스를 함수처럼 호출하게 해주는 __call__ 스페셜 메서드를 활용함. 18 | 19 | __init__ 메서드에서 인스턴스(데코레이터)를 생성하면, 전달받은 함수를 인스턴스 속성에 저장하고, 20 | __call__ 메서드로 인스턴스(데코레이터)가 호출된다면, 전달받은 함수를 호출하고, 추가기능도 작성함. 21 | 이때 대상 함수는 self.~ 꼴로 인스턴스 속성으로 저장했기 때문에, 호출하거나 사용할 때도, self.~ 형식을 지켜야 함. 22 | 23 | (@를 쓰지않으면, 아래처럼 함수로 데코레이터를 호출하면 됨.) 24 | deco(hi)() 25 | 26 | 매개변수, 반환값이 있는 함수의 데코레이터를 클래스를 구현할 때는, 27 | __call__ 의 매개변수로 대상 함수의 매개변수와 똑같이 전달받아, 대상 함수를 호출할 때 그대로 전달해 주면 되고, 28 | 반환값은 __call__ 함수의 반환값으로 대상함수의 반환값을 반환하면 된다. (이부분은 함수로 구현했을 때와 동일하다.) 29 | """ 30 | 31 | 32 | class kaka: 33 | def __init__(self, x): # 데코레이터의 매개변수가 있는 경우면, __init__ 에 대상함수 대신 매개변수를 전달 받는다. 34 | self.x = x 35 | 36 | def __call__(self, func): # __call__에서 대상함수를 전달받고, 안에 내부함수(클로저)를 만든다. 37 | def warpper(a, b): # 내부함수에선 대상함수의 매개변수를 전달받고, 대상함수를 호출, 반환값을 반환한다. 38 | r = func(a, b) 39 | print("결과 : ", str(r) * self.x) 40 | return r 41 | return warpper 42 | # __call__ 함수만 보면 데코레이터를 함수로 구현했던 구조와 비슷하다. (클로저를 사용) 43 | 44 | 45 | @kaka(3) 46 | def add(a, b): 47 | return a + b 48 | 49 | 50 | print(add(1, 2)) 51 | print(add(2, 3)) 52 | """ 매개변수가 있는 데코레이터를 클래스로 구현 : 53 | 대신 매개변수가 있는 데코레이터를 클래스로 구현할때는 다르다. 54 | 55 | @데코레이터(인수) 56 | 와 같이 데코레이터를 사용하면서 바로 인자를 넘겨주기에, __init__ 에서 데코레이터의 매개변수를 전달 받고, 57 | 대신에 데코레이터의 대상 함수는 __call__ 에서 매개변수로 전달받는다. 58 | 그리고 __call__ 메서드 안에 내부함수(wrapper, 클로저)로 대상함수의 매개변수를 전달받고, 59 | 내부함수 안에서 대상함수를 호출하고, 코드를 덧붙이고, 대상함수의 반환값을 내부함수가 반환한다. 60 | 그리고, __call__ 메서드에서 내부 함수 자체를 반환하면 된다. 61 | """ -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/6/08-4-(데코레이터예제,html태그).py: -------------------------------------------------------------------------------- 1 | def html_tag(tag): 2 | def deco(func): 3 | def wrapper(): 4 | return '<' + tag + '>' + func() + '' 5 | return wrapper 6 | return deco 7 | 8 | 9 | a, b = input().split() 10 | 11 | 12 | @html_tag(a) 13 | @html_tag(b) 14 | def hello(): 15 | return 'Hello, world!' 16 | 17 | 18 | print(hello()) -------------------------------------------------------------------------------- /_2 파이썬 문법정리 파일(구버전)/6/09-(급식표프로그램,클래스,예외처리,파일응용).py: -------------------------------------------------------------------------------- 1 | # (클래스, 예외처리, 파일)종합 창작 2 | class Lunch: 3 | def __init__(self, meal, soup, main_dish, side_dish): 4 | self.meal = meal 5 | self.soup = soup 6 | self.main_dish = main_dish 7 | self.side_dish = side_dish 8 | def __str__(self): 9 | msg = f"점심 식단\n밥: {self.meal}\n국: {self.soup}\n주메뉴: {self.main_dish}\n반찬: {self.side_dish}" 10 | 11 | print(" 이번주 월~수요일의(7월 29일 ~ 7월 31일) 점심 급식표 관리 프로그램 입니다. ") 12 | days = input("어떤 요일의 점심을 보시겠습니까?(숫자입력) 1: 월요일, 2: 화요일, 3: 수요일 : ") 13 | try: 14 | int(days) 15 | except Exception as e: 16 | print(f'잘못된 {type(e)}입니다') 17 | print(f'잘못된 {type}입니다') 18 | else: 19 | print(f'\n{days} 점심 식단표') 20 | 21 | if days == 1: 22 | f = open(r"C:\PycharmProjects\06\venv\1.txt", 'r') 23 | f.close() 24 | elif days == 2: 25 | f = open(r"2.txt", 'r') 26 | elif days == 3: 27 | f = open(r"3.txt", 'r') 28 | lines = f.readlines() 29 | Today = Lunch(lines[0], lines[1], lines[2], lines[3]) 30 | print(Today) 31 | f.close() 32 | 33 | """ 급식표 보는 프로그램: 34 | 클래스와 예외처리, 파일 개념을 모두 종합해서 응용한 예제 35 | """ 36 | --------------------------------------------------------------------------------