<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")
%reset
%whos
# 함수 선언
def grade(point):
    if point >= 90:
        print("A")
    elif point >= 80:
        print("B")
    else:
        print("C")
        
# 코드를 가지고 있는 데이터 타입
a = 1
ls =[1, 2, 3]
%whos
# 함수 호출
grade(88)
grade(78)<jupyter_output>C<jupyter_text>2. 파라미터와 아규먼트 (디파실아 : def parameter 실행 시는 아규먼트 / 선파호아 선언 파라미터 호출 아규먼트)- 파라미터 : 함수를 선언할 때 호출하는 부분에서 보내주는 데이터를 받는 변수- 아규먼트 : 함수를 호출할 떄 함수에 보내주는 데이터<jupyter_code>def plus(num1, num2=10, num3=20): # 파라미터 : 디폴트 파라미터
    print(num1 + num2 - num3)
plus(1,2) # 아규먼트
plus(3, num3 = 100) # 아규먼트 : 키워드 아규먼트

# input을 받지 못하더라도 디폴트 지정이 되있기 떄문에 실행 가능<jupyter_output>-87<jupyter_text>3. 리턴- 함수를 실행한 결과를 저장하고 싶을 떄 사용합니다.- return<jupyter_code>def plus(num1, num2):
    print(num1 + num2)
    return num1 + num2
result = plus(1,2)
print(result)
data1 = "python"
result = data1.upper()
print(result)
data2 = [3,1,2]
result = data2.sort()
print(result)
# 함수에서 return 코드가 실행되면 무조건 함수의 코드 실행이 종료
def echo(msg):
    if msg == "quit":
        return
    print(msg)
echo("python")
echo("quit")<jupyter_output><empty_output><jupyter_text>4. `*args`, `**kwargs`- 함수를 호출할 때 아규먼트와 키워드 아규먼트의 갯수를 특정지을 수 없을 때 사용<jupyter_code>def plus(num1, num2):
    return (num1 + num2)
plus(1,2)
def plus(*args):
    print(type(args), args)
    return sum(args)
plus(1,2,3,4,5,6,7,8,9)
plus(1,2,3,4,5, num1 = 6, num2 = 7)
def plus(*args, **kwargs):
    print(type(args), args)
    print(type(kwargs), kwargs)
    return sum(args) + sum(list(kwargs.values()))
plus(1,2,3,4,5, num1 = 6, num2 = 7)
def func(num1, num2, num3):
    return num1 + num2 + num3

data = [1, 2, 3]
print(func(*data)) # func(1, 2, 3)
# *가 붙음으로서 리스트 안에 있는 값이 하나씩 호출된다
# print(func(data)) # func([1, 2, 3])
# *가 없으면 리스트가 통으로 넘어간다
data = {
    "num2" : 100,
    "num3" : 200,
}

func(1, **data) # func(1, num2=100, num3=200)

# type(**data)<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.163003663003663, 'fraction_numerical': 0.055860805860805864, 'mean_word_length': 3.5903361344537816, 'pattern_counts': {'":': 1, '<': 15, '<?xml version=': 0, '>': 19, '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': '256926', 'license': 'MIT', 'n_tokens_mistral': 1299, 'n_tokens_neox': 1547, 'n_words': 269, 'path': 'python/01_python/04_function.ipynb', 'repo_name': 'dreandes/Code', 'size': '2184'}