본문 바로가기

Study/개발일지

[백엔드스터디]4일차 학습일지

미니프로젝트를 마치며 전반적으로 파이썬 개념을 복습하였다. 

그외의 시간은 프로젝트 소스 구현에 집중하였다.

1. Python 기초:

1.1 식별자

식별자: 변수, 함수, 모듈, 클래스 등을 식별하는 데 사용되는 이름

convention:

  • 식별자의 이름은 영문알파벳, _, 숫자로 구성된다.
  • 첫 글자에 숫자가 올 수 없다.
  • 대소문자를 구별한다.
  • 예약어는 사용할 수 없다.
  • False, None, True, and, as, assert, break, class, continue, def, del, elif, else, except, finally, for, from, global, if, import, in, is, lambda, nonlocal, not, or, pass, raise, return, try, while, with, yield
  • 내장함수나 모듈 등의 이름으로도 만들면 안된다.
  • 예약어, 내장함수, 모듈 등의 이름으로 변수를 만들면 기존의 기능이 덮어쓰여지므로 식별자 이름으로 쓰면 안된다.

1.2 기초 문법

인코딩 선언: default로 UTF-8이 설정되어 있다. 인코딩 선언은 Python parser에 의하여 읽혀지며, # -*-coding:<encoding-name>-*-이라 선언한다.

주석: #으로 표현하는 것이 기본이다. 여러 줄의 주석을 작성할 때에는, """으로 docstring 을 표현하면 된다.

코드라인: 기본적으로 파이썬에서는 ;을 작성하지 않는다. 그러나 한 줄로 표기할 때에는 ;으로 작성한다. \으로도 가능하다. list, set, dict은 특별한 표기 없이 한 줄 작성이 가능하다.

print('Happy'); print('Hacking')print('Happy\Hacking')

1.3 변수 및 자료형

  • 변수는 =을 통해 할당(assignment) 된다.
  • type()을 통해 자료형을 확인해야한다.
  • 해당 변수의 메모리 주소를 확인하기 위해서는 id()를 활용한다.
  • 같은 값을 동시에 할당 할 수 있다.
  • a = b = 10
  • 다른 값을 동시에 할당 가능하다.
  • a, b = 1, 2
  • 변수의 갯수가 값의 갯수보다 더 적거나 많으면 오류가 발생한다.
  • # 변수의 값 바꾸기a = 10b = 20# 1. tmp var 사용c = aa = bb = c# 2. +, - 사용a = a + bb = a - ba = a - b

1.4 수치형(Numbers)

(1) int: 정수

  • 모든 정수는 int로 표현된다.
  • 8진수: 0o, 2진수: 0b, 16진수: 0x
  • Overflow (일반적) vs Arbitrary-precision arithmetic (Python)
    • 일반적으로, 데이터 타입 별로 사용할 수 있는 메모리 크기가 제한되어 있다. 표현할 수 있는 수의 범위가 넘어가면 메모리의 넘친(overflow) 현상으로 이상한 값이 출력된다.
    • 파이썬은 아주 큰 정수를 표현할 때, 메모리의 변화한다. 가용 메모리를 모두 수 표현에 끌어다 쓸 수 있어 유동적인 운용이 가능하다.

(2) float: 부동소수점, 실수

  • 실수는 부동소수점으로 표현되며, 항상 같은 값으로 일치되지 않는다.
  • 숫자를 표현하는 과정에서 생기는 오류는 대부분 중요하지 않으나, 값 비교 과정에서는 문제가 발생할 수 있다.
  • 실수의 경우, 덧셈은 괜찮으나 뺄셈 처리 시에는 오류가 있을 수 있다.
  • round() 를 통해 반올림하여 실수를 정리 할 수 있다.
  • 실수 비교 방법
  • # 1. absif abs(a-b) <= 1e-10:print('대충 같다')# 2. sys moduleif abs(a - b) <= sys.float_info.epsilon:print('대충 같다')# 3. math moduleimport mathmath.isclose(a, b)# output: True

(3) complex : 복소수

  • 복소수는 허수부를 j로 표현한다.
  • a = 3 + 4j a.imag => 허수부 출력 a.real => 실수부 출력 a.conjugate() =>

1.5 Bool

  • True와 False로 이뤄진 bool 타입
  • bool(value) 하면 True와 False 가 출력된다.
  • False의 경우: [], 0, {}, 0.0, ’’, (), None
  • True의 경우: False 경우 제외 전부. 어떤 값이나 type 이든 비어있지 않고 무언가가 존재 하면 True이다. 예로, [False], [0], ' ' 등 도 전부 True이다.

1.6 None

  • 값이 없음을 표현하는 None 타입이 존재한다.

1.7 String: 문자형

  • 문자열은 ''  ""을 활용하여 표현 가능하다.
  • 하나의 문자열을 묶을 때 동일한 문장부호를 활용해야 한다.
  • PEP-8에서는 하나의 문장부호를 선택하여 유지하는 것이 원칙이다.
  • 사용자에게 받은 입력은 기본적으로 str 이다.
  • 여러 줄에 걸쳐있는 문장은 """ """ 을 사용 하여 표현 합니다.
  • 이스케이프 문자열
    • 특수문자 또는 조작을 하기 위하여 \ 을 활용하는 문자열
    • 예약문자내용(의미)줄바꿈 탭 캐리지리턴\0널(Null)\\\’단일인용부호(’)"이중인용부호(")
    • 문자열 뒤에 end='escape string'을 쓰면 출력 결과를 조정할 수 있다.
  • String Interpolation
    • %-formatting
    • 'Hello, %s' % name
    • str.format()
    • 'Hello, {} {} {}'.format(name, 100, True) #순서대로 들어간다
    • f-strings
    • f'Hello, {name}'
  • name = '김싸피'

1.8 연산자

  • 산술 연산자+덧셈
    - 뺄셈
    * 곱셈
    / 나눗셈
    //
    % 나머지
    ** 거듭제
  • 비교 연산자a>b초과
    a<b 미만
    a>=b 이상
    a<=b 이하
    a==b 같음
    a!=b 같지않음
       
  • 논리 연산자
    • a and b => a 와 b 모두 true시만 true
    • a or b => a 와 b 모두 false시만 false
    • not a => true to false, false to true
    • 참거짓 판단에서는 판단을 위해 고려하는 가장 마지막 값을 출력한다.
  • 복합 연산자
    • 연산과 대입이 함께 이뤄진다.
    • ex) a+=b, a-=b
  • Concatenation: 자료형을 합치는 + 연산자
  • Containment Test: in 연산자를 통해 속해있는지 여부를 확인
  • Identity: is 연산자를 통해 동일한 object인지 확인
  • 연산자 우선순위
    1. ()을 통한 grouping
    2. Slicing [ : ]
    3. Indexing [0]
    4. 제곱연산자: **
    5. 단항연산자: +, - (음수/양수 부호)
    6. 산술연산자: \*, /, %, //
    7. 산술연산자: +, -
    8. 비교연산자, in, is
    9. not
    10. and
    11. or

1.9 기초 형 변환(Type Conversion)

  • 암시적 형변환
    • 사용자가 의도하지 않았지만, 파이썬 내부에서 자동으로 형변환 하는 경우: bool, numbers(int, float, complex)
    • bool은 true는 1로, false는 0으로 자동 변환
    • Numbers는 연산 시 1) complex, 2) float, 3) int 우선순위 순으로 변환된다.
  • 명시적 형변환
    • 암시적 형변환을 제외하고는 모두 명시적으로 형 변환
    • int(): string, float을 int로 변환
    • float(): string, int 를 float으로 변환
    • str(): int, float, list, tuple, dictionary를 문자열로 변환
    • string -> intger : 형식에 맞는 숫자만 가능
    • integer -> string : 모두 가능
    • 2가지 형 변환을 한 번에 할 수 없음. ex) int('3.5')
    • float을 int로 형변환하면 내림 숫자가 나옴

1.10 시퀀스(sequence) 자료형

  • 시퀀스(sequence): 데이터의 순서대로 나열된 형식
  • 정렬되었다라는 뜻은 아니다
  • list, tuple, range, string, binary
  1. list (리스트): [value1, value2, value3]
  • 리스트는 대괄호 []로 만들 수 있다
  • 값에 대한 접근: list[i]
  1. tuple(튜플): (value1, value2)
  • 리스트와 유사, ()로 묶어서 표현
  • 수정불가능(immutable)하고, 읽을 수 밖에 없음
  • 직접 사용 보다는 파이썬 내부에서 사용
  • # tuple을 만들어봅시다.tup = (1, 2)print(tup, type(tup))# 아래와 같이 만들 수 있습니다.x = 1, 2print(x, type(x))# 파이썬 내부에서는 다음과 같이 활용됩니다.# 앞선 2. 변수 및 자료형 예제에서 사용된 코드입니다.x, y = 1, 2# 실제로는 x, y = (1, 2) 형태로, tuple 처리 됩니다.# 변수의 값을 swap하는 코드 역시 tuple을 활용하고 있습니다.x, y = y, xtup = 1, 2, 3, 4, 5, 'a', 'b'print(tup, type(tup))tup[5]output: (1, 2, 3, 4, 5, 'a', 'b')<class 'tuple'>'a'
  1. range: 숫자의 시퀀스
  • range(n): 0<= x < n
  • range(n, m) : n <= x < m
  • range(n, m, s): n <= x < m (스텝: s)
  • range의 기본형은 tuple

1.11 non-sequence type

  • set과 dictionary는 기본적으로 순서가 없다
  1. set: {value 1, value 2, value 3}
  • 수학의 집합과 동일하게 처리
  • 순서가 없고, 중복된 값이 없다
  • set을 활용하면 list의 중복된 값을 손쉽게 제거할 수 있다
  • 차집합은 - 또는 difference로, 합집합은 | 또는 union, 교집합은 & or intersection으로 표현
  1. dictionary: {key1: value1, key2: value2, key3: value3, …}
  • key와 value가 쌍으로 이루어져있다
  • literal {} 과 생성자 함수 dict()로 만들 수 있다.
  • key는 immutable한 모든 것이 가능 (string, integer, float, boolean, tuple, range)
  • value는 list, dictionary를 포함한 모든 것이 가능하다.
  • 중복된 key는 존재 할 수가 없다.

총정리

데이터 타입

container:

  1. sequence (ordered)
  2. string, list, tuple, range
  3. unordered
  4. set, dictionary

changeable?:

  1. immutable
  2. string, tuple, range, bool, numbers ( int, float, complex )
  3. mutable
  4. list, set, dictionary

2. 제어문 (Control of Flow)

2.1 조건문 (if문)

  • if <조건식> : 반드시 일정한 참/거짓을 판단할 수 있는 조건식과 사용
    • 조건식이 참인 경우: : 이후의 문장을 수행
    • 조건식이 거짓인 경우: else: 이후의 문장을 수행
  • 복수 조건문: 2개 이상의 조건문을 활용할 경우 elif <조건문>: 을 활용
  • 중첩 조건문: if 안에 if 실행
  • 조건 표현식(conditional expression):
    • true_value if <조건식> else false_value

2.2 반복문

(1) while 문: while True:

while 문은 조건식이 True 인 경우 반복적으로 코드를 실행

종료조건을 반드시 설정해줘야 한다.

(2) for문: for value in sequence:

정해진 범위 내 (시퀀스) 에서 순차적으로 코드를 실행

범위가 이미 정해져 있기 때문에, 종료조건을 설정해주지 않아도 된다.

** iterable 이라는 것은 시퀀스, 이터레이터 또는 이터레이션을 지원하는 객체, 즉 열거 객체

  • index와 for문
    • enumerate(iterable): index와 value를 반환하는 함수
    • for index, value in enumerate(iterable)
  • dictionary 반복문
    • for key in dict: key 반환 및 반복
    • for key in dict.keys(): key 반환 및 반복
    • for value in dict.values(): value 반환 및 반복
    • for key, value in dict.items() : key와 value 반환 및 반복

(3) break, continue, else

  • break : 반복문을 종료하는 표현
  • continue : continue 이후의 코드를 수행하지 않고 다음 요소를 선택해 반복을 계속 수행
  • else : 끝까지 반복문을 시행한 이후에 실행. break를 통해 중간에 종료되지 않은 경우에만 실행. for~else를 의미한다.

3. function (함수)

3.1 함수 정의

def func(parameter1, parameter2):code line1code line2return value
  • parameter == 매개변수
  • return을 통해 결과값을 전달
  • return 값이 없으면, None을 반환
  • 호출은 func(val1, val2)로 한다
  • return은 모든 종류의 객체를 반환할 수 있다. 단, 오직 한 개의 객체만 반환된다.
  • 단 하나의 객체만 반환되지만, 값은 여러개 반환될 수 있고 이럴 때에는 하나의 tuple로 묶여서 반환된다.

3.2 인수(parameter)

  1. 위치 인수
  • 함수는 기본적으로 인수를 위치로 판단
  • 기본값(Default Value):
    • 함수가 호출될 때, 인자를 지정하지 않아도 기본 값을 설정할 수 있다.
    • 기본 값이 있는 ‘’매개변수’’ 뒤에 기본 값이 없는 ‘’매개변수’’를 사용 할 수는 없다.
    • def greeting(age, name= 'john'):print(name, age)
  1. 키워드 인자
  • 직접적으로 변수의 이름으로 특정 인자를 전달할 수 있다.
  • 키워드 인자 뒤에 위치 인자를 사용 할 수는 없다.
  • 위치 ‘’인자’’ => 키워드 ‘’인자’’ 순서 이어야 한다.
  • greeting('neo', age=10)
  1. 가변 인자
  • 정해지지 않은 임의의 개수의 인자를 받기 위한 가변인자
  • tuple 형태로 처리
  • def func(*args)
  1. 정의되지 않은 키워드 인자
  • dict 형태로 처리
  • def func(**kwargs)
  1. 딕셔너리를 인자로 넘기기
  • **dict 를 통해 함수에 딕셔너리를 인자로 넘길 수 있다
  • func(**dict)

3.3 이름공간 및 스코프(Scope)

  • 파이썬에서 사용되는 이름들은 이름공간(namespace)에 저장되어 있다.
  • 인식 우선순위 (LEGB Rule)
    1. Local scope: 정의된 함수
    2. Enclosed scope: 상위 함수
    3. Global scope: 함수 밖의 변수 혹은 import된 모듈
    4. Built-in scope: 파이썬안에 내장되어 있는 함수 또는 속성
  • 수명주기 순위
    1. Built-in scope: 파이썬이 실행된 이후부터 끝까지
    2. Global scope: 모듈이 호출된 시점 이후 혹은 이름 선언된 이후부터 끝까지
    3. Local/Enclosed scope: 함수가 실행된 시점 이후부터 리턴할때까지

3.4 재귀함수(recursive function)

  • 재귀함수: 함수 내부에서 자기 자신을 호출하는 함수
  • 재귀함수는 기본적으로 같은 문제이지만, 점점 범위가 줄어드는 문제를 풀게 된다
  • 재귀 함수 작성시에는 반드시, base case가 있어야 한다.
  • base case는 점점 범위가 줄어들어 반복되지 않는 최종적으로 도달하는 곳이다.
  • 재귀 함수의 장/단점
    • 알고리즘 구현에 적절 (더 자연스럽다)
    • ’변수 사용’을 줄여준다
    • 코드가 더 직관적이고 이해하기 쉬운 경우가 있다
    • 만들기는 어렵다
    • 함수가 호출될 때 마다 메모리 공간에 쌓인다. 그래서 메모리 스택이 넘치거나 (stack overflow) 프로그램 실행속도가 느려진다.
    • 파이썬에서는 이를 방지하기 위해 1,000번이 넘어가게 되면 더이상 함수를 호출하지 않고, 종료된다.

4. Data structure (자료구조)

4.1 String method (문자열 메소드)

  1. .capitalize() : 앞글자를 대문자로 만들어 반환합니다. + 나머지는 모두 소문자. ex) string.capitalize()
  2. .title() : 어포스트로피나 공백 뒤에 있는 문자를 대문자로 만들어 반환. ex) string.title()
  3. .upper() : 모두 대문자로 만들어 반환. ex)string.upper()

(4).lower() : 모두 소문자로 만들어 반환. ex) string.lower()

(5).swapcase(): 대 <-> 소문자로 변경하여 반환

  1. 'arg'.join(iterable) : iterable type의 객체를 특정한 문자열로 만들어 반환

arg을 넣는 기준은 string은 각 value 뒤, 그 외 iterable은 ‘,’ 이다.

'!'.join('배고파') -> output: 배!고!파!'-'.join(['hi', 'hello']) -> output: hi-hello
  1. <class str>. replace(old, new[, count]) : 바꿀 대상의 글자를 새로운 글자로 바꿔서 반환. count를 지정하면 해당 갯수만큼만 시행.
  2. 'yayaya!'.replace('a', '_')'woooooowooooo'.replace('o', '', 3)output:y_y_y_wooowooooos = 'wooooowoooo's2 = s.replace('o', 'x')print(s, s2)output:s = wooooowoooos2 = wxxxxxwxxxx
  3. .strip([chars]): 특정한 문자들을 지정하면, 양쪽을 제거한다. 지정하지 않으면 default value는 공백.

(9).lstrip([chars]) & .rstrip([chars]) : 왼쪽제거, 오른쪽 제거

  • strip은 패턴을 읽고 제거하기 때문에 chars와 조금이라도 유사한 부분은 제거한다. 예를 들어, ’hehehehihihi’에서 lstrip으로 he를제거하라고 하면 heheheh를 제거해서 ihihi가 나옴.
  1. .find(x) : string 내 첫 x의 index를 반환. 없으면, -1를 반환.
  2. .index(x) : string 내 첫 x의 index를 반환. 없으면, 오류를 반환.
  3. .split(chars='arg') : 문자열을 chars를 기준으로 나누어 리스트로 반환. chars의 default value는 ’ ’ (띄어쓰기) 이다.
  4. 그 외 참/거짓 반환 메소드: .isbulabula()
  5. ex) .isdecimal(), .isspace() , .istitle()

4.2 LIST Method (리스트 메소드)

  1. .append(x) : 리스트에 x값을 추가한다. x가 iterable type일 때, iterable value만 뽑아서 추가하는 것이 아니라 하나의 객체로 인식해서 추가한다. 이를 고려해서 사용해야 한다.

ex) list.append([1, 2]) -> list = [[1, 2]]

  1. .extend(iterable) : 리스트에 iterable 값을 붙일 수 있다. iterable 내 value들을 하나씩 리스트에 추가한다. 그래서 string을 넣으면 문자 하나하나씩이 list value로 추가됨으로 주의해야한다.

ex) list.extend([1, 2]) -> list = [1, 2]

  1. .insert(i, x) : 정해진 위치 i에 x 값을 추가. i가 list의 길이를 넘어서면 무조건 마지막에 하나만 추가된다.
  2. .remove(x) : 리스트에서 값이 x인 것을 삭제. remove는 값이 없으면 오류 발생.
  3. .pop(i) : 정해진 위치 i에 있는 값을 삭제하며, 그 항목을 반환한다. i가 지정되지 않으면 default로 마지막 항목을 삭제하고 반환한다.
  4. .index(x) : 원하는 x값을 찾아 index 값을 반환. index 도 찾는 value x가 없으면 오류 발생.
  5. .count(x) : list 내 원하는 x 값의 갯수를 반환.
  6. .sort() : list를 정렬해줌. .sorted()와 다르게 원본 list를 변형시키고, None을 리턴.

(9)sorted(list): iterable을 정렬해서 list로 반환. 원본 list를 변형시키지 않고, 정렬된 list을 리턴.

  1. .reverse() : list 내 value의 순서를 반대로 뒤집는다. (정렬 아님)
  2. 복사
  • 파이썬에서 모든 변수는 객체의 주소(id)를 가지고 있을 뿐이다.
    • 변수를 생성하면, 메모리에 객체를 생성하고 변수에는 객체의 주소가 저장된다.
    • namespae에 있는 변수가 memory에 형성된 객체를 가르키고 있다는 뜻이다.
    • mutable 자료형과 immutable 자료형은 서로 다르게 동작한다.
    • 즉, call by reference라는 것.
    • mutable한 자료형인 list, set, dictionary은 namespace에 있는 변수명이 메모리에 있는 자료를 가르키고, 변형 시 원본이 남지 않는다.
    • immutable한 tuple 같은 type은 메모리 내 자료를 가르키지만, 변형 시 원본이 남는다.
  • Shallow Copy
    • When you make another instance that is referencing the same memory of original instance, it looks like copy instance has copied the original instance. But, actually they reference the same data in memory. So they cannot be said truly copied.
    • When one of original instance or copied instance has changed, both are changed. It’s because data in the memory which both instance have referenced has been changed.
    • copy_instance = copy.copy(original_instance)
  • Deep Copy
    • When you want to copy an instance for real, you have to use deep copy.
    • copy_instance = copy.deepcopy(original_instance)
  1. .clear() : 리스트의 모든 항목을 삭제한다.
  • literal 하게 list = [] 이라고 한다고 삭제되지 않는다. 이는 value가 삭제되는 것이 아니라, 메모리 내 새로운 빈 list를 지칭하고 있는 것이다.
  • clear 메소드를 써야 실제로 value가 삭제된다.
  • shallow copy 상황에서, clear를 쓰면 원본과 카피본 모두 삭제 되고, literal 을 사용하면 해당 객체만 빈 리스트를 가르키는 것으로 바뀐다.
  1. List Comprehension
  • list_name = [value to append <조건문/반복문>]
  • 조건문과 반복문이 중첩될 때에는, 상위 명령문을 앞에다 쓰면 된다.
  • ex) even = [number for number in range(1, 10) if number % 2 == 0]
728x90