지금은마라톤중

멋사 AI스쿨 TIL - (5) 본문

멋쟁이사자처럼/Python

멋사 AI스쿨 TIL - (5)

달리는중 2023. 1. 4. 17:01

2022.01.04


- list.append() : 리스트 데이터에 데이터를 추가

 

data = [1, 2, 3]
data.append(4)
data
# 출력 : [1, 2, 3, 4]

 

 

6. 함수

- 반복적으로 사용되는 코드를 묶어서 사용하는 방법 > 코드의 유지보수가 워짐

- def, return, argument, parameter, docstring, scope, lambda

- 사용법 : 함수선언(코드작성) > 함수호출(코드실행)

 

1)  argument, parameter

: 함수를 호출하는 코드에서 함수를 선언하는 코드로 데이터 전달할 때 사용

- default parameter : 입력이 없을 때 입력되는 고정값이 있는 파라미터

- keyword argument 

import random

# 함수선언
def display_lotto(count): # count : parameter
    lotto = []
    while True:
        random_number = random.randint(1, 45)
        lotto.append(random_number)
        lotto = list(set(lotto))
        if len(lotto) >= count:
            break
    lotto.sort()
    print(lotto)
    
# 로또번호출력 : 6개
display_lotto(6) # 6 : argument

# 로또번호출력 : 7개
display_lotto(7)

# 출력 : [12, 20, 27, 36, 38, 40]
#   [6, 7, 17, 23, 25, 40, 45]

 

* 간단한 예제) argument, parameter 

# 함수선언(코드작성)
def plus(n1, n2=10, n3=20): # n1 : parameter, n2=10, n3=20 : default parameter
    print(n1 + n2 + n3)

# 함수호출(코드실행)
plus(1, n3=100) # 1 : argument, n3=1000 : keyword argumnet
# 출력 : 26

 

2) return 

-함수를 호출해서 결과 데이터를 변수에 저장할 때

-함수의 코드를 중단할 때

# 리턴이 있는 함수 예시 : str.upper()
data = 'python'
result = data.upper()
print(data, result)
# 출력 : python PYTHON

# 리턴이 없는 함수 예시 : list.sort()
data = [1, 3, 2]
result = data.sort()
print(data, result)
# 출력 : [1, 2, 3] None
# 여러개의 데이터를 리턴
def calc(n1, n2):
    return n1 + n2, n1 - n2

plus, minus = calc(3, 1)
plus, minus
# 출력 : (4, 2)

 

 

3) docstring

-함수의 설명을 작성

-help() 함수로 docstring 출력

def plus(n1, n2):
    '''
    This function is to plus two numbers.

    parameters
    ----------
    n1 : int, float : first number
    n2 : int, float : second number

    return
    ------
    n1 + n2 : int, float
    '''  #    help(plus)를 쓰면 이 부분이 출력
    return n1 + n2

 

* args, **kwargs

-아규먼트의 갯수에 상관없이 함수를 실행하는 방법

- *args : 여러개의 아규먼트를 튜플 데이터타입으로 받아줌

- **kwargs : 여러개의 키워드 아규먼트를 딕셔너리 데이터타입으로 받아줌

- *args, **kwargs : 아규먼트에서 사용

- 파라미터 사용 : 여러개의 아규먼트 > 컬렉션 데이터타입(tuple, dict)으로 묶어줌

- 아규먼트 사용 : 컬렉션 데이터타입(list, tuple, dict) > 여러개의 아규먼트로 풀어줌

def plus(*args, **kwargs): # 파라미터에 컬렉션 데이터 타입을 받아줌 : 식별자1개, 데이터n개
    print(type(args), args)
    print(type(kwargs), kwargs)
    # return n1 + n2

plus(1, 2, 3, 4, 5, n1=10, n2=30) # 여러개의 아규먼트
# 출력 : <class 'tuple'> (1, 2, 3, 4, 5)
#   <class 'dict'> {'n1': 10, 'n2': 30}
# 결과에서 보듯이 args는 키워드가 없는 것, kwargs는 키워드 있는 것것
# 키워드 아규먼트는 키워드가 없는 아규먼트 뒤에 사용
# 디폴트 파라미터는 디폴트 값이 없는 파라미터 뒤에 사용

 

 

*args, **kwargs 정리
- parameter
   - 여러개의 아규먼트 > 하나의 컬렉션 데이터타입(tuple,dict)으로 묶어서 받아줌
   - *args : 키워드가 없는 여러개의 아규먼트를 받음 : tuple
   - **kwargs : 키워드가 있는 여러개의 아규먼트를 받음 : dict
- argument
   - 묶여있는 컬렉션 데이터타입(list,tuple,dict) > 여러개의 아규먼트로 풀어서 함수호출
   - *args : list, tuple 데이터타입의 데이터를 여러개의 키워드가 없는 아규먼트로 풀어줌
   - **kwargs : dict 데이터타입의 데이터를 여러개의 키워드가 있는 아규먼트로 풀어줌

 

 

4) scope

- 함수 밖 : 전역영역 : global

- 함수 안 : 지역영역 : local

# 실수 할만한 코드 3
data = 10 #전역영역 데이터

def change():
    data = 20 #지역영역 데이터

change()
print(data) #전역영역 데이터가 출력
# 출력 : 10

-global : 지역영역에서 전역영역의 변수사용 방법

# def 안의 data가 지역영역이지만 globald을 써줌으로써 전영영역에 데이터를 가져와서 사용
data = 30
def change():
    global data 

change()
print(data)
# 출력 : 30

 

- 지역영역에서 사용되는 변수(식별자)는 지역영역 없으면, 전역영역의 변수를 가져와서 사용

data = 10

def change():
    print('local', data)

change()
print('global', data)
# 출력 : local 10
#   global 10

 

-return : 전역영역에서 지역영역의 변수 사용하는 방법

data = 10

def change():
    data = 20
    return data

data = change()
print(data)
# 출력 : 20
# 3중 구조여도 global 쓰면 전역영역의 데이터를 사용
data = 10

def change1():
    data = 20
    def change2():
        global data
        print('local', data)
    change2()

change1()
# 출력 : local 10

 

 

5) lambda 함수

일회성 함수로 간단한 함수(파라미터, 리턴)를 함수 선언 없이 사용 가능 > 메모리절약, 가독성 증대

- 구조 : func = lambda n1, n2 : n1 + n2

 

* 함수는 데이터 타입이 function인 변수이다.

* function은 코드를 담고 있는 데이터타입이다. 

# 변수 3개 선언 : plus, minus, calc : 저장공간 3칸
def multi(n1, n2):
    return n1 * n2

def divid(n1, n2):
    return n1 / n2

def calc(func, n1, n2): # func:plus
    return func(n1, n2)

calc(multi, 4, 5), calc(divid, 18, 6)
# 출력 : (20, 3.0)

⬇️위 코드를 아래 코드와 같이 lambda함수를 이용하면 적은 저장공간을 사용하여 수행이 가능하다.⬇️

# lambda 함수 설명  
func = lambda n1, n2: n1 * n2
func(6, 3)

# 저장공간 1칸 사용
def calc(func, n1, n2): 
    return func(n1, n2)

calc(lambda n1, n2: n1 * n2, 4, 5), calc(lambda n1, n2: n1 / n2, 18, 6)

# 출력 : (20, 3.0)

 

 

6) list comprehension : 리스트 컴프리헨션

- 간단한 반복문, 조건문을 사용해서 리스트 데이터를 만들 때 사용하는 문법

- 주로 리스트 데이터를 필터링 하거나 데이터를 변경할 때 사용

- dict comprehension, set comprehension도 있다.

# 0 ~ 9 까지의 데이터에서 홀수만 뽑아서 제곱한 결과를 리스트로 출력
result = []
for number in range(10):
    if number % 2:
        result.append(number + 10)
result
# 출력 : [11, 13, 15, 17, 19]

 

⬇️위 코드를 아래 코드와 같이 lambda함수를 이용하면 적은 저장공간을 사용하여 수행이 가능하다.⬇️

result = [number + 10 for number in range(10) if number % 2 ]
result

 

 

7) map() 

-  iterable한 데이터의 모든 value에 특정 함수를 적용한 결과를 리스트로 출력

 

names1 = ['김 대한(56)', '아 민국(42)', '김 만세(35)']
names2 = ['김 서울(12)', '이 대전(72)', '김 부산(92)']

def ages(*args):
    return [data[:-3] + str(int(data[-3:-1]) // 10 * 10) + ')' for data in args]

print(list(map(ages, names1, names2)))
# 출력 : [['김 대한(50)', '김 서울(10)'], ['아 민국(40)', '이 대전(70)'], ['김 만세(30)', '김 부산(90)']]

 


parameter 와 argument 추가공부

- parameter : 매개변수, 함수를 정의 할 때 외부로부터 받아들이는 임의의 값을 의미

- argument : 인수, 함수를 호출할 때 이 때 사용하게 되는 일련의 값들

- keyword argument : 이름을 붙여 전달하는 인자, 인자의 순서를 무시하고 사용가능

                                      가변인자, **kwarg : 여러개의 인자를 받을 수 있는 집합

- default parameter : 기본값이 이미 정의된 매개변수, 

 


네이버 API 활용하여 번역하기

- 사이트  : https://developers.naver.com.   

 

사이트에 접속해서 API key를 부여받고 진행한다.

위의 폼을 작성하면 Client-Id, Client-Secret을 볼 수 있다.

API 가이드를 참고하여 코드를 작성하면 된다. 

Client-Id, Client-Secret는 개인정보이니 #으로 대체했다. 

import requests, json

# 1. APP 등록 > access token
CLIENT_ID, CLIENT_SECRET = '############', '#############'

text = '파이썬은 짱.'
url = "https://openapi.naver.com/v1/papago/n2mt"
headers = {
    "Content-Type" : "application/json", 
    "X-Naver-Client-Id" : CLIENT_ID,
    "X-Naver-Client-Secret" : CLIENT_SECRET
}

data = {'source' : 'ko', 'target' : 'en', 'text' : text}

#text의 한글을 인코딩하기 위해 json.dumps 사용
response = requests.post(url, json.dumps(data), headers=headers) 
response

response.text #출력되는 것을 확인

# str > dict
en_text = response.json()['message']['result']['translatedText']
en_text
# 출력된 것을 좀 더 깔끔하게 번역된 것만 보이게 하였다.

# 4. 함수 만들기
# 함수로 만들어 활용하기 쉽게 만들었다.
def translate(text, source = 'ko', target = 'en'):
    CLIENT_ID, CLIENT_SECRET = '############', '#############'

    url = "https://openapi.naver.com/v1/papago/n2mt"
    headers = {
    "Content-Type" : "application/json", 
    "X-Naver-Client-Id" : CLIENT_ID,
    "X-Naver-Client-Secret" : CLIENT_SECRET
    }

    data = {'source' : 'ko', 'target' : 'en', 'text' : text}

    response = requests.post(url, json.dumps(data), headers=headers) 
    return response.json()['message']['result']['translatedText']
    
text = '파이썬 짱'
en_text = translate(text)
en_text

# 출력 : 'Python is the best.'

 

 


Quiz

흠..일단..오늘은 못 풀겠다...ㅜㅜ

 

 

 


 

출처 :

- https://docs.python.org/3/glossary.html.

- https://enarastudent.tistory.com/3

- https://int-i.github.io/python/2020-06-04/python-keyword-args/

 

 

 

 

 

 

 

 

 

'멋쟁이사자처럼 > Python' 카테고리의 다른 글

멋사 AI스쿨 TIL - (7)  (0) 2023.01.06
멋사 AI스쿨 TIL - (6)  (2) 2023.01.05
멋사 AI스쿨 TIL - (4)  (1) 2023.01.03
멋사 AI스쿨 TIL - (3)  (0) 2023.01.02
멋사 AI스쿨 TIL - (2)  (2) 2022.12.23
Comments