본문 바로가기
개발일지/멀티캠퍼스 프로젝트형 AI 국비지원

2022.01.19 멀티캠퍼스 Day-3 후기

by 개발에정착하고싶다 2022. 1. 19.
320x100

정리는 딱히 하지 않는다.

정리하면서 따라갈 수 없기 때문이다.

때문에 보면 에러가 여전히 있는것도 있다.

그럼에도 수강했던 내용을 적어 놓는다.

물론 이것도 좀 더 심화되면 느꼈던 점을 총체적으로 말하는 수 밖엔 없을것이다.

수업을 따라가면서 이렇게 따로 메모를 한다는 것 자체가 가능할까? 싶다.

그 정도로 난이도가 꾸준하지만 뭔가 쓰나미처럼 서서히, 그리고 크게 다가 오고 있다는게 체감된다.

다음주만 되더라도 엄청나게 큰 해일이 올것같은 느낌이랄까..

 

#이 뒤쪽의 모든 내용은 주석처리 되요!
# Python의 주석은 1줄의 경우에 #으로 표시
# jupyter notebook에서 주석처리하기 원하는 코드를 block으로 설정한 후
# ctrl + / 키를 이용하면 해당 코드 block을 주석처리해요!
# 여러줄 주석은 ''' ''' 이용해요!

 

'''
이것은
소리없는
아우성
'''

 

# 변수
# 변수는 특정값을 저장할 수 있는 메모리 저장 공간을 지칭
# 변수를 어떻게 만드나요?

a = 100
# a라는 이름의 변수를 생성하고 그 안에 100이라는 값을 저장.
# 그럼 변수이름은 어떻게 지어야 하나요?

# 키워드는 변수로 사용할 수 없다.
# 의미없는 이름의 변수는 사용을 지양 (이름만 보고 그 변수의 기능을 유추할 수 있어야한다.)
# 변수는 숫자로 시작할 수 없다. 무조건 문자로 시작 (특수문자로 시작x)
# 100a = 100 (x)
# 한글이름의 변수를 사용할 수는 있다. 그러나 누구도 한글 이름의 변수는 사용하지 않는다. 범용성의 문제도 있고
# 당연히 영문자 대문자와 소문자는 다른 문자다.

a = 200 #ok
# a = 300 #Error
# 무조건 코드줄의 시작은 띄어쓰기 하면 안된다. (파이썬은)

print(a) # print() 함수는 괄호안에 내용을 문자열로 출력!

 

# Python에서 사용할 수 있는 데이터 타입
# Python에서 정해져 있는 데이터 타입 => built-in data type
# Python의 built-in data type은 일반 data type + 자료구조 (data structure)

# 1. Numeric
# 2. Seqeunce
# 3. Text Sequence
# 4. Mapping
# 5. Set
# 6. Bool

 

# 1. Numeric - 1

# 숫자형 데이터 타입
# 프로그램에서 일반적으로 사용하는 숫자는 정수, 실수, 복소수
# 결국 Numeric Data type은 <class int> 와 <class float>등를 이용

a = 100 #정수
b = 3.14 #실수
c = 3.14E-10 #실수(지수표현)
d = 0o7 # 8진수 (많이 사용되지는 않는다)
e = 0xAB # 16진수 (많이 사용되지는 않는다)

 

# 1. Numeric - 2

# Operator (연산자)
# + 연산자
# + 연산은 이항연산자
# 프로그램에서 이항연산자의 특징은.. 같은 데이터 타입에 대해서 연산을 수행
# 10+3.14 = 13.14
# + 연산을 할때는 하나의 클래스에서 파생되진 것이여야한다.
# 사실 위의 것은 int와 float 이기때문에 성립되지 않는다.
# 위의 연산은 내부적으로 타입을 바꾸어서 실행한다.
# 작은사이즈의 데이터를 큰사이즈의 데이터 클래스로 변형해준다.
# float로 10을 10.0으로 바꾸고 3.14는 그대로 유지가 가능하지만 int로 했을때는 10 + 3이된다. 따라서 이 케이스에서 큰 사이즈의 데이터 클래스는
# float 이다.

# a = 3/4
# print(a)
# 위와 같이 했을때 int/int 이기 때문에 출력값도 int인 0이 나오는게 당연하다. (답이 0.75니깐)(Java 나 C언어 등에서는 0 으로 출력됨)
# 하지만 위의 int/int의 결과값이 float로 나오게 된다.

# %연산자(나머지를 구하는 연산자)
# //연산자 (몫을 구하는 연산자)

 

# 2. Seqeunce (순서)
# 순서가 있는 자료형(자료구조)

#     - <class list>
#     - <class tuple>
#     - <class range>

'''
# <class list>
# literal : 코드에서 어떻게 표현 하나요?
a = [] # list (empty list => 가지고 있는 데이터가 없어요!)
a = [1,2,3,4]
# list안에는 같은 데이터 타입만 들어오지 않아요! (어떤게 들어와도 상관이 없다. + list 안에 다른 list가 들어올 수 있다.)
a = [1,2,3.14]
'''

# # list 안에 다른 list가 들어올 수 있다 (중첩 리스트)
# a = [1, 2, [3, 4], 4]

# indexing

# a = []
# a = list()  # <class list> empty list 생성할 때 사용 (바로 위의것과 같은 것이다.)

# a = [1, 2, 3, [4, 5], 6]
# # a = [1, 2, 3, [4, 5], 6]


a = [1, 2, 3, [4, 5], 6] # 인 상태에서
print(a[3,[0]]) #4
# 매우 중요하다. 3번 인덱스 내부의 0번 인덱스를 출력.

print(a[-1])#이렇게 했을때, 다른 언어는 에러가 난다. 파이썬에서는 거꾸로 가기 때문에 6.


# slicing -> 연속적인 부분집합을 만들어 내는게 슬라이싱
a=[1, 2, 3, [4, 5],6]
a[1:3] # 1번째 인덱스 부터 2번째 인덱스 까지, 즉 출력값은 2,3이 된다.
# slicing 시작 인덱스는  inclusive(포함), 끝 인덱스는 exclusive(불포함)
# slicing은 원본의 부분집합을 구하는 것이기 때문에 당연히
# 원본과 동일한 데이터 타입이 나온다. -> 무슨말인고 하니  print(a[1:2])라고 했을때, 출력값은 2. 가 아니라 [2]. 다.

print(a[1:]) # 1부터 끝까지 슬라이싱
print(a[:3]) # 처음 부터 2번째 자리의 인덱스까지 슬라이싱
print(a[:]) # 처음 부터 끝까지

 

# 리스트의 연산
# +연산
a = [1, 2, 3]
b = [4, 5, 6]

print(a+b)

# 원래 + 기호는 숫자를 더하는 기호.
# 이 숫자를 더하는 기호인 +에 피 연산자를  list를 사용
# 이 + operator(연산자)의 의미가 변해요. => 연산자 오버로딩 (operator overloading)
# 이 연산자 오버로딩이 발생해서 + 의 의미가 연결 (concatenation)
# 위 수식의 경우 2개의 리스트는 1개의 새로운 리스트에 합쳐진다.

a = [1, 2, 3]
result = a*3
print(result)

# 위의 경우는 리스트를 3번 반복해서 써지게 된다. # a+a+a

 

# a = list()
# print(a)

# a.append(10) # append()는 리스트의 맨 마지막 방을 추가하고 원소를 저장하는 기능
# print(a)
# a.append(20)
# print(a)
# # 리스트 안의 각각의 요소(원소)들을 정렬하려면 어떻게 해야 하나요?
# # 정렬은 기본은 오름차순 정렬(작은값이 맨 위 혹은 맨 앞쪽에 위치)

a =  # [4,7,10,2,8,1,9]
# result = a.sort() #[1,2,4,7,8,9,10]

#*********************** 개 중요 및 헷갈림
# print(result) #None (값이 없어요!)
# # list의 sort()기능은 원본을 정렬하고 정렬된 결과를 새롭게 복사본으로 만들지 않아요.

# a.sort()
# print(a)    # [1,2,4,7,8,9,10]

result = sorted(a) # sorted()는 원본은 그냥 두고 정렬된 복사본을 만든다.

print(a) # [4,7,10,2,8,1,9]
print(result) #[1,2,4,7,8,9,10]

#*********************** 개 중요 및 헷갈림

 

# 특수한 함수에 대해서 하나 알아보고 넘어간다.
# print()
# type() : 클래스의 타입
# id() : 메모리 주소값에 대한 hash값(전환값)을 알려준다. (실제값은 아님. 보안을 위해서.)
a = 100
id(a)

# C언어를 제외한 다른 프로그래밍 언어는 메모리 주소를 직접적으로
# 조작할 수 없도록 프로그래밍 언어가 디자인 되어있다.
# 메모리 주소를 직접 조작하면 cracking 작업을 수행할 수 있어요!

 

a =256 #140711859994336
b = 256 #140711859994336
print(id(a))
print(id(b))

# 프로그램의 효율성 때문에 0~256의 숫자는 공통의 메모리 주소를 공유하여 쓴다. # "숫자"를 제외한 나머지는 다 다르다. 오직 0~256만 공통

a = 257 # 2270176662320
b = 257 # 2270176662128
print(id(a))
print(id(b))

a = list()
b = list()

print(id(a))
print(id(b))

 

 

a = 100
b = 100

a == b

# is 연산자는 값을 비교하지 않고 메모리 주소값을 비교 (같은 객체인지를 확인)
# 따라서 숫자를 기준으로 할때는 256까지는 동일한 숫자까지는 a is b 라고 했을 때 True 이지만, 257부터는 False가 된다.


a = [1,2,3]
b = [1,2,3]

print(a == b)
print(a is b)

# 위의 사례는 단순 숫자 vs 단순 숫자가 아니라서 어쨌든 메모리 값이 다르다.

 

 

# python 의 built-in Data Type
# 1. Numeric
# - <class int> 정수, < class float> 실수

# 2. Sequence
# - <class list> : []
# - <class tuple> : ()# 오직 파이썬에만 있는 클래스이다.


# 3. Text Sequence
# 4. Mapping
# 5. Set
# 6. Bool

 

 

# Tuple (튜플)
# literal => ()
a = (1,2,3) # [1,2,3]
a = ()      # empty tuple 
a = tuple() # empty tuple
print(type(a)) # <class "tuple">
a = (1,2,3, (4,5),6) # 중첩 tuple
a = (1,2, [3,4],5) # 가능

a = (1,2,3)


# indexing
print(a[1]) # 2

a = (1,2,3) # Tuple은 소괄호를 생략할 수 있다. 따라서 이거는 a = 1,2,3 으로도 쓰일 수 있다.

a = ()
# Tuple은 읽기 전용 이기 때문에 값이 변할 수 없다.
# 때문에 변경된 구조같은게 있으면 변동가능하지만 Tuple 자체는 변할 수 없다.

a = (1,2,[3,4],5)
#라고 되어있을때 1,2,[],5 는 고정이다.
#그러나 []안의 3,4는 변동 가능하다.

a[2][0] = 100
# 이라고 할때
a = (1,2,[100,4],5)
# 으로 된다.

print(a)

# 즉 Tuple은 Tuple 자체의 뼈대는 고정되서 변하지 않되, 그 안의 메모리값은 변화를 주는 것이 가능하다.
# 이것을 리돈? 이라고 부른다.

a = (3) # 튜플이 아니다. int다.
a = (3,) #튜플이다.

# a = [1,2,3]
# b = tuple(a)
# print(type(b)) -> 결과값은 튜플

# a = [1,2,3]
# b = list(a)
# print(type(b))   -> 결과값은 리스트

 

300x250