Today I Learned

[TIL] 파이썬 기초 (함수/파파고 API)

by Holly Yoon

TIL

1. 함수

  • 로또를 출력하는 함수를 만들어보자. 숫자 범위, 갯수를 argument를 설정해서 함수를 호출하게 한다.
  • parameter가 없으면 default값은 1~45, 6개로 한다.
# display_lotto를 호출할때 파라미터가 없으면 1 ~ 45까지 6개의 숫자를 출력
def display_lotto(count=6,end=45): # count : parameter
    lotto = []
    while True:
        random_number = random.randint(1, end)
        lotto.append(random_number)
        lotto = list(set(lotto))
        if len(lotto) >= count:
            break
    lotto.sort()
    print(lotto)

display_lotto() # 1 ~ 45까지 6개의 숫자
display_lotto(end=50, count=10) # 1 ~ 50까지 10개의 숫자
  • return값이 존재하는 함수도 없는 함수도 있다. (*sort()함수는 리턴값이 없음)
  • 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
    '''
    return n1 + n2

2. *args, **kwargs

  • argument의 갯수와 상관없이 함수를 실행하는 방법
  • *args는 튜플 타입으로 **kwargs는 딕셔너리 타입으로 받아준다.
def plus(*args, **kwargs): # 파라미터에 컬렉션 데이터 타입을 받아줌 : 식별자1개, 데이터n개
    print(type(args), args)
    print(type(kwargs), kwargs)
    return sum(args) + sum(kwargs.values())

plus(1, 2, 3, 4, 5, n1=10, n2=30) 

#결과값
<class 'tuple'> (1, 2, 3, 4, 5) # 키없는 argument
<class 'dict'> {'n1': 10, 'n2': 30} # 키있는 argument
55
  • *args, **kwargs를 argument에서 사용하게 되면, 컬렉션 데이터 타입은 여러개의 argument로 풀어준다.
def echo(*args, **kwargs):
    print(type(args), args)
    print(type(kwargs), kwargs)
    
data = [1, 2, 3]
echo(data)  # echo([1, 2, 3]) > 아규먼트 : 1개, 데이터타입 : 리스트
echo(*data) # echo(1, 2, 3) > 아규먼트 : 3개, 데이터타입 : 정수

data = {'num1': 10, 'num2': 20}
echo(data)   # echo({'num1': 10, 'num2': 20}) > 아규먼트 1개, 데이터타입 : 딕셔너리
echo(**data) # echo(num1=10, num2=20) > 키워드 아규먼트 2개, 데이터타입 : 정수
  • 적용 예시) parameter에 **kwargs를 사용하고, argument도 dic 타입이라면?
# 데이터베이스 접속 함수
def connect(**kwargs):
    print('connect :', kwargs['host'], kwargs['user'], kwargs['pw'])

data = {'host': '1.2.3.6', 'user': 'python', 'pw': '1234'}
connect(**data)
>> connect : 1.2.3.6 python 1234

3. lambda함수

  • 파라미터, 리턴으로 구성된 일회성 함수로, 별도의 함수 선언없이도 사용 가능하다.
  • 메모리를 절약하고 가독성이 증대된다.
def calc(func, n1, n2):
    return func(n1, n2)

calc(lambda n1, n2: n1 + n2, 1, 2), calc(lambda n1, n2: n1 - n2, 1, 2)
>>> (3,-1)

4. list comprehension

  • 간단한 반복문, 조건문을 사용해서 리스트 데이터를 만들 때, 사용하는 문법
  • 주로 리스트 데이터를 필터링 하거나 데이터를 변경할 때 사용한다.
reports = ['사업보고서(2020)', '감사보고서(2021)', '[기재정정]사업보고서(2020)']
# 2020년도 보고서 목록을 리스트로 출력
reports_2020 = [report[:-6] for report in reports if report[-5:-1] == '2020']
reports_2020
>>> ['사업보고서', '[기재정정]사업보고서']

reports_2020 = {report[:-6]: report[-5:-1] for report in reports if report[-5:-1] == '2020'}
reports_2020
>>> {'사업보고서': '2020', '[기재정정]사업보고서': '2020'}
# kim씨 성을 가진 이름을 연령대로 데이터를 바꿔서 리스트로 출력
names = ['kim python(23)', 'lee notebook(32)', 'kim macbook(47)']
def ages(data):
    return data[:-3] + str(int(data[-3:-1]) // 10 * 10) + ')'

names_kim = [
    ages(name)
    for name in names 
    if name.split(' ')[0] == 'kim'
]

names_kim

5. map(func, *iterables)

  • iterable한 데이터의 모든 value에 특정 함수를 적용한 결과를 리스트로 출력한다. 
  • pandas에선 apply메소드가 비슷한 기능을 수행
names = ['kim python(23)', 'lee notebook(32)', 'kim macbook(47)']

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

list(map(ages, names))
>>>['kim python(20)', 'lee notebook(30)', 'kim macbook(40)']


names1 = ['kim python(23)', 'lee notebook(32)', 'kim macbook(47)']
names2 = ['kim py(33)', 'lee note(52)', 'kim book(87)']

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

print(list(map(ages, names1, names2)))
>>>[['kim python(20)', 'kim py(30)'], ['lee notebook(30)', 'lee note(50)'], ['kim macbook(40)', 'kim book(80)']]
[ ]

6.(과제) map함수를 직접 만들어보자

# Quiz. map 함수 직접 구현
names1 = ['kim python(23)', 'lee notebook(32)', 'kim macbook(47)']
names2 = ['kim py(33)', 'lee note(52)', 'kim book(87)']

def map_func(func, *args):
    result=[]
    for i in zip(*args) :
        result.append(func(*i))
    return result

#연령대로 바꿔주는 함수 str -> str으로 나온다
def ages(data):
    return data[:-3] + str(int(data[-3:-1]) // 10 * 10) + ')'

map_func(ages, names1)
>>>['kim python(20)', 'lee notebook(30)', 'kim macbook(40)']

7.파파고 API사용하기

  • App을 등록해서 access token을 얻는다. client id, client secret
  • 번역하고 싶은 원본 텍스트(ko) -> 번역 후 텍스트(en)를 지정해준다.
  • 응답값의 text를 받는다.
  • 파일로 저장시킨다. 
  • 위의 과정을 함수로 만들어보자.
def translate(text, source='ko', target='en'): #default ko->en
	CLIENT_ID, CLIENT_SECRE = '입력하기', '입력하기'
    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':source, 'target':target, 'text':text}
    response = requests.post(url, json.dumps(data), headers=headers)
    return response.json()['message']['result']['translatedText']

 

 

***

  1. 강사님이 코딩 공부하는 팁을 알려주셨다.
  2. 최신버전의 쉬운 책을 구매하기. (일주일 안에 보고 실습할 수 있다. 업데이트가 반영되어있는 책을 살 것)
  3. 근데, 시중엔 입문책밖에 없어서 이것만 공부해선 경쟁력이 없다.
  4. 공식사이트의 documentation, user guide를 읽고 사용법을 익히기. 한국어로 개괄적인 내용을 공부했기 때문에 쉽게 이해할 수 있다.

블로그의 정보

Study Log by Holly

Holly Yoon

활동하기