선미 파이썬 0328 13일차

azuremei
이동: 둘러보기, 검색

노트

#함수에서 여러개의 값 반환
def clac(a, b) :
    return a+b, a-b, a*b, a/b
#사칙연산의 네 가지 결과를 바환하겠다

print(clac(5, 3)) #clac함수는 리턴을 하니까 반환되는 값을 출력(사용)
#반환된 값 : (8, 2, 15, 1.6666666666666667)
#>>값이 여러개이면 튜플로 반환된다. >>> 튜플 '하나'로 반환
####모든 프로그래밍 언어에서 함수가 반환하는 값은 절대로 여러개일 수 없음, 오직 하나 또는 none
print(clac(5, 3)[0]) # >>인덱싱 가능!!

print()
print() #매개변수가 없으면 단순개행
print(1) # 매개변수로 전달한 값 : 1
print(1, 2, 3) # 정수 1, 2, 3 출력(매개변수로 값이 3개출력)
#함수는 정의해놓은대로 사용하는데 print만 매개변수가 달라도 사용이 가능하다. >왜?

# 전달되는 값이 몇 개인지 모르거나 몇 개이던 받아야 할 때는 '가변인수'를 사용한다.
#가변인수 >>> *args(arguments : 입력 인자'들')
'''
def add(a, b) :
    return a+b
print(add(1, 2)) 
'''
#만약 이 두 개보다 더 많은 값을 구하고 싶다면?? 프린트처럼


def add( *args ) : # args라는 이름도 일종의 변수이기 때문에 변경이 가능하다.
    print("add의 args : ", args) # args에는 튜플로 전달된 모든 값들이 나열됨 >>>> * = 패킹/언패킹
    my_sum=0 # 덧셈의 결과를 누적할 변수 생성
    for i in args : # 튜플(전달된 값)의 모든 요소를 대입
        my_sum+=i 
    return my_sum

print(add(1, 2, 3, 4, 5))
#프린트도 동일한 가변인수를 사용한것(print(v, ....... ))
#print()에서 아무것도 넣지 않았는데 개행이 되는 이유는 print 안에 end="\n"가 적용되어 있기 때문

print()

#매개변수 이름을 '키워드'로 사용하여 함수 호출

def print_info(name, age, phone) :
    print("이름 : ", name)
    print("나이 : ", age)
    print("전화번호 : ", phone)
    #반환없음

print_info("쿠로코", 18, "010-0415-0411")

print_info(age=18, name="쿠로코", phone="010-0415-0411")
# 매개변수를 알면 순서와 상관 없이 수행할 수 있다.
#문자열 포매팅과 비슷
print("{a}, {b}".format(b=2245, a=588))

print(1, 2, 3, sep="") #sep에는 원래 ' '공백이 있었는데 빈 문자를 전달함, 즉 sep나 end도 매개변수이다.


#매개변수에 초기값(기본값) 넣기

#기본값 넣는것은 매개변수 뒤에 대입을 해주면 됨, ㅁ는 ㅇ 이런식으로...

def print_info(name, age, phone="010-xxxx-xxxx") :
    print("이름 : ", name)
    print("나이 : ", age)
    print("전화번호 : ", phone)


print_info("쿠로코", 18)
#이런식으로 매개변수를 입력하지 않으면 기본값이 전달된다. 이 때 폰 부분에 "zzzzz"를 치면 기본값을 덮고 "ㅋㅋㅋㅋ"가 출력된다.
#print()함수의 정의된 구조 예쌍
#def print(sep="", end="\n", .....)
# 기본값을 적용할 매개변수를 맨 뒤에 위치시켜야 한다. (print처럼???)
'''
def test(a=1, b) :
    print(a, b)
test(2)
'''
#오류! 컴파일 오류 : 실행하려 했는데 문법오류가 난 것, 실행하기도 전에 오류가 났다.(파이썬에는 없는 개념이지만 문법적 오류로 실행조차 되지 않는 것이 컴파일 오류이다.) /실행 도중에 오류가 난 것(런타임 오류)

def test(a, b=1) :
    print(a, b)
test(2)

#전역변수, 지역변수
#전역변수 : 전체 영역 >>전체 영역에서 사용 가능한 변수이다.
#지역변수 : 특정 지역에서만 사용 가능
    #특정 지역이란? : 어떠한 문법의 수행문 예) (:) 이후의 들여쓰기 구문
# 전역변수는 우리가 여태 사용하던 형태
#전역이냐 지역이냐에 따른 사용을 논하는 것 >>>> 변수 위치! 정확히는 변수의 생성 위치에 따라 사용하느냐 마느냐

value = "전역변수" # 우리가 사용하는 위치, 제일 앞 들여쓰기
def fun1() :
    print(value)

fun1()
#코드의 흐름상 위에만 있으면 사용이 가능하다.
'''
def fun2():
    val_fun2 = "fun2의 지역변수"
    print(val_fun)

fun2()
'''
#print(val_fun2) # 오류! 이때는 존재하지 않는 지역변수이기 때문에 사용할 수 없다.


def fun2():
    val_fun2 = "fun2의 지역변수"
    print(val_fun2)
    value="fun2의 벨류"
    print(value) # 이 때의 벨류는 새로 생성된 지역변수로 위의 벨류 변수와는 이름만 같다.
#fun2에서 벨류 변수를 주석했을때와 하지 않았을 때를 비교해보자
    
fun2()


def fun3():
    #지역변수를 전역변수로 만들기
    global val_fun3
    val_fun3 = "fun3의 지역변수"
    print(val_fun3)
print("====3===")
fun3()

print(val_fun3) # global로 호출하면 지역변수를 전역변수로 전환되어 밖에서도 사용할 수 있음. 그러나 파이썬은 위에서부터 아래로 연산하는 프로그램이므로 호출은 반드시 출력 전에 해야 한다.

#재귀함수 ㅣ 함수의 수행문에서 자기 자신 함수를 다시 호출하는것 >>>나를 다시 호출 : 재귀호출(명칭)
#명칭일 뿐이고 특별한 기술이 들어가는 것은 아님
#함수에 대한 이해가 선행되어야 함
# >함수는 호출하면, 함수의 수행문으로 점프(이동)하고 수행문이 끝나면 호춯했던 위치로 다시 돌아오는것
'''
def count_down(count) :
    print("카운트다운 : ", count)

print("함수호출 전")
count_down(2)
print("함수호출 후")
'''

def count_down(count) :
    print("카운트다운 : ", count)

    #이렇게 하면 숫자가 점점 작아지다 오류가 난다.
    #재귀함수는 나 자신을 반복해서 호출하기 때문에 반복문과 유사함.(반복문도 수행 코드를 반복 수행) >> 반복문처럼 반복이 끝나는 시점을 만들어줘야 한다.
    if count ==0 :
        return # 이렇게 리턴을 뒤에 값 없이 그냥 쓰면 함수를 끝내라, 아무 값 없이 변환할 수 있다.
    ######카운트를 이프 위에 쓰면 오류남...
    count_down(count-1) # 나 자신을 다시 호출(재귀호출)
print("함수호출 전")
count_down(2)
print("함수호출 후")

print()
def func(n) :
    print("fonc({}) 시작".format(n))

    if n==0 :
        print("n==0 이때부터 끝")
        return
    func(n-1) # 재귀함수
    print("fonc({}) 끝".format(n))

#(1) f2 를 호출 (2) f2함수 내부에서 f1을 호출 ㄹ2는 끝난게 아님 (3) ㄹ1함수 내부에서 ㄹ0을 호출 (4)ㄹ0은 조건식에 만족해서 리턴(종료) (5)ㄹ0을 호출했던 ㄹ1로 돌아간다>>>func(n-1)>>>f1끝 출력됨 (6) ㄹ1을 호출한ㄹ2로 돌아간다(>>>>려ㅜ(ㅜ-1)>>펑2끝이 출력됨 (7)ㄹ2를 호출했던 바깥의 ㄹ2로 돌아간다.)
    #>>>어느 코드에서 함수를 호출했는지에 따라 돌아가는 위치가 다르다
    
print("func(2)호출 전")
func(2)
print("func(2)호출 후")

#함수는 호출되면 stack이라는 메모리(기억공간)에 정보가 쌓이고 수행이 완료되면 stack의 정보가 삭제됨

# stack의 자료구조는? : 한 쪽이 막혀있기 때문에 나중에 들어온 자료가 먼저 나감 예) 1. 2. 3 이 쌓인다면 3. 2. 1로 나감.
# [참고] queue자료구조도 있음 아래가 뚫혀있기 때문에 먼저 들어온 자료가 먼저 나감 예) 1, 2, 3이 있다면 1, 2, 3 순으로

#함수 연습 2
'''
    4. 소수 출력하기
      소수(prime no.) : 1 혹은 자신으로만 나눠떨어지는 수 (1은 소수가 아니다.)

        1)1부터 입력받은 수 까지 소수 출력
          함수
            >>이름 :is_prime_number
            >>기능 : 매개변수 전달받은 1개의 숫자가 소수인지 아닌지 판별하여 그 결과를 반환
                소수ㅇ : True
                소수x : False
            is_prime_number(10) --> return false
            is_prime_number(11) --> return true
[출력 결과]
숫자 입력 : 20
소수 : 2 3 5 7 11 13 17 19
힌트 : 1~입력받은 수까지 반복수행하는 for문이 잇어야 함, for문 수행은 안에서 함수를 호출하여 하나씩 확인

    5. 재귀함수를 이용하여 팩토리얼 구하기
      팩토리얼이란 : 1부터 특정 수까지 모든 숫자를 곱한 결과 값(5!=5*4*3*2*1)

      함수
          이름 : get_factorial
          기능 : 매개변수로 전달 받은 숫자의 팩토리얼 결과값 구해서 반환

[결과값]
숫자 입력 ! 5
5!=120
힌트 : 3! = 3*2*1 = 3*2! = 3*2*1!
        1! = 1
      
'''
input_num = int(input("숫자 입력 : "))
def is_prime_number(input_num) :

강의내용