반응형

Decorator 란?

 

함수 A를 다른 명령을 받아 또 다른 함수 B로 호출 하는 것이다.

 

바로 예를 들어보겠습니다.

 

# 함수 장식자(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
반응형

'python' 카테고리의 다른 글

python - 클래스  (0) 2020.05.10
python - 재귀함수  (0) 2020.05.10
python - 파이썬은 1급 함수인가 ?  (0) 2020.05.08
python - 가변인수  (0) 2020.05.08
python - range  (0) 2020.05.08
반응형

1급 함수의 조건 3가지

 

- 함수 안에 변수를 할당 할 수 있다.

- 인자로 함수를 전달 할 수 있다.

- 반환값이 함수가 가능하다.

 

대부분의 프로그래밍 언어는 1급함수의 조건에 충족합니다.

 

파이썬 또한 이 3가지를 충족합니다.

 

Ex 1)

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
내부함수 출력

 

조건1. 함수 안에 함수를 호출 할 수 있다.

func3 함수는 내부에서 fun4 함수를 호출하여 충족합니다.

 

조건2. 인자 abc로 함수 fun3을 호출하여 조건2을 충족합니다.

 

조건3. 반환값이 func으로 마지막 조건을 충족합니다.

반응형

'python' 카테고리의 다른 글

python - 재귀함수  (0) 2020.05.10
python - 함수 장식자 ( Decorator )  (0) 2020.05.10
python - 가변인수  (0) 2020.05.08
python - range  (0) 2020.05.08
python - 모듈  (0) 2020.05.08
반응형

가변인수란 ?

함수 호출시 , 함수에 정의된 매개변수 개수만큼 인자를 전달해주어야 하지만

가변 인수라는 것을 사용하면 하나의 매개변수로 인자의 개수를 맞춰주지 않고 처리 할 수 있다.

 

이유는 가변 인수가 튜플 형식으로 처리하기 때문이다.

 

바로 예를 들어보겠습니다.

 

Ex 1)

def func1(*ar):
    print(ar)
    for i in ar:
        print('음식: ' + i)
func1('비빔램명','물냄명','돌솥빔빔팝')



출력 결과

('비빔램명', '물냄명', '돌솥빔빔팝')
음식: 비빔램명
음식: 물냄명
음식: 돌솥빔빔팝

소스코드를 보시면 매개변수 앞에 * 표시를 해주었습니다.

 

Ex 2)

 

def func2(*ar):
    print(ar)
    
func2('비빔밥', '공기밥', '주먹밥')


출력 결과

('비빔밥', '공기밥', '주먹밥')

 

키워드 가변 인수

 

키워드 가변 인수는 매개변수 앞에 **을 붙여주면 됩니다.

키워드 가변 인수는 DICT 형태로 전달되며 key : values 형태로 저장됩니다.

 

이것도 예제를 바로 들어보겠습니다.

 

Ex 1)

print()
def func3(**v2):

print(v2)
    

func3(m=6, n=7)


출력 결과

{'m': 6, 'n': 7}

 

 

반응형

'python' 카테고리의 다른 글

python - 함수 장식자 ( Decorator )  (0) 2020.05.10
python - 파이썬은 1급 함수인가 ?  (0) 2020.05.08
python - range  (0) 2020.05.08
python - 모듈  (0) 2020.05.08
python - 함수  (0) 2020.05.07
반응형

range 함수란 ?

 

이 함수는 입력받은 숫자에 해당하는 범위 값을 반복 가능한 객체로 만들어준다.

 

아래 소스코드를 기준으로 인수가 1개일때, 2개일때, 등등 풀어보겠습니다.

def ShowGugu(start, end = 5):
    for dan in range(start, end+1):
        print(str(dan) + '단출력')

 

인수가 1개일 때,

# 인수가 1개일 때
ShowGugu(3)

출력 결과

3단출력
4단출력
5단출력

 

인수가 2개일 때,

# 인수가 2개 일때
ShowGugu(2,3)
print()

출력 결과

2단출력
3단출력

* 주의점 끝 숫자는 해당 범위에 포함되지 않는다

 

 

인수의 시작을 2 끝을 4로 주었을 경우

# 인수의 시작이 2부터 끝인 4까지
ShowGugu(start=2, end=4)
print()

출력 결과

2단출력
3단출력
4단출력

 

반응형

'python' 카테고리의 다른 글

python - 파이썬은 1급 함수인가 ?  (0) 2020.05.08
python - 가변인수  (0) 2020.05.08
python - 모듈  (0) 2020.05.08
python - 함수  (0) 2020.05.07
python - 반복문 (for)  (0) 2020.05.07
반응형

Module 이란 ?

함수나 변수 또는 클래스를 모아 놓은 파일

모듈은 이미 만들어져있는 것을 사용할 수도 있고 사용자가 직접 만들어서도 사용이 가능합니다.

 

파이썬에서 기본적으로 제공하는 함수들을 다 작성 할 순 없어서 아래 링크를 참조하면 확인 가능합니다.

 

https://docs.python.org/ko/3.7/library/index.html

 

파이썬 표준 라이브러리 — Python 3.7.7 문서

파이썬 표준 라이브러리 파이썬 언어 레퍼런스 는 파이썬 언어의 정확한 문법과 의미를 설명하고 있지만, 이 라이브러리 레퍼런스 설명서는 파이썬과 함께 배포되는 표준 라이브러리를 설명합�

docs.python.org

 

Module의 사용 목적 ?

코드의 재사용을 가능하게 하며, 하나의 이름 공간으로 별도 관리가 가능하다.

 

Module의 사용 위치

 package 내에서 작성해야 한다.

 

Module import 방법

 

방법 1)

import 불러올모듈A

불러올모듈A 전체를 가져온다.

이 방식을 이용하는 경우 '불러올모듈A.메소드' 처럼 모듈명을 적고 사용하여야한다.

 

방법 2)

from 불러올모듈B import 메소드 or 변수

불러올모듈B 내에 있는 특정 메소드 또는 모듈에 정의된 변수를 가져온다.

방법 1과 다르게 불러온 메소드 또는 변수 앞에 모듈명을 적지 않고 사용 가능하다.

 

 

 

 

Ex 1)

# import math

# math의 모듈 함수 : fabs(절대값), ceil(올림), floor(버림), exp(지수함수), log(로그), sqrt(루트), sin(사인함수),

# asin(사인 역함수), cos(코사인), acos(코사인역함수), tan(탄젠트), degrees(라디안을 각도로), radians(각도를 라디안)

# math의 모듈 상수 : pi, e

 

import math
print(math.ceil(1.2), math.ceil(1.6)) # 정수 근사치 중 큰 수
print(math.floor(1.2), math.floor(1.6)) # 정수 근사치 중 작은 수
print()

 

출력 결과

 

 

이번에는 사용자 모듈을 생성하고 불러와서 사용해보겠습니다.

 

mymod1.py

gvar = 123
def ListHap(*ar):
    print(ar)
    
def kbs():
    print('채널9')
    
def mbc():
    print('문화방송')

mymod2.py

def Hap(a, b):
    return a + b

def Cha(a, b):
    return a - b


 

불러오기 위한 사용자 모듈 2개를 생성하였습니다. 이번에는 불러올 최상위 모듈에서 호출해보겠습니다.

방법 1.

import pack1.mymod1
list1 = [1,2]
list2 = [3,4,5]
pack1.mymod1.ListHap(list1, list2)

pack1.mymod1.kbs()

 

출력 결과

 

방법 2.

from pack1 import mymod1
mymod1.kbs()

 

방법 3.

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에 대해서는 다음에 추가 설명 작성 또는 포스팅을 하도록 하겠습니다.

 

위에 작성한 클래스들을 호출한 출력 결과

 

반응형

'python' 카테고리의 다른 글

python - 가변인수  (0) 2020.05.08
python - range  (0) 2020.05.08
python - 함수  (0) 2020.05.07
python - 반복문 (for)  (0) 2020.05.07
python - 반복문 (while)  (0) 2020.05.07
반응형

내장 함수란 ?

 

파이썬에서 기본적으로 제공하는 기능입니다.

 

내장 함수의 종류는 많기 때문에, 예제는 제가 주로 공부한 함수에 대해 작성하였으며 더 많은 내장함수 종류들은 해당 링크에 첨부하였습니다 !

 

https://wikidocs.net/32

 

위키독스

온라인 책을 제작 공유하는 플랫폼 서비스

wikidocs.net

 

 

Ex 1)

print(sum([3,5,7]))
print(int(1.7), float(4), str(5))
print(round(1.2), round(1.6)) # 반올림

 

sum 은 합을 구하는 함수로 3 + 5 + 7 의 값을 출력한다.

int 는 정수이므로 1 출력, float 는 실수이므로 4.0 출력 str 은 문자열이므로 5를 문자열로 출력

round는 반올림으로 1.2 -> 1 출력, 1.6 -> 2 출력

 

출력 결과

 

 

Ex 3)

# zip 함수란 ? 동일한 개수로 이루어진 자료형을 묶어주는 함수

# 아래 예제는 공통 개수만큼 묶어주기 때문에 30은 출력되지 않는다.

 

x = [10,20,30]
y = ['a', 'b']

for i in zip(x,y):
    print(i)
    

 

출력 결과

 

 

Ex 4) 사용자 정의 함수

사용자 정의 함수 형태는 이렇습니다.

def 함수명():
	print('내용')

 

def DoFunc1():
    print('DoFunc1 실행')
    
DoFunc1()
  
print(DoFunc1) # 주소를 출력한 것

abc = DoFunc1
abc()

 

함수명을 DoFunc1() 로 주었고 실행하면 'DoFunc1 실행' 이 출력되도록 작성하였습니다.

DoFunc1() 에서 print 내용을 출력하고

DoFunc1 로 줄 경우 값이 아닌 해당 주소를 출력하게 됩니다.

 

abc에 DoFunc1을 정의해주었기 때문에 abc() 또한 'DoFunc1 실행'을 출력하게 됩니다.

 

출력 결과

 

 

Ex 5) 사용자 함수 내에 또다른 사용자 함수를 정의

 

def DoFunc2(a, b):
    print('DoFunc2')
    result = DoFunc3(a,b)
    return result

def DoFunc3(m,n):
    imsi = m+n
    return imsi  

bcd = DoFunc2
print(bcd(5, 6))

 

DoFunc2(a, b) 함수 안에 DoFunc3 함수를 또 한번 정의 해주었습니다.

출력 내용 bcd(5,6)을 보면 DoFunc2 함수로 가게됩니다.

이후 우선 '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))))

 

반응형

'python' 카테고리의 다른 글

python - range  (0) 2020.05.08
python - 모듈  (0) 2020.05.08
python - 반복문 (for)  (0) 2020.05.07
python - 반복문 (while)  (0) 2020.05.07
python - 제어문 ( if )  (0) 2020.05.07
반응형

for 문의 기본 구조

for 변수 in 리스트(또는 튜플, 문자열):
    문장1
    문장2
    ...

 

Ex 1)

 

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)

 

출력 결과

 

 

Ex 9) list / tuple / set 각각의 출력 결과 확인

 

print(list(range(1,6)))
print(tuple(range(1,6)))
print(set(range(1,6)))

 

출력 결과

 

Ex 10) for문을 이용한 2~9단 구구단 출력

 

for i in range(2, 10):
    for j in range(1, 10):
        print('{}*{}={}'.format(i, j, i*j), end = ' ')
    print()

 

출력결과

 

반응형

'python' 카테고리의 다른 글

python - 모듈  (0) 2020.05.08
python - 함수  (0) 2020.05.07
python - 반복문 (while)  (0) 2020.05.07
python - 제어문 ( if )  (0) 2020.05.07
python - 정규 표현식  (0) 2020.05.07
반응형

while문이란?

조건식이 참(True) 인 동안 반복해 배루 소스코드를 수행하고, if 문과 동일하게 while문 다음에 조건이 오며, : 으로 조건이 종료됐음을 인지시킵니다. 조건식은 소스코드를 수행하기전 수행하여 , 그 이후 소스코드를 수행한 후 다시 따집니다.

 

형태는 다음과 같습니다.

while 조건식:
	소스코드
    

 

 

Ex 1)

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
= 1
while a <= 5:
    print(a, end = ' ')
    a += 1
 
colors = ['r''g''b']
= 0
while a < len(colors):
    print(colors[a], end = ' ')
    a += 1
    
print()
while colors:
    print(colors.pop(0), end = ' ' )
    
print()

 

출력 결과

 

 

 

Ex 2)

 

1
2
3
4
5
6
7
8
9
10
11
= 0
while a < 10:
    a += 1
    if a == 5:
        continue
    if a == 7:
        break
    
    print(a)
else:
    print('while 수행')

 

출력 결과

 

 

 

 

 

 

Ex 3)

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import random
num = random.randint(110)
print(num)
# while 1000: 무한루프 while: 0 안돌아감  숫자 0은 false 제외 나머지 true
 
while 1:
    print('1 ~ 10 사이의 컴이 가진 숫자를 입력하시오')
    guess = input()
    su = int(guess)
    if su == num:
        print('성공 ~~~ ' * 5)
        break
    elif su < num:
        print('더 큰 수 입력')
    elif su > num:
        print('더 작은 수 입력')
 

 

출력 결과

 

 

반응형

'python' 카테고리의 다른 글

python - 함수  (0) 2020.05.07
python - 반복문 (for)  (0) 2020.05.07
python - 제어문 ( if )  (0) 2020.05.07
python - 정규 표현식  (0) 2020.05.07
python - 집합형 자료 ( Tuple , Set , Dict )  (0) 2020.05.07

+ Recent posts