코딩이라고도 불린다. 프로그래밍은 로직을 작성하는 작업을 뜻하고 이런 작업을 하기 위한 언어가 프로그래밍 언어다. 범용적인 프로그래밍 언어로는 자바, 파이썬, C언어 등이 있고 특수 목적의 언어로는 SQL, R 등이 있다.
코드 실행 방식
1991년 네덜란드 프로그래머 귀도 판 로섬(Guido van Rossum)이 만든 프로그래밍 언어로 가독성에 가장 큰 목적을 두고 만들었다.
자바에서 maven과 같은 역할로 3rd party library들이 저장되는 저장소다. 자바에서는 각 어플리케이션마다 메이븐을 따로 만들어야 하지만 파이썬의 경우 한 번 pypi에 라이브러리를 다운받으면 여러 어플리케이션에서 모두 사용 가능하다. maven은 개별 저장소, pypi는 통일 저장소라고 생각하면 쉽다. 또한 자바는 dependency설정을 통해 라이브러리를 받지만, 파이썬은 pip라는 프로그램을 이용해 라이브러리를 다운받는다.
주요 명령어
지역변수는 로컬변수라고도 하고, 전역변수는 글로벌변수라고도 한다.
ex)
def test(x):
y=10
return x+y
test(10)
print(x) # 오류
print(y) # 오류
다음 예제에서 x,y는 test함수 안에서 선언된 지역변수로 함수 밖에서 따로 x나 y로 호출이 불가하다.
ex)
a = 1
def test2():
return a
test2()
print(a)
다음 예제에서 a는 함수나 메서드 안에서 선언되지 않아서, test2함수 안에서도 호출이 가능하고 함수 밖에서 따로 a로 호출이 가능하다. 이때 조심해야 할 것이 전역변수의 함수 안에서 호출과 초기화의 차이다. 위 예제처럼 전역변수를 함수 안에서 조회만 하는 것은 가능하지만, 함수 안에서 전역변수값을 변경하고 싶다면 따로 처리를 해주어야 한다. 그렇지 않는다면 어떻게 될까?
a = 1
def test2():
a = 2
return a
test2() # 2 출력
print(a) # 1 출력
위와 같이 함수 안에서 전역변수와 같은 변수명의 값을 대입했을 때, 전역변수 a를 가져오는 것이 아닌 test2 함수만의 지역변수 a를 만들고 이 변수에 2값을 넣는다. 그러므로 전역변수 a값은 그대로 1로 유지되게 된다. 전역변수를 함수 안에서 바꾸고 싶다면 "global"이라는 키워드를 이용한다.
a = 1
def test2():
global a
a = 2
return a
test2() # 2 출력
print(a) # 2 출력
global을 통해 함수 안에서 전역변수를 불러와 값을 변경하는 모습을 볼 수 있다.
@classmethod
def 클래스메서드명(clz, 매개변수들):
return
def 메서드명( self , 추가 매개변수 선언 ):
self.속성명 = 값
def __init__( self , 추가 매개변수 선언 ):
self.속성명 = 값
보통 두 객체가 같은 속성값을 가지고 있으면 같다라고 표현하고 싶은 경우가 많다. 이 경우의 코드를 예로 들어본다.
def __eq__(self, other):
result = False
if isinstance(other, type(self)):
if self.속성값==other.속성값 and ... :
result = True
return result
자바에서는 접근제어자 private, public 등을 이용해서 변수나 메서드를 외부에서 호출할 수 있는 정도에 대해 관리했었다. 하지만 파이썬에서는 접근제어자가 따로 존재하지 않는다. 그래서 파이썬에서는 접근 제한이 불가하다. 그나마 접근 제한 비슷하게 할 수 있는 방법이 언더바 2개를 변수명이나 메서드명 앞에만 붙여서 이용하는 방법이다.
class Person:
def __init__(self, name, age, address=None):
self.__name = name
self.__age = age
self.__address = address
p = Person()
print(p.__name) # 오류!!
print(p._Person__name) # 성공!!
```
위의 예제와 같이 언더바 2개를 변수명이나 메서드명 앞에 붙일 경우 변수명이나 메서드명이 "_클래스명__변수명/메스드명"으로 바뀌므로 바뀐 이름으로 호출해야 한다. 즉, 아예 접근을 제한하는 것이 아니라 이름만 살짝 바꾸어 원래 이름으로 접근했을 때 막는 정도이다. 바뀐이름으로 호출한다면 접근을 막을 방법은 없다.
def __init__(self, name):
self.__name = name
def set_name(self, name):
self.__name = name
def get_name(self):
return self.__name
위에서 설명한 언더바2개를 이용한 정보은닉 방법을 통해 클래스의 속성"name"이 "객체명.name"으로 호출되지 못하도록 설정했다. 그리고 set_name과 get_name 메서드를 생성해 "객체명.set_name("바꿀이름")", "객체명.get_name()"을 통해 name에 대한 값을 변경하거나 조회할 수 있도록 했다. 이때 property를 쓰면 set_name과 get_name을 더 쉽게 사용할 수 있게 된다.
프로퍼티명 = property(get메서드, set메서드)
클래스 안에 다음과 같이 설정하면 "객체명.프로퍼티명", "객체명.프로퍼티명 = 새로운값" 이 두 형태를 알아서 인식해서 전자는 get, 후자는 set을 자동으로 해준다.
기존 클래스를 확장하여 instance 변수나 메서드를 추가하는 방식을 의미한다.
구분
선언
메서드 재정의 : 부모 클래스의 메서드의 구현부를 자식 클래스에서 재구현하는 것.
super() : 부모클래스의 instance를 자식클래스에 반환해준다. 즉, 부모클래스의 메서드를 호출할 수 있게 해준다.
MRO(Method Resolution Order) : 파이썬은 다중상속을 지원하기 때문에 A라는 클래스가 있을 때 동시에 여러 클래스를 상속받을 수 있다. 이때 문제가 생길 수 있다. 만약 상속받을 클래스들 중에서 같은 이름의 메서드들이 존재한다면 A클래스는 어떤 클래스의 메서드를 상속받아야 할까? 이를 해결하기 위한 방법이 MRO이다. MRO는 메서드 호출 순서로 다음과 같다.
독립적인 기능을 가지고 재사용가능한 프로그램 단위를 모듈이라고 한다. 즉, py 확장자를 가진 하나의 파일이 모듈이 된다. 이런 모듈 중 외부 모듈을 사용하기 위해서는 import를 사용해서 외부 모듈을 불러와야 사용이 가능하다.
또한 기본적인 import 가능 범위는 해당 모듈과 같은 영역과 그 하위 영역이다. 즉, A라는 디렉토리가 있고 이 안에 내가 작성 중인 모듈이 있다면, import를 이용한 외부 모듈 호출을 A디렉토리에 속하거나 A디렉토리 하위에서만 할 수 있다. 이때 기본적인 범위 밖의 경로에 있는 모듈을 호출하고 싶다면 해당 모듈이 존재하는 root디렉토리를 운영체제 환경설정에 등록해야 한다.
ex) 내PC -> 속성 -> 고급 시스템 설정 -> 환경변수 -> 새로 만들기(시스템 변수) -> 변수 이름 작성 후 변수 값은 디렉터리 찾아보기로 해당 모듈 경로 등록 -> 확인 -> 확인
모듈의 집합체다. 디렉토리가 패키지가 되기 위해서는 "__init__.py"파일이 존재했어야 했다. 하지만 이 부분은 파이썬 3.3부터 개선되어 더 이상은 필요없어졌다.
자바는 컴파일하면서 예외를 잡지만 파이썬은 인터프리트 형식이므로 코드를 실행시킬 당시에 예외가 잡힌다.
class 사용자정의Exception명(Exception):
# 구현
try:
# 원하는 명령
except(잡고싶은예외클래스명):
# 예외처리 후 명령
finally:
# 예외처리와 상관없이 마지막에 무조건 실행되는 문장
raise 예외클래스명
예시코드
txtfile = open("open할 파일주소와 파일명,"w")
txtfile.write("안녕하세요")
txtfile.close()
# 파일을 하나 열고(open할 파일 주소에 해당하는 파일이 있으면 있던 파일 열어서 새로작성, 없었으면 새로 만들기)
# "안녕하세요"라는 문구를 작성 후 저장하고 연결종료했다
이때 파이썬은 연결을 시작했다 종료를 무조건 해줘야 하는데, 이것이 번거로워서 생긴 것이 "with"이다. 따로 연결을 종료하지 않아도 모든 작업이 끝나고 알아서 연결이 종료된다.
with open("open할 파일주소와 파일명", "w") as f:
f.write("안녕하세요")
ex)
class MyIterator:
def __init__(self, iterable):
"""
제공해줄 원소를 가지고 있는 iterable을 인자로 받아서 attribute로 저장
몇번째 원소를 제공했는지를 저장할 attribute(index)도 저장
"""
self.iterable = iterable
self.index = 0
def __next__(self):
"""
Iterable원소를 next()호출할 때마다 하나씩 제공해주는 메서드
"""
values = self.iterable.values
if self.index < len(values):
ret_value = values[self.index]
self.index+=1
return ret_value
else:
raise StopIteration()
class MyIterable:
def __init__(self,*args):
"""
initializer에서 가변인자를 통해 제공해줄 값들을 tuple로 받아 저장
"""
self.values = args
def __str__(self):
"""
제공할 원소들을 가진 tuple을 문자열로 반환
"""
return str(self.values)
def __iter__(self):
"""
원소들을 하나씩 제공할 iterator객체 반환
"""
print("MyIterator호출")
return MyIterator(self)
test = MyIterable(100,3213,541,453,1231) # Iterable한 MyIterable클래스 객체 test를 생성
test_iterator = iter(test) # test의 Iterator인 test_iterator 생성
next(test_iterator) # 100 출력
next(test_iterator) # 3213 출력
next(test_iterator) # 541 출력
next(test_iterator) # 453 출력
next(test_iterator) # 1231 출력
next(test_iterator) # StopIteration 발생
Iterable과 Iterator를 합친 기능을 함수 형태로 구현한 것이다.
ex)
def my_gen(): # yield를 사용해 generator생성
v=10
yield v
v+=10
yield v
v+=12
yield v
a= my_gen()
next(a) # generator가 호출되어서 yield를 만나면 일시정지한다 -> 10
next(a) # 일시정지된 위치에서 시작해 다시 yiedl를 만나면 일시정지한다 -> 20
next(a) # 일시정지된 위치에서 시작해 다시 yiedl를 만나면 일시정지한다 -> 32
next(a) # 일시정지된 위치에서 시작해 다시 yiedl를 만나면 일시정지한다. 이때는 다음 yield가 없어서 return None이 되고 StopIteration 예외가 발생한다
@(어노테이션)을 이용해서 핵심함수에 전처리, 후처리 등을 해주는 방식을 의미한다.
ex)
def MyDecorator(func):
def wrapper():
print("전처리작업")
func()
print("후처리작업")
return wrapper
@MyDecorator
def CoreFunc():
print("핵심작업")
CoreFunc()
# 출력화면은 다음과 같다
# 전처리작업
# 핵심작업
# 후처리작업
위 예제와 같이 어노테이션을 이용해 @MyDecorator를 CoreFunc함수 위에 설정해주면 해당 CoreFunc함수가 MyDecorator함수에 매개변수로 넣어져 실행되는 모습을 확인할 수 있다.
pymysql 모듈을 사용한 방법을 설명한다.