<jupyter_start><jupyter_text>함수- 반복되는 코드를 묶음으로 효율적인 코드를 작성하도록 해주는 기능- 기본 함수- 파라미터와 아규먼트- 리턴- `*args`, `**kwargs`- docstring- scope- inner function- lambda function- Map, Filter, Reduce- Decorlator  1. 기본 함수- 함수의 선언과 호출<jupyter_code>point = 88

if point >= 90:
    print("A")
elif point >= 80:
    print("B")
else:
    print("C")
# code...
point = 70

if point >= 90:
    print("A")
elif point >= 80:
    print("B")
else:
    print("C")
# 함수 선언
def grade(point):
    if point >= 90:
        print("A")
    elif point >= 80:
        print("B")
    else:
        print("C")
# 함수 호출
grade(88)
grade(78)<jupyter_output>C<jupyter_text>2. 파라미터와 아규먼트- 파라미터 : 함수를 선언할때 호출하는 부분에서 보내주는 데이터를 받는 변수- 아규먼트 : 함수를 호출할때 함수에 보내주는 데이터<jupyter_code>def plus(num1, num2=10, num3=20): # num1, num2 : 파라미터 
                         # 디폴트 파라미터 : num2=10으로 설정해서 받는 아규먼트가 없으면 10으로 작동한다.
                         # 아규먼트가 하나 또는 두개를 써도 상관없게 만들어준다.
    print(num1 + num2 - num3)
plus(1, 2) # 1, 2 : 아규먼트 # 파라미터와 갯수를 다르게 써주면 에러가 발생한다.
           # 아규먼트 : 키워드 아규먼트
plus(3, num3=100) # 아규먼트 : 키워드 아규먼트
print(1, 2, end="-")
print(3)<jupyter_output>1 2-3<jupyter_text>3. 리턴- 함수를 실행한 결과를 저장하고 싶을때 사용한다.- return<jupyter_code>def plus(num1, num2):
    print(num1 + num2)
    return num1 + num2 # ()를 사용하면 tuple이된다. ()를 안해주는것이 맞다.
result = plus(1, 2)
print("return 사용 : ", result)
data1 = "python"
result = data1.upper() # return이 있는 함수
print(result)
data2 = [3, 1, 2]
result = data2.sort() # return이 없는 함수
print(result)
# 함수에서 리턴코드가 실행되면 무조건 함수의 코드 실행이 종료된다.
def echo(msg):
    if msg == "quit":
        return
    print(msg)
echo("python")
echo("quit")
def calc(num1, num2):
    return num1 + num2, num1 - num2

data1, data2 = calc(1, 2)
data1, data2<jupyter_output><empty_output><jupyter_text>4. `*args, **kwargs`- 함수를 호출할때 아규먼트와 키워드 아규먼트의 갯수를 특정지을수 없을때 사용<jupyter_code>def plus(*args, **kwargs):
    print(type(args), args)
    print(type(kwargs), kwargs) # kwargs : 키워드만 있는 값들만 받아온다 => 키워드가있기 때문에 키가있는 dict타입이다.
    return sum(args) + sum(list(kwargs.values()))
plus(1, 2, 3, 4, 5, num1=6, num2=7)
def func(num1, num2 = 10, num3 = 20):
    return num1 + num2 + num3

data = [1, 2, 3]
func(*data) # *가 붙으면 func(1, 2, 3)으로 동작하는 것과 같다
            # 각각의 값이 아규먼트로 들어가도록 설정하는 것이다.
            # *를 사용하지 않으면 [1,2,3]이 하나로 넘어가는 것과 같다 => 아규먼트의 갯수가 맞지않기 때문에 에러가 발생
                # 아규먼트는 3개인데 넘어가는 것은 list하나만 넘어가기 때문에
            # iterable 순서가있는 list, tuple이면 상관없다.
def func2(*args, **kwargs):
    return sum(args) + sum(list(kwargs.values()))
data1 = list(range(0, 1000))
func2(*data1)
data = {
    "num2" : 100,
    "num3" : 200,
}
func2(*data1, **data) # func(1, num2=100, num3=200)<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.14895209580838323, 'fraction_numerical': 0.05239520958083832, 'mean_word_length': 2.96, 'pattern_counts': {'":': 1, '<': 15, '<?xml version=': 0, '>': 23, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '4', 'dir': 'jupyter-structured-clean-dedup', 'id': '432559', 'license': 'MIT', 'n_tokens_mistral': 1580, 'n_tokens_neox': 1878, 'n_words': 327, 'path': 'Python/python/04_function.ipynb', 'repo_name': 'kimchangkyu/TIL', 'size': '2672'}