변수(variables)
- 프로그래밍에서 변수는 값을 저장하는 장소이다.
- 변수는 메모리 주소를 가지고 있고 변수에 들어가는 값은 메모리 주소에 할당된다.
- 참고 : 폰 노이만 아키텍쳐
- 선언 되는 순간 메모리 특정 영역에 물리적인 공간이 할당됨
- 변수 명명법
기본 자료형(primitive data types)
- int, float, bool, string
- Dynamic Typing으로 인터프리터가 알아서 자료형을 결정한다.
자료형은 class (type함수로 확인 가능)
1 2 3 4 5 6
a = 10 type(a) # <class, 'int'> float(a) # 10.0 ->반환값이 실수형 a = "3.33" b = float(a) #좋은듯..이렇게 변환가능
연산
- 좌변의 값은 저장이 되는 공간을 의미, 우변은 값을 의미
- 파이썬에서는 증감 연산자 없음 ( ++a , a++…)
List
- 인덱싱
1
2
3
4
numbers = [4 ,3, 2, 2 , 4]
numbers[3] #2
numbers[0] #4
numbers[-1] #4
- 슬라이싱
1
2
3
4
numbers[1,2,3,4,5,6,7]
numbers[:3] # 1 2 3
numbers[::-1] # 7 6 5 4 3 2 1
numbers[:-1] # 1 2 3 4 5 6
- 리스트 연산
1
2
3
4
5
6
7
8
9
10
nums1 = [1, 3, 5, 6]
nums2 = [4, 8, 9, 10]
nums1 + nums2 #[1, 3, 5, 6, 4, 8, 9, 10]
1 is in nums1 # True
nums1.extend([7,6,45]) # 리스트에 새로운 리스트 추가
nums1.append(4) # 리스트에 4추가
nums1.insert(3, 9) # 3번째 주소에 9추가
nums1.remove(9) # 9삭제
del nums1[0] # 0번째 리스트 삭제
파이썬의 list는 같은 자료형만 들어갈 필요가 없고 중첩이 가능하다.
이는 파이썬이 메모리의 주소를 계속해서 참조하고 있기 떄문이다.
메모리 저장 방식
assign연산을 수행하면 두 변수가 같은 메모리를 참조하게 된다.
1 2 3 4 5 6 7 8 9 10 11
a = [1, 2, 3] b = [4, 5, 6] # 현재 a와 b는 서로 다른 메모리를 가리키고 있음 a = b # a와 b가 같은 메모리를 가리킴 b = [6, 8, 9] # b에 재할당이 일어나 a와 다른 메모리를 가리키고 있음 #deepcopy를 수행하려면 b = a[:] #처럼 값을 복사하면된다. 혹은 copy.deepcopy를 사용하면 된다. #이런식의 복사는 1차원 list에서만 가능하다.
문자열 함수
- len(a) : 문자열의 문자 개수를 반환
- a.upper() : 대문자로 변환
- a.lower() : 소문자로 변환
- a.capitalize() : 첫 문자를 대문자로 변환
- a.titile() : 제목형태로 변환 띄워쓰기 후 첫 글자만 대문자
- a.count(‘abc’) : 문자열 a에 ‘abc’가 들어간 횟수 반환
- a.find(‘abc’) : 문자열 a에 ‘abc’가 들어간 위치 반환 (앞에서 부터 처음으로 찾은 지점)
- a.rfind(‘abc’) : 문자열 a에 ‘abc’가 들어간 위치 반환 (뒤에서부터 처음으로 찾은 지점)
- a.startswith(‘abc’) : 문자열 a가 ‘abc’로 시작하는지 True False반환 (a.startswith(‘abc’, 5) : a의 5번인덱스부터 abc로 시작하는지 T F반환)
- a.endswith(‘abc’) : 문자열 a가 ‘abc’로 끝나는지 True False반환 (a.endswitch(‘abc’,5,9) : a의 5번인덱수부터 9번 인덱스 전 까지가 abc로 끝나는지 T F반환)
- a.strip() : 좌우 공백 제거
- a.rstrip() : 오른쪽 공백 제거
- a.lstrip() : 왼쪽 공백 제거
- a.split() : 공백을 기준으로 리스트로 변환
패킹과 언패킹
- 패킹 : 한 변수에 여러 개의 데이터를 넣는 것
- 언패킹 : 한 변수의 데이터를 각각의 변수로 반환
1
2
t = [1, 2, 3] # 1,2,3을 변수 t에 패킹
a, b, c = t # t에 있는 값 1, 2 3을 변수 a,b,c에 언패킹
Matrix
1
2
3
4
5
6
import copy
a = [1, 2, 3, 4, 5]
b = [1, 2, 3, 4, 5]
c = [1, 2, 3, 4, 5]
d = [a,b,c]
함수
- 어떤 일을 수행하는 코드 덩어리
- 반복적인 일을 1회만 작성후 이후 호출만 해서 사용 가능
- 코드를 논리적인 단위로 분리가 가능
- 캡슐화 : 인터페이스만 알면 타인의 코드 사용이 가능
- 함수사이는 기본적으로 두줄 이상 띄워준다.
- parameter : 함수의 입력 값 인터페이스
- argument : 실제 parameter에 대입된 값
IO
- input()함수를 사용해 입력을 받을 수 있음 입력받은 type는 항상 string타입이다.
- input(“message”)처럼 사용해
print("abc", 3)
처럼 사용해 사이에 공백이 추가되어 출력된다.
print formatting
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
print("%s %s" %('one', 'two'))
print("{} {}".format('one','two))
print("%d %d" %(1,2))
print("{} {}".format(1,2))
# "%datatype"%(variable)
# "~~~{datatype}~~~".format(variable)
print("{0: <10s}, {1:>10.3f}".format('abc',3.333))
#최근 방법 PEP498에 근거한 formatting기법(f-string)
name = "abc"
age = 33
print(f"Hello, {name}. You are {age}.")
print(f'{name:20}')
print(f'{name:>20}')
print(f'{name:*<20}')
print(f'{name:*>20}')
print(f'{name:*^20}')
조건
is와 ==의 차이
1 2 3 4 5 6 7 8 9
a = 100 b = 100 a == b # True a is b # True a = 300 b = 300 a == b # True a is b # False
is는 주소를 비교하고 ==은 값을 비교한다. 값이 100일 경우 두개의 주소가 같은 것을 확인할 수 있는데 이는 파이썬이 -5 ~ 256이라는 자주 사용하는 숫자를 미리 정적 메모리에 올려놓기 때문이다.
all,any
1 2 3
boolean_list = [True, False, True, False] all(boolean_list) # list전체를 and연산 한것과 같음 any(boolean_list) # list전체를 or연산 한것과 같음
삼항 연산자
1 2 3
value = 123 is_even = True if value % 2 == 0 else False # 참일경우 앞 아닐 경우 뒤
if name == “main”
1
2
3
4
5
def main():
....
if __name__ == "__main__"
main()
py파일을 파이썬으로 바로 실행시키면 __name__에 __main__이 들어가게된다. 프로그램의 entry point이기 때문이다. (import된경우 파일 이름이 들어가게됨). 이런식으로 메인함수를 따로 작성해줘야 import에 상관없이 원하는 동작을 사용할 수있다. 위 if문은 현재 스크립트가 Entry point일때만 (파이썬 인터프리터로 현재파일을 실행시킨 경우)main함수가 동작한다. import로 이 파일을 추가해도 main은 실행되지 않는다.
raw string
1
s = r"abc\nasd" #앞에 r을 붙히면 raw string으로 인식되어 출력할경우 \n이 문자로 출력됨
파이썬의 함수 호출
call by object reference
파이썬은 객체의 주소가 함수로 전달되는 방식을 사용한다.
전달된 객체를 참조하여 변경 시 호출자에게 영향을 주지만 새로운 객체를 만들경우 영향을 주지 않는다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14
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_ex, offest_x, offset_y): temp = list_ex[offset_x] list_ex[offset_x] = list_ex[offset_y] list_ex[offset_y] = temp
function type hints
1
2
3
4
def function(var_name : var_type) -> return_type:
...
def my_f(name : str) -> str:
..
함수를 처음 사용하는 사람이 parameter와 리턴 타입을 알 수 없어 힘듬
이를 해결하기위해 파이썬 3.5부터 타입 힌트를 작성하여 사용자가 쉽게 함수를 사용할 수 있도록 하였다.
function docstring
파이썬 함수에 대한 상세스펙을 사전에 작성하여 사용자 이해도를 높일 수 있다.
함수명 바로 아래에 세개의 따옴표를 사용해 docstring영역을 표시한다.
코딩 컨벤션
conda install flake
flake8 asd.py 를 사용해 코딩 PEP8에서 정의된 코딩컨벤션이 맞는지 알려준다.
conda install black
black asd.py 를 사용해 PEP8에 최대한 맞춰서 자동으로 수정이된다.
참고
폰 노이만 아키텍쳐
폰 노이만 아키텍처 (https://codingisgame.tistory.com/7)
폰 노이만 아키텍처에서는 사용자가 컴퓨터에 값을 입력하거나 프로그램을 실행할 경우 그 정보를 먼저 메모리에 저장시키고 CPU가 순차적으로 그 정보를 해석하고 계산해 사용자에게 결과값을 전달한다.
컴퓨터는 왜 이진수를 쓸까
- 컴퓨터는 실리콘이라는 재료로 만든 반도체로 구성되어 있다. 반도체는 특정 자극으로 전기를 통하게 할 수있는데 이렇게 전류의 흐름 제어가 가능하기 때문에 2가지 상태 (0 과 1)을 표현할 수 있다.