본문 바로가기

KOSA 클라우드 솔루션즈 아키텍트 양성과정

[5.10] Python 2일차

# 입력 받은 숫자를 문자가 아닌 숫자로 처리하고 싶을 때

- 데이터 변환 함수 (클래스의 생성자) 사용

- 문자열을 정수로 변환 : int()

 

# type() : 함수로 보이지만 실제로는 클래스

- type을 이용하면 객체의 클래스를 알 수 있음

 

 

# 변수란?

- 값(데이터)을 담는 그릇

- 종류와 크기

- 데이터의 종류와 크기에 따라 데이터 타입이 결정

- 이 데이터를 담는 변수의 데이터 타입도 결정

 

# 정적(static)  vs 동적(dynamic)

# 정적 타입 언어 vs 동적 타입 언어

#  pre-run-time(compilation-time) vs run-time

# 동적 타입 언어 : 변수가 프로그램 실행 중에 어떤 타입이든 저장 가능 즉, 변수가 특정 데이터 타입으로 결정X

# 정적 타입 언어 : 변수에 데이터 타입을 미리 선언 즉, 해당 변수는 사전에 선언된 데이터 타입만 저장 가능

# 파이썬은 강타입 언어이면서 동적 타입 언어

  - 올바른 데이터를 사용하지 않으면 TypeError, ValueError
  - 변수는 선언 없이 바로 생성, 대신 초기화 필요

  - 선언은 어떤 데이터 타입을 사용할지 준비하는 것

# 파이썬에서 생성한 변수와 객체의 목록을 보고 싶다면 dir()함수 사용:  print(dir())

#  id() : 객체의  ID(주소) 반환

 

# Scalar 형

  - 단일값 :  숫자형(int, float, complex), 불형(bool형), None 등

 

 # Collection  형

  - 다중값 : 원소(element)들로 구성됨

 

  - 시퀀스 : 데이터가 순서대로 저장 (순서는 0번부터 시작)

    - mutable (가변 시퀀스) : 변경 가능 - 리스트

    - immutable (불변 시퀀스) : 값 변경 불가 - 문자열, 튜플

 

  - 매핑

    - 사전(dictionary, item) : 원소가 키와 값의 쌍으로 구성됨

                                    키는 해시가능한 데이터 타입이어야 함(보통 immutable)

                                    순서X

 

  - 집합(set)

    - 순서X

    - 중복X

  

 

# boolean type

 -  파이썬에서는  True, False (첫 글자 대문자에 주의)

 

# dll(dynamic linking library)

  - 윈도우에서만 사용하며, 실행 중에 필요할 때 연결

 

# 리스트

  - cf.) 베열(array) : 모든 원소가 같은 타입 (배열도 Collection 형의 sequence 타입)

  - 리스트 리터럴 : 대괄호[] 사용

  - 리스트 함수(클래스) : list()

 

# 인덱싱(Indexing) : 색인

  - Collection 형에서 원소(아이템)에 접근하는 것

  - 대괄호[] 사용

  - 시권스 형은 반드시 0부터 시작, 정수형

  - 사전(dictionary)은 키로 접근

 

# 슬라이싱(Slicing)

  - 시퀀스 형의 원소 토막을 반환

  - 슬라이싱의 결과는 해당 시퀀스 형과 같음 (문자열을 슬라이싱하면 문자열, 튜플을 슬라이싱 하면 튜플 등)

  - 종료위치의 값은 포함하지 않음

  - 종료위치의 값을 포함하지 않는 것은 시퀀스를 분리할 때 편리함을 제공

 

# 표현식(expression, expr)

  - 평가(evaluation)한 결과가 값이 되는 것

 

# 튜플(Tuple)

  - 튜플 리터럴 : 소괄호() 사용

  - 튜플 함수(클래스) : tuple()

  - cf.) 리스트와 다른 점 하나 : 원소 변경 불가능 즉, immutable 시퀀스

 

# 사전(dictionary, dict)

  - 사전 리터럴 : 중괄호 {} 사용

  - 아이템 키, 값 쌍은 콜론으로 구분

  - 순서 없는 자료형

  - 키 값은 같으면 안 됨

  - 만약 같은 키를 가진 아이템이 있으면 마지막 key에 대응되는 value가 출력됨

  - 사전의  키는 hashable 객체여야 함(쉽게 말하면 immutable의 느낌)

 

# Collection의 원소 제거

  - del 명령어 : 객체 제거

  - 해당 컬렉션의 메소드 사용

 

# GC(Garbage Collector)

  - 메모리 관리 기법

 

# 레퍼런스 카운트

  - 메모리 관리 기법

  - 객체들은 레퍼런스 카운트를 통해 몇 번 참조당하는지 세고 있는데, 0이 되면 메모리 반환

 

# 집합(set)

  - 중복을 허용하지 않음

  - 순서가 없음

  - 인덱싱이 불가능함

  

# 연산자 우선순위

  - 산술 > (비트) > 비교 > 논리 > 대입

 

# 데이터를 논리값으로 판단해야 한다면

  - 값 자체가 False : None, False

  - 숫자 데이터는 0으로 판명되는 것 : 0, 0.0, 0j, Decimal(0), Fraction(0, 1)

  - 빈 시퀀스 또는 컬렉션 : ' ', (), {}, [], set(), range(0)

 

# 논리 리터럴 True, False가 산술연산에 사용되면

  - True는 1

  - False는 0

 

# 동등 비교(==)

  - 값이 같으냐 비교

 

# 일치(is)

  - 객체가 같으냐

 

# 맴버십 연산자 : in, not in

  - 컬렉션과 함께

 

# 흐름제어(Flow Control)

  - 조건문 : if, else, elif

  - 반복문 : for, while

 

# 조건문

  - 조건 : 비교식, 논리값, Truth Value Testing으로 결정

  - if는 필수

  - else는 옵션

  - elif(else if) 옵션, 필요한 만큼 여러번

 

  - for문 : 반복 횟수가 정해져 있음, for문에 사용한 변수는 for문이 끝나더라도 사라지지 않음

  - while문 : 조건이 거짓이 될 때까지 반복

 

# 코드 블록(code block)

  - 프로그램 문장을 묶은 것

  - 파이썬은 띄어쓰기로 코드 블록을 표현

  - 파이썬은 코드블록 직전에 콜론(:)을 사용

  - cf.) 다른 언어들은 보통 {}로 코드를 묶음

 

# short cut evaluation

 - and 혹은 or로만 연결된 논리식에서 앞부분에서 이미 전체 결과가 결정되면 뒷부분은  evaluate하지 않음

  

# 참고

  - ~ : tilde

  - ` : backtick

  - @ : at

  - ^ :  caret

  - * : asterisk

  - [] : square brakets(brace)

  - {} : curly brakets(brace)

  - () : parentheses

  - | : pipe, vertical bar

  - \ : back-slash


# 리스트(list), 튜플(tuple), 사전(dictionary), 집합(set) #

 

Introspection

* 변수가 바인딩하고 있는 input객체에 대한 정보 출력

* 변수명에 ? 붙이는 것을 Introspection이라고 함

 

int의 type은?

* int는 함수가 아니라 클래스

* 클래스의 type 불러내면 생성자인 type클래스가 출력됨

 

선언과 초기화

*  int num; 은 단순히 변수를 선언한 것

* 선언된 변수 num을 10이라는 값으로 초기화

* 파이썬에서는  int num;과 같이 변수를 선언하는 과정이 없고, 바로 초기화부터 함

* 정적 타입 언어는 선언하고 초기화 (C++ 등)

* 동적 타입 언어는 바로 초기화 (파이썬 등)

 

다양한 객체를 바인딩

* 파이썬은 동적 타입 언어이기 때문에, fn변수가 다양한 객체를 바인딩 가능

 

오른쪽에서 왼쪽으로 바인딩

* 대입 연산자(assignment operator)는 오른쪽에서 왼쪽으로 바인딩

* c가 100을 바인딩 -> b가  100을 바인딩한 c를 바인딩 -> a가 c를 바인딩한 b를 바인딩

 

boolean

* True와 False의 타입은 bool

 

리스트

* 리스트 리터럴 -> 리스트 객체 생성 -> 변수에 바인딩

# a_list[0]과 같은 인덱싱 사용하여 해당 인덱스의 값 출력

 

인덱싱

* 리터럴에 직접 인덱싱도 가능은 함

* 보통은 변수에 바인딩한 후 인덱싱함

 

음수 인덱싱

* 음수로 인덱싱하면 오른쪽부터 -1, -2, -3....

 

여러 타입이 들어간 리스트

* 여러 타입을 원소로 가진 리스트

* f-string과 인덱싱을 통해 해당 인덱스의 타입을 출력

 

슬라이싱

* 슬라이싱할 때 종료위치의 인덱스 값은 포함하지 않음

* 리스트에 대한 슬라이싱이니까 결과도 리스트로 출력됨

* 직관적으로 4-2 = 2 니까 2개의 원소가 출력될 것을 알 수 있음

 

빈 리스트

* 비어있는 리스트 만드는 두 가지 방법 []로 빈 리스트로 초기화 하거나, list() 로 초기화

 

빈 리스트에 원소 추가

* append 메소드를 사용하여 1과 빈리스트와 문자열 a를 삽입

 

리스트 안의 리스트에서 인덱싱

* my_list를 출력

* my_list  내의 인덱스1에서 인덱스2의 원소를 출력

 

리스트의 특정 인덱스 변경

*  b리스트의 인덱스1의 값을 3.12321로 변경

 

튜플

* ()를 써도 되고 안 써도 됨

* ()를 쓰지 않을 때도 반드시 ,(콤마)는 사용해야 함

* ()를 사용하지 않고 튜플을 만들어도 자동으로 ()를 씌워줌

* 리스트를 튜플로 만들 수도 있음

 

튜플의 원소 변경 시도

* 튜플은 아이템 할당을 지원하지 않음

 

튜플 내의 리스트 원소 변경

* 튜플 자체의 원소를 변경할 수는 없음

* 튜플 내부에 리스트가 있다면 해당 리스트의 원소는 변경 가능

* 튜플 내부에 있는 리스트는 튜플의 원소이기 때문에 리스트 자체를 다른 값으로 변경은 불가능

 

* (10)과 10은 같음

 

원소가 하나인 튜플

* 원소가 하나인 튜플은 반드시 (10,) 처럼 ,를 찍어야 함

*  t2는 ,를 안 찍은 int 타입이고, t3는 ,를 찍어서 튜플타입

 

사전의 아이템에는 키로 접근

* a_dict에 있는 홍판서라는 value를 꺼내기 위해 키값인 ('홍길동', '아버지')로 인덱싱함

 

리스트는 키가 될 수 없음

 

사전에 아이템 추가하기

* '날짜'라는 키와 20220510이라는 값을 사전의 마지막 원소로 삽입

 

리스트에 아이템 추가

* 리스트는 튜플과 같은 방식의 원소 삽입 불가능

* 리스트에서는  append  메소드를 사용하여 리스트의 마직 원소로 원한는 값을 삽입할 수 있음

 

리스트 중간에 값 삽입

* insert 메소드를 통해 insert(몇 번째 자리에, 어떤 값을 넣을지) 정할 수 있음

 

insert를 통해 리스트 마지막 원소 삽입

* 리스트의 마지막 인덱스에 값을 넣을 때는  append를 쓰는 것이 빠름

* insert 메소드는 리스트 중간에 값을 넣을 때 사용함

 

빈 사전 만들기

* 비어 있는 사전을 만드는 두 가지 방법 

 

del을 통한 객체 제거

* hellow world를 바인딩한 msg변수 값이 del msg명령어 이후 더 이상 출력되지 않음

 

원소 삭제

* pop메소드를 통해 리스트의 마지막 원소를 제거

 

사전에서 키벨류 제거

* del을 통해 a_dict에서 키 값이 100인 키 벨류 쌍을 제거

 

키 값을 통해 아이템 제거

* 키가 c인 키벨류 쌍 제거

* c라는 키가 없으면 '없음' 출력

 

집합형

* 중복을 제거함

 

잡합의 타입

* 집합(set)의 타입은 set

 

중복을 제거해주는 집합

* 중복을 제거함

* 정해진 순서 없이 임의의 순서로 출력됨

 

중복을 제거하지 않는 리스트와 튜플

* 리스트와 튜플은 중복을 제거하지 않음

* 리스트와 튜플은 순서대로 출력됨

 

 


# 사칙연산, 논리연산, 비교연산 #

 

몫과 나머지 연산자

* 파이썬 3.대부터는 정수/정수 하면 실수가 출력됨

* //는 몫을 출력하는 연산자

* %(modulus)는 나머지를 출력하는 연산자

 

True와 False

* 숫자로 사용될 때 True는 1 False는 0

 

short cut evaluation

* 100 or라면 뒤에 볼 필요도 없이 100이 True니까 값도 True인 100이 출력됨

* 'hello' or error 에서  뒤에 error라는 단어까지 읽었다면, 문자열도 아니고 정수형도 아니라서 애러가 나는 게 맞음

* hello만 보고 True로 판단해버리니까 애러 없이 hello가 출력됨

 

비교연산

* 비교연산의 결과는 논리값(True or False)으로 출력됨

 

비교연산(in과 not in)

* in을 통해 리스트 안에 'kiwi'가 있는지 확인, 있으니까  True

* not in을 통해 리스트 안에 9가 있는지 확인, 없으니까  True

 

dict.values

* .values()는 클래스임

* 'one'이 a_dict에 있으니까 True

 

아스키 코드로 비교

* a는 17 b는 4이므로  a와 b의 비교연산 결과 True 출력됨

 

문자열 비교

* 순서대로 비교한다 맨 앞자리 a끼리 비교해보면 같은 값

* a가 같은 값이니까 A와 B의 값을 비교

 

==(값이 같은가)과 is(객체가 같은가)

* l1, l2, l3 값은 같음

* l1과 l2는 저장되어 있는 주소값이 같아서 같은 객체, l3는 주소값이 다름

 

정수는 위의 경우와 조금 다름

* 정수가 256이하일 때에는 1byte이하로 같은 숫자를 바인딩한다면 같은 주소를 가짐

 

정수

* 정수가 257 이상이면 1byte가 넘어가면서 같은 숫자를 바인딩해도 별도의 객체로 생성됨

 

swap을 하고 싶을 때

* a와 b를 swap하고 싶지만 서로 값이 같아짐

 

swap 하는 법

* a객체를 temp변수에 바인딩

* b객체를 a변수에 바인딩

* a가 바인딩 되어 있는 temp 객체를 b에 바인딩

 


# 조건문, 반복문 #

 

 

a와 b가 같을 경우, 다를 경우

* 들여쓰기 간격이 다르면 다른 수준

* 들여쓰기로 흐름제어

 

a와 b가 같을 경우, 다를 경우

* if와 else를 사용하여 a == b인 경우와 a != b인 경우를 표현

 

elif 활용

* elif를 활용해 else와 if를 한 줄의 코드로 작성

 

False값을 바인딩한 경우

* test가 False이므로 Hello가 출력됨

 

반복문

*1부터 9까지의 수를 출력함

* 마지막 수인 10 바로 이전의 수인 9까지만 출력됨

 

세 자리 마다 _를 추가하여 시인성 확보

* 0부터 999까지 출력

* 1_000_000 같은 식으로 세 자리 마다 _입력

 

step을 -1로 줄 때

* 10에서 시작하여 1의 바로 전인 2까지 -1씩 내려감

 

enumerate

* enumerate를 사용하면 인덱스와 벨류를 동시에 받아올 수 있음