본문 바로가기

코딩/파이썬 혼공단

혼공파 파이썬 4주차 기본미션과 선택미션 수행하기

 

처음 책을 샀을때 책이 생각보다 두꺼워서 이책을 내가 끝까지 다 볼 수 있을까?? 걱정했었는데..한 주 한 주 주어진 미션을 해오다보니 벌써 책 50% 완주하게 되었다~!!!! ㅎㅎㅎㅎㅎ 완주도 하고 간식도 받고~!!!

뿌듯뿌듯~!!! 

우수혼공족 말고 이번에는 감사하게도 50% 완주한 분들에게 모두 간식을 주셔서 이번에 나도 받게되어 몰랐던 사실을 알게 되었다!!

전에 카카오톡에 비즈콘으로 커피쿠폰이 왔었는데 사실...이때는 스팸인줄알고...뭐야!! 이러면서 그냥 지나갔었다. 그러다가 2주차 우수혼공족이 된것을 나중에 알게되었는데 같이 공부하고있는 동생이 간식 받았냐고 물어봐서 아직 안보내주신것 같다고  기다리고 있다고 말했었었다. 이번에 카카오톡 비즈콘으로 쿠키슈 쿠폰이 와서 아..머야 또 스팸인가 생각하던 찰나에 전에 동생이 메가커피를 받았다는 기억이 나서 처음 쿠폰 받을것을 봤는데... 메가커피라고 쓰여있는게 아닌가!! 그래서  선물받은 쿠폰들을 자세히 살펴보니 보내신분에 한빛주식회사라고 쓰여있는것을 그때 알게되었다...ㅎㅎㅎ 

이번에 정말 감사하게도 50% 완주한분들에게 모두 간식을 주셔서 받은 쿠폰이 스팸이 아니고 혼공족장님이 주신 간식쿠폰이란것을 알게되어 간식을 먹을수 있게 되었다~!!!!! 아마 그때 한번만 간식을 받게 되었다면  비즈콘으로 온 간식쿠폰의 출처도 모르고 사용도 못하며 "2주차 우수혼공족 간식 나는 언제 보내주시는걸까" 하면서 기다리고 있었을것같다ㅎㅎㅎ 감사합니다~!!!

혹시 저와같은 생각을 하신분이 있다면~~ 지금 바로 카카오톡 비즈콘으로 온것을 확인해 보세요~!!!! 맛있는 간식쿠폰이랍니다!!! 

간식도 받고 기분 좋은 마음으로 이번주 과제를 시작 해 볼까나~~!!

 

 

 

05-1 함수 만들기

(기본미션과 선택미션)

 

시작하기전에

함수를 사용하는 것을 함수를 호출된다.

매개변수: 함수를 호출할 때는 괄호 내부에 여러가지 자료를 넣게 되는데, 이러한 자료를 매개변수라고 부릅니다.

리턴값: 함수를 호출해서 최종적으로 나오는 결과를 말합니다.

 

함수의 기본

- 함수는 한마디로 '코드의 집합'입니다.

def 함수 이름( ):
      문장

 

 

직접 해보는 손코딩

기본적인 함수

실행 결과:

 

 

함수에 매개변수 만들기

: - print( ) 함수를 작성할 때 print(value, ... sep=' ' , end='\', file=sys.stdout,flush=false)와 같이 괄호 안에 많은 것들이 있습니다. 이러한 것들을 모두 매개변수라고 부릅니다.

- 매개변수는 다음과 같이 함수를 생성할 때 괄호 내부에 식별자를 입력해서 만듭니다.

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

 

예제

직접 해보는 손코딩

매개변수의 기본

실행 결과:

 

함수의 괄호 내부에 value와 n이라는 식별자를 입력했습니다. 이렇게 입력하면 이는 매개변수가 됩니다. 이렇게 매개변수를 만들면 함수를 호출할 때 값을 입력해서 함수쪽으로 전달할 수 있습니다.

 

위의 코드에서는 print_n times("안녕하세요", 5) 형태로 함수를 호출하므로

매개변수 value에는 "안녕하세요"가 들어가고, 매개변수 n에는 5가 들어갑니다. 따라서 코드를 실행하면 "안녕하세요"를 5번 출력합니다.

 

매개변수와 관련된 Type Error (예외처리)

함수를 호출할 때 매개변수를 넣지 않거나 더 많이 넣는 경우

 

1. 함수를 호출할 때 매개변수를 넣지 않는경우

오류:

: 'print_n_times( )라는 함수의 매개변수 n이 없다'라는 오류입니다.

 

2. 함수를 호출할  때 매개변수를 더 많이 넣는 경우

오류:


: 'print_n_times( )함수는 2개의 매개변수가 필요한데 3개가 들어왔다'라는 오류입니다.

 

따라서, 함수를 호출할 때는 함수를 선언할 때와 같은 개수의 매개변수를 입력해야 합니다.!!

 

 

가변 매개변수

가변 매개변수: 매개변수를 원하는 만큼 받을 수 있는 함수를 말합니다.

- 여기서 말하는 가변 매개변수란 매개변수 개수가 변할 수 있다는 의미입니다.

- 자주 사용해왔던 print( ) 함수가 여기에 속합니다. 

 

형태:

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

 

가변 매개변수를 사용할 때의 규칙

    ● 가변 매개변수 뒤에는 일반 매개변수가 올 수 없습니다.

-직접해보는 손코딩 예제를 보면 어디까지가 가변 매개변수이고, 어디가 매개변수 n인지 구분하기 힙듭니다. 따라서 파이썬 프로그래밍 언어는 내부적으로 가변 매개변수 뒤에 일반 매개변수가 오지 못하게 막은 것입니다.

 

그래서 매개변수 n을 앞으로 옮기고 매개변수*values를 뒤로 밀었습니다. 

가변 매개변수 *values는 리스트처럼 사용하면 됩니다.

    ● 가변 매개변수는 하나만 사용할 수 있습니다.

 

직접 해보는 손코딩

가변 매개변수 함수

실행 결과:

 

- 실행 결과에 오류가 나왔었다.

이유:

1. *values를써야되는데 values만 썼다. 

2. print(value)를 print(values)로 썼다.

단어를 제대로 썼는지 잘 확인하자~~!!

위의 사항들을 알맞게 써주니 올바른 실행 결과가 나왔다.

 

 

기본 매개변수

print(values, ..., sep=' ', end='\n', file=sys.stdout, flush=false)

(print( ) 함수의 자동 완성 기능으로 나오는 설명)

 

:-  '매개변수=값' 형태로 되어있는것을 기본 매개변수라고 합니다.

 - 기본 매개변수는 매개변수를 입력하지 않았을 경우 매개변수에 들어가는 기본값입니다.

기본 매개변수에도 규칙이 있습니다.

● 기본 매개변수 뒤에는 일반 매개변수가 올 수 없습니다.

 

직접 해보는 손코딩

기본 매개변수

 

실행 결과:

 

 

키워드 매개변수

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

: 기본 매개변수가 가변 매개변수보다 앞에 올 때는 기본 매개변수의 의미가 사라집니다.

다음코드의실행 결과를 예측해 봅시다. n에는 무엇이 들어갈까요?

매개변수가 순서대로 입력되므로 n에는 "안녕하세요"가 들어가고, values에는 ["즐거운", "파이썬 프로그래밍"]이 들어옵니다. 그런데 range( ) 함수의 매개변수에는 숫자만 들어올 수 있으므로 다음과 같은 오류가 발생합니다.

 

오류

Traceback (most recent call last):
   File "test5_03.py", line 11, in <module>
      print_n_times("안녕하세요", "즐거운", "파이썬 프로그래밍")
   File "test.py", line 3, in print_n_times

따라서 기본 매개변수는 가변 매개변수 앞에 써도 의미가 없다는걸 기억하자!!!

 

 

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

 

예측!

1. ["안녕하세요", "즐거운", "파이썬 프로그래밍"]을 세 번 출력합니다. -------> 기본 매개변수가 우선된것

2. ["안녕하세요", "즐거운", "파이썬 프로그래밍", 3]을 두 번 출력합니다.  ----> 가변 매개변수가 우선된것

실행 결과:



가변 매개변수가 우선된다!!

따라서, 2번으로 출력된다.

 

키워드 매개변수

: - 매개변수 이름을 지정해서 입력하는 매개변수를 키워드 매개변수라고 부릅니다.

- 기본 매개변수가 지정된 함수를 사용할 때는 다음과 같이 사용합니다. <while 반복문>을 살펴볼 때 짧게 보았던 코드인데 매개변수 이름을 직접적으로 지정해서 값을 입력합니다.

# while 반복문을 사용합니다.
while True:
     # "."을 출력합니다.
     # 기본적으로 end가 "\"이라 줄바꿈이 일어나는데
     # 빈 문자열 ""로 바꿔서 줄바꿈이 일어나지 않게 합니다.
     print(".", end="")  -----> 키워드 매개변수 입니다.

 

 

이전 코드에서 ["안녕하세요", "즐거운", "파이썬 프로그래밍"]을 세 번 출력하도록 실행하려면 다음과 같이 매개변수 이름을 직접적으로 지정해서 값을 입력합니다.

 

직접 해보는 손코딩

키워드 매개변수

실행 결과:

 

 

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

키워드 매개변수는 기본 매개변수들로 구성된 함수에서도 많이 사용됩니다.

 

직접 해보는 손코딩

여러 함수 호출 형태

 

실행 결과:

 

- 첫번쨰 매개변수a는 일반 매개변수이므로 해당 위치에 반드시 입력해야 합니다(1번형태).

- 일반 매개변수이지만 키워드 매개변수처럼 사용할 수도 있습니다(2번과 3번 형태).

- 8행의 3번 형태를 보면 매개변수의 순서가 마구잡이로 쓰여있는데, 키워드를 지정해서 매개변수를 입력하는 경우에는 이처럼 매개변수 순서를 원하는 대로 입력할 수 있습니다.

- 10행의 4번은 b를 생략한 형태입니다. 이렇게 키워드 매개변수를 사용하면 필요한 매개변수에만 값을 전달할 수 있습니다.

즉, '일반 매개변수'는 필수로 입력합니다. 순서에 맞게 입력하면 됩니다.

'기본 매개변수'는 필요한 것만 키워드를 지정해서 입력하는 경우가 많습니다.

 

리턴

: input( ) 함수는 함수를 실행하고 나면 다음과 같은 형태로 함수의 결과를 받아서 사용했습니다. 이와 같은 함수의 결과를

리턴값(return value)이라고 부릅니다.

# input( ) 함수의 리턴값을 변수에 저장합니다.
value = input("> ")


# 출력합니다.
print(value)

 

1. 자료 없이 리턴하기

함수 내부에서는 return 키워드를 사용할 수 있습니다.

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

 

직접 해보는 손코딩

자료 없이 리턴하기

 

실행 결과:

 

함수 내부에서 출력을 두 번 사용했는데 중간에 return 키워드가 들어 있습니다. return 키워드는 함수를 실행했던 위치로 돌아가라는 의미와 함수를 여기서 끝내라는 의미를 가지고 있다고 했습니다. 따라서 return 키워드를 만나는 순간 함수가 종료되어 결과적으로 "A 위치입니다." 만 출력하고 프로그램이 종료됩니다.

 

2. 자료와 함께 리턴하기

: 리턴 뒤에 자료를 입력하면 자료를 가지고 리턴합니다.(돌아갑니다).

 

직접 해보는 손코딩

자료와 함께 리턴하기

 

실행 결과:

 

 

3. 아무것도 리턴하지 않기

 

직접 해보는 손코딩

아무것도 리턴하지 않았을 때의 리턴값

실행 결과:

 

None: 파이썬에서 '없다'라는 의미입니다.

 

 

기본적인 함수의 활용

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

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

 

 

기본미션

 

직접 해보는 손코딩

범위 내부의 정수를 모두 더하는 함수

 

실행 결과:

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

덧셈식은 0

곱셈식은 1

예를 들면 덧셈식에서는 0입니다. 어떤 값에 0을 더하면 아무런 변화가 없습니다. 그래서 4행에서 output 변수를 0으로 초기화한 뒤에 사용했습니다.

 

기본 매개변수를 사용하면 함수를 조금 더 편리하게 사용할 수 있습니다.

 

직접 해보는 손코딩

기본 매개변수와 키워드 매개변수를 활용해 범위의 정수를 더하는 함수

실행 결과:

 

 

★ 마무리 

5가지 키워드로 정리하는 핵심 포인트

● 호출: 함수를 실행하는 행위를 말합니다.

● 매개변수: 함수의 괄호 내부에 넣는 것을 의미합니다.

● 리턴값: 함수의 최종적인 결과를 의미합니다.

● 가변 매개변수: 함수는 매개변수를 원하는 만큼 받을 수 있는 함수입니다.

● 기본 매개변수: 매개변수에 아무것도 넣지 않아도 들어가는 값입니다.

* 초깃값을 설정할 때는 연산에 아무런 변화를 주지 않는것을 사용합니다.

- 덧셈식은 0

- 곱셈식은 1

 

 

 

05-2 함수의 활용

 

재귀 함수

팩토리얼(factorial):

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

 

팩토리얼을 구하는 방법은 두 가지로 구분 할 수 있습니다.

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

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

 

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

 

직접 해보는 손코딩

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

실행 결과:

 

초깃값은 1로 설정했습니다. 어떤 값이라도 1을 곱하면 변화가 없기 때문에 1로 설정한 것입니다.

(앞에서 초깃값은 0으로 했는데 여기서는 1로 한 이유가 이건 (팩토리얼) 곱셈을 해주는 것이여서 1로 한것 입니다.)

 

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

재귀(recursion): '자기 자신을 호출하는 것'을 의미합니다.

 

팩토리얼 표현법

1.

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

 

2.

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

 

직접 해보는 손코딩

재귀 함수를 사용해 팩토리얼 구하기

실행 결과:

 

팩토리얼

 

 

재귀 함수의 문제 (재귀 함수를 사용할 때 주의사항)

메모화(memoization)

: 재귀 함수로 인해 발생하는 문제를 해결할 수 있는 기술

 

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

규칙

● 처음에는 토끼가 한 쌍만 존재합니다.

● 두 달 이상 된 토끼는 번식할 수 있습니다.

● 번식 가능한 토끼는 매달 새끼를 한 쌍씩 낳습니다.

● 토끼는 죽지 않는다고 가정합니다.

 

 

한 달이 지날 때마다 달라지는 토끼 쌍의 수를 적어 보면 '1쌍,1쌍,2쌍,3쌍,5쌍,8쌍,13쌍, ...'이 됩니다.

규칙을 적어보면 다음과 같습니다.

  ● 1번째 수열 = 1

  ● 2번째 수열 = 1

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

이를 코드로 구현해 보면 다음과 같습니다.

 

직접 해보는 손코딩

재귀 함수로 구현한 피보나치 수열(1)

 

실행 결과:

 

이렇게 하면 시간이 조금 오래 걸립니다.

코드를 조금 변경해서 문제를 확인해 보겠습니다.

 

직접 해보는 손코딩

재귀 함수로 구현한 피보나치 수열(2)

 

실행 결과:

.... 생략....
fibonacci (1) 를 구합니다.
fibonacci (2) 를 구합니다.
---
fibonacci(10) 계산에 활용된 덧셈 횟수는 109번입니다.

 

 

이렇게 덧셈 횟수가 많이 늘어나는 이유를 그림으로 살펴보겠습니다.

- 다음과 같은 그림을 트리(tree)라고 합니다.

 

- 트리에 있는 각각의 지점을 노드(node)

- 노드 중에 가장 마지막 단계의 노드를 리프(leaf)라고 부릅니다.

 

한번 구한 값은 그것으로 계산이 끝나면 좋겠지만, 현재 코드의 재귀 함수는 한 번 구했던 값이라도 처음부터 다시 계산해야 합니다. 그래서 계산 횟수가 많이 늘어나는 것 입니다.

 

UnboundLocalError에 대한 처리(예외 처리)

297쪽의 코드를 보면 8행에 global counter라고 되어 있는 부분이 있습니다. 왜 이런 코드를 사용하는지 확인하기 위해 다음과 같이 해당 내용을 지우고 실행해 보겠습니다.

 

직접 해보는 손코딩

재귀 함수로 구현한 피보나치 수열(3)

실행 결과:

파이썬은 함수 내부에서 외부에 있는 변수를 참조하지 못합니다.

♣ 참조(reference) : 변수에 접근하는 것

 

함수 내부에서 함수 외부에 있는 변수라는 것을 설명하려면 다음과 같은 구문을 사용합니다.

global 변수 이름

 

global 키워드 

: - 파이썬 프로그래밍 언어에만 있는 특이한 구조입니다.

  - 붉은색 밑줄이 떴을 때 마우스를 밑줄 위에 올려놓고 W0621: Redefining name 'counter' from outer scope 또는

E0602: Undefined variable 'counter'가 나타나면 그제야 global 키워드를 쓰라는 것으로 판단하고 코드를 수정합니다.

 

 

메모화

현재 문제는 같은 값을 구하는 연산을 반복하고 있기 때문에 발생하는 것입니다. 따라서 같은 값을 한 번만 계산하도록 코드를 수정하면 됩니다.

 

직접 해보는 손코딩

메모화

실행 결과:

 

메모(memo)한다: 딕셔너리를 사용해서 한 번 계산한 값을 저장하는 것을 메모한다고 표현합니다.

딕셔너리에 값이 메모되어 있으면 처리를 수행하지 않고 곧바로 메모된 값을 돌려주면서 코드의 속도를 빠르게 만드는 것입니다.

 이전에는 fibonacci(50)을 계산하는 데 한참 걸렸지만, 메모화를 사용하면 실행 후 곧바로 결과를 출력할 정도로 속도가 빨라집니다. 재귀 함수와 함께 많이 사용되는 기술이므로 꼭 기억해 주기!!!

 

조기 리턴(early return)

- return 키워드를 중간에 사용하는 형태입니다.

- 흐름 중간에 return 키워드를 사용하는 것을 조기리턴이라고 합니다.

 

실행 결과:

 

과거에는 함수 흐름의 끝에 리턴을 적기 위해 첫번째 손코딩과 같은 형태의 코드를 사용했습니다. if else 조건문을 만들고 각각의 마지막 부분에서 리턴하도록 한 것입니다.

 

더 쉽게 읽을 수 있게 위와 같이 씁니다.

 

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

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

 

1. 리스트 하나를 입력 받아 이를 평탄화해서 리턴하는 함수를 만듭니다.

- 다음과 같이 flatten 이라는 이름으로 재귀 함수의 기본 구조를 잡아 생성합니다.

2. 이어서 내부에 있는 요소를 하나씩 확인하면서 리스트인지 리스트가 아닌지 확인합니다. 요소를 하나씩 확인하는 for반복문을 추가합니다.

- for 반복문 내부에서는 리스트인지, 리스트가 아닌지 확인해야 합니다. 리스트가 아니라면 바로 output 리스트에 자료를 넣고, 리스트라면 리스트 에 요소들을 하나하나 output에 추가해야 합니다.

3. 리스트에 있는 내용을 추가할 때는 + 연산자 또는 extend( )함수를 사용할 수 있는데, 여기에서는 +연산자를 사용해 보겠습니다.

 

직접 해보는 손코딩

리스트 평탄화하기(1)

실행 결과:

 

그런데 리스트를 변환하니 [1, 2, 3, 4, [5, 6], 7, 8, 9] 가 나옵니다. 중간에 [5, 6] 이라는 리스트가 여전히 포함되어 있습니다.

이 리스트까지 해제하려면 output += item으로 요소를 추가(5번 행)할 때도 flatten() 함수를 적용해서 코드를 output += flatten(item)으로 변경하면 됩니다.

 

직접 해보는 손코딩

리스트 평탄화하기(2)

실행 결과:

- 5행의 output += flatten(item)   --------> flatten( ) 함수를 재귀적으로 호출합니다.

 

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

 

★ +=연산자 와 append( )함수 와 extend( )함수를 비교해보자!!

append( )함수:  매개변수 하나를 리스트의 마지막 요소로 추가합니다.

- 리스트 전체가 하나의 요소로서 추가됩니다.

>>> a = [1, 2, 3]
>>> b = [4, 5, 6]
>>> a.append(b)
>>> a
[1, 2, 3, [4, 5, 6]]     ---------> 마지막 요소로 [4, 5, 6]이 추가됩니다.

 

+= 연산자 : 오른쪽에 있는 리스트의 요소를 하나하나 리스트에 추가합니다. 다읍과 같은 형태로 리스트를 결합하면 히스트에 있는 요소 하나하나가 추가됩니다.

>>> a = [1, 2, 3]
>>> b = [4, 5, 6]
>>> a += b
>>> a
[1, 2, 3, 4, 5, 6]

 

extend( )함수: += 연산자와 같은 기능을 수행하는 함수입니다.

                        += 연산자 코드와 같은 실행 결과를 나타냅니다.

>>> a = [1, 2, 3]
>>> b = [4, 5, 6]
>>> a.extend(b)
>>> a
[1, 2, 3, 4, 5, 6]

 

파이썬 튜터

기억해야 하는 것

1. 함수의 변수는 함수 호출마다 따로따로 만들어집니다.

2. 함수가 끝나면(리턴되면) 함수를 호출했던 위치로 돌아옵니다.

 

재귀함수

: - flatten함수는 재귀함수입니다.

  - 재귀함수는 이와같이 치고 빠지기를 반복하면서 결과를 만들어냅니다.

  - 내부에서 자기 자신을 호출하는 함수를 의미합니다.

 

마무리

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

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

 

 

 

05-3 함수 고급

함수를 조금 더 편리하게 사용할 수 있게 다양한 기능들을 제공해주는 대표적인 것으로 튜플과 람다가 있습니다.

 

튜플 

: 함수와 함께 많이 사용되는 리스트와 비슷한 자료형으로, 리스트와 다른 점은 한번 결정된 요소는 바꿀 수 없습니다.

- 예) 0번째 요소에 1을 넣으려고 하면 아래와 같은 오류가 발생합니다. 그이유는 튜플은 내부 요소 변경이 불가능 하기 때문입니다.

TypeError: 'tuple' object does not support item assignment  

 

요소를 하나만 가지는 튜플

: 요소를 하나만 가지는 튜플을 선언하려면 다음과 같이 쉼표를 넣어 선언합니다.

(273, )

 

(리스트와 차이점 : 요소를 하나만 가지는 리스트는 (273) 이와 같은 형태로 쉼표 없이 생성합니다. )

 

 

괄호 없는 튜플

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

 

직접 해보는 손코딩

리스트와 튜플의 특이한 사용

 

실행 결과:

 

 

괄호를 생략해도 튜플로 인식할 수 있는 경우는 괄호를 생략해도 됩니다.

 

직접 해보는 손코딩

괄호가 없는 튜플

실행 결과:

 

괄호 없이 여러 값을 할당할 수 있어 자주 사용되는 형태입니다.

 

직접 해보는 손코딩

변수의 값을 교환하는 튜플





실행 결과:

편리하게 사용할 수 있는 값 교환 방법이므로 잘 기억해주세요!!!

 

 

튜플과 함수

튜플은 함수의 리턴에 많이 사용합니다.

 

직접 해보는 손코딩

여러 개의 값 리턴하기

실행 결과:

 

괄호 없이 여러 값을 할당하는 것은 튜플로만 할 수 있는 일입니다.

 

람다(lambda)

: -  매개변수로 함수를 전달하기 위해 함수 구문을 작성하는 것이 번거롭고, 코드 공간 낭비라는 생각이 들 때 함수를 간단하고 쉽게 선언하는 방법입니다. 1회용 함수를 만들어야 할 때 많이 사용합니다.

  - 요즘 프로그래밍 언어에서는 함수라는 '기능'을 매개변수로 전달하는 코드를 많이 사용합니다. 이런 코드를 조금 더 효율적으로 작성할 수 있도록 파이썬에서는 람다라는 기능을 제공합니다.

 

 

함수의 매개변수로 함수 전달하기

콜백 함수(callback function): 함수의 매개변수에 사용하는 함수를 말합니다.

 

직접 해보는 손코딩

함수의 매개변수로 함수 전달하기

 

실행 결과:

 

 

 

filter()함수와 map()함수

: 함수를 매개변수로 사용하는 대표적인 표준 함수로 map()함수와 filter()함수가 있습니다.

*파이썬이 표준으로 제공하는 함수를 '내장 함수' 또는 '표준 함수'라고 부릅니다.

 

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

map(함수, 리스트)

 

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

filter(함수, 리스트)

 

직접 해보는 손코딩

map()함수와 filter()함수

 

실행 결과:

 

 

결과로 <map object>와 <filter object>가 나오는데, 이를 제너레이터(generator) 라고 부릅니다.

 

 

람다의 개념

람다란 '간단한 함수를 쉽게 선언하는 방법'입니다.

lambda 매개변수: 리턴값

 

직접 해보는 손코딩

람다

 

실행 결과:

 

 

직접 해보는 손코딩

인라인 람다

 

실행 결과는 이전과 같습니다.

 

 

파일 처리

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

- 파일을 처리 하려면 일단 파일 열기(open)를 해야 합니다. 파일을 열면 파일 읽기(read) 또는 파일 쓰기(write)를 할 수 있습니다.

 

파일 열고 닫기

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

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

 

open() 함수의 첫 번째 매개변수에는 파일 경로(path)를 입력하고, 두 번째 매개변수에는 모드(mode)를 지정합니다.

 

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

 

 

파일을 닫을 때는 close()함수를 사용합니다.

파일 객체. close()

 

 

직접 해보는 손코딩

파일 열고 닫기

open() 함수로 파일을 열면 close()함수로 파일을 닫아 주어야 합니다.

프로그램이 종료될 때는 열려있는 파일이 모두 자동으로 닫고 종료되지만 반드시 open()함수로 열면 close()함수로 닫는 습관을 기르자!!!

 

이렇게 하면 같은 폴더에 'basic.txt'라는 파일이 생성된다고 하는데.... 왜 안만들어 지는걸까...ㅠㅠ

흠...... 궁금해궁금해!!!

와와와와와와와와왕~!!!!!! 진짜 찾고 찾고 하다보니 드디어!!!!!!!!!! 파일이 생성되었다!!!!!!

나는 파일을 저장 하면 바로 'basic.txt'이라는 파일이 만들어 지는 줄 알고 계속 파일만 저장했었는데...

알고보니 power shell에 실행을 해야지만 파일이 만들어 지는 거였다.

진짜 지금 너무 감격스럽다!!!ㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎ  포기하지 않고 찾은 나 스스로 칭찬하기 ㅎㅎㅎㅎ

 

 

with 키워드

프로그램이 길어지면 open()함수와 close()함수 사이에 많은 코드가 들어가는데 조건문과 반복문이 들어가다 보면 파일을 열고 닫지 않는 실수를 하는 경우가 생길 수 있는데 이러한 실수를 방지 하기 위해 with()키워드라는 기능을 씁니다.

 

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

 

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

 

 

 

텍스트 읽기

write()함수: 파일에 텍스트를 쓸때 사용합니다.

read()함수: 파일을 읽을 때 사용합니다.

파일 객체.read()

 

직접 해보는 손코딩

read()함수로 텍스트 읽기

 

실행 결과: 

 

위의 파일이 만들어지니까 그 다음 단계도 술술 잘 풀린다~!!! 행복하다 행복해~~

 

텍스트 한 줄씩 읽기

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

CSV: ( Comma Separated Values)의 줄임말로, 쉼표로 구분된 값들을 의미합니다.

대표적인 형식

이름, 키, 몸무게       ------->헤더

윤인성, 176, 62        -----

                                               -----> 데이터
연하진, 169, 50        -----     

 

CSV 파일은 한 줄에 하나의 데이터를 나타내며, 각각의 줄은 쉼표를 사용해 데이터를 구분합니다.

 

직접 해보는 손코딩

랜덤하게 1000명의 키와 몸무게 만들기

실행 결과:


.....생략.....

근데 실행 결과가 책에는 다자, 98, 171 부터 시작되는데.. 내가 한것에는 아라, 55, 199부터 시작되는데 그 이유가 무엇일까???  ----->  랜덤이여서 그런것이였다~!!! 실행 결과가 맞게 잘 나왔다니 다행이다.!

 

for 반복문

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

 

 

직접 해보는 손코딩

반복문으로 파일 한 줄씩 읽기

실행 결과:

 

 

 

 

 

 

예전에는 실행결과가 다른값이 나오면왜그런지 찾는데 시간이 꽤 걸렸는데 이젠 하면서 실행결과에 오류가 뜨면 

어느부분인지 전보다 더 쉽게 찾을 수 있게되었다는게  신기하고 뿌듯하다.

이번 5장은 직접해보는 손코딩도 그렇고 이전에 했던것보다 더 어려웠다...ㅠㅠ  그래서 더 여러번 책을 읽고 다시 풀어보면서 연습했다.

특히, 중간에 파일 만들기에서 파일이 만들어지지 않아서 조금 화가났었다...ㅎㅎㅎ  파일이 만들어져야지만 그 다음단계를 할수 있는데...  어느부분을 내가 못본걸까 하고 책을 보고 또보고 했더니...ㅠㅠ 드디어 방법을 찾아서 파일을 만들수 있었다!!!!!!

진짜 이때의 뿌듯함이란...... ㅎㅎㅎㅎㅎ

진짜  "파일 열고닫기" 하는거 기억에 많이 남을것같다!!!!