ai tech 2일차
두번째 날은 강의가 꽤 길었다.
강의
# 변수
변수에는 값이 저장된다.
변수는 메모리 주소를 가지고 있고,
변수에 들어가는 값을 메모리 주소에 할당된다.
선언이 되는 순간 메모리에 물리적으로 할당된다.
즉, A = 8이라는 것은 A라는 이름의 메모리 공간에 8을 할당하라는 것이다.
파이썬에서는 변수명의 대소문자가 구분된다.
# 폰노이만 아키텍쳐
메모리에 먼저 정보가 저장되고 연산장치가 순차적으로 연산한다.
# 기본 자료형
정수형, 실수형, 문자형, 논리형
데이터 종류마다 메모리 공간을 차지하는 크기가 다르다.
type(변수명)하면 타입을 알아낼 수 있다.
Dynamic Typing: 파이썬은 변수에 할당되는 데이터의 종류에 따라 변수의 타입이 정해진다.
(자바같은 경우는 변수의 종류를 사전에 결정해 주어야 한다.)
# 연산자와 피연산자
concatenate: 문자간에도 + 연산이 가능하다.
a = 5
a ** 3
125
a += 1
float(a)과 같은 형변환 함수는 리턴값이 형변환인것이지 a자체를 형변환하는것은 아니다.
실수형을 정수형으로 형변환하면 리턴값은 내림한 정수값이 반환된다.
문자열과 숫자형은 함께 합연산이 안되며 에러가 발생한다.
# 리스트(시퀀스형 자료형)
인덱싱(indexing): 리스트에 있는 값들은 주소(오프셋)를 가지며, 주소를 이용해 할당된 값을 호출한다.
슬라이싱(slicing): 리스트의 있는 값들을 잘라서 반환한다.
[시작:끝]: 시작 오프셋부터 끝 오프셋의 바로 앞까지 반환한다.
[시작:끝:스텝]: 시작 오프셋부터 끝 오프셋의 바로 앞까지 반환한다. 스텝값이 있으면 그 갯수만큼 점프한 리스트를 반환한다. 스텝이 음수이면 역순으로 반환된다.
리스트는 +연산이 가능하고 *상수로 반복 반환이 가능하다.
값 in 리스트변수 연산자로 값이 리스트에 포함되어 있는지 확인 할 수 있다.
리스트변수.append(값): 리스트에 값 추가
리스트변수.extend(다른리스트): 리스트 합치기
리스트변수.remove(값): 리스트에 값 삭제
del 리스트변수[인덱스]: 리스트의 특정인덱스의 주소와 값을 삭제한다.
# 파이썬 리스트의 특징
다양한 데이터 타입이 하나의 리스트에 들어갈 수 있다.
리스트 안에 리스트를 넣어서 행렬을 만들 수 있다.
[:]연산을 통해 복사를 할 수 있지만 행렬일때는 내부 값은 얕은 복사가 된다.
깊은 복사를 위해서는 import copy, copy.deepcopy(행렬) 하면 된다.
# 함수
함수 부분을 제외한 메인프로그램부터 시작한다.
함수 호출시 함수부분을 수행 후 되돌아온다.
리턴을 해야 함수로부터 값을 반환받을 수 있다.
# 콘솔창 입력
input() 함수로 사용자의 입력을 입력받는다.
# 콘솔창 출력
print('%s %s' % ('one', 'two'))
print('{} {}'.format('one', 'two'))
print('%d %d' % (1, 2))
print('{} {}'.format(1,2))
print("Product: %10s, Price per unit: %10.1f." % ("Apple", 5.243))
print("Product: {0}, Price per unit: {1:.3f}.".format("Apple", 5.243)) # padding
print("Product: {0:>10s}, Price per unit: {1:10.3f}.".format("Apple", 5.243)) # padding and align right
print("Product: {0:<10s}, Price per unit: {1:10.3f}.".format("Apple", 5.243)) # padding and align left
# f string
print(f"Hello, {name}. You are {age}.")
print(f"{name:20}") # 20칸 먹기
print(f"{name:>20}") # 우측정렬
print(f"{name:*<20}") # 좌측정렬하고 빈칸은 *채우기
print(f"{name:*>20}") # 우측정렬하고 빈칸은 *채우기
print(f"{name:*^20}") # 중앙정렬하고 빈칸은 *채우기
print(f"{number:.2f}") # 전체소수점 중에 2자리만 자르기
# 조건문
x is y: 메모리의 주소를 비교해서 같은지 검사
a = 100
b = 100
a is b # true
a = 300
b = 300
a is b # false
256이하의 숫자는 이미 메모리 공간에 할당되어 공유된다.
리스트에는 any나 all의 연산자를 써서 리스트에 들어있는 불린값을 연산 할 수 있다.
# 삼항연산자
value = 12
is_even = True if value % 2 == 0 else False
파이썬의 삼항연산자는 다른 언어들과는 다르게
결과 if 조건 else 다른결과 형식이다.
# 반복문
for looper in [1,2,3,4,5]:
print(f"{looper} : Hello")
for looper in range(0, 5):
print(f"{looper} : Hello")
for i in "abcdefg":
print(i)
for looper in range(1, 10, 2):
print(f"{looper} : Hello")
break: 반복문 종류
continue: 다음 반복문 진행
반복문에도 else문을 사용할 수 있다. 다만, break로 종료된 반복문은 else문이 수행되지 않는다.
# 메인함수
if __name__ == "__main__":
main()
위에 조건문처럼 묶어두면 코드를 import문으로 부르더라도 main문을 강제실행하지 않는다.
# 문자열
시퀀스형 자료형으로 문자형 data를 메로리에 저장한다.
영문자 한글자는 1byte를 차지한다.
1byte = 8bit = 256가지를 표현가능
# 데이터 타입과 메모리
파이썬에서는 각 타입별로 메모리에 할당받는 크기가 다른데,
정수형의 int는 4바이트 크기,
정수형의 long은 무제한 크기를 나타낼 수 있고,
실수형의 float는 8바이트 크기(부동소수점)를 나타낼 수 있다.
# 문자열 슬라이싱
text[0:6] # 0부터 5까지
text[-9:] # -9부터 끝까지
text[:] # 처음부터 끝까지
text[-50:50] # 범위를 넘어가도 괜찮다
text[::2] # 2칸 단위로
text[::-1] # 역방향으로
# 문자열 함수
len(a) # 문자갯수 변환
a.upper() # 대문자 변환
a.lower() # 소문자 변환
a.split() # 문자열을 리스트로 변환
a.capitalize() # 첫문자를 대문자로 변환
a.title() # 첫문자들을 대문자로 변환
a.count('abc') # 문자열 a에 'abc'가 들어간 횟수 반환
a.find('abc') # 문자열 a에 'abc'가 들어간 오프셋 반환
a.startwith('abc') # 문자열 abc로 시작하는지 여부
a.endwith('abc') # 문자열 abc로 끝나는지 여부
a.isdigit() # 숫자로 변경가능한지 여부
raw_string = r"테스트 \n테스트" # 개행표시조차도 문자열로 저장된다.
# call by object reference
파이썬은 객체의 주소가 함수로 전달되는 방식이다.
def swap_value(x, y):
temp = x
x = y
y = temp
def swap_offset(offset_x, offset_y):
temp = a[offset_x]
a[offset_x] = a[offset_y]
a[offset_y] = temp
def swap_reference(list, offset_x, offset_y):
temp = list[offset_x]
list[offset_x] = list[offset_y]
list[offset_y] = temp
a = [1, 2, 3, 4, 5]
swap_value(a[0], a[1]) # 변경되지 않는다.
a = [1, 2, 3, 4, 5]
swap_offset(a[0], a[1]) # [2, 1, 3, 4, 5]
a = [1, 2, 3, 4, 5]
swap_reference(a, 3, 4) # [1, 2, 3, 5, 4]
# 변수의 범위
함수 호출시 파라미터로 받는 값을 함수 안에서 재선언하면 다른 주소가 할당된다.
global 을 함수 내에서 사용하면 전역변수를 가져오게 된다.
# type hint
def 함수명(변수명: 변수타입) -> 리턴타입:
pass
1. 사용자에게 인터페이스를 명확하게 알려줄 수 있다.
2. 함수를 문서화 할때 parameter에 대한 정보를 명확히 알 수 있다.
3. mypy 또는 IDE, linter 등을 통해 코드의 발생가능한 오류를 사전에 확인한다.
4. 시스템 전체적인 안정성을 확보할 수 있다.
# docstring
파이썬 함수에 대한 상세스펙을 작성해 주는 것이다.
함수 아래에 ``` ``` 사이에 함수 설명을 적어준다.
# 함수 작성 가이드 라인
함수는 가능하면 짧게
함수 이름에 역할과 의도가 명확하게
인자로 받은 값 자체를 바꾸지 말고 복사해서 사용하자
공통적으로 쓰게되면 함수로 묶자
복잡한 수식은 함수로 변경하자
# flake8(컨벤션 문제찾기툴)
# black(컨벤션 자동수정툴)
conda install black
black 파일.py