본문 바로가기
SSAFY

[수업기록] 파이썬 기초 문법(2)

by 주니코니 2024. 7. 16.

240716 싸피 파이썬반

 

지난시간 복습

 

1. float(실수형) 데이터타입은 근사값이다.

-> 컴퓨터가 수를 표현하는 방식에서 발생하는 것

-> 연산시 문제 발생 : 부동소수점 에러 (작은 오차 문제)

-> 대표적으로 decimal 모듈 활용하기 

 

2. 지수표현 방식

-> 소문자 e혹은 E 사용한 지수 표현

a = 3.14 * 0.01

a = 314e-2

 

3. sequence types

: 여러 값들을 순서대로 나열하여 저장하는 자료형(정렬X)

 

4. escape sequence 

: 작은 따옴표와 큰 따옴표 말고 일반적으로 escape sequence 예약어들을 사용한다

ex. \', \"

 

5. f-string

: 문자열에 f 또는 F 접두어 붙이고 표현식을 나타내는 방법

문자열에 변수 삽입 가능

 

6. 리스트 []

: 여러 개 값을 순서대로 저장하는 변경 가능한 시퀀스 자료형

: 0개 이상의 객체(요소)를 포함하며 데이터 목록을 저장

: 데이터는 어떤 자료형도 저장 가능 -> 파이썬만의 특징 -> 파이썬은 모두 주소로 처리하기에 ✔

 

7. 슬라이싱

[시작 :  미만 :  증감값]   


오늘 수업기록

 

1. 중첩된 리스트

 

# 중첩된 리스트
my_list  = [1,2,3,['python','hello',100]]
print(len(my_list))
my_list[3][2]
my_list[3][0]
my_list[3][1][-4]

 

# 리스트는 가변
my_list  = [1,2,3,['python','hello',100]]

print(my_list[3][0][-1]) #출력 : n
my_list[3][0][-1] ='2' #문자열은 수정이 안된다 # TypeError: 'str' object does not support item assignment
print(my_list)

 

 

2. 튜플 ()

: 0개 이상의 객체(요소) 포함하며 데이터 목록을 저장

: 데이터는 어떤 자료형도 저장 가능

 

m_tuple_1 = (1,)

왜 이렇게 표현할까? 

(1)일 경우 int로 표현된다

고로 하나일 땐 쉼표와 함께 쓴다 ✔

 

리스트와의 차이점

튜플은 불변!

 

그러나 튜플보단 리스트의 개념을 아는 게 중요하다

튜플의 쓰임새는 안전하게 여러 개의 값을 전달, 다중 할당 등에 쓰임

-> 개발자가 직접 사용하기보다 파이썬 내부 동작에서 주로 사용됨 ✔

- 다중할당 ex.

 x, y = 10,20

print(x) #출력 : 10  

print(y) #출력 : 20

- 괄호를 생략했는데도 불구하고 실행이 됨(파이썬 내부 동작)


3. range ✔

: 연속된 정수 시퀀스를 생성하는 변경 불가능한 자료형 

: 함수 형태이다

 : range(시작 값, 끝 값, 증감 값)

 

range(n)

: 0부터 n-1까지의 숫자의 시퀀스

: 왜 n-1까지일까?

: 시작점이 0이기에

 

증가값이 음수일 수 있음

: 증가 값이 음수이면 시작값이 끝값보다 커야함

 

range를 print 하면? 범위를 출력해줌

my_range_1 = range(5)
my_range_2 = range(1, 10)
print(my_range_1)  # range(0, 5)  # 처음보는 형태.......................!
print(my_range_2)  # range(1, 10)

- print(range(n)) : 아직 메모리에 올리지 않은 상태(할당x, 조건을 부여한 것, dtype은 range)

- for문이나 print(list(range(n))) 써야 할당됨

 

range : 반복주체에 해당 ✔

# 주로 반복문과 함께 활용
for i in range(5): #반복주체에 해당

4. non sequence type

 

1) dict : 딕셔너리 ✔ {}

- key-value쌍으로 이루어진 데이터 자료형

- 쌍으로 이루어졌기에 순서가 없음

- index 존재 x

print(my_dict[1]) # KeyError : 1

 

- key값 중복 x, value 값 변경 가능

- key에는 변경 불가능한 자료형만 사용 가능(str, int, float, tuple, range ..)

- 왜일까?

- key로 접근해, 값을 얻어내기에.

- ex. api 키 가져올 때

- value는 모든 자료형 사용 가능 

 

my_dict = {'apple': 12,
           'list': [1, 2, 3]}
           
#주소값은 바뀌지 않는다
print(id(my_dict[0]))

# 추가
my_dict['banana'] = 100 

# 변경
my_dict['apple'] = 40


#출력
{'apple': 40, 'list': [1, 2, 3], 'banana': 100}
✔✔✔✔✔✔✔✔✔✔✔✔✔✔✔✔✔
#my dict 변수 자체의 주소값은 바뀌지 않는다
print(id(my_dict))
print(id(my_dict([0]) # 첫번째 요소값의 주소는 바뀜

 

 

- 딕셔너리는 언제 쓰일까? 

 리스트는 시간복잡도가 크다

 key로 바로 접근 가능하게 dict이 생긴 것!

 

- key value 형태의 자료형은 모든 컴퓨터 언어에서 가지고 있는 type이다

 

 

 

2) set

- 순서와 중복이 없는 변경 가능한 자료형

- 중괄호 {}

- 딕셔너리와 기호가 유사하다, 왜일까? 중복x, 순서x(원리 비슷) ✔

 

- 빈 세트 어떻게 만듦?

a = {} #딕셔너리로 인식

set()함수로 만들 수 있음

my_set_1 = set()

 

 

- 아래 두 가지 케이스에서 많이 씀

중복제거를 하거나 집합 연산필요할 때

 

 

- 중복이 없기에 집합 연산 가능

합집합(|)

차집합(-)

교집합(&)

#%%

#튜플값을 우회적으로 바꾸기
t1 = (1,2,['사과', '포도'])
t1[-1][0] ='귤' #리스트 내 요소값이라 수정 가능
print(t1)
# %%

# 논리연산자
# 1) and (&)
print(True and True)
print(True&  True)
# %%

# 2) or (|)
print(True or True)
print(True |  True)


# %%
# 3) xor (^) : 다르면 True, 같으면 False 
#print(True xor True)
print(True ^  True)

 

- 참고로 &, |라는 연산자는, 비트 연산시 사용됨

#0b : 이진수화
print(0b1011 & 0b0111)  # 3
print(bin(0b1011 & 0b0111 )) #0b11

print(0b1011 | 0b0111)  # 15
print(bin(0b1011 | 0b0111 )) #0b1111

print(0b1011 ^ 0b0111)  # 12
print(bin(0b1011 ^ 0b0111 )) #0b1100

 


5. other types

- 값이 없음을 표현하는 자료형

 a = None

-> 왜? 초기화 & None이 아닌 0이라면 값이 할당안된건지 0으로 할당된건지 구분이 어려우니까 ✔

 

- 참과 거짓을 표현하는 자료형(Boolean)

조건문에서 많이 쓰임

 

 

6. collection

- 데이터를 담을 수 있는 데이터 타입을 말함

- srt, list, tuple, dict, set 를 말함(sequence type + nonsequence type)

- c++ 언어에서는 컨테이너라고도 함

# immutable (불변)
my_str = 'hello'
my_str[0] = 'z'  # 오류 # TypeError: 'str' object does not support item assignment
 

# mutable (가변)
my_list = [1,2,3]
my_list[0] = 100

 

 

7. 형변환

암시적 형변환

- 정수와 실수 연산에서 정수가 실수로 변환됨

print(3 + 5.0) # 8.0

- true 1 false 0, 대다수 컴퓨턴언어 공통적

print(1 == True) #근데 이건 좋은 조건은 아님, 같은 dtype끼리 비교할 것

 

명시적 형변환

- int(), float() 등 함수

- ' ' -> 문자열 변환

print(int(3.5)) #3

 


8.  연산자

 

1) 복합 연산자 (재할당)

- 연산과 할당이 함께 이루어짐

a += b # a = a+ b 

a //= b # a = a // b  #몫

a %= b # a = a % b #나머지

 

y = 10
y -= 4
print(y)  # 6

 

 

2) 비교 연산자

- < : 미만, <= : 이하,  is : 같음, is not : 같지 않음 등

- 일반적으로 True, False로 값이 나온다. 

- is, is not 왜 존재할까?

- ==는 값에 대한 비교(동등성)

- is는 식별성(identity, 같은 방의 메모리 주소에 대한 비교 ) 

- is는 None, Bool에 많이 씀

print(2 is 2.0) # False

 

3) 논리&비교 연산자

# 논리 연산자 & 비교 연산자
num = 15
result = (num > 10) and (num % 2 == 0)
print(result)  # False

# 하나가 false라서 false

 

 

 

4) 단축평가 

- 논리연산에서 다루는 것

- 핵심은 값이 비어있지 않다면 true(str도 값이 비어있지 않다면 true)

- 파이썬은 유연한 언어라 false, true를 0, 1로 암시변환함

- 첫 번째 값이 확실할 때 두 번째 값을 확인하지 않음 

- 왜 있는가 : 코드 실행 최적화를 위함 

-파이썬 특징

1) 0 은 false, 1은 true

 2) ' ' 비어있으면 false, 하나라도 채워져있으면 true

 

예제

# 단축 평가

vowels = 'aeiou'

print(('a' and 'b') in vowels)  #
print(('b' and 'a') in vowels)  #

print(3 and 5)  #  
print(3 and 0)  #
print(0 and 3)  #
print(0 and 0)  #

print(5 or 3)  #
print(3 or 0)  #
print(0 or 3)  #
print(0 or 0)  #

 

더보기

 

# 단축 평가

vowels = 'aeiou'

print(('a' and 'b') in vowels)  # and니까 a true고 b도 true, b만 남음 # b는 vowels에 없음 # false
print(('b' and 'a') in vowels)  #and 니까 둘다 봐야함. b true, a true, a만 남음 # true

print(3 and 5)  # 3이니까 true고 and니까 5까지 봐야함. 5 true고 5만 남음  # 5 
# 3 and 5 면 3이 값이 있나? true -> 그럼 and 뒤의 값도 참이어야하잖아 그래서 5를 또 판단하는거지 -> 그래서 마지막에 평가한 5를 내보내는거야(일타강사 류현)
 
print(3 and 0)  0
print(0 and 3) #0 
#만약에 0 and 5면 -> 0을 먼저 판단해 이미 false야 -> 뒤에도 볼필요없이 false니까 0을 출력해버리는거지
(일타강사 류현)
print(0 and 0)  0

print(5 or 3)  # 5
print(3 or 0)  # 3
print(0 or 3)  # 3
print(0 or 0)  # 0 뒤에꺼 하나라도 true인지 뒤에꺼까지 확인

 

5) 멤버십 연산자(안에 있냐 없냐 in, not in, True, False)

word = 'hello'
numbers = [1, 2, 3, 4, 5]

print('h' in word)  # True
print('z' in word)  # False

 

 

6)  +와 *는 시퀀스형에서 결합, 반복이 됨!

print([1, 3] * 2)  # [1, 3, 1, 3]

 

 


추가 : 

내림, 반올림, 올림 

# %%
#내림 , 반올림, 올림
num = 3.3
# 1)내림
floor_num = int(num)
print(floor_num) #3

# 2) 반올림
round_num = round(num)
round_num = round(num, 1) # 소수점 첫째자리 표시
print(round_num) # 3 # 3.3

# 3) 올림
ceil_num = int(num + 0.999999)
print(ceil_num) #4

ceil_num = int(num) + (num != int(num))
print(ceil_num)


ceil_num = -(-num//1)

import math
print(math.ceil(num))