수업 8일차

galoo·2023년 7월 7일
0
post-thumbnail

✔ 제어문

제어문이란?

  • 프로그램은 왼쪽에서 오른쪽으로 위에서 아래로 수행되는데, 이 흐름을 변경하고자 하는 명령어

    Python의 명령어는 아래와 같다.
    if, for, while, break, continue, return

  • if는 분기문(branch)
  • while이 반복문
  • for는 순서열을 순회
  • break는 반복문을 종료
  • continue는 다음 반복으로 넘어가는 역할
  • return 은 현재 함수의 수행을 종료하고 호출하는 함수로 되돌아감(이때, 데이터를 가지고 갈 수 있음)

표현식(Expression)

  • 연산식 : -= 가 있는 경우가 하나의 연산식(나머지 연산자는 중첩해서 사용해도 하나의 표현식으로 간주)
  • return이 있는 함수 호출 : 리턴이 없는 함수호출은 표현식으로 간주하지 않는데, 그 이유는 판단을 할 수 없기 때문이다.

판단이 가능한 문장을 표현식이라고 합니다.

파이썬은 제어문이 하나의 블럭을 생성한다

  • 제어문 안에서 만든 데이터는 외부에서 사용이 불가능

조건 분기 - if

if bool 데이터 : 
	bool 데이터가 True인 경우 수행할 문장
elif bool 데이터 : 
	앞의 데이터가 False이고, 현재 데이터가 True인 경우 수행할 문장
....
else : 
	앞의 모든 데이터가 False인 경우 수행할 문장

elif와 else 는 if없이 사용 불가능합니다.
elif는 0번 이상, else는 생략 혹은 한번만 가능

  • elif를 작성할 때 주의할 점
    - 수행되지 않는 조건을 만드는 것에 주의해야 한다.
  • 일반적으로 else는 처리보다는 예외적인 상황을 처리하는 용도로 사용하는 것을 권장함
#하나의 점수를 이볅받아서 60점 이상이면 합격
#무조건 프로그램 종료라는 문구를 출력
score=int(input("점수를 입력하세요 : "))
#실제 프로그램이라면 잘못된 입력을 할 수 있으므로 예외처리를
#해주는 것이 좋습니다. 
print(type(score)) #정말로 문자열이 int로 바뀐건지 확인하기
if score>=60:
    data=30
    print("합격")
else :
    print(data)
print("프로그램 종료")

Fasly

  • Python에서는 0이나 데이터가 없는 데이터의 모임도 False로 간주합니다.
    - None도 False로 간주합니다.
  • Falsy가 아니면 전부 True로 간주

if score==False 보다는 if !score:라고 한다.
왜냐하면 == 연산은 __eq__ 이 메서드를 사용하는 것이기에 메모리 사용 단점이 존재한다.

"""
90에서 100사이이면 A
80에서 89사이이면 B
70에서 79사이이면 C
60에서 69사이이면 D
0에서 59사이면 F
"""
score = int(input("점수를 입력해주세요"))
#int 형변환은 문자열이 int 형태의 친구라면 int로
#하지만 다른 실수나 그러면 못해줌
#물론 int형인 실수를 정수형으로는 바꿀 수 있음
if score>=90 and score<=100:
    print("A")
elif score>=80 and score<=89:
    print("B") 
elif score>=70 and score<=79:
    print("C") 
elif score>=60 and score<=69:
    print("D") 
elif score>=0 and score<=59:
    print("F")
else : #사용자의 입력은 랜덤하기에 제약을 주는 용도로 사용하자.
    print("잘못된 점수 입력입니다.") 

이와 같이 else는 예외처리를 하는데 사용하는 것이 좋다.

  • int 형변환은 문자열이 int 형태의 값이라면 int로
  • 하지만 다른 실수나 그러면 못해줌
  • 물론 int형인 실수를 정수형으로는 바꿀 수 있음
  • 굳이 실수형태도 받고 싶다하면 int(float(input()))

Switch 흉내내기

  • python에서는 switch가 없는데 dict를 이용하면 유사하게 구현가능
# 0 이면 일요일, 1이면 월요일, .... 6이면 토요일 을 출력하자
dayDict={0:"일요일", 1:"월요일", 2:"화요일", 3:"수요일",
4:"목요일", 5:"금요일", 6:"토요일"}
day=int(input("0에서 6까지의 숫자를 입력하세요"))
if day>=0 and day<=6:
    # 원래 dict쓸 때 이것도 가능하다. 하지만 잘 안쓴다.
    #(없는 값 넣으면 에러)
    print(dayDict[day]) 
else:
    print("잘못된 입력입니다.")
# get을 쓰자. 한 번에 끝난다.
print(dayDict.get(day, "알 수 없는 요일"))    

dict에서 get은 일치하는 키가 있으면 그 값을 가져오고, 없으면 두 번째 매개변수의 값을 리턴한다.

if를 이용한 값 대입 - list 사용할 때 중요

  • x값에 따라 y에 True나 False를 설정하고 싶은 경우가 있다.
    - if를 이용한 값 대입을 하지 못한다면
x=10
y
if x>=10:
	y=True
else:
	y=False
x=10
y=False if x<10 else Ture 
# y는 x가 10미만이면 False를 대입 아니면 True 대입

밑에가 중요해

✔ While

반복을 위한 제어문

while bool 데이터 :
	bool 데이터가 True인 경우 수행할 문장
  • python에서는 while과 else를 매핑하는 것이 가능함
while bool 데이터 :
	bool 데이터가 True인 경우 수행할 문장
else:
	while이 break를 만나지 않고 정상 종료된 경우 수행할 문장
idx=0
while idx<10:
    print(idx)
    idx+=1
    #if idx>5:#이게 수행되면 else사용 x
    #   break
else:
    print("반복문 종료") 
print(idx)

else는 반복문이 모두 정상적으로 수행하고 종료된 경우에 호출된다. break나 예외 발생 시 호출이 안된다.
예외 발생 때문에 걸어두는 것이다.

무한 반복

while Ture:
	반복할 내용

✔ for

for 임시변수 in 순서열 :
	순서열의 데이터를 하나씩 임시변수에 대입하고 수행할 문장

순서열은 __iter__가 구현된 인스턴스 :
순서열 : str, dict, set, tuple, list, bytes

숫자열을 만들 수 있는 함수 - range

  • range(숫자) : 0부터 숫자 전까지 1씩 증가한 숫자열
  • range(시작숫자,종료다음숫자)
  • range(시작숫자, 종료다음숫자, 간격)
  • map, dict가 for에 들어갔을 때, 무엇이 return인지 확인하자.
    - dict는 key값이 하나씩 대입되고, 나머지는 데이터가 하나씩 대입된다.
news="http://www.donga.com/news/search?p="
newsList=[]
newsCnt=67
listLength=15
pagenum=int((newsCnt/listLength)+1)
for i in range(1,pagenum+1):
    newsList.append(news+str((i-1)*15+1))
print(newsList)
for i in range(1,32,15):
    print("http://www.donga.com/news/search?p=",i,sep="")
for i in range(3):
    print("http://www.donga.com/news/search?p=",
    (i*15)+1,sep="")
for i in range(3):
    q="http://www.donga.com/news/search?p="+str((i*15)+1)
    print(q)

여러 방식이 존재한다.

기타

  • 제어문은 중첩해서 사용이 가능하다.
  • break : 반복문 종료
  • continue : 다음 반복으로 이동

✔ 간단한 문제들

#2 부터 100까지 완전수의 개수 
#완전수 : 자신을 제외한 약수의 합이 자신과 같다.
perfectNum=[]
startNum=2
endNum=1000
for i in range(startNum,endNum+1):
    divisorSum=1 #1은 모든 수의 약수이기에
    for j in range(2,i//2+1):#2부터 하자 
        #자기보다 절반보다 큰 숫자가 약수가 될 확률
        #+1을 해줘야지 i//2까지 가겠지
        if(i%j==0):
            divisorSum+=j
    if(i==divisorSum):
        perfectNum.append(i)
print(perfectNum)
print(len(perfectNum))
# 피보나치 수열
# 첫 번째와 두 번쨰 데이터는 1
# 세 번째 데이터부터는 앞의 2개의 합
#
# list append해서 간단하게?
#
fibonacci=[1,1] #앞에는 고정이라 그냥 해두자
n=10
for i in range(2,n): # 굳이 반복문의 횟수를 늘리려고 하지 말자.
        fibonacci.append(fibonacci[i-2]+fibonacci[i-1])
print(fibonacci)
#
#재귀함수 쓰면 안되나?
#
def fibo(n):
    if n==1 or n==2:
        return 1
    else :
        return fibo(n-2)+fibo(n-1)
#
#강사님이 원한 것
#
def prof_fibo(n):
    if n==1 or n==2:
        return 1
    else:
        n_1=1 #직전항
        n_2=1 # 두번쨰 앞의 항
        result=0 #실제 결과
        for i in range(3,n+1): # 1, 2번항은 이미 한거라 뺀거야.
            result=n_1+n_2
            n_2=n_1
            n_1=result
        return result
#
# 결과물을 확인해보자.
#
idx=int(input("구하고자 하는 피보나치 수열의 값은?"))
print("fibonacci 리스트를 확인하면 : "+str(fibonacci[idx-1]))
print("fibo함수를 사용하면 : "+str(fibo(idx)))
print("강사님이 생각한 함수를 사용하면 : "+str(prof_fibo(idx)))

✔ 함수 - function

  • 함수는 stack 형태로 메모리 차지 (크기에 제한이 있습니다.)
  • 함수 없이 그냥 길게 때려버리면 메모리 터져서 stack overflow 생기는겁니다.
  • 가장 큰 목적은 궁극적으로 재사용성을 위한 것이다.
  • 함수는 다른말로 프로시저라고 불러도 됩니다.
  • 클래스와 객체 인스턴스
  • 인스턴스 : 함수와 속성을 묶어둔 것이다.
  • 클래스 : 인스턴스를 여러번 만들 것 같아서 new 해서 재사용성을 높이자. (동일한 객체의 원형)
  • 상속 : 클래스들끼리 똑같은 것이 있으면 그걸 클래스로 묶자
  • 다형성 : 동일한 메시지에 대해서 다르게 반응하는 것.

결국 어떻게든 똑같은 코드를 묶어서 줄여 써보자
분석을 하는 사람들은 파이썬 함수의 원형을 잘 봐야한다.

  • 분석은 재사용은 없지만, 개발은 유지보수를 해야 한다.
  • 개발 tdd(껍데기 만들고 안을 채워나가는 방식)가 가능
  • 분석은 target(model)이 안만들어지면 의미가 없기에 껍데기만 만드는것은 의미가 없다.
  • 딥러닝은 기본 기능을 가진 class를 준다. 이 클래스를 확장 시켜서 나의 것으로 바꿔 써야 한다.
  • 그래서 딥러닝 할 때는 클래스, 인스턴스 만들고 볼 줄 알아야 한다.

개요

  • 별도의 메모리 공간을 할당 받아서 독립적으로 수행되는 코드의 집합
  • 목적은 코드의 모듈화(분할)와 동일한 코드의 중복 제거이다.

종류

Built-In Function(Maker Function)

  • 파이썬이 제공하는 함수

User-Define Function

  • 개발자가 필요에 의해서 만든 함수

3rd party Function

  • 다른 개발자가 만들어서 제공하는 함수
    - 되도록이면 파이썬 중앙 저장소에서 제공하는 것만 이용

Python에서는 함수도 데이터입니다.

사용자 정의 명칭 <-> 변수 를 구분할 필요가 없다?

  • 전통적인 C/Java 는 function이 데이터가 아니다.
  • 그때는 이름과 기능을 나눠야 했다.
  • 하지만 JS나 python에서는 함수도 하나의 데이터입니다.
  • 나눈건 큰 의미는 없다.

내장함수 - Built-In Function

코드에서 확인하자

  • dir(__builtins__))

문서에서 확인하자

사용자 정의 함수

함수 선언(정의)

def 함수이름(매개변수 나열):
	함수 내용
    return 데이터

함수 이름은 사용자 엉의 명칭을 사용
매개변수는 없을 수 도 있습니다.
return도 생략 가능합니다.

함수 호출(call, 실행)

함수이름(매개변수에 대입할 데이터 나열)
#hello python을 2번 출력
#hello java를 2번 출력
print("hello python")
print("hello python")
print("hello java")
print("hello java")
#횟수 및 변수를 바꾸려면 싹 바꿔야 하는 불편함이 있다.
for i in range(3):
    print("hello python")
def whoR(name,n):
    for i in range(n):
        print("hello",str(name))
whoR("R", 5)
whoR # 함수 이름은 함수를 저장한 곳의 참조
print(whoR) #이를 한다면 id를 보여줌
#<function whoR at 0x0000021604264700> python id : 16진수

함수를 호출한 곳으로 돌아가기 - return

  • 함수 내에서 return을 만나면 함수를 호출한 곳으로 돌아갑니다.
  • 돌아갈 때, 데이터를 1개 가지고 갈 수 있습니다.
  • return 데이터를 이용하면 데이터를 가지고 돌아갑니다.
  • 함수를 호출한 곳에 return 되는 데이터가 남겨지는 것과 같습니다.

python은 여러개의 데이터를 return 할 수 있습니까?

  • 근본적으로는 잘못되었습니다.
  • 1개의 데이터이지만 여러개의 데이터를 가리키는 데이터라 여러개를 가지고 return하는 것으로 보이는 것입니다.
  • python은 콤마(,)를 이용해서 데이터를 나열하면 tuple로 간주
    - 10,20 \rarr (10,20) : tuple(row)로 인식
  • 이전의 파이썬 문법에서 함수의 헤더에 리턴되는 자료형을 적지 않았지만, 최근에는 가독성의 문제 때문에 헤더 부분에 리턴되는 데이터의 타입을 기재하는 경우가 많습니다.
    - return 되는 데이터가 없을 때는 None이라 기재합니다.
def fibo(n)->리턴되는 데이터타입 : //요샌 이렇게 쓴다.
    if n==1 or n==2:
        return 1
    else :
        return fibo(n-2)+fibo(n-1)

코드를 쉽게 짜고, 가독성을 높이는 것은 매우매우 중요하다!!!

  • return되는 데이터가 있다면, 그 결과를 가지고 다른 작업을 수행할 수 있습니다.
    - return이 없으면 일반적으로 매개변수로 대입된 데이터를 수정합니다.
result=intAddWithInt(100,300)
x=intAddWithInt(result,600)
###########################################
intAddWithInt(intAddWithInt(100,300),600)

위는 스택을 하나씩 순서대로 하지만 밑에는 recursion으로 스택 2개임

  • 파이썬은 여러 개의 데이터를 나열해서 리턴하는 것이 가능
  • 여러 개의 데이터를 나열해서 리턴하면 하나의 튜플로 만들어 리턴
def intOpWithInt(a,b):
	return a+b, a-b
# 아래 두줄은 다 맞는 말이다. 
t=intOpWithInt(100,200) #튜플 전체를 받는 것
add, sub=intOpWithInt(100,200) # 튜플을 분해해서 받는 것

데이터를 불러오는 것이라면 튜플 전체를 받고,
분석을 하기 위한 것이라면 분해해서 받는 것이 좋다.
분석 데이터에서 주로 기울기/절편 이라면 분해가 좋겠지.

전처리하는 함수를 만들거면 return을 하세요.
원본데이터를 편집하는 방법은 좋지 않기 떄문입니다.

매개변수(인수, 인자) - argument, parameter

  • 실제 argument와 parameter는 다릅니다.
  • 함수를 호출할 때, 함수에게 넘겨주는 데이터
  • 원래는 argument가 맞지만, parameter가 argument보다 큰 개념
  • 클라이언트->서버 넘길때는 parameter, 그래서 그냥 같이 써버림
  • 없을 수도 있고 여러개 일 수 도 있습니다.
  • 함수를 호출할 때 매개변수가 있는 함수의 경우, 매개변수를 전달하지 않으면 에러가 발생합니다.
def intOpWithInt(a,b):
	return a+b, a-b
add, sub=intOpWithInt(100,200) 
# 100이나 200 둘 중 하나라도 없으면 에러
  • 최근에는 매개변수의 자료형을 명시하는 것을 권장합니다.
    - 매개변수 이름 다음에 : 자료형 기재 가능
def add(a : int,b : int)-> int:
	return a+b
dataAdd=add(100,200) 

이렇게 한다면 선언문 line 한줄만 보고 정수 2개를 받아 덧셈연산을 통해 결과를 정수형태로 return하는 함수라고 파악 할 수 있다.

int add(int a, int b){ c는 이렇게 쓴다.
add(a: int, b: int)->int : python은 이렇게 한다. 

위의 python 표기 방법은 UML(표준 표기법)이다. 뭐지?
표기법을 기억해야 한다.

call by value & call by reference - 매개변수 전달 방법

  • scala data는 값이 전달되는 형태이고, vector data(collection, container)는 참조가 전달되는 형태로 동작합니다.
  • 함수를 호출할 때, scala data를 넘겨주면, 함수 내부에서 데이터를 변경해도 외부의 데이터는 변경되지 않습니다.
  • vector data를 넘겨주면, 함수 내부에서 함수 외부의 데이터를 수정할 수 있습니다. (참조여서?)
def callByValue(a:int)->None:
	a=20
    print(a)
x=30
callByValue(x)
print(x)

x는 scala 데이터라 x가 전달되는 것이 아닌, 30이 전달됩니다.
그래서 a는 20으로 바뀐다.

def callByReference(li:list)->None:
	li[0]=20
    print(li)
l=[100,200,300]
callByValue(l)
print(l)

l의 값을 넣는 것 보다는, l의 참조를 넘겨준 것이라 생각해야 한다. 즉, 참조를 할 수 있게 되어 100, 200, 300에 접근 할 수 있게 되어 l의 값 자체가 바뀌어진다.

어지간하면 프로그램에서는 callByValue로 하라고 한다. 속도나 여러 문제로 callByReference로 종종하지만 sw 개발 관련 가점은 Value이다.

결국 책 원본을 빌려주느냐 vs 책 사본을 빌려주느냐(돈이 들어)

pure function(순수함수)

  • 함수 내부에서 함수 외부의 데이터를 변경하지 않고, 매개변수가 동일하면 항상 동일한 결과를 리턴하는 함수
  • 이 함수에서는 현재 시간, 랜덤을 사용하면 안된다.
    - 결과가 달라질 수 있게 하는 애들은 넣으면 안된다.
    - 일관성이 있는 함수

매개변수의 기본값을 설정하는 것이 가능하다

  • 매개변수이름=값의 형태로 작성하면 매개변수의 값을 생략하면 기본값이 설정됩니다.
  • print("hello")를 하면 자동 줄바꿈되는것
    - print의 end 매개변수의 기본값은 "\n"이다.
    - value가 있는데 왜 생략? : ...이 뒤에 붙어서!
    - 이는 0개이상이기 때문에

기본값이 설정된 매개변수를 호출할 때 생략할 수 있습니다.

  • 함수를 호출할 때, 매개변수 이름과 값을 같이 전달할 수 있습니다.

매개변수의 unpacking

  • 매개변수가 여러개 일 때, list나 tuple 또는 set으로 한꺼번에 전달이 가능합니다.
  • list나 tuple 그리고 set을 분할해서 매개변수에 대입합니다.
  • 매개변수로 대입할 때, 앞에 *을 붙여서 전달합니다.
  • dict를 전달하면 key가 순서대로 대입됩니다.
  • dict의 value를 전달하고자 하는 경우는 **을 붙여서 전달하면 됩니다.
def collect(a,b):
	print(a)
    print(b)
collect(10,20)
collect(*[100,200]) #list를 분할해서 a에 100, b에 200대입
collect(*{"key1":100,"key2":200}) #이러면 key값이 들어감
#즉 a="key1", b="key2"
collect(**{"key1":100,"key2":200}) #이러면 value가 전달
#즉 a=100, b=200 이 전달됨

python matplotlib 쓸 때, 매개변수 많아서 스트레스 받는데
이거 쓰면 참 좋다.

가변 매개변수

  • 매개변수의 개수를 정하지 않고 사용하는 매개변수
  • 매개변수를 만들 때 * 을 이용해서 이름을 설정
  • *을 이용해서 매개변수를 설정하면 데이터 개수에 상관없이 대입 가능합니다.
    - 함수 내부에서는 매개변수들을 모아서 하나의 튜플을 만듦
  • 매개변수를 만들 때, **을 추가하면 dict로 받아들이게 된다.
#가변 매개변수 사용하기
#함수 내부에서는 튜플로 
def merge(*li):
    for element in li:
        print(element)
merge(10)
merge([1,23,4,5])
merge([1,2],[3,4],(5,6),7)

가변 매개변수 앞에 있는 매개변수를 대입할 때, 매개변수 이름과 함께 대입하면 에러
가변 매개변수 뒤에 있는 매개변수를 대입할 떄는 반드시 매개변수 이름과 함께 대입해야 한다.
\rarr앞은 이름 x 뒤는 이름 o

def merge(name,*li,age):
#생략
merge("mino",10,20,30,26) #가능
merge(name="mino", 10, 20, 30, 26) # 에러
merge("mino", 10, 20, 30, age=26) # 에러 아님

함수를 호출할 때 존재하지 않는 매개변수 이름을 이용해서 대입하면 dict로 받아들일 수 있다.

  • 이 경우, dict는 가장 마지막 매개변수여야 합니다.
def merge(name, **param):
	for k in param:
		print(k,param[k])
merge(name="mino", job="student", gender="남자")
# job, gender는 매개변수에 없으니 **param으로 dict로 쑥 들어감

가장 최악

재귀함수(Recursion, Recursive call)

  • 함수가 자기 자신을 다시 호출하는 것
  • 함수의 수행이 종료되기 전에 자기 자신을 다시 호출하기 때문에 메모리 사용량도 늘어나고 속도도 느리지만 가독성이 우수

유의할 점 : 반드시 종료지점이 존재해야 한다.

def dataSum(n:int)->int:
	if n==1:
    	return 1
    return n+dataSum(n-1)

else를 안썼지만, return이 else와 같은 역할을 하고 있다.
그래서 반복문에서도 break를 안쓰고 return 하는 경우도 있다.

def fibo(n:int)->int:
    if n==1 or n==2:
        return 1
    return fibo(n-2)+fibo(n-1)
print(fibo(10)) #55가 나오면 된다.

피보나치를 재귀함수로 만들어보자
가독성이 매우 뛰어납니다.

python default lib에 memoization으로 재귀가 그렇게 느리지 않습니다.

fibonacci=[1,1]
n=10
for i in range(2,n):
        fibonacci.append(fibonacci[i-2]+fibonacci[i-1])
print(fibonacci)

몰랐는데 이것도 memoization 아니야? - 맞아

import functools
@funtools.lru_cache() #추가한다면 기존코드에?

memoization - 함수의 호출 결과를 저장해 둔 후 그 값으로 재사용하는 것

pass

  • 함수 나 클래스의 내용을 나중에 작성하기 위해서 비워두는 것
def temp():
	pass

TDD 테스트 주도 개발 : 껍데기부터 만들어 가는 것이다.
왜 이렇게 해? : 처음부터 다 구현하려면 힘들다.
현실적으로 "시기"가 매우 중요하기에 빠르게 해야 한다.

함수의 매개변수에 설명을 추가하는 것이 가능

def 함수이름(매개변수이름 : 자료형)->리턴타입:

주석을 써주고 싶을 수 있잖아?
변수가 score면 일반적으로 0~100 인걸 써주고싶은데
함수 내부에 적어놨어서 들어가서 봐야하니까 외부에 써두자

def 함수이름(매개변수이름 : '문자열'자료형)->리턴타입:

문자열로 주석 작성
def pan(score:'int >=0 and <=100'=0)->None: ??

함수에 도움말 만들기

  • help를 했을 때, 출력되는 문자열 만들기
  • 함수를 만들고 난 후, 함수.__doc__ 속성에 문자열을 대입해서 만들 수 있다.
  • 함수를 만들 때 가장 상단에 문자열을 추가하면 help를 했을 때 출력
def fibo(n:int)->int:
    if n==1 or n==2:
        return 1
    return fibo(n-2)+fibo(n-1)
fibo.__doc__="재귀를 이용해서 피보나치 수열의 값을 리턴하는 함수"

이렇게 하면 된다.

python에서 함수는 일급 객체

일급객체?

  • 자료형이어야 합니다. (함수는 자료형이다.)
  • 동적으로 생성이 가능해야 합니다.
  • 변수에 대입이 가능해야 합니다.
  • 함수의 매개변수로 사용이 가능해야 합니다.
  • 함수에서 리턴할 수 있어야 합니다.

함수를 변수에 대입

  • 함수를 다른 변수에 대입해서 호출하는 이유는?
    - 다형성 때문이다.
    - 동일한 메시지에 대하여 다르게 반응하는 성질이다.
    - 동일한 코드가 상황에 따라 다른 함수, 메서드를 호출하는 것
def dragonAttack():
	print("드래곤의 공격")
def tankAttack():
	print("탱크의 공격")
dragonAttack()
tankAttack()

이렇게 한다면 명령어를 2개 따로 해야 한다.

def dragonAttack():
	print("드래곤의 공격")
def tankAttack():
	print("탱크의 공격")
dragonAttack()
tankAttack()
delegate=tankattack
delegate()

이러면 key하나로 함수 2개를 조절할 수 있게 되었어.

고위 함수 - High Order Function

함수를 매개변수로 받거나 함수를 리턴하는 함수

  • python에서는 함수 안에서 함수를 생성하는 것이 가능
#함수가 함수를 내부에 만들어서 리턴하면 고위 함수라고 합니다.
def outer():
	def inner():
    	print("내부함수")
   	return inner

이는 함수를 호출해서 그 결과를 변수에 대입하고 그 변수를 통해서 함수를 호출해야 합니다.
func=outer(), func() 이렇게 말이죠

람다 - lambda

  • 이름이 없는 한 줄 짜리 함수
  • 람다 함수 안에서는 변수를 생성할 수 없고, 할당문이나 while, try 등도 사용할 수 없다.
lambda 매개변수 나열 : 리턴할 내용

2개의 숫자를 받아서 더한 결과를 리턴하는 람다는

lamda x,y:x+y

이다.

lambda는 이름이 없어, 그럼 호출할 때 만들어지고 소멸한다.

  • 이름을 만들면 처음부터 만들어져서 저장되기에 이름 없는 것으로 많은 것을 빠르게 처리하면 편하다.
profile
밀가루 귀여워요

0개의 댓글