ref)
1. 점프 투 파이썬(강추)
2.왕초보를 위한 Python: 쉽게 풀어 쓴 기초 문법과 실습
목차
0. python이란
파이썬(Python)은 1990년 암스테르담의 귀도 반 로섬(Guido Van Rossum)이 개발한 인터프리터 언어이다.
귀도는 파이썬이라는 이름을 자신이 좋아하는 코미디 쇼인 "몬티 파이썬의 날아다니는 서커스(Monty Python’s Flying Circus)"에서 따왔다고 한다.
- 인터프리터 언어란 한 줄씩 소스 코드를 해석해서 그때그때 실행해 결과를 바로 확인할 수 있는 언어
- 파이썬의 사전적 의미는 고대 신화에 나오는 파르나소스 산의 동굴에 살던 큰 뱀
1. python 특징
- 간결하다 : 문제 해결을 위해 가장 좋은 방법 1가지만 사용하는 것을 선호
- 가독성 : 들여쓰기가 강제되어, 들여쓰기를 하지 않으면 프로그램이 실행되지 않는다.
- 콜론(:)을 사용하여 들여쓰기(indentation)를 하도록 만들었다
- 접착(glue) 언어 : 다른 언어와 잘 어울려 결합해서 사용가능하다. 특히 C/C++
- EAFP 언어이다(TRY~Exception) : “It’s Easier to Ask Forgiveness than Permission”
- LBYL 언어(IF): “Look Before You Leap”
2. 파이썬 작업
2.1 파이썬 대화형 인터프리터 : 파이썬 셸(Python shell)
- 파이썬 대화형 인터프리터를 간단히 파이썬 셸(Python shell)이라고도 부른다.
- 3개의 꺾은 괄호(>>>)는 프롬프트(prompt)라고 한다.
2.2 파이썬 에디터 : 파이썬 IDLE(Integrated Development and Learning Environment)
에디터 = 소스 코드를 편집할 수 있는 프로그래밍 툴
- IDLE 셸 창(Shell Window) - IDLE 에디터에서 실행한 프로그램의 결과가 표시되는 창으로서 파이썬 셸과 동일한 기능을 수행한다. IDLE을 실행하면 가장 먼저 나타나는 창이다.
- IDLE 에디터 창(Editor Window) - IDLE 에디터가 실행되는 창이다.
2.3 전문 에디터
- 비주얼 스튜디오 코드
- 파이참
3. 자료형(Number, String)
3.1 숫자형
Integer- 정수 | 123, -345, 0 |
Floating-point - 실수 | 123.45, -1234.5, 3.4e10(컴퓨터식 지수표현 방식, e와 E 구별 없음) |
Octal - 8진수(0+'O' or 'o') | 0o34, 0o25 |
Hexadecimal - 16진수(0+'x') | 0x2A, 0xFF |
3.2 문자열(String)
- 선언방법
- 한 줄
- 큰따옴표(")로 양쪽 둘러싸기 "Hello World"
- 작은따옴표(')로 양쪽 둘러싸기 'Python is fun'
- 여러줄
- 큰따옴표 3개를 연속(""")으로 써서 양쪽 둘러싸기 """Life is too short, You need python"""
- 작은따옴표 3개를 연속(''')으로 써서 양쪽 둘러싸기 '''Life is too short, You need python'''
- 한 줄
- 작은따옴표나 큰따옴표를 포함시키고 싶을 때
- 작은따옴표 -> 큰걸로 싸기 : "Python's favorite food is perl" :
- 큰따옴표 -> 작은걸로 싸기 '"Python is very easy." he says.'
- 백슬래시 사용 : 'Python\'s favorite food is perl'
3.3 리스트
3.4 튜플
3.5 딕셔너리
3.6 집합
3.7 불
3.8 변수
4. 연산
4.1 숫자
- 사칙연산 : +, -, *, /
- 제곱 : ** ex) a^b == a **b
- 나머지 : %
- 몫 : // ex) 7//4 =1
4.2 문자열 연산
- 문자열 반복 : * , ex) print("=" * 50) => "=================...."
- 문자열 길이 : len()
- indexing : [번호], a[0]
- slicing : 자르기, ex) a[0:4] 0부터 4까지, 0<= a < 4
- -기호 : ex) a[19:-7] a[19]에서부터 a[19-8] 까지, 11< a <= 19
- 문자열 연결 : 큰따옴표(")로 둘러싸인 문자열은 + 연산과 동일하다
- print("life" "is" "too short") = print("life"+"is"+"too short")
- print("life" "is" "too short") = print("life"+"is"+"too short")
- 띄어쓰기 : 콤마로 한다
- print("life", "is", "too short") = life is too short
- print("life", "is", "too short") = life is too short
- formatting
- 정수(Integer) %d : ex) "I eat %s apples." % "five
- 문자열(String) %s : ex) "I eat %d apples." % 3
- %s는 자동으로 % 뒤에 있는 값을 문자열로 바꿈
- 문자 1개(character) %c :
- 부동소수(floating-point) %f :
- 8진수 %o
- 16진수 %x
- Literal % '%' 표현 : %%
- "Error is %d%%." % 98 -> 'Error is 98%.'
- 두개이상 : ex) I ate %d apples. so I was sick for %s days." % (number, day)
- format함수
- 문자열의 {0}, {1}과 같은 인덱스 항목이 format 함수의 입력값으로 순서에 맞게 바뀐다.
- name 형태도 가능
- index 방식 : "I ate {0} apples. so I was sick for {1} days.".format(number, day)
- name 방식 : "I ate {number} apples. so I was sick for {day} days.".format(number=10, day=3)
- count : 문자 갯수 세기 ex) a = "hobby", a.count('b') = 2
- find : 문자가 처음 나온 위치(index) 반환
- index : find와 동일하나, 해당 문자가 없을 시 오류 반환
- join : 문자열 삽입 ex) ",".join('abcd') = 'a,b,c,d'
- 리스트나 튜플도 입력으로 사용가능
- upper/lower/lstring/rstrip/strip/replace/split
4.3 비교연산
x < y | x가 y보다 작다 |
x > y | x가 y보다 크다 |
x == y | x와 y가 같다 |
x != y | x와 y가 같지 않다 |
x >= y | x가 y보다 크거나 같다 |
x <= y | x가 y보다 작거나 같다 |
4.4 논리연산
x or y | x와 y 둘중에 하나만 참이어도 참이다 |
x and y | x와 y 모두 참이어야 참이다 |
not x | x가 거짓이면 참이다 |
4.5 집합 연산
in(안에 있다) | not in(안에 없다) |
x in 리스트 | x not in 리스트 |
x in 튜플 | x not in 튜플 |
x in 문자열 | x not in 문자열 |
5. 조건
5.1 if
if 조건문:
수행할 문장1
수행할 문장2
...
else:
수행할 문장A
수행할 문장B
...
5.2 elf : 다중 조건 판단, 이전 조건문이 거짓일 때 수행
5.3 조건부 표현식 : ex ) message = "success" if score >= 60else"failure"
5.4 pass : 아무것도 안하게 하는 명령
5.5 match - case : switch-case
6. 반복
6.1 while
while <조건문>:
<수행할 문장1>
<수행할 문장2>
<수행할 문장3>
...
while - else
6.2 for
for 변수 in 리스트(또는 튜플, 문자열):
수행할 문장1
수행할 문장2
...
ex1) 리스트의 요솟값이 튜플이기 때문에 각각의 요소가 자동으로 (first, last) 변수에 대입된다.
>>> a = [(1,2), (3,4), (5,6)]
>>> for (first, last) in a:
... print(first + last)
...
3
7
11
for - else
6.3 break : 탈출
6.4 continue : 현재 반복회차 skip
6.5 range 함수 : 숫자리스트를 자동으로 만들어 줌
>>> add = 0
>>> for i in range(1, 11):
... add = add + i
...
>>> print(add)
55
6.6 List comprehension
[표현식 for 항목 in 반복가능객체 if 조건문]
for문을 2개 이상 사용하는 것도 가능
ex1)
>>> a = [1,2,3,4]
>>> result = [num * 3 for num in a]
>>> print(result)
[3, 6, 9, 12]
ex2)
>>> a = [1,2,3,4]
>>> result = [num * 3 for num in a if num % 2 == 0]
>>> print(result)
[6, 12]
7. 함수
예약어 def를 선언해서 생성
def 함수명(매개변수):
<수행할 문장1>
<수행할 문장2>
...
7.1 함수의 영향범위
ex) print는 1이 나온다
a = 1
def vartest(a):
a = a +1
vartest(a)
print(a)
- 함수 안에서 함수 밖의 변수를 변경하는 방법
- return 사용하기(O)
- global 명령어 사용하기(X)
# vartest_return.py
a = 1
def vartest(a):
a = a +1
return a
a = vartest(a)
print(a)
7.2 반환 : return 명령하기
리턴값은 언제나 하나이다.
- 튜플리턴
>>> def add_and_mul(a,b):
... return a+b, a*b
result = (7, 12)
>>> result1, result2 = add_and_mul(3, 4)
result1, result2 = (7, 12)가 되어 result1은 7이 되고 result2는 12가 된다.
7.3 매개변수 지정 호출
>>> def sub(a, b):
... return a - b
...
>>> result = sub(a=7, b=3) # a에 7, b에 3을 전달
>>> print(result)
4
7.4 매개변수 갯수 랜덤
def 함수이름(*매개변수):
<수행할 문장>
...
ex1)
>>> def add_many(*args):
... result = 0
... for i in args:
... result = result + i
... return result
...
>>>
>>> result = add_many(1,2,3)
>>> print(result)
6
>>> result = add_many(1,2,3,4,5,6,7,8,9,10)
>>> print(result)
55
ex2) 혼용하기
>>> def add_mul(choice, *args):
... if choice == "add":
... result = 0
... for i in args:
... result = result + i
... elif choice == "mul":
... result = 1
... for i in args:
... result = result * i
... return result
...
>>>
7.5 kwargs 키워드 매개변수
key=value 형태의 입력값이 딕셔너리 형태로 저장 후 반환된다.
>>> def print_kwargs(**kwargs):
... print(kwargs)
...
>>> print_kwargs(a=1)
{'a': 1}
>>> print_kwargs(name='foo', age=3)
{'age': 3, 'name': 'foo'}
7.6 매개변수 초기화
매개변수(age)는 초깃값이 있는 매개변수(man) 뒤에 사용할 수 없다.
항상 뒤쪽에 놓아야 한다.
(name, age, man=True)는 되지만 (name, man=True, age)는 안 된다
def say_myself(name, age, man=True):
print("나의 이름은 %s 입니다." % name)
print("나이는 %d살입니다." % age)
if man:
print("남자입니다.")
else:
print("여자입니다.")
7.7 lambda
lambda는 함수를 생성할 때 사용하는 예약어로 def와 동일한 역할을 한다. def를 사용해야 할 정도로 복잡하지 않거나 def를 사용할 수 없는 곳에 주로 쓰인다.
- lambda로 만든 함수는 return 명령어가 없어도 표현식의 결괏값을 리턴한다.
>>> add = lambda a, b: a+b
>>> result = add(3, 4)
>>> print(result)
7
8. 입출력
8.1 파일
- 파일경로 역슬래시 입력
- 역슬래시를 2개 사용하거나 r"C:\doit\새파일.txt"와 같이 문자열 앞에 r 문자(Raw String)를 덧붙여 사용
- ( \n과 같은 이스케이프 문자가 있을 경우 줄바꿈 문자로 해석)
- ex1) r"C:\doit\새파일.txt"
- ex2) "C:\\doit\\새파일.txt"
- 역슬래시를 2개 사용하거나 r"C:\doit\새파일.txt"와 같이 문자열 앞에 r 문자(Raw String)를 덧붙여 사용
- 파일 열기
- open 함수 : 파일 객체 = open(파일 이름, 파일 열기 모드)
- r : 읽기모드 - 파일을 읽기만 할 때 사용
- w : 쓰기모드 - 파일에 내용을 쓸 때 사용
- a : 추가모드 - 파일의 마지막에 새로운 내용을 추가 시킬 때 사용
- f.close() : 생략가능 but 닫아주는 것이 좋다. 쓰기모드로 열었던 파일을 닫지 않고 다시 사용하려고 하면 오류가 발생한다. 프로그램을 종료할 때 파이썬 프로그램이 열려 있는 파일의 객체를 자동으로 닫아 줌.
- open 함수 : 파일 객체 = open(파일 이름, 파일 열기 모드)
- 파일 읽기
- readline 함수 : 한 줄씩 읽는다. 읽을 줄이 없을 경우 빈 문자열('')을 리턴
- readlines 함수 : 파일의 모든 줄을 읽어서 각각의 줄을 요소로 갖는 리스트를 리턴
- read 함수 : 파일의 내용 전체를 문자열로 리턴
- 줄바꿈 문자(\n)제거 : line.strip()
- with 문 : 파일을 열고(open) 닫는 것(close)을 자동으로 처리, with 블록(with 문에 속해있는 문장)을 벗어나는 순간 열린 파일 객체 f가 자동으로 close
8.2 프로그램
sys 모듈을 사용하여 프로그램에 인수를 전달
argv[0]은 파일 이름 sys1.py가 되고 argv[1]부터는 뒤에 따라오는 인수가 차례로 argv의 요소
#sys1.py
import sys
args = sys.argv[1:]
for i in args:
print(i)
9.구조
9.1 클래스
class Calculator:
def __init__(self):
self.result = 0
def add(self, num):
self.result += num
return self.result
cal1 = Calculator()
cal2 = Calculator()
print(cal1.add(3))
print(cal1.add(4))
print(cal2.add(3))
print(cal2.add(7))
- type : 파이썬이 자체로 가지고 있는 내장 함수로 객체의 타입을 출력한다. ex) <class '__main__.FourCal'>
- 메서드 : 클래스 안에 구현된 함수
- 매개변수 self : self에는 메서드를 호출한 객체가 자동으로 전달(매개변수에서 생략)
- ex) def setdata(self, first, second): -> a.setdata(4, 2) -> (a,4,2)가 전달
- a 객체에 객체변수 first가 자동 생성되고 4라는 값이 저장된다
- a 객체에 객체변수 second 가 자동 생성되고 2라는 값이 저장된다
- ex) def setdata(self, first, second): -> a.setdata(4, 2) -> (a,4,2)가 전달
- 클래스 통해 메서드 호출 : self에 해당하는 객체를 꼭 전달
- a = FourCal() -> FourCal.setdata(a, 4, 2)
- 매개변수 self : self에는 메서드를 호출한 객체가 자동으로 전달(매개변수에서 생략)
- 생성자 : 메서드 이름으로 "__init__"를 사용하면 생성자 메서드가 된다. 객체 생성시점에 자동 호출
- def __init__(self, first, second):
- self.first = first
- self.second = second
- def __init__(self, first, second):
- 상속 : class 클래스 이름(상속할 클래스 이름)
- ex) class MoreFourCal(FourCal):
- 메서드 오버라이드 : 메서드를 동일한 이름으로 다시 작성
- 클래스 변수 : 클래스 안에 변수를 선언하여 생성한다.
- class Family: lastname = "김"
- 클래스이름.클래스변수로 사용할 수 있다.
- 클래스 변수는 클래스로 만든 모든 객체에 공유된다
- a.lastname = "최"
- 객체변수는 클래스 변수와 동일한 이름으로 생성가능하다
9.2 모듈 : 함수나 변수 또는 클래스를 모아 놓은 파이썬 파일
- import : 모듈 전체 읽기, 클래스나 변수 등 포함
- 특정 함수만 : from 모듈이름 import 모듈함수
- if __name__ == "__main__": 의 의미
- if __name__ == "__main__"을 사용하면
- C:\doit>python mod1.py처럼
- 직접 이 파일을 실행했을 때는 __name__ == "__main__"이 참이 되어 if문 다음 문장이 수행된다.
- 반대로 대화형 인터프리터나 다른 파일에서 이 모듈을 불러서 사용할 때는 __name__ == "__main__"이 거짓이 되어 if문 다음 문장이 수행되지 않는다.
- __name__ 변수
- 파이썬이 내부적으로 사용하는 특별한 변수 이름이다.
- 만약 C:\doit>python mod1.py처럼 직접 mod1.py 파일을 실행할 경우
- mod1.py의 __name__ 변수에는 __main__ 값이 저장된다.
- 하지만 파이썬 셸이나 다른 파이썬 모듈에서 mod1을 import 할 경우
- mod1.py의 __name__ 변수에는 mod1.py의 모듈 이름 값 mod1이 저장된다.
- 이동하지 않고, 모듈 import 하기
- sys변수 추가 : sys.path.append("C:/doit/mymod")
- PYTHONPATH 환경변수 : set PYTHONPATH=C:\doit\mymod
- 맥이나 유닉스 환경에서는 set 대신 export 명령
- 도트 연산자(.)를 사용해서 import a.b.c처럼 import할 때 가장 마지막 항목인 c는 반드시 모듈 또는 패키지여야만 한다.
9.3 패키지
- __init__.py
- 해당 디렉터리가 패키지의 일부임을 알려주는 역할을 한다. 만약 디렉터리에 __init__.py 파일이 없다면 패키지로 인식되지 않는다.
- python3.3 버전부터는 __init__.py 파일이 없어도 패키지로 인식한다(PEP 420). 하지만 하위 버전 호환을 위해 __init__.py 파일을 생성하는 것이 안전한 방법이다.
- __init__.py 파일은 패키지와 관련된 설정이나 초기화 코드를 포함할 수 있다
- 패키지 변수 및 함수 정의
- ex) __init__.py에 VERSION = 3.5
- 패키지 내 모듈을 미리 import
- ex) __init__.py에 from .graphic.render import render_test
- 패키지 초기화 : 패키지가 처음 불러와질 때 실행되어야 하는 코드를 작성
- 패키지가 처음 import 될 때 __init__.py의 명령 코드(초기화코드)가 실행
- 초기화 코드는 import 할 때 처음 한번만 실행된다.
- print("Initializing game ...")
- __all__
- 특정 디렉터리의 모듈을 *를 사용하여 import할 때는 해당 디렉터리의 __init__.py 파일에 __all__ 변수를 설정하고 import할 수 있는 모듈을 정의해 주어야 한다.
- __all__ = ['echo']
- __all__이 의미하는 것은 디렉터리에서 * 기호를 사용하여 import할 경우 이곳에 정의된 echo 모듈만 import된다는 의미이다.
- __all__과 상관없이 무조건 import되는 경우는 from a.b.c import * 에서 from의 마지막 항목인 c가 모듈인 경우
- __all__ = ['echo']
- 특정 디렉터리의 모듈을 *를 사용하여 import할 때는 해당 디렉터리의 __init__.py 파일에 __all__ 변수를 설정하고 import할 수 있는 모듈을 정의해 주어야 한다.
- relative 패키지
- .. – 부모 디렉터리
. – 현재 디렉터리
- .. – 부모 디렉터리
- 패키지 변수 및 함수 정의
9.4 exception
- try, except문(+ else)
- try .. finally
- 예외 만들기
- ex) class MyError(Exception):
9.5 내장함수 : https://wikidocs.net/32
- print
- 끝문자 지정 : print(i, end=' ')
- input() : 사용자 입력 받기
- 입력되는 모든 것을 문자열로 취급
9.6 표준라이브러리 : https://wikidocs.net/33
9.7 외부라이브러리 : https://wikidocs.net/180538
- pip : pip은 파이썬 모듈이나 패키지를 쉽게 설치할 수 있도록 도와주는 도구
- pip으로 파이썬 프로그램을 설치하면 의존성 있는 모듈이나 패키지를 함께 설치해 줌
- 예를 들어 B라는 파이썬 패키지를 설치하려면 A라는 패키지가 먼저 설치되어야 하는 규칙이 있다고 할 때 pip을 이용하면 B 패키지를 설치할 때 A 패키지도 자동으로 함께 설치된다.
- pip으로 파이썬 프로그램을 설치하면 의존성 있는 모듈이나 패키지를 함께 설치해 줌
- PyPI(Python Package Index) : 파이썬 소프트웨어가 모인 저장 공간
- pip install : pip install SomePackage
- pip install SomePackage==1.0.4 : 특정 버전으로 설치하기
- pip install --upgrade SomePackage : 최신 버전으로 업그레이드하기
- pip uninstall : pip uninstall SomePackage
- pip list :설치된 패키지 확인하기
10. 테스트
- unittest.TestCase를 상속하는 클래스 생성 : ex) class TestLeapYear(unittest.TestCase):
- unittest.main() 실행