ai tech

ai tech 2일차

완달프 2021. 1. 19. 16:32

두번째 날은 강의가 꽤 길었다.


강의

# 변수

변수에는 값이 저장된다.

변수는 메모리 주소를 가지고 있고,

변수에 들어가는 값을 메모리 주소에 할당된다.

선언이 되는 순간 메모리에 물리적으로 할당된다.

즉, 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