코딩하는 해맑은 거북이

인공지능(AI) 기초 다지기 (2) 본문

AI

인공지능(AI) 기초 다지기 (2)

#CJE 2022. 12. 12.
본 게시물의 내용은 '인공지능(AI) 기초 다지기(부스트코스)' 강의를 듣고 작성하였다.
해당 글은 1-2. 파이썬 기초 문법 4가지 파트를 다룬다.
1. Variables
2. Function and Console I/O
3. Conditionals and Loops
4. String and advanced function concept

 

1. Variables

- 변수 (Variable)

: 데이터(값)을 저장하기 위한 메모리 공간의 프로그래밍상 이름, 값을 저장하는 장소
변수는 메모리 주소를 가지고 있고, 변수에 들어가는 메모리 주소에 할당됨
선언 되는 순간 메모리 특정영역에 물리적인 공간이 할당됨
ex) A = 8 의미 : A라는 이름을 가진 메모리 주소에 8을 저장하라


- Basic Operation (간단한 연산)

1) 기본 자료형 (Primitive data type)

* 파이썬은 코드 실행시점에 데이터의 Type을 결정하는 Dynamic Typing 방법을 사용한다!

2) 연산자(Operator)와 피연산자(Operand)
- 연산자 : +, -, *, / 같은 기호
- 피연산자 : 연산자에 의해 계산되는 숫자들
ex) 3+2 : 3, 2는 피연산자 / +는 연산자
* 연산의 순서는 수학에서 연산 순서와 같음
* 문자간에도 + 연산이 가능하다 → concatenate

3) 데이터 형 변환
정수형 ↔ 실수형 : float() 함수와 int() 함수를 사용하여 데이터의 형 변환 가능
숫자 ↔ 문자열 : str() 함수를 사용하여 데이터의 형 변환 가능
* 데이터 형 확인하기 : type() 함수

- List 또는 Array

: 시퀀스 자료형, 여러 데이터들의 집합 / 다양한 데이터 타입 포함
cf) Python 리스트만의 특징 : 다양한 Data Type이 하나의 List에 들어갈 수 있다.

* List 특징 7가지
(1) 인덱싱 (Indexing)
list에 있는 값들은 주소(offset)을 가진다 → 주소를 사용해 할당된 값을 호출
(2) 슬라이싱 (Slicing)
list의 주소 값을 기반으로 부분 값으로 반환
(3) 리스트 연산
- concatenation : 두 개의 리스트를 하나의 리스트로 합치는 연산 가능
- is_in : 특정한 값이 존재하는지 여부 확인
(4) 추가, 삭제
- 추가 : append(값), insert(인덱스, 값), extend(리스트)
- 삭제 : remove(값), pop(공백 or 인덱스), clear(), del list[인덱스]
(5) 메모리 저장 방식
파이썬은 해당 리스트 변수에는 리스트 주소값이 저장된다.
cf) copy : 리스트[:]로 할당하면 다른 주소값을 가질 수 있음. 단, 1차원에서만 가능하다
2차원에서 copy하는 방법 → copy.deepcopy() 함수 사용 (import copy)
(6) 패킹과 언패킹
- 패킹 : 한 변수에 여러 개의 데이터를 넣는 것
- 언패킹 : 한 변수의 데이터를 각각의 변수로 반환
(7) 이차원 리스트
리스트 안에 리스트를 만들어 행렬(Matrix) 생성

2. Function and Console I/O

- Function

: 어떤 일을 수행하는 코드의 덩어리, 반복적인 수행을 1회만 작성 후 호출 할 수 있다는 장점이 있음
코드를 논리적인 단위로 분리 → 캡슐화 : 인터페이스만 알면 타인의 코드 사용

* 함수 선언 문법

* parameter vs argument
- parameter : 함수의 입력 값 인터페이스
- argument : 실제 parameter에 대입된 값

- Console in/out

input() : 콘솔창에서 문자열을 입력받는 함수
print() : 출력하는 함수, 콤마(,)를 사용할 경우 print 문이 연결됨.

- Print formatting

1) % string = %-format 》 old-school formatting
print( "%datatype" %(variable) )
ex) print('%s %s' %('one', 'two'))

datatype


2) format 함수 》 old-school formatting
print( " ~ {인덱스 : datatype} ~ ".format(argument) )
ex) print("My name is {0} and {1} years old.".format(name, age))
ex) print("product: {0}, price per unit: {1:.3f}.".format("apple", 5.243))


3) f-string
print( f" ~, {argument} ~" )

f-string 예시



* padding : 여유 공간을 지정하여 글자배열 + 소수점 자릿수 맞추기
print("Product: %10s, Price per unit: %10.3f." % ("Apple", 5.243))
print("Product: {0:>10s}, Price per unit: {1:10.3f}.".format("Apple", 5.243))
→ '>' 표시는 오른쪽 정렬, '<'로 바꾸면 왼쪽 정렬, '^'는 가운데 정렬

* naming : 표시할 내용을 변수로 표시하여 입력
print("Product: %(name)10s, Price per unit: %(price)10.5f." %{"name":"Apple", "price":5.243})
print("Product: {name:>10s}, Price per unit: {price:10.5f}.".format(name="Apple", price=5.243))

3. Conditionals and Loops

- Condition, 조건문

: 조건에 따라 특정한 동작을 하게하는 명령어, 조건을 나타내는 기준실행해야 할 명령으로 구성

* if-else문 문법
1) 조건 판단 방법
- 비교 연산자

※ is는 메모리 주소를 비교한 것

- 논리 키워드 : and, or, not
* 삼항 연산자 (Ternary operators) : [true_value] if [condition] else [false_value]

2) 조건 일치 시 수행 명령 block ":"와 들여쓰기
3) 조건 불일치 시 수행 명령 block

- Loop, 반복문

: 정해진 동작을 반복적으로 수행하게 하는 명령문, 반복 시작 조건, 종료조건, 수행 명령으로 구성

* for loop
기본적인 반복문 : 반복 범위를 지정하여 반복문 수행

* while문
조건이 만족하는 동안 반복 명령문 수행

* 반복의 제어
- break : 특정 조건에서 반복 종료
- continue : 특정 조건에서 남은 반복 명령 skip
- else : 반복 조건이 만족하지 않을 경우 반복 종료 시 1회 수행



- Loop & Control Lab

* 가변적인 중첩 반복문 (Variable nested loops)
: 실제 프로그램에서는 반복문은 사용자의 입력에 따라 가변적으로 반복되고, 하나의 반복이 아닌 중복되어 반복이 일어남

- Debugging, 디버깅

: 코드의 오류를 발견하여 수정하는 과정
오류의 '원인'을 알고 '해결책'을 찾아야 함
문법적 에러를 찾기 위한 에러 메시지 분석
논리적 에러를 찾기 위한 테스트도 중요

4. String and advanced function concept

- String, 문자열

: 시퀀스 자료형으로 문자형 data를 메모리에 저장, 영문자 1글자는 1byte의 메모리 공간을 사용

* 1Byte의 메모리 공간?
컴퓨터는 2진수로 데이터를 저장된다. 이진수의 한 자릿수는 1bit로 저장된다. 즉 1bit는 0 또는 1.
컴퓨터는 문자를 직접적으로 인식하지 않는다! → 모든 데이터는 2진수로 인식
이를 위해 2진수를 문자로 변환하는 표준 규칙을 정함 → 아스키코드

* 프로그램 언어에서 데이터 타입
각 타입별로 메모리 공간을 할당 받은 크기가 다르다. 메모리 타입은 메모리 효율적 활용을 위해 매우 중요!


* 문자열 특징 2가지
(1) 인덱싱 (Indexing)
문자열의 각 문자는 개별 주소(offset)를 가짐. 이 주소를 사용해 할당된 값을 가져오는 것.
각 문자의 오프셋은 왼쪽에선 0부터, 오른쪽에선 -1부터 시작함
(2) 슬라이싱 (Slicing)
문자열의 주소값을 기반으로 문자열의 부분값을 반환

* 문자열 연산 및 포함여부 검사
덧셈과 뺄셈의 연산이 가능함.
in 명령으로 포함 여부 체크 (ex) if 'A' in 'ABCDE':

* 문자열 함수

a.startswith('abc')로 변경


* 특수 문자
문자열을 표시할 때 백슬래시 "\"를 사용하여 키보드로 표시하기 어려운 문자들을 표현한다.


* raw string
특수문자 특수 기호인 \escape 글자를 무시하고 그대로 출력함

 

- Function Ⅱ

* 함수에서 parameter를 전달하는 방식 3가지
(1) 값에 의한 호출 (Call by Value)
- 함수에 인자를 넘길 때 값만 넘김
- 함수 내에 인자 값 변경 시, 호출자에게 영향을 주지 않음

(2) 참조에 의한 호출 (Call by Reference)
- 함수에 인자를 넘길 때 메모리 주소를 넘김
- 함수 내에 인자 값 변경 시, 호출자의 값도 변경됨

(3) 객체 참조에 의한 호출 (Call by Object Reference) 》 파이썬 함수 호출 방식
- 객체의 주소가 함수로 전달되는 방식
- 전달된 객체를 참조하여 변경 시, 호출자에게 영향을 주지만
새로운 객체를 만들 경우 호출자에게 영향을 주지 않음


* Scoping Rule, 변수의 범위
- 지역변수(local variable) : 함수 내에서만 사용
- 전역변수(global variable) : 프로그램 전체에서 사용
전역변수는 함수에서 사용 가능하다. But, 함수 내에서 전역변수와 같은 이름의 변수를 선언하면 새로운 지역변수가 생김
→ 함수 내에서 전역변수 사용 시 global 키워드 사용

* Recursive funtion, 재귀함수
자기 자신을 호출하는 함수로 점화식과 같은 재귀적 수학 모형을 표현할 때 사용.
재귀 종료 조건 존재, 종료 조건까지 함수 호출 반복

* Funtion type hints
파이썬의 가장 큰 특징인 Dynamic typing의 단점 : 처음 함수를 사용하는 사용자가 interface를 알기 어렵다.
그래서 python 3.5 버전 이후로는 PEP 484에 기반하여 type hints 기능 제공

- Type hints의 장점
(1) 사용자에게 인터페이스를 명확히 알려줄 수 있다.
(2) 함수의 문서화시 parameter에 대한 정보를 명확히 알 수 있다.
(3) mypy 또는 IDE, linter 등을 통해 코드의 발생 가능한 오류를 사전에 확인
(4) 시스템 전체적인 안정성을 확보할 수 있다.

* Docstring
파이썬 함수에 대한 상세스펙을 사전에 작성 → 함수 사용자의 이행도 UP
세개의 따옴표로 docstring 영역 표시 (함수명 아래)
cf) VS-Code 에서 docstring을 다운받으면, ctrl+shift+P 한 후 docstring을 입력하면 자동으로 기본적인게 뜸.

Comments