Python 공부하기
#3.
그냥 개인적으로 파이썬 공부하면서 정리한 내용입니다...
중간중간 계속 업데이트 됩니다.
오타 및 답이 틀린경우가 있을 수 있습니다.
++저장하면, 특히 인용문 안에 들여쓰기가 다 깨집니다..
1. 함수
파이썬에서도 함수를 사용할 수 있다.
def 함수명(매개변수):
(실행문)
1. 결과값(return)
: 1) 함수는 return 값(결과값)을 가질 수 있다.
: 2) 함수는 return 값(결과값)을 안 가질 수도 있다.
2. 입력값 (매개변수)
: 1) 입력값이 없을 수도 있다.
: 2) 입력값(매개변수)는 지정된 개수만큼 설정할수 있다.
: 3) 지정되지 않는 가변의 매개변수는 *args로 처리하면, 튜플의 형태로 입력을 받는다.
: 4) 매개변수를 **args로 처리하면, 딕셔너리 형태로 입력을 받는다.
* 매개변수에 초기값 설정이 가능하다! (매개변수 초기값은 입력받는 매개변수 중에서 맨 마지막에 설정해주는게 좋다.)
#1. return 값이 없을 때
def fun1(a) :
a=a+1
print(a)
> fun1(1)
> 2
#2. return 값이 있을 때
def fun2(a):
a=a+1
reutrn a
> fun2(1)
> # 결과 없음
> print(fun2(1))
> 2
#3. 매개변수 없을 때
def fun3():
print('hello world')
> fun3()
> hello world
#4. 매개변수 3개일 때
def fun4(a,b,c):
return a+b+c
> hap=fun4(1,2,3)
> print(hap)
> 6
#5. 매개변수 가변일 때
def fun5(*a):
result=0
for i in a:
result=result+i
return result
> hap2=fun5(1,2,3,4,5,6,7)
> print(hap2)
> 28
#6. 매개변수에 초기값이 설정되어 있을 때
def fun6(a,b,c=1):
return a+b+c
> hap3_1=fun6(1,2) # 초기값이 주어진 매개변수를 입력해주지 않아도 된다.
> print(hap3_1)
> 4
> hap3_2=fun6(1,2,3) # c의 초기값이 1이였는데 3으로 입력된 것.
> print(hap3_2)
> 6
> hap3_3=fun6(1,2,1)
> print(hap3_3)
> 4
> hap3_4=fun6(1,2,0)
> print(hap3_4)
> 3
def fun6_arg3(a=0,b=0,c=0):
return a+b+c
> hap4_1=fun6_arg3()
> print(hap4_1)
> 0
> hap4_2=fun6_arg3(1)
> print(hap4_2)
> 1
> hap4_3=fun6_arg3(1,1)
> print(hap4_3)
> 2
+
[언패킹 사용하기]
인수를 순서대로 넣을 때는 리스트나 튜플을 사용할 수도 있다.
리스트 또는 튜플 앞에 *를 붙여서 함수에 넣어주면 된다.
에)
def fun1(a,b,c):
return a+b+c
> fun1(1,2,3)
> 6
> a=[3,4,5]
> fun1(*a)
> 12
> fun1(*[1,3,5])
> 9
2. 람다(lambda)
lambda 또한 def 처럼 함수를 만드는 명령어이다. 주로, 함수를 간결하게 만들 때 사용된다.
def를 사용해야 할 정도로 복잡하지 않거나 def를 사용할 수 없는 곳에 주로 쓰인다.
lambda 매개변수 : 매개변수이용한 표현식
def fun_add(a,b) :
return a+b
==>
lambda a, b : a+b
* 이렇게 한줄로 끝낼수 있고, return 으로 끝내지 않아도 결과값을 반환해준다!!
3. 클래스
1) 클래스와 객체
- 클래스 : 붕어빵 틀
- 객체 : 붕어빵 틀에서 생성된 붕어빵들!! / 붕어빵은 붕어빵 틀의 인스턴스
- 속성 : 클래스 안에서의 속하여 있는 데이터
- 매서드 : 클래스 안에서의 함수
- self : 객체 호출 시 호출한 객체를 뜻함.
- 생성자 : 객체가 생성시 자동으로 호출되는 매서드. 객체의 초기값을 설정시 주로 사용 (__init__)
# 1 클래스 작성하기
class total_fun(): # 클래스
def setdata(self, first, second): # 매서드
self.first=first
self.second=second
#self : 객체 호출 시 호출한 객체, 주로 자기 자신이 자신에게 전달하기 때문에 self라고 쓴다.
# 클래스이름.메서드 형태로 호출할 때는 객체 a를 첫 번째 매개변수 self에 꼭 전달해 주어야 한다.
ex) a = total_fun():
CAL().add(a,1,2)
반면에 다음처럼 객체.메서드 형태로 호출할 때는 self를 반드시 생략해서 호출해야 한다.
ex) a = total_fun():
a.add(1,2)
# 그렇기 때문에
a= total_fun()
a.setdata(1,2) 에서
self는 a이므로
self.first=first 는 a.first = first 가 되므로, a.first=1
self.second=second 는 a.second =second이므로 a.second=2이다.
# 값
print(a.first) 값은 1
print(a.second) 값은 2
# 2 클래스 만들어보기
class total_fun(): # 클래스
def setdata(self, first, second): # 매서드
self.first=first
self.second=second
def sum(self):
result=self.first+self.second
return result
def sub(self):
result=self.first-self.second
return result
예)
a=total_fun()
b=total_fun()
a.setdata(1,2)
b.setdata(10,3)
a.add()
3
a.sub()
-1
b.sub()
7
b.add()
13
# 3 클래스에서 생성자 활용하기
class total_fun(): # 클래스
def __init__(self, first, second): # 생성자 #객체 생성시 값을 지정해주면 된다.
self.first=first
self.second=second
def setdata(self, first, second): # 매서드
self.first=first
self.second=second
def sum(self):
result=self.first+self.second
return result
def sub(self):
result=self.first-self.second
return result
a=total_fun(2,4)
a.sum()
> 6
a.sub()
>-2
2) 상속
어떤 클래스를 만들 때 다른 클래스의 기능을 물려받을 수 있게 만드는 것이다.
보통 상속은 기존 클래스를 변경하지 않고 기능을 추가하거나 기존 기능을 변경하려고 할 때 사용한다.
# 클래스 상속 형식
class 클래스이름(상속받을클래스)
class 클래스이름(상속받을클래스1, 상속받을클래스2)
위의 형식으로 상속을 해주면된다.
# 1 클래스 상속을 해보자
two_more_fun 클래스를 생성하면서 total_fun이라는 클래스를 상속 받았다.
class two_more_fun(total_fun):
def mul(self, first, second):
result=self.first*self.second
return result
def div(self, first, second):
result=self.first/self.second
return result
a=two_more_fun(10,5)
b=total_fun(10,2)
a.sum()
> 15
a.div()
> 2.0
b.sum()
> 12
a.sub()
> 5
a.mul()
> 50
b.mul()
> 오류 발생
3) 매서드 오버라이딩
: 상속한 클래스(부모 클래스)에 있는 매서드를 같은 이름으로 다시 만들어서 덮어씌우는 것. 매서드 오버라이딩을 하면, 부모 클래스의 매스드가 아니라 자식 클래스의 오버라이딩 된 매서드가 호출된다.
매서드 오버라이딩 이후 부모 매서드를 사용하고 싶으면, super()를 이용하면된다.
# 1 오버라이딩 해보기
#이미 total_fun에 sum이라는 매소드가 있지만, 같은 이름의 매소드를 만들었다.
class test_overriding(total_fun):
def sum(self) :
result=self.first+self.second
if result >=100 :
print("값이 너무 큽니다.")
return
else :
return result
* 참고 total_fun()클래스의 sum 매서드는 더한 값만 반환한다.
def sum(self):
result=self.first+self.second
return result
결과:
c=test_overriding(80,50)
d=test_overriding(8,5)
c.sum()
> 값이 너무 큽니다.
d.sum()
> 13
결론 : 새로 선언한 매소드로 잘된다.
# 2 이미 클래스 상속이되고, 매서드 오버라이된 클래스를 다시 상속하고 매서드 오버라이딩해 보았다...
# total_fun() 클래스를 상속받은 test_overriding 클래스를 상속받는 test_twice_inh() 클래스이다.
class test_twice_inh(test_overriding):
def sum(self):
result=self.first+self.second
if result < 0:
print("값이 너무 작습니다.")
elif result >=100:
print("값이 너무 큽니다.")
else :
return result
# sum 매서드는 가장 상위의 total_fun, test_overriding 클래스 모두에 있는 매서드이지만 다시한번도 오버라이딩을 하였다.
def test(self,new1,new2):
self.first=new1
self.second=new2
print("값이 변경되었습니다.")
a=test_twice_inh(100,90)
a.sum()
> 값이 너무 큽니다.
a.test(-1,-2)
> 값이 변경되었습니다.
a.sum()
> 값이 너무 작습니다.
a.test(10,11)
> 값이 변경되었습니다.
a.sum()
> 21
결론 : 잘된다.
# 3 한번에 여러개 상속을 받아보자
class Test_inh(two_more_fun, test_twice_inh):
def test1():
print('test')
return
def test(self,new1,new2):
self.first=new1
self.second=new2
print("값이 변경되었습니다.")
return self.first+self.second
b=Test_inh(1,2)
b.test(90,11)
> 값이 변경되었습니다.
101
b.sum()
> 값이 너무 큽니다.
결론 : 잘된다.
파이썬 클래스에서 상속/매서드 오버라이딩 한번씩 한것 이외에도 가능한 것 :
이미 클래스 상속과 매서드 오버라이된 클래스를 > 다시 상속 및 매서드 오버라이딩 : 가능
한번에 여러개 클래스 상속을 받기 : 가능
참고!
[ 정적 매소드/클래스 매소드 ]
class 클래스이름:
@staticmethod
def 메서드(매개변수1, 매개변수2):
코드
인스턴스를 통하지 않고 클래스에서 바로 호출할 수 있다.
메서드 위에 @staticmethod를 붙인다. 이때 정적 메서드는 매개변수에 self를 지정하지 않는다.
ex)
class Cal():
@staticmethod
def sum(a, b):
print(a + b)
@staticmethod
def mul(a, b):
print(a * b)
# 클래스에서 바로 메서드 호출
Cal.sum(10, 20)
Calc.mul(10, 20)
결과:
30
200
[ 클래스 매서드 ]
클래스 메서드는 메서드 안에서 클래스 속성, 클래스 메서드에 접근해야 할 때 사용한다.
클래스 메서드는 다음과 같이 메서드 위에 @classmethod를 붙인다. 이때 클래스 메서드는 첫 번째 매개변수에 cls를 지정해야 한다.
class 클래스이름:
@classmethod
def 메서드(cls, 매개변수1, 매개변수2):
코드
4. 모듈
모듈이란 함수나 변수 또는 클래스를 모아 놓은 파일이다.
* .py 파일 하나가 모듈에 해당된다.
# 모듈 사용법 :
import 모듈이름
# 모듈안에 함수들이 많으면,
from 모듈이름 import 함수이름
from 모듈이름 import 함수1, 함수2
from 모듈이름 import *
모듈 안에서
if __name__ == "__main__":
직접 파이썬 파일을 실행 시 내부변수인 __name__에 __main__이라는 값이 저장이 된다.
그 이외에 shell이나 다른 파이썬 모듈에서 import해서 사용 시 __name__에는 모듈 이름이 저장된다.
해당 조건식은 직접파일을 실행할 때만 조건이 참이다.
모듈 안에 클래스가 있을 때도 사용이 가능하다.
test1.py 파일 내용:
c=100
class Math:
def aa(self,a):
a= a+c
return a
def bb(self,b):
b = b +1
return b
새로운 파일에서 (파일1과 같은 경로)
import test1
x=test1.Math() # 모듈이름(파일이름)을 앞에 먼저 적어야한다.
y=x.aa(1)
print(y)
x.c=1000
y=x.aa(1)
print(y)
z=x.bb(2)
print(z)
결과:
101
1001
3
5. 패키지
패키지는 모듈들을 더 편리하게 사용할 수 있게 해준다. 계층적(디렉터리 구조)로 이루어져 있다. 사용은 모듈과 동일하게 import를 이용하면되고, 디렉토리 구조로 아래 항목들이 필요할 때는 .으로 적으면된다.
위치 또한 루트를 기준으로 상대적으로 지정 가능하다.
.. 이면 부모 디렉터리이고, .이면 본인 디렉터리이다.
__init__.py 는 3.3 이전에 쓰였던 파일로 해당 디렉터리가 패키지임을 알리는 역할을 했다.
예)
to_live라는 패키지가 있다고 예시를 들고 아래와 같이 만든다면
[to _live]
- __init__.py
- eat
- __init__.py
- breakfast.py
- lunch.py
- dinner.py
- sleep
- __init__.py
- deepsleep.py
- nap.py
- work
- __init_.py
- 52times.py
- night_overtime.py
- weedends_work.py
- play
- __init__.py
- nothing.py
- game.py
- tv.py
- friends.py
- coding.py
사용법
import to_live
from to_live.eat import breakfast
from to_live.sleep import *
등등
참고: https://wikidocs.net/24 등 다수의 인터넷 사이트!