Home 파이썬 기초2
Post
Cancel

파이썬 기초2

변수(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) 처럼 사용해 사이에 공백이 추가되어 출력된다.
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)을 표현할 수 있다.
This post is licensed under CC BY 4.0 by the author.