AI SCHOOL/TIL

[TIL] 멋사 AI SCOOL DAY 7 - 파이썬 함수

moru_xz 2023. 1. 4. 16:47

멋사 AI SCOOL 7일차

: Python function

  

* Keywords

#lambda

#scope

#grobal #local

#def

 

 

* Today I Learned

# 로또번호 출력(list)
# - 1 ~ 45의 랜덤한 숫자 6개 출력
# - 숫자 6개가 중복데이터가 없어야 함
# list 선언, random.randint(), while, break, if, not in, >=, len(), list.append()
# 로또번호출력
lotto = []
while True:
    random_number = random.randint(1, 45)
    lotto.append(random_number)
    lotto = list(set(lotto))
    if len(lotto) >= 6:
        break
lotto.sort()
print(lotto)

# 파이썬출력
print('python')

# 로또번호출력
lotto = []
while True:
    random_number = random.randint(1, 45)
    lotto.append(random_number)
    lotto = list(set(lotto))
    if len(lotto) >= 6:
        break
lotto.sort()
print(lotto)
[7, 16, 20, 32, 34, 37]
python
[5, 9, 17, 29, 40, 42]

이러면 숫자를 7번 뽑고 싶으면 두개 모두 >= 7로 바꿔야 함 -> 귀찮음 -> 함수선언(코드작성)

# 함수선언(코드작성)
def display_lotto():
    lotto = []
    while True:
        random_number = random.randint(1, 45)
        lotto.append(random_number)
        lotto = list(set(lotto))
        if len(lotto) >= 6:
            break
    lotto.sort()
    print(lotto)


# 로또번호출력
display_lotto()

# 파이썬출력
print('python')

# 로또번호출력
display_lotto()
[13, 14, 21, 34, 42, 45]
python
[13, 15, 19, 26, 35, 36]

간편해짐 

 

Parameter(매개변수)와 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)
[1, 10, 16, 18, 25, 34]
[4, 6, 26, 27, 28, 32, 41]

Default Parameter 와 keyword argument

default parameter 내가 지정해놓은 파라미터 

keyword argument는 지정해서 전달하는 방법

+) 키워드 인자(keyword 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
111

 

# 숫자의 범위와 숫자의 갯수를 아규먼트로 설정해서 함수를 호출할수 있도록 함수를 수정
# 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개의 숫자
display_lotto(10, 50)
[2, 3, 15, 31, 36, 39]
[2, 8, 11, 16, 24, 26, 44, 45, 47, 50]
[4, 6, 7, 24, 26, 29, 33, 35, 36, 43]

 

Return

- 함수를 호출해서 결과 데이터를 변수에 저장할 때, 함수의 코드를 중단할 때 

def plus1(n1, n2):
    print(n1 + n2)

def plus2(n1, n2):
    return n1 + n2
    
result1 = plus1(1, 2)
result2 = plus2(2, 3)
print(result1, result2)
3
None 5

리턴이 있는 함수와 없는 함수

# 리턴이 있는 함수 예시 : 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

 

calc는 공부를 더 해보고 정리해야할 것 같음... ㅠ

 

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
    '''
    return n1 + n2

 

*args, **kwargs

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

*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)
<class 'dict'> {'n1': 10, 'n2': 30}
55

 

 

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개, 데이터타입 : 정수
<class 'tuple'> ([1, 2, 3],)
<class 'dict'> {}
<class 'tuple'> (1, 2, 3)
<class 'dict'> {}

 

data = {'num1': 10, 'num2': 20}
echo(data)   # echo({'num1': 10, 'num2': 20}) > 아규먼트 1개, 데이터타입 : 딕셔너리
echo(**data) # echo(num1=10, num2=20) > 키워드 아규먼트 2개, 데이터타입 : 정수
<class 'tuple'> ({'num1': 10, 'num2': 20},)
<class 'dict'> {}
<class 'tuple'> ()
<class 'dict'> {'num1': 10, 'num2': 20}

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

 

데이터베이스 접속 함수

 

scope

- 함수 밖: 전역영역 - global

- 함수 안: 지역영역 - local

data = 10

def change():
    data = 20

change()
print(data)
10

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

data = 10

def change():
    global data
    data = 20

change()
print(data)
20

 

lambda

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

 

 

 

* Homework

 

 

* Reference

https://www.hackerrank.com/

 

HackerRank

HackerRank is the market-leading technical assessment and remote interview solution for hiring developers. Learn how to hire technical talent from anywhere!

www.hackerrank.com

 


* Retrospective

😍 Liked

지금까지 배웠던 파이썬 입문서에서는 이렇게 딥하게 다루지 않았는데 이번에 제대로 배울 수 있었음 

 

📚 Learned

함수 전체적으로 배울 수 있었음

 

💦 Lacked

전체적으로 이해가 잘 되지 않음... 

진도 따라가기 바쁜 느낌 

 

🙏 Longed for

내일 class 배운다고 해서 일단 그것부터 예습하고 주말에 이 부분 복습해야겠음