21.12.29 AIFFEL 3일차 6. 파이썬 시작하기 part2.

yakasan·2021년 12월 29일
0

AIFFEL!

목록 보기
3/3
post-thumbnail

목차


학습 목표

  • 파이썬을 통해 프로그래밍의 기본 개념들을 이해하고 사용할 수 있다.
  • 오류 메시지를 읽고 이해할 수 있다.
  • 학습한 개념들을 토대로 이해하고 수정할 수 있다.

6-9 제어문

while 문

  • 코드를 실행하기 전 가장 먼저 조건문을 검사하여 조건문이 참이라면 강제종료 될 때까지 실행. = 무한루프
  • 주로 참과 거짓(boolean) 명제가 붙음.

for 문

for 형태.png

  • 목록 y 에서 값을 하나씩 꺼내 x 변수에 담에 반복문을 실행하는 형태.
for word in 'hello':
	print(word)

>> h
e
l
l
o

→ ‘hello’ 라는 목록을 word 라는 변수에 담아, word 변수를 하나씩 출력.

위 예시 처럼 문자열에도 쓰일 수 있고, 다양한 종류에도 사용할 수 있음.

6-13 자료형 (data type)

6-14 정수형 - int(integer)

  • 양의 정수와 음의 정수 모두 포함.
  • type 으로 알아봤을 때, int 타입으로 출력되는 데이터.
print(type(1))

>> <class 'int'>
  • 무지막지하게 크거나 작은 숫자를 표현할 땐 64비트 이상의 공간을 사용하면 된다..?
    • 파이썬은 알아서 메모리를 사용함. 수동으로 설정할 필요가 없대.

      Untitled

      엑셀에서도 1E+30..? 이란 알 수 없는 단어..? 로 표시되는걸 파이썬은 알아서 메모리를 할당해 표시해 준다니 참 편하다

6-15 소수형(부동소수점 수) - float

  • 정수를 제외한 실수 , 소수점 (소수점 아래에 값이 있는.. 0.25 같은 수)
  • type 으로 알아봤을 때, float 타입으로 출력되는 데이터.
print(type(1.0))

>> <class 'float'>
  • 우리는 1 이나 1.0 이나 같은거 아니냐 하지만 영어권은 구분해 준다 함. but 파이썬은 알아서 변환 해 준다니 정말 편하다..!

  • 정수 + 소수 = 소수형 데이터 1+1.0 = 2 지만 컴퓨터는 float로 인식 하기 때문에, 이를 정수형으로 출력 해 주려면 앞에 int를 붙여준다.

a=int(1+1.0)
print(a)
print(type(a))

>>2
>><class 'int'>
  • 반대로 정수형 데이터를 소수형으로 나타내고 싶을 땐, 앞에 float를 붙여준다.
b=float(1+3)
print(b)
print(type(b))

>>4.0
>><class 'float'>

⭐ 부동소수점? 고정소수점?

뭔가 찾으면 2진수 기법이 젤 먼저 나오는걸 보니 2진수 먼저 알아야할 것같음.

왜냐면 숫자를 2진수로 바꿨을 때, 어떻게 표현하는지를 나눈게 고정 or 부동 소수점이기 때문.

고정 소수점

  • 정수를 표현하는 비트 수와 소수를 표현하는 비트수를 미리 정해놓고, 해당 비트 만큼만 사용해서 숫자를 표현하는 방식.
  • 즉, 10진수를 2진수로 바꿨으면 그걸 그대로 표현하는 방식.
ex) 7.625 를 2진수로 변환하면.. 

정수부는 하던 방식대로 하면되고,

소수부는 2를 곱해 결과가 1로 떨어질 때까지, or 똑같은 소수가 나올때 까지 반복. 

|  | 2진수 |
| --- | --- |
| 7 | 111 |
| .625 | 101 |

```
0.625 * 2 = 1.250 # 정수부 버리고 다시 
0.250 * 2 = 0.500
0.500 * 2 = 1

위에서 부터 차례대로 가져오면 >>101
```

고정 소수점은 이를 그대로 가져온다니까 111.101 이 되겠지. 

![Untitled](https://s3-us-west-2.amazonaws.com/secure.notion-static.com/1ac1f8d5-01a8-4867-8a16-919274e2311a/Untitled.png)

부호비트 : 0 = 양수 , 1 = 음수

소수점을 기준으로 정수부와 소수부를 나누는 비트로 나누게 되는데,

소수점 위치는 위와 같이 미리 정해둔다 함.

부동 소수점 (floating point) 부유물?

  • 소수점을 이동시켜서 표현하는 방법.
  • 소수점을 한 곳에 고정시켜, 옮긴 자리 수 만큼 지수로 올려주는 방식,...?
  • 2진수로 변환한 결과를 몇가지 과정을 거쳐 표현함.
  1. 정규화
    1. 2진수를 1.xxxx... * 2^n 형식로 변환하는 것.
    2. 정수부에 1만 남을 때 까지 소수점을 왼쪽으로 이동시키고, 이동한 칸 수만큼 n 자리에 집어넣으면 된단다.
ex) `111.101` 를 정규화 하면 `1.11101 * 2^2`
  1. IEEE 754 부동 소수점 표현

Untitled

부호비트 : 0이면 양수, 1이면 음수 인건 동일

가수부(23자리) : 정규화 결과 소수점 오른쪽에 있는 숫자들을 왼쪽부터 차례대로 기입. 남는자리는 0 채우기.

지수부(8자리) : 2^n 중, n에 해당 하는 수를 bias 라 지정된 숫자를 더한 다음 2진수로 바꿔서 넣어준다. (bias - 32비트 = 127)

설명 내용 출처 ↓

컴퓨터에서의 실수 표현: 고정소수점 vs 부동소수점


LMS 퀴즈로 1.0을 고정과 부동 소수점으로 나타내는 문제가 나왔다.

위 설명을 토대로 고정 소수점, 부동 소수점으로 함 바까보자.

Q1. 1.0을 32bit의 고정소수점 수와 부동소수점 수로 각각 표현해 보세요.
고정소수점의 경우 1bit(부호) + 16bit(정수) + 15bit(소수)
부동소수점의 경우 1bit(부호) + 8bit(지수) + 23bit(가수)
  • 1.0을 고정 소수점으로 표현하기
  1. 정수부인 1은 2진수로 변환하면 1
  2. 소수부인 0은 0이다.

Untitled

  1. 고정소수점으로 표현하면 0 0000000000000001000000000000000
  • 1.0을 부동 소수점으로 표현하기.
  1. 1.0 을 2진수로 변환 → 1.0

  2. 정규화 → 1.0 * 2^0 (소수점 이동이 없기 때문에 0)

  3. 23자리 가수부에는 정규화 결과 소수점 오른쪽에 있는 숫자를 넣는다 ⇒ 소수점 오른쪽 = 0 ⇒ 따라서, 0이 23개.

  4. 8자리 지수부에는 2^n 에서 n에 해당하는 수 즉, 0 을 bias 라 지정한 숫자 127을 더한 다음, 2진수로 바꿔준다.

    0+127 = 127 2진수 변환 ⇒ 01111111

Untitled

  1. 부호부 , 지수부, 가수부를 더해, 나타내 주면 0 0111111100000000000000000000000

이렇게 같은 숫자라도 컴퓨터에선 표현법에 따라 다르게 인식할 수 있단 사실을 알수 있었다.


6-16 NoneType 자료형

  • None 을 값으로 갖는 자료형.
  • 정말 아무것도 없는 것을 나타냄. 0과는 다르다 0과는!
  • type 으로 알아봤을 때, NoneType 타입으로 출력되는 데이터.
print(type(None))

>> <class 'NoneType'>
  • 다른 프로그래밍 언어에선 null 로 표현하기도 함.
  • 런타임 오류가 발생했을 때, 실행되는 프로그램을 멈추지 않구 아무것도 출력 할 수없단 의미로 객체를 내보내기 위해 필요한 기능. (c 언어에선 필요 없대)

6-17 bool(boolean) 자료형 -

  • 참(True) or 거짓(False)
  • 수학에서 시작된 불 대수에서 시작된 개념?
  • type 으로 알아봤을 때, bool 타입으로 출력되는 데이터.
print(type(True))
print(type(False))

>> 
<class 'bool'>
<class 'bool'>
  • not 으로 참과 거짓이 뒤집힐 수 있음.
print(not True)
print(not not True)

>> 
False
True
  • 다른 값을 참이나 거짓으로 변환 할 수도 있다.
print(bool(None))
print(bool(0))
print(bool(1.1))

>>
False
False
True

6-18 str(string) 문자열 자료형

print('hello world')
  • ‘’ 나 “” 안에 있는 문자 데이터
  • 출력 시, “ 나 ‘ 를 함께 출력하고 싶다면? escape 문자의 \ 를 함께 붙여준다.
print('Quote(\') and double quote(\")')

>> Quote(') and double quote(")

🎀 escape 문자?

  • (백슬래시) 를 앞에 붙여 정의되어 있는 원래의 의미를 벗아는 문자
escape 문자의미
\”큰 따옴표를 출력
\’작은 따옴표를 출력
\\ (백슬래시)를 출력
\n다음줄로 이동 (개행?)
\t탭, 여러칸을 띄워 출력
  • 컨테이너 자료형
    • 유한한 길이를 갖는 자료형
    • 뒤에 [숫자] 를 붙여 해당 순서 인덱스에 해당하는 값만 뽑아올 수 있음.
    • 인덱스 순서 ↓
인덱스!인덱스 순서?번호?
a =1234
인덱스0123
음수(-) 인덱스-4-3-2-1

#인덱스 사용
message = 'Hello'
print(message[1]) # message 의 1번째 인덱스 요소를 출력하세요

>> e
# 음수(-) 인덱스 사용
message = 'Hello'
print(message[-1])# message 의 1번째 인덱스 요소를 출력하세요

>> o 
  • 슬라이싱
    • : 를 써서 [ a : z ] a 번째 부터 z번째 직전까지의 요소를 한번에 뽑올 수도 있고,

    • [ a : ][ : z ] 를 이용해 a 부터 전부, 처음부터 z 까지 전부 뽑을 수도 있음.

      message = 'Hello'
      print(message[::1])  # 기본 (한 칸 씩)
      print(message[:-1:1])  # 기본 (한 칸 씩)
      print(message[::2])  # 두 칸 씩
      
      >>
      Hello
      Hell
      Hlo
    • 거꾸로 출력할 수도 있다!

      message = 'Hello'
      print(message[::-1])  # 거꾸로 출력
      
      >> olleH

6-19 튜플(tuple) 과 리스트(list) 자료형

□ 얘내도!! 컨테이너 자료형!

  • 튜플 (tuple)
    • 이름 = (값 , 값 , 값) 의 형태를 띔 ( 쉽표(,)로 구분) (소괄호)

    • 문자열, 숫자, bool 데이터 다 들어갈 수 있다.

    • 인덱스 기능 사용 가능.

      tuple_123 = (1, 2, 3)
      print(tuple_123[0])
      
      >> 1
    • 튜플 내 요소를 빼거나 추가할 순 없지만, 튜플끼리 합칠 순 있다.

      tuple_123 = (1, 2, 3)
      tuple_123[0] = 0
      
      >> typeError 
      # 덧셈 연산자를 통한 합치기 
      tuple_a = (1, 2)
      tuple_b = (3, 4)
      print(tuple_a + tuple_b)
      
      >> (1, 2, 3, 4)
      nested_tuple = ((1, 2), (3, 4))
      print(nested_tuple[1][0]) # 
      
      >> 3
    • in 연산자를 이용해 튜플안에 값이 있는지 없는지도 검사 할 수 있음.

      tuple_abc = ('a', 'b', 'c')
      print('a' in tuple_abc)
      print('d' in tuple_abc)
      
      >> 
      True
      False
  • 리스트 (list)
    • 이름 = [요소 , 요소, 요소 ] 의 형태. (중괄호)

    • 인덱싱 기능 사용은 비슷하나 튜플과 달리 값을 추가하거나 뺄 수 있다.

      # 0번째 인덱스 요소 1을 0으로 바꿔주기. 
      
      list_123 = [1, 2, 3]
      list_123[0] = 0
      print(list_123)
      
      >> [0, 2, 3]
      #.append() 함수 이용하여 추가하기
      #.remove() 함수 이용하여 특정 값 제거하기. 
      #.pop() 함수 이용하여 특정 순서의 값 빼기
      
      list_123 = [1, 2, 3]
      list_123.append(4)
      print(list_123)
      
      list_123.remove(4)
      print(list_123)
      
      list_123.pop(0)
      print(list_123)
      
      >>[1, 2, 3, 4]
      [1, 2, 3]
      [2, 3]
      

6-20 딕셔너리(dictionary) 자료형

  • 이름 = { ‘key 값’ : ‘value’값 , ‘key 값’ : ‘value’값 } 의 형태. (대괄호)
  • 직접 인덱스를 정해줄 수 있다.(key 값)
  • 정해준 key 값을 불러올 수도 있고, key값으로 value 값을 찾을 수도 있다.
  • 값을 추가하거나 뺄 수도 있다.
# 값 추가
conductor = {'first_name': '단테', 'last_name': '안'}
conductor['gender'] = 'male' # 이렇게 추가만 해 주면되니 얼마나 편한가! 
print(conductor)

>> {'first_name': '단테', 'last_name': '안', 'gender': 'male'}
# 값 제거 
conductor = {'first_name': '단테', 'last_name': '안'}
conductor.pop('last_name') #제거할 ket 값을 입력
print(conductor)

>> {'first_name': '단테'} # 하니 키에 할당된 value 값도 같이 없어졌다! 
  • for 문을 사용하면 기본적으론 key 값만 돌려줌
conductor = {'first_name': '단테', 'last_name': '안'}
for key in conductor:
    print(key)

>> first_name
last_name
  • 같이 뽑아올 수도 있음
conductor = {'first_name': '단테', 'last_name': '안'}
for key, value in conductor.items():
    print(key + ' : ' + value)

>> first_name : 단테
last_name :

6-22 고오오오급 스킬 재귀함수..! 🍗 피보나치!!!!!!!!!!!!!!!!!!!!

  • 함수 내에서 그 함수 스스로를 사용하는 인셉션 같은 함수?
  • 대표적인 예로 피보나치 수열의 n번째 숫자를 찾는 작업.

피보나치 수열?

⇒ 앞의 두 숫자를 더한 수가 다음 수가 되는 무한 수열.

aka.황금비율

ex) 1, 1, 2, 3, 5, 8, 13, 21, ...

피보나치 수열의 n번째 수는 n-1번째 수와 n-2번째 피보나치 수의 합입니다.

남기지 않는다. 치킨. 피보나치킨!

피보나치 수열이 그 빛을 발할 때에는 사람 수에 따른 최적의 치킨 수를 구할 때입니다.

즉,피보나치 수열의 n번째 숫자만큼의 사람이 있다면, n-1번째 피보나치 숫자만큼 주문하면 됩니다.

...피보나치!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

  • 메모이제이션
    • 중간 계산 값을 기억해 놓고 다시 하는 대신, 값을 바로 읽어 쓴느 방식으로 계산 시간을 줄이는 기법이래!

6장을 마치며

  • 기초적인 내용도 많아 일전에 배웠던걸 복습 해 보거나, 새로운 개념이 추가되어 찾아본다고 열심히 구글링 했던 것 같다. 처음엔 어려워 보였던 소수형 변환도 하나하나 따져보면서 해 보니 조금은 알 것 같았다.
  • 다음 7장 진도를 얼른 보고 싶어 피보나치는 잠시 내려놓기로 했다.
  • 죄송해요 전 수포였지만 기회가 된다면 다시 돌아올게요 피보나치....
  • 피보나치ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ
profile
시-작!

0개의 댓글