# 함수 장식자(decorator
def make2(fn):
return lambda:'파이썬 ' + fn() # '파이썬'과 fn() 함수를 합쳐서 리턴
def make1(fn):
return lambda:'공부를 '+fn()
def hello():
return '열심히'
hi = make2(make1(hello))
print(hi())
# 출력 결과
파이썬 공부를 열심히
기존 hello() 함수는 '열심히' 만을 반환하는 함수입니다.
하지만 이 함수를 mak1이라는 함수에 씌워주고, 그 겉에는 또 다시 make2라는 함수로 덮어주었습니다.
그 말은 make2함수의 '파이썬'을 출력하고 그 안에 호출할 함수 make1 에서 '공부를' 호출 후 hello의 '열심히' 를 호출하게 됩니다.
위와 같은 방법이 아닌 다른 방법으로는 '@' 키워드를 사용하여도 적용 가능합니다.
함수를 데코레이션('@')으로 사용할 경우
def make6(fn):
return lambda:'공부를 '+fn()
@make6
def hello1():
return '열심히'
print((hello1()))
# 출력 결과
공부를 열심히
클래스를 데코레이션('@') 으로 사용할 경우
class prac(object):
def __init__(self, fn):
self.fn = fn
def __call__(self, *args, **kwargs):
result = self.fn(*args, **kwargs)
print(f'Result: {result}')
return result
@prac
def add(a, b):
return a + b
add(5,1)
# 출력 결과
Result: 6
def fun1(a, b):
return a + b
fun2 = fun1
print(fun2(3,4))
def fun3(func):
def fun4(): # 함수 안에 함수
print('내부함수 출력')
fun4()
return func # 반환값이 함수
abc = fun3(fun1) # 인자로 함수 전달
출력 결과
7
내부함수 출력
from pack1.mymod1 import kbs, mbc, gvar
kbs()
mbc()
print(gvar)
방법 4.
from etc.mymod2 import *
print(Hap(5, 3))
print(Cha(5, 3))
해당 방법은 etc 패키지 안에 있는 mymod.py 에 있는 것들을 전부 import 하겠다는 의미입니다.
if __name__ == '__main__':
불러올 모듈에서 함수뿐 아니라 내용까지 전부 실행할 경우 __name__ 변수에 __main__이 저장되어 전부 실행된다.
하지만 다른 모듈에서 불러와서 사용할 경우 __name__ 변수에 불러올 모듈명 저장된다.
main.py
# 여러 모듈 중 응용프로그램의 시작 모듈을 명시적으로 표시하기
# 이곳은 모듈을 불러온 파이썬 모듈
if __name__ == '__main__':
print('여기가 최상위 모듈')
pack1.mymod1.kbs()
from pack1 import mymod1
mymod1.kbs()
mymod1.py
gvar = 123
def ListHap(*ar):
print(ar)
# 최상위 모듈이 아니라 출력되지 않음
if __name__ == '__main__':
print('최상위메인모듈')
def kbs():
print('채널9')
def mbc():
print('문화방송')
mymod1.py의 파일에 if __name__ == '__main__' 부분을 추가하였습니다.
여기서 위 mymod1.py 에서 직접 실행하면 __name__ 이 참이 되면서 mymod1.py 에서의 print 문이 출력됩니다.
하지만 main.py 에서 부를 경우 mymod1.py 의 if문이 거짓이 되면서 print문이 출력되지 않습니다.
해당 이유는 위에 작성하였습니다.
클래스를 포함한 모듈
class TestClass:
kk = 1 # 멤버변수 ( 전역 )
def __init__(self):
print('생성자')
def __del__(self):
print('소멸자')
def printMsg(self): # 메소드 (public)
name = '한국인' # 지역변수
print(name)
print(self.kk)
test = TestClass() # 생성자 호출. instance
print(test.kk) # 1을 출력
print(TestClass.kk) # prototype(원형) 클래스의 멤버 직접 호출
print()
test.printMsg() # Bound Method call
# TestClass.printMsg() # 이렇게 주면 아규먼트를 주지 않아서 ERR
print()
TestClass.printMsg(test) # UnBound Method call
__init__과 self에 대해서는 다음에 추가 설명 작성 또는 포스팅을 하도록 하겠습니다.
이후 우선 'DoFunc2'를 출력하고 DoFunc3 함수의 a에는 5 b에는 6이 들어가고 ,
그 해당 값 계단을 DoFunc3 함수에서 imsi 변수에 5 + 6을 하여 반환해주면 그 값이 result 값으로 들어가게 됩니다.
출력 결과
Ex 6) 비슷한 내장함수 응용
player = '전국대표'
def FuncSoccer():
name = '축구선수'
print(name,player)
FuncSoccer()
print(player)
출력 결과
Ex 7) 사용자 정의 함수에 전역변수 지역변수 이용
a = 10; b = 20; c = 30
print('1) a: ' , a, ', b:', b, ', c: ', c)
def Good():
a = 40
b = 50
print('2) a: ' , a, ', b:', b, ', c: ', c)
Good()
초기에 전역변수로 주었지만, Good 함수 안에서 a는 40 b는 50으로 주었기 때문에
1)은 각각의 출력 값이 10 20 30 이지만 2)는 40 50 30 입니다.
출력 결과
여기서 지역변수로 값을 변경 하는 것이 아닌 전역변수의 값을 내장 함수 안에서 바꾸고 싶다면
global keyword를 사용해주면 됩니다.
a = 10; b = 20; c = 30
print('1) a: ' , a, ', b:', b, ', c: ', c)
def Good():
a = 40
b = 50
global c
c = 100
Good()
print('2)a: ' , a, ', b:', b, ', c: ', c)
변수 c를 global 키워드를 통해 100으로 변경해주었습니다.
여기서 global 선언을 해주지 않는다면 c 값은 100이 아닌 30 이 출력 됩니다.
lambda
# def 와 동일한 역할로 함수 이름이 길면 사용하기에 부적합하다.
lambda 매개변수1, 매개변수2, ... : 표현식
aaa = lambda a, su = 10: a + su
print(aaa(5))
print(aaa(5,6))
여기서는 a+su를 더한 값을 반환하는 람다 함수를 만들었습니다.
출력 결과
bbb = lambda a, *tu, **di:print(a, tu, di)
bbb(1,2,3,m=4, n=5)
li = [lambda a, b: a+b, lambda a, b: a*b]
print(li[0](3,4))
print(li[1](3,4))
# 다른 함수에서 람다 사용
print(list(filter(lambda a:a<5, range(10))))
print(list(filter(lambda a:a % 2, range(10))))
for i in [1, 2, 3, 4, 5] :
print(i, end=' ')
print()
i는 1부터 5까지 저장되어있고,
1부터 5까지 차례대로 출력 하도록 되어있습니다.
출력 결과
Ex 2)
for문을 이용하여 soft 안에 저장된 데이터들을 키값만 가져와서 출력하고 values 값만 가져와서 출력한다.
soft = {'java':'프로그래밍언어', 'python':'접착언어', 'c':'시스템개발용'}
for i in soft.items():
# print(i) key value 형태로 나타남
print(i[0], ' ' , i[1])
for k, v in soft.items():
print(k, ' ' , v)
for k in soft.keys():
print(k)
for k in soft.values():
print(k)
print()
출력 결과
Ex 3)
format 방법을 이용하여 구구단을 출력하였습니다.
여기서 format이란 { } 괄호를 이용하여 포맷팅하는 방법입니다.
% 와 기능은 동일하고, 괄호와 숫자만을 이용하여 구성합니다.
for n in [2] :
print(' 구구단 : {}단'.format(n))
for i in [1, 2, 3, 4, 5, 6, 7, 8, 9]:
print('{0}*{1}={2}'.format(n, i, n * i))
print()
출력 결과
Ex 4) enumerate 내장함수를 이용하여 인덱스 값도 얻는 예시
li = ['a', 'b', 'c']
for ind, d in enumerate(li):
print(ind, ' ', d)
print()
출력 결과
Ex 5) dict 를 이용한 상품 구매 가격 출력
price = {'사과':500, '수박':12000, '참외':600}
my = {'사과':2, '수박':1}
bill = sum(price[f] * my[f] for f in my)
print('총 구매 가격 : {}원'.format(bill) )
출력 결과
Ex 6) list를 이용한 예시
# 변수 datas의 타입이 int형인것이 있다면 li에 담아서 출력 list형태여서 []로 감싸줘야함
print()
datas = [1,2,'a',True,3]
li = [i * i for i in datas if type(i) == int]
print(li)
출력 결과
Ex 7) Set을 이용한 예시
datas = {1,1,2,2,3}
se = {i + i for i in datas}
print(se)
출력 결과
Ex 8) list 안에 tuple 값을 집어 넣은 예시,
aa = [(1,2),(3,4),(5,6)]
for a, b in aa:
print(a + b)