<jupyter_start><jupyter_text>함수- 반복되는 코드를 묶음으로 효율적인 코드를 작성하도록 해주는 기능- 기본 함수- 파라미터와 아규먼트- 리턴- `*args`, `**kwargw`- 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")
# 함수 선언 (식별자 스네이크로)
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): #파라미터
    print(num1+num2)
plus(1,2) # 아규먼트
plus(3, 4) #아규먼트
plus(3) # 아규먼트 개수가 요구되는 파라미터 개수랑 다를땐 오류가남
def plus(num1, num2=10): #파라미터 : 디폴트 파라미터
    print(num1+num2)
# 아무것도 입력하지 않으면 디폴트 값을 10으로 하겠다
plus(3)
def plus(num1,num2=10,num3=20):
    print(num1+num2-num3)
plus(3,num3=100) # 아규먼트: 키워드 아규먼트 
# 아규먼트를 어떤 파라미터역할에 대입할지 지정하는것<jupyter_output>-87<jupyter_text>3. 리턴- 함수를 실행한 결과를 저장하고 싶을때 사용합니다.- return<jupyter_code>def plus(num1,num2):
    print(num1+num2)
result=plus(1,2)
print(result)
# 출력까지는 해줬는데 값을 내보내진 않음
def plus(num1,num2):
    print(num1+num2)
    return 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)
# sort에는 return이 포함되어있지 않음
# 결과를 저장하는 함수 예시
def grade(point):
    result=""
    if point >=90:
        return  "A"
    elif point >= 80:
        return 'B'
    else:
        return "C"
point=78
result=grade(point)
print(result)
# 함수에서 return 코드가 실행되면 무조건 함수의 코드 실행이 종료 (break와같이)
# 함수 종료를 위해서도 쓰임
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)
# `*args` 아규먼트 개수에 상관없이 들어온 모든 아큐먼트에 대해 적용,,
def plus(*args):
    print(type(args),args)
    return sum(args)
plus(1,2,3,4,5)
# `*args` 아규먼트 개수에 상관없이 들어온 모든 아규먼트에 대해 적용,,
# '**kargs' 키워드가 있는 아규먼트들을 일컫는말 키워드 있는 아규먼트들은 kargs에 들어감
# kargs 키워드 있음 -> 딕셔너리 타입으로!
def plus(*args,**kargs):
    print(type(args),args)
    print(type(kargs),kargs)
    return sum(args)+sum(list(kargs.values()))
plus(1,2,3,4,5,num1=6,num2=7)
def func(num1,num2,num3):
    return num1+num2+num3

data=[1,2,3]
func(*data) # func(1,2,3)
# *args 이것처럼 *data 하면 data안에있는 요소들을 args하나하나로 넣음!
def func(num1,num2,num3):
    return num1+num2+num3

data=[1,2,3]
func(data) # func([1,2,3]) 이렇게 들어간 거라 1,2,3이 num1에 들어가 에러남
# *args 이것처럼 *data 하면 data안에있는 요소들을 args하나하나로 넣음!
data={
    "num2":100,
    "num3":200,
}
func(1,**data)
# 1은 num1에 data에 num2와 func의 num2 같으니 num2에 100, num3에는 200 
# (**karg는 키값 같은걸 넣어줌)
# func(1,num2=100,num3=200)와 동일한 결과<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.15200273878808626, 'fraction_numerical': 0.054775761725436495, 'mean_word_length': 4.117338003502627, 'pattern_counts': {'":': 3, '<': 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': '11377', 'license': 'MIT', 'n_tokens_mistral': 1828, 'n_tokens_neox': 2246, 'n_words': 334, 'path': 'python/08.Condition,Loop,Function_03.ipynb', 'repo_name': 'Seoheesu1/TIL', 'size': '2921'}