본문 바로가기
코딩 공부/파이썬 (혼공단 11기)

[혼공파] 4주차_05

by 루담 2024. 1. 24.

 

👩🏻‍💻 이럴수가,, 혼공학습단을 벌써 반이나 했다고,,,?😮 1주차 시작하면서 헤맸던 게 엊그제 같은데 신기하다. 그동안의 나는 뭐든 작심삼일에 끈기도 없다고 생각했는데, 이렇게 꾸준히 공부하는 나자신 넘넘 대견해 칭찬해. 간식이라는 보상이 있어서 하는 것 같기도 하고 

그래도 공부 열심히 하라고 아아부터 와플까지 아낌없이 주시는 울 족장님,, 감사합니다 ㅎㅎ

 

4주차부터는 진짜 어려워 진 것 같은데, 이게 또 이해가 되면 희열도 느껴지고.. 넘 즐겁다 ✨✨

 

 


[선택미션]

Q) 매개변수 / 기본 매개변수 / 가변 매개변수에 대해 정리

 

05-1. 함수 만들기
▷핵심 포인트 - 호출 / 매개변수 / 리턴값 / 가변 매개변수 / 기본 매개변수

 

 

✍🏻함수를 사용하는 것을 함수를 호출한다고 표현한다. 함수를 호출할 때는 괄호 내부에 여러 가지 자료를 넣게 되는데, 이러한 자료매개변수라고 부른다. 마지막으로 함수를 호출해서 최종적으로 나오는 결과리턴값이라고 한다.

 

✏️함수의 기본

-함수: 코드의 집합

def 함수 이름():
      문장

 

🖐🏻직접 해보는 손코딩🖐🏻

def print_3_times():
    print("안녕하세요")
    print("안녕하세요")
    print("안녕하세요")
   
print_3_times()

-결과

 

✏️함수에 매개변수 만들기

-매개변수는 함수를 생성할 때 괄호 내부에 식별자를 입력해서 만든다.

def 함수 이름(매개변수, 매개변수, ...):
     문장

 

🖐🏻직접 해보는 손코딩🖐🏻

def print_n_times(value, n):
    for i in range(n):
        print(value)
       
print_n_times("안녕하세요", 5)

-결과

 

👻매개변수와 관련된 TypeError

① 첫번째 오류

def print_n_times(value, n):
     for i in range(n):
            print(value)

print_n_times("안녕하세요")
⚠️오류 발생

-결과

👉🏻'print_n_times() 라는 함수의 매개변수 n이 없다'는 오류

 

② 두번째 오류

def print_n_times(value, n):
     for i in range(n):
          print(value)

print_n_times("안녕하세요", 10, 20)
⚠️오류 발생

-결과

👉🏻'print_n_times() 함수는 2개의 매개변수가 필요한데 3개가 들어왔다'는 오류 / 따라서 함수를 호출할 때는 함수를 선언할 때와 같은 개수의 매개변수를 입력해야 한다.

 

✏️가변 매개변수

-가변 매개변수: 매개변수를 원하는 만큼 받을 수 있는 함수

def 함수 이름(매개변수, 매개변수, ... , *가변 매개변수):
      문장

 

-가변 매개변수를 사용할 때는 제약이 있다.

  • 가변 매개변수 뒤에는 일반 매개변수가 올 수 없다
  • 가변 매개변수는 하나만 사용할 수 있다

👆🏻위와 같은 제약을 만든 이유는, 이러한 제약이 없으면 가변 매개변수가 어디부터 어디까지인지 알 수 없기 때문이다.

 

🖐🏻직접 해보는 손코딩🖐🏻

def print_n_times(n, *values):
    #n번 반복합니다.
    for i in range(n):
        #values는 리스트처럼 활용합니다.
        for value in values:
            print(value)
        #단순한 줄바꿈
        print()
           
#함수를 호출합니다.
print_n_times(3, "안녕하세요", "즐거운", "파이썬 프로그래밍")

-결과

👉🏻만약 print_n_times("안녕하세요", "즐거운", "파이썬 프로그래밍", 3)을 사용할 수 있다고 하면 어디까지가 가변 매개변수고, 어디까지가 매개변수 n인지 구분하기가 힘들다. 따라서 파이썬 프로그래밍 언어에서는 내부적으로 가변 매개변수 뒤에 일반 매개변수가 오지 못하게 막은 것이다.

 

✏️기본 매개변수

print(value, ..., sep='  ', end='\n\, file=sys.stdout, flush=False)

👆🏻가장 앞에 있는 value가 가변 매개변수 (앞에선 가변 매개변수 뒤에 일반 매개변수가 올 수 없다고 했다) / 특이하게 '매개변수=값' 형태로 되어있다. 이를 기본 매개변수라고 부른다.

 

-기본 매개변수의 제약

  • 기본 매개변수 뒤에는 일반 매개변수가 올 수 없다

 

🖐🏻직접 해보는 손코딩🖐🏻

def print_n_times(value, n=2):
    #n번 반복합니다.
    for i in range(n):
        print(value)
       
#함수를 호출합니다.
print_n_times("안녕하세요")

-결과

 

✏️키워드 매개변수

-가변 매개변수와 기본 매개변수를 같이 써도 되는지?

 

① 기본 매개변수가 가변 매개변수보다 앞에 올 때

<예제>

def print_n_times(n=2, *values):
    #n번 반복합니다.
    for i in range(n):
        #values는 리스트처럼 활용한다.
        for value in values:
            print(value)
        #단순한 줄바꿈
        print()
       
#함수를 호출합니다.
print_n_times("안녕하세요", "즐거운", "파이썬 프로그래밍")

-결과

👉🏻range() 함수의 매개변수에는 숫자만 들어올 수 있으므로 오류 발생 / 따라서 기본 매개변수는 가변 매개변수 앞에 써도 의미가 없다.

 

② 가변 매개변수가 기본 매개변수보다 앞에 올 때

<예제>

def print_n_times(*values, n=2):
    #n번 반복합니다.
    for i in range(n):
        #values는 리스트처럼 활용한다.
        for value in values:
            print(value)
        #단순한 줄바꿈
        print()
       
#함수를 호출합니다.
print_n_times("안녕하세요", "즐거운", "파이썬 프로그래밍", 3)

-결과

👉🏻가변 매개변수가 우선되는 것

 

👻키워드 매개변수

-키워드 매개변수: 매개변수 이름을 지정해서 입력하는 매개변수

while True:
     print(".", end="" -> 키워드 매개변수

 

🖐🏻직접 해보는 손코딩🖐🏻

def print_n_times(*values, n=2):
    #n번 반복합니다.
    for i in range(n):
        #values는 리스트처럼 사용합니다.
        for value in values:
            print(value)
        #단순한 줄바꿈
        print()
       
#함수를 호출합니다.
print_n_times("안녕하세요", "즐거운", "파이썬 프로그래밍", n=3)

-결과

 

👻기본 매개변수 중에서 필요한 값만 입력하기

 

🖐🏻직접 해보는 손코딩🖐🏻

def test(a, b=10, c=100):
    print(a+b+c)
   
# 1) 기본형태
test(10, 20, 30)
# 2) 키워드 매개변수로 모든 매개변수를 지정한 형태
test(a=10, b=100, c=200)
# 3) 키워드 매개변수로 모든 매개변수를 마구잡이로 지정한 형태
test(c=10, a=100, b=200)
# 4) 키워드 매개변수로 일부 매개변수만 지정한 형태
test(10, c=200)

-결과

👉🏻 '일반 매개변수'는 필수로 입력하고, 순서에 맞게 입력하면 된다. '기본 매개변수'는 필요한 것만 키워드를 지정해서 입력하는 경우가 많다.

 

✏️리턴

-함수는 함수를 실행하고 나면 그 결과를 받아서 사용한다. 이와 같은 함수의 결과리턴값이라고 부른다.

 

👻자료 없이 리턴하기

-return 키워드: 함수를 실행했던 위치로 돌아가라는 뜻으로, 함수가 끝나는 위치를 의미

 

🖐🏻직접 해보는 손코딩🖐🏻

#함수를 정의합니다.
def return_test():
    print("A 위치입니다.")
    return   #리턴합니다.
    print("B 위치입니다.")
   
#함수를 호출합니다.
return_test()

-결과

👉🏻함수 내부에서 출력을 두 번 사용했는데, return 키워드를 만난 순간 함수가 종료되어 "A 위치입니다."만 출력하고 프로그램이 종료되는 것

 

👻자료와 함께 리턴하기

-리턴 뒤에 자료를 입력하면 자료를 가지고 리턴한다.

 

🖐🏻직접 해보는 손코딩🖐🏻

#함수를 정의합니다.
def return_test():
    return 100

#함수를 호출합니다.
value = return_test()
print(value)

-결과

 

👻아무것도 리턴하지 않기

 

🖐🏻직접 해보는 손코딩🖐🏻

#함수를 정의합니다.
def return_test():
    return

#함수를 호출합니다.
value = return_test()
print(value)

-결과

📋None은 파이썬에서 '없다'라는 의미

 

✏️기본적인 함수의 활용

-일반적으로 함수는 다음과 같이 값을 만들어 리턴하는 형태로 많이 사용한다.

def 함수(매개변수):
     변수 = 초깃값
     #여러 가지 처리
     #여러 가지 처리
     #여러 가지 처리
     return 변수

 

🖐🏻직접 해보는 손코딩1🖐🏻

#함수를 선언합니다.
def sum_all(start, end):
    #변수를 선언합니다.
    output = 0
    #반복문을 돌려 숫자를 더합니다.
    for i in range(start, end + 1):
        output += i
    #리턴합니다.
    return output

#함수를 호출합니다.
print("0 to 100:", sum_all(0, 100))
print("0 to 1000:", sum_all(0, 1000))
print("50 to 100:", sum_all(50, 100))
print("500 to 1000:", sum_all(500, 1000))

-결과

📋일반적으로 초깃값을 설정할 때는 연산을 해도 값에 아무런 변화를 주지 않는 것 (0) 를 사용한다.

 


[기본미션]

Q) [범위 내부의 정수를 모두 더하는 함수] 실행 후 코드가 입력된 화면 및 실행 결과 화면

 


 

🖐🏻직접 해보는 손코딩2🖐🏻

#함수를 선언합니다.
def sum_all(start=0, end=100, step=1):
    #변수를 선언합니다.
    output = 0
    #반복문을 돌려 숫자를 더합니다.
    for i in range(start, end + 1, step):
        output += i
    #리턴합니다.
    return output

#함수를 호출합니다.
print("A.", sum_all(0, 100, 10))
print("B.", sum_all(end=100))
print("C.", sum_all(end=100, step=2))

-결과

 

 

5-1 chapter 마무리

 

🔎핵심 포인트

-호출은 함수를 실행하는 행위

-매개변수는 함수의 괄호 내부에 넣는 것

-리턴값은 함수의 최종적인 결과

-가변 매개변수 함수는 매개변수를 원하는 만큼 받을 수 있는 함수

-기본 매개변수는 매개변수에 아무것도 넣지 않아도 들어가는 값

 

 


05-2. 함수의 활용
▷ 핵심 키워드 - 재귀 함수 / 메모화 / 조기 리턴

 

✏️재귀 함수

 

👻팩토리얼 구하기

n! = n * (n-1) * (n-2) * ... * *1

 

반복문으로 팩토리얼 구하기

-start부터 end까지 더하는 함수를 곱하는 함수로 바꾸면 된다.

 

🖐🏻직접 해보는 손코딩🖐🏻

#함수를 선언합니다.
def factorial(n):
    #변수를 선언합니다.
    output = 1
    #반복문을 돌려 숫자를 더합니다.
    for i in range(1, n+1):
        output *= i
    #리턴합니다.
    return output

#함수를 호출합니다.
print("1!:", factorial(1))
print("2!:", factorial(2))
print("3!:", factorial(3))
print("4!:", factorial(4))
print("5!:", factorial(5))

-결과

👉🏻어떤 값이라도 1을 곱하면 변화가 없기 때문에 초깃값을 1로 정했다.

 

재귀 함수로 팩토리얼 구하기

-재귀: 자기 자신을 호출하는 것

factorial(n) = n * factorial(n-1) (n >= 1 일 때)
factorial(0) = 1

f(4) = 4 * f(3)
      = 4 * 3 * f(2)
      = 4 * 3 * 2 * f(1) * f(0)   -> f(0)은 1이므로 곧바로 1로 변경합니다.
      = 4 * 3 * 2 * 1 * 1

👆🏻팩토리얼 연산을 다음과 같이 표현할 수 있다.

 

🖐🏻직접 해보는 손코딩🖐🏻

#함수를 선언합니다.
def factorial(n):
    #n이 0이라면 1을 리턴
    if n == 0:
        return 1
    #n이 0이 아니라면 n * (n-1)!을 리턴
    else:
        return n * factorial(n-1)
   
#함수를 호출합니다.
print("1!:", factorial(1))
print("2!:", factorial(2))
print("3!:", factorial(3))
print("4!:", factorial(4))
print("5!:", factorial(5))

-결과

 

✏️재귀 함수의 문제

-피보나치 수열: '어떠한 속도로 번식하는가' 와 같은 연구에 사용되는 수열

👉🏻규칙

  • 1번째 수열 = 1
  • 2번째 수열 = 1
  • n번째 수열 = (n-1)번째 수열 + (n-2)번째 수열

 

🖐🏻직접 해보는 손코딩1🖐🏻

#함수를 선언합니다.
def fibonacci(n):
    if n == 1:
        return 1
    if n == 2:
        return 1
    else:
        return fibonacci(n - 1) + fibonacci(n - 2)
   
#함수를 호출합니다.
print("fibonacci(1):", fibonacci(1))
print("fibonacci(2):", fibonacci(2))
print("fibonacci(3):", fibonacci(3))
print("fibonacci(4):", fibonacci(4))
print("fibonacci(5):", fibonacci(5))

-결과

 

🖐🏻직접 해보는 손코딩2🖐🏻

#변수를 선언합니다.
counter = 0

#함수를 선언합니다.
def fibonacci(n):
    #어떤 피보나치 수를 구하는지 출력합니다.
    print("fibonacci({})를 구합니다.".format(n))
    global counter
    counter += 1
    #피보나치 수를 구합니다.
    if n == 1:
        return 1
    if n == 2:
        return 1
    else:
        return fibonacci(n - 1) + fibonacci(n - 2)
   
#함수를 호출합니다.
fibonacci(10)
print("---")
print("fibonacci(10) 계산에 활용된 덧셈 횟수는 {}번입니다.".format(counter))

-결과

앞부분 너무 길어서 잘림,,

 

👻UnboundLocalError에 대한 처리

 

🖐🏻직접 해보는 손코딩🖐🏻

#변수를 선언합니다.
counter = 0

#함수를 선언합니다.
def fibonacci(n):
    counter += 1
    #피보나치 수를 구합니다,
    if n == 1:
        return 1
    if n == 2:
        return 1
    else:
        return fibonacci(n - 1) + fibonacci(n - 2)
   
#함수를 호출합니다.
print(fibonacci(10))

-결과

⚠️오류 발생

👉🏻파이썬은 함수 내부에서 함수 외부에 있는 변수를 참조(reference)하지 못한다.

 

📋global 키워드: 함수 내부에서 함수 외부에 있는 변수라는 것을 설명하려면 다음과 같은 구문을 사용한다.

global 변수 이름

👉🏻마우스를 붉은색 밑줄 위에 올려놨을 때 W0621:Redefining name 'counter' from outer scope 또는 E0602:Undefined variable 'counter' 가 나타나면 global 키워드를 쓰라는 것

 

👻메모화

 

🖐🏻직접 해보는 손코딩🖐🏻

#메모 변수를 만듭니다.
dictionary = {
    1: 1,
    2: 1
}

#함수를 선언합니다.
def fibonacci(n):
    if n in dictionary:
        #메모가 되어 있으면 메모된 값을 리턴
        return dictionary[n]
    else:
        #메모가 되어 있지 않으면 값을 구함
        output = fibonacci(n - 1) + fibonacci(n - 2)
        dictionary[n] = output
        return output
   
#함수를 호출합니다.
print("fibonacci(10):", fibonacci(10))
print("fibonacci(20):", fibonacci(20))
print("fibonacci(30):", fibonacci(30))
print("fibonacci(40):", fibonacci(40))
print("fibonacci(50):", fibonacci(50))

-결과

👉🏻메모: 딕셔너리를 사용해서 한 번 계산한 값을 저장한다. / 딕셔너리에 값이 메모되어 있으면 처리를 수행하지 않고 곧바로 메모된 값을 돌려주면서 코드의 속도를 빠르게 만드는 것

 

✏️조기 리턴

 

#함수를 선언합니다.
def fibonacci(n):
      if n in dictionary:
           #메모되어 있으면 메모된 값을 리턴
           return dictionary[n]
      else:
            #메모되어 있지 않으면 값을 구함
            output = fibonacci(n - 1) + fibonacci(n - 2)
            dictionary[n] = output
            return output

 

👇🏻조기 리턴: 흐름 중간에 return 키워드를 사용하는 것

#함수를 선언합니다.
def fibonacci(n):
      if n in dictionary:
           #메모되어 있으면 메모된 값 리턴
           return dictionary[n]
      output = fibonacci(n - 1) + fibonacci(n - 2)
      dictionary[n] = output
      return output

👆🏻들여쓰기 단계가 줄기 때문에 코드를 더 쉽게 읽을 수 있다.

 

✏️리스트 평탄화하는 재귀 함수 만들기

-리스트 평탄화: 중첩된 리스트가 있을 때 중첩을 모두 제거하고 풀어서 1차원 리스트로 만드는 것을 의미

[[1,2,3], [4,[5,6]], 7, [8,9]

👇🏻세 번 중첩된 리스트를 1차원 리스트로

[1,2,3,4,5,6,7,8,9]

 

📋평탄화 리스트 작성하는 방법

-먼저 리스트 하나를 입력 받아 이를 평탄화해서 리턴하는 함수를 만든다. 이어서 내부에 있는 요소를 하나씩 확인하는 for 반복문을 추가한다. for 반복문 내부에서 리스트가 아니라면 바로 output 리스트에 자료를 넣고, 리스트라면 리스트에 있는 요소들을 하나하나 output에 추가한다.

def flatten(data):
      output = []
      for item in data:
            if type(item) == list:
            
            else:
                   output.append(item)
      return output

 

🖐🏻직접 해보는 손코딩1🖐🏻

def flatten(data):
    output = []
    for item in data:
        if type(item) == list:
            output += item
        else:
            output.append(item)
    return output

example = [[1, 2, 3], [4, [5, 6]], 7, [8, 9]]
print("원본:", example)
print("변환:", flatten(example))

-결과

👆🏻[5, 6]이라는 리스트가 여전히 포함되어 있다.

 

🖐🏻직접 해보는 손코딩2🖐🏻

def flatten(data):
    output = []
    for item in data:
        if type(item) == list:
            output += flatten(item)
        else:
            output.append(item)
    return output

example = [[1, 2, 3], [4, [5, 6]], 7, [8, 9]]
print("원본:", example)
print("변환:", flatten(example))

-결과

📋리스트가 더 복잡하게 중첩되어 있어도 문제없이 평탄화하는 함수를 만들 수 있다.

 


🌟파이썬 튜터🌟

 

① 함수의 변수는 함수 호출마다 따로따로 만들어진다

② 함수가 끝나면(리턴되면) 함수를 호출했던 위치로 돌아온다

 


5-2 chapter 마무리

 

🔎핵심 포인트

-재귀 함수는 내부에서 자기 자신을 호출하는 함수

-메모화는 한 번 계산한 값을 저장해 놓은 후, 이후에 다시 계산하지 않고 저장된 값을 활용하는 테크닉

-조기 리턴은 함수의 흐름 중간에 return 키워드를 사용해서 코드 들여쓰기를 줄이는 등의 효과를 가져오는 테크닉

 

 


05-3. 함수 고급
▷핵심 키워드 - 튜플 / 콜백 함수 / 람다 / with 구문

 

✍🏻파이썬은 함수를 좀 더 편리하게 사용할 수 있게 다양한 기능들을 제공해 준다.

  • 튜플 - 함수와 함께 많이 사용되는 리스트와 비슷한 자료형 / 한번 결정된 요소는 바꿀 수 없다.
  • 람다 - 매개변수로 함수를 전달하기 위해 함수 구문을 작성하는 것이 번거롭고, 코드 공간 낭비라는 생각이 들 때 함수를 간단하고 쉽게 선언하는 방법 / 1회용 함수를 만들어야 할 때 많이 사용함

 

✏️튜플

-튜플: 리스트와 비슷한 자료형 / 리스트와 다른 점은 한번 결정된 요소를 바꿀 수 없다는 것

👇🏻일반적인 튜플 형태

(데이터, 데이터, 데이터, ...)

 

>>>tuple_test = (10, 20, 30)
>>>tuple_test[0]
10
>>>tuple_test[1]
20
>>>tuple_test[2]
30

 

⚠️튜플과 리스트와 다른 점 - 요소를 변경할 때 차이가 있다. 0번째 요소에 1을 넣으려고 하면 오류가 발생

 

👻괄호 없는 튜플

-파이썬의 리스트와 튜플은 특이한 형태의 할당 구문으로 사용할 수 있다.

 

🖐🏻직접 해보는 손코딩1🖐🏻

#리스트와 튜플의 특이한 사용
[a, b] = [10, 20]
(c, d) = (10, 20)

#출력합니다.
print("a:", a)
print("b:", b)
print("c:", c)
print("d:", d)

-결과

 

🖐🏻직접 해보는 손코딩2🖐🏻

#괄호가 없는 튜플
tuple_test = 10, 20, 30, 40
print("# 괄호가 없는 튜플의 값과 자료형 출력")
print("tuple_test:", tuple_test)
print("type(tuple_test):", type(tuple_test))
print()

#괄호가 없는 튜플 활용
a, b, c = 10, 20, 30
print('# 괄호가 없는 튜플을 활용한 할당')
print("a:", a)
print("b:", b)
print("c:", c)

-결과

 

🖐🏻직접 해보는 손코딩3🖐🏻

a, b = 10, 20

print("# 교환 전 값")
print("a:", a)
print("b:", b)
print()

#값을 교환합니다.
a, b = b, a

print("# 교환 후 값")
print("a:", a)
print("b:", b)
print()

-결과

👉🏻a, b = b, a라는 코드만으로 값이 바뀐다.

 

👻튜플과 함수

-튜플은 함수의 리턴에 많이 사용한다. 함수의 리턴에 튜플을 사용하면 여러 개의 값을 리턴하고 할당할 수 있기 때문이다.

 

🖐🏻직접 해보는 손코딩🖐🏻

#함수를 선언합니다.
def test():
    return (10, 20)

#여러 개의 값을 리턴합니다.
a, b = test()

#출력합니다.
print("a:", a)
print("b:", b)

-결과

 

✏️람다

-람다: 요즘에는 함수라는 '기능'을 매개변수로 전달하는 코드를 많이 사용하는데, 그것을 조금 더 효율적으로 작성할 수 있는 기능

 

👻함수의 매개변수로 함수 전달하기 - 콜백 함수

-콜백 함수: 함수의 매개변수로 함수를 전달하는 코드

 

🖐🏻직접 해보는 손코딩🖐🏻

#매개변수로 받은 함수를 10번 호출하는 함수
def call_10_times(func):
    for i in range(10):
        func()
       
#간단한 출력하는 함수
def print_hello():
    print("안녕하세요")
   
#조합하기
call_10_times(print_hello)

-결과

👉🏻프로그램을 실행하면 print_hello() 함수를 10번 실행하고, 따라서 "안녕하세요"라는 문자열을 10번 출력

 

👻filter() 함수와 map() 함수

-map() 함수: 리스트의 요소를 함수에 넣고 리턴된 값으로 새로운 리스트를 구성해 주는 함수

map(함수, 리스트)

-filter() 함수: 리스트의 요소를 함수에 넣고 리턴된 값이 True인 것으로, 새로운 리스트를 구성해주는 함수

filter(함수, 리스트)

 

🖐🏻직접 해보는 손코딩🖐🏻

#함수를 선언합니다.
def power(item):
    return item * item
def under_3(item):
    return item < 3

#변수를 선언합니다.
list_input_a = [1, 2, 3, 4, 5]

#map() 함수를 사용합니다.
output_a = map(power, list_input_a)
print("# map() 함수의 실행 결과")
print("map(power, list_input_a):", output_a)
print("map(power, list_input_a):", list(output_a))
print()

#filter() 함수를 사용합니다.
output_b = filter(under_3, list_input_a)
print("# filter() 함수의 실행 결과")
print("filter(under_3, list_input_a):", output_b)
print("filter(under_3, list_input_a):", list(output_b))

-결과

👉🏻map() 함수: 첫 번째 매개변수에는 값을 제곱해주는 power() 함수를 넣었다. 두 번째 매개변수에는 [1, 2, 3, 4, 5]라는 리스트를 넣었다. 그리고 결과로 [1, 2, 3, 4, 5] 내부의 요소에 power() 함수가 적용된 [1, 4, 9, 16, 25]를 얻었다.

👉🏻filter() 함수: 첫 번째 매개변수에는 item < 3 을 판정하는 under_3() 함수를 넣었다. 두 번째 매개변수에는 [1, 2, 3, 4, 5]라는 리스트를 넣었다. 그리고 결과로 [1, 2, 3, 4, 5] 내부의 요소 중에 item < 3 이 True인 [1, 2]를 얻었다.

📋<map object>, <filter object>: 제너레이터

 

👻람다의 개념

-람다: 간단한 함수를 쉽게 선언하는 방법

lambda 매개변수: 리턴값

 

🖐🏻직접 해보는 손코딩1🖐🏻

-이전 코드를 람다로 변경 -> power() 함수와 under_3() 함수를 람다로 변환하면, def 키워드로 선언했던 함수를 lambda로 바꾸고, return 키워드를 따로 쓰지 않게 된다.

#함수를 선언합니다.
power = lambda x: x * x
under_3 = lambda x: x < 3

#변수를 선언합니다.
list_input_a = [1, 2, 3, 4, 5]

#map() 함수를 사용합니다.
output_a = map(power, list_input_a)
print("# map() 함수의 실행 결과")
print("map(power, list_input_a):", output_a)
print("map(power, list_input_a):", list(output_a))
print()

#filter() 함수를 사용합니다.
output_b = filter(under_3, list_input_a)
print("# filter() 함수의 실행 결과")
print("filter(under_3, list_input_a):", output_b)
print("filter(under_3, list_input_a):", list(output_b))

-결과

 

🖐🏻직접 해보는 손코딩2🖐🏻

#변수를 선언합니다.
list_input_a = [1, 2, 3, 4, 5]

#map() 함수를 사용합니다.
output_a = map(lambda x: x * x, list_input_a)
print("# map() 함수의 실행 결과")
print("map(power, list_input_a):", output_a)
print("map(power, list_input_a):", list(output_a))
print()

#filter() 함수를 사용합니다.
output_b = filter(lambda x: x < 3, list_input_a)
print("# filter() 함수의 실행 결과")
print("filter(under_3, list_input_a):", output_b)
print("filter(under_3, list_input_a:)", list(output_b))

-결과

 

✏️파일 처리

-파일은 크게 텍스트 파일바이너리 파일로 나뉜다.

 

👻파일 열고 닫기

-파일을 열 때 open() 함수를 사용한다.

파일 객체 = open(문자열: 파일 경로, 문자열: 읽기 모드)

 

모드 설명
w write 모드 (새로 쓰기 모드)
a append 모드 (뒤에 이어서 쓰기 모드)
r read 모드 (읽기 모드)

 

-파일을 닫을 때 close() 함수를 사용한다.

파일 객체.close()

 

🖐🏻직접 해보는 손코딩🖐🏻

#파일을 엽니다.
file = open("basic.txt", "w")

#파일에 텍스트를 씁니다.
file.write("Hello Python Programming...!")

#파일을 닫습니다.
file.close()

-결과

진짜루 반갑다 ㅠㅠ

뭘 해도 txt파일이 생성되지 않아서 엄청 헤맸는데, 파워셸로 file_open.py 파일을 실행하니까 txt파일이 생성됐다ㅠㅠ 감격,,😭

 

👻with 키워드

-조건문과 반복문이 들어가다보면 파일을 열고 닫지 않는 실수를 하는데, 이런 실수를 방지하기 위해 with 키워드라는 기능이 있다.

with open(문자열: 파일 경로, 문자열: 모드) as 파일 객체:
      문장

 

#파일을 엽니다.
with open("basic.txt", "w") as file:
      #파일에 텍스트를 씁니다.
      file.write("Hello Python Programming...!")

 

👻텍스트 읽기

-파일을 읽을 때read() 함수를 사용한다.

파일 객체.read()

 

🖐🏻직접 해보는 손코딩🖐🏻

-파일을 열고 파일 객체의 read() 함수를 호출하기만 하면 내부에 있는 데이터를 모두 읽어 출력한다.

#파일을 엽니다.
with open("basic.txt", "r") as file:
    #파일을 읽고 출력합니다.
    cotents = file.read()
print(cotents)

-결과

 

👻텍스트 한 줄씩 읽기

-텍스트를 사용해 데이터를 구조적으로 표현할 수 있는 방법으로 CSV, XML, JSON 등이 있다.

-CSV: Comma Separated Values, 쉼표로 구분된 값들을 의미

이름, 키, 몸무게  -> 헤더
윤인성, 176, 62  -> 데이터
연하진, 169, 40  -> 데이터

👉🏻첫 번째 줄에 헤더를 넣어 각 데이터가 무엇을 나타내는지 설명 / CSV 파일은 한 줄에 하나의 데이터를 나타내며, 각각의 줄은 쉼표를 사용해 데이터를 구분한다.

 

🖐🏻직접 해보는 손코딩1🖐🏻

#랜덤한 숫자를 만들기 위해 가져옵니다.
import random
#간단한 한글 리스트를 만듭니다.
hanguls = list("가나다라마바사아자차카타파하")
#파일을 쓰기 모드로 엽니다.
with open("info.txt", "w") as file:
    for i in range(1000):
        #랜덤한 값으로 변수를 생성합니다.
        name = random.choice(hanguls) + random.choice(hanguls)
        weight = random.randrange(40, 100)
        height = random.randrange(140, 200)
        #텍스트를 씁니다.
        file.write("{}, {}, {}\n".format(name, weight, height))

-결과

 

-데이터를 한 줄씩 읽어 들일 때는 for 반복문을 다음과 같은 형태로 사용한다.

for 한 줄을 나타내는 문자열 in 파일 객체:
    처리

 

🖐🏻직접 해보는 손코딩🖐🏻

with open("info.txt", "r") as file:
    for line in file:
        #변수를 선언합니다.
        (name, weight, height) = line.strip().split(", ")
       
        #데이터가 문제없는지 확인합니다: 문제가 있으면 지나감
        if (not name) or (not weight) or (not height):
            continue
        #결과를 계산합니다.
        bmi = int(weight) / ((int(height) / 100) ** 2)
        result = ""
        if 25 <= bmi:
            result = "과체중"
        elif 18.5 <= bmi:
            result = "정상 체중"
        else:
            result = "저체중"
           
        #출력합니다.
        print('\n'.join([
            "이름: {}",
            "몸무게: {}",
            "키: {}",
            "BMI: {}",
            "결과: {}"
        ]).format(name, weight, height, bmi, result))
        print()

-결과

너무 길어서 생략됨

 

 

5-3 chapter 마무리

 

🔎핵심 포인트

-튜플은 리스트와 비슷하지만, 요소를 수정할 수 없는 파이썬의 특별한 문법 / 괄호를 생략해서 다양하게 활용 가능

-람다는 함수를 짧게 쓸 수 있는 파이썬의 특별한 문법

-with 구문은 블록을 벗어날 때 close() 함수를 자동으로 호출해주는 구문

 

 


+) 혼공파를 시작하면서 다짐했던 목표는 프로그래밍의 매력을 알아가자! 였는데, 이미 그 목표를 이룬 것 같다.ㅎㅎ 프로그래밍이 너무 재밌고, 나날히 실력이 느는 것이 보이니까 프로그래밍만 계속 공부하고 싶어진다 !! 🥰

'코딩 공부 > 파이썬 (혼공단 11기)' 카테고리의 다른 글

[혼공파] 6주차_07-2 ~ 08  (0) 2024.02.07
[혼공파] 5주차_06 ~ 07-1  (0) 2024.02.01
[혼공파] 3주차_04  (0) 2024.01.21
[혼공파] 2주차_02-3 ~ 03  (0) 2024.01.12
[혼공파] 1주차_01-1 ~ 02-2  (0) 2024.01.03