해당 포스팅은 네이버 부스트캠프 AI Tech 학습 정리 자료임을 알려드립니다.
1. 강의 정리
최성철 교수님 - Variables
1) Variables & Memory
student = "sooho"
위에 코드블럭이 말하는 내용은 무엇일까요? student라는 변수에 "sooho"라는 값을 넣으라는 의미와 같습니다. 변수는 메모리 주소를 가지는 장소라고 생각하면 됩니다. 이때, 우리가 넣어준 값은 어디로 갈까요? 바로 변수가 가지고 있는 메모리 주소에 값이 할당되게 됩니다.
2) Basic operations
간단한 연산에는 기본적인 사칙연산과 문자열 처리 등이 포함되어 있습니다. 먼저, 기본 자료형(primitive data type), 연산자와 피연산자, 데이터 형 변환 등의 내용을 알아야 합니다.
기본 자료형(primitive data types)은 아래와 같은 데이터 타입들을 가지고 있습니다.
유형 | 설명 | 예시 | 선언 형태 | ||||
수치자료형 | 정수형 | integer | 양/음의 정수 | 1,2,3,100,-9 | data = 1 | ||
실수형 | float | 소수점이 포함된 실수 | 10.2, -9.3, 0.5 | data = 0.5 | |||
문자형 | string | 따옴표에 들어가 있는 문자형 | abc, a20abc | data = 'abc' | |||
논리형 | boolean | 참 또는 거짓 | True, False | data = True |
다음은 연산자와 피연산자에 대해 알아보고자 합니다. 연산자에는 +,-,*,/와 같은 기호들이 포함되어 있습니다. 피연산자는 "5+2"에서 5와 2에 해당됩니다. 여기서 주의할 것은 문자 간에도 + 연산이 가능합니다. 예를 들어, 'a'+'B'를 하게 되면, 'aB'로 합쳐지게 됩니다.
데이터 형 변환은 정수형(int) ↔ 실수형(float), 숫자↔문자열, 데이터 형 확인하는 방법(type())을 배웠습니다. 정수형(int) ↔ 실수형(float) 관계에서는 실수형을 정수형으로 만들 때, 소수점을 버린다는 특징이 있습니다. 숫자 ↔문자열 관계에서는 숫자도 문자열로 변경이 str() 명령어를 활용하면 가능합니다.
3) list(또는 Array)
리스트는 시퀀스 자료형, 여러 데이터들의 집합입니다. int, float 같은 데이터 타입을 포함할 수 있습니다. 특히, 리스트 내부에 여러 가지 데이터 타입을 동시에 가질 수 있습니다. list는 아래와 같은 특징을 가지고 있습니다.
-
인덱싱(indexing)
-
list에 있는 값들은 주소(offset)를 가진다. 주소를 사용해서 할당된 값을 호출할 수 있습니다.
-
-
슬라이싱(Slicing)
-
list의 값들을 잘라서 쓰는 것이 슬라이싱이라고 하는 데, 주소 값을 기반으로 부분 값을 반환할 수 있습니다.
-
-
리스트의 연산
-
리스트 연산에는 concatenation('+'), in(존재 여부 반환), append(추가), extend(리스트에 새로운 리스트 추가), insert(원하는 주소에 값을 추가), remove(값을 제거), del(주소로 값을 제거)
-
-
리스트 메모리 저장 방식
-
파이썬은 해당 리스트 변수에는 리스트 주소 값이 저장됩니다.
-
-
패킹과 언패킹
-
패킹 : 한 변수에 여러 개의 데이터를 넣는 것
-
언패킹 : 한 변수의 데이터를 각각의 변수로 반환
-
-
이차원 리스트
-
리스트 안에 리스트를 만들어 행렬(Matrix) 생성할 수 있습니다.
-
최성철 교수님 - Function and Console I/O
1) Function
function은 어떤 일을 수행하는 코드의 덩어리를 말하는 데, 반복적으로 호출해야 할 경우 function을 만들어서 사용하면 편리합니다. 함수 선언 문법은 다음과 같습니다.
def 함수이름(parameter):
수행문 #1(statements)
수행문 #2(statements)
return 반환값
보통 작성된 함수는 메인 프로그램이 수행되면서 필요한 지점에서 불러와서 사용하게 됩니다. 함수의 형태는 반환 값(return value)과 parameter의 유무에 따라 함수의 형태가 다릅니다.
2) Console in/out
보통 데이터를 입력받아 수행할 때에 사용하는 명령어는 input()을 사용합니다. 이 함수는 입력받은 데이터 형태가 string 형태이기 때문에 숫자 연산을 위해서는 반드시 int()로 변경해줘야 합니다.
print formatting 방법에는 기본적으로 3가지 방법이 존재합니다. 최근에 자주 사용되는 것은 fstring입니다.
print('I eat %d apples.' % 3) # % string
print('I eat {} apples.'.format(3)) # str.format()
three = 3
print(f'I eat {three} apples.') # f-string
최성철 교수님 - Conditionals and Loops
1) 조건문(condition)
조건문은 조건에 따라 특정한 동작을 하게 하는 명령어입니다. 조건문은 조건을 나타내는 기준과 실행해야 할 명령으로 구성되게 되는데, 조건의 참과 거짓에 따라 명령이 실행 여부를 결정하게 됩니다. 파이썬의 대표적인 조건문은 if, else, elif 등이 있습니다. 기본적인 if-else, if-elif-else 구문은 알고 계시리라 생각하면서 헷갈리기 쉬운 내용을 위주로 설명하겠습니다.
if 문에는 보통 비교 연산자를 통해서 참/거짓을 구분하게 되는 데, 그중에 꼭 알아야 할 'x is y'와 'x == y'의 차이를 알아보고자 합니다. 기본적으로 'x is y'는 동일한 위치의 id값을 가지고 있는지에 대한 여부를 판단하는 연산자입니다. 파이썬에서 -5부터 256까지는 이미 파이썬에서 메모리를 할당되어있기 때문에 True를 반환합니다. 하지만, 위에서 말씀드린 범위 -6은 새로 할당하기 때문에 False를 반환하게 됩니다. 'x==y'는 값이 동일한 지 확인하는 비교 연산자입니다. 두 개의 차이를 반드시 알고 넘어가야 합니다.
삼항 연산자는 한 줄에 조건과 실행문을 같이 작성하는 방식입니다. 예시는 아래와 같습니다.
number = 10
alpha = True if number % 2 == 0 else False #삼항 연산자
2) 반복문(loop)
반복문은 정해진 동작을 반복적으로 수행하게 하는 명령문입니다. 반복문은 반복 시작 조건과 종료 조건, 수행 명령으로 구성되어 있습니다. 파이썬의 반복문에는 for, while 등이 있습니다. for와 while의 가장 큰 차이는 정해진 횟수가 있는가입니다. for의 경우 in 뒤에 문자형이나 range 등의 조건을 통해 횟수를 지정해줍니다. 하지만, while의 경우 조건이 만족하지 않을 때까지 계속 loop문을 실행합니다. 이때, 반복을 제어하는 방법으로는 break와 continue 등을 통해서 loop문을 나갈 수 있게 됩니다.
반복문을 실행할 때에는 debugging을 위해서 print문으로 출력하면서 loop문이 어떻게 돌아가는지 확인하기 쉽습니다. 여기서 디버깅(debugging)은 코드의 오류를 발견하여 수정하는 과정을 말합니다. 디버깅에는 문법적 에러와 논리적 에러가 있는데, 문법적 에러의 경우 에러 메시지를 통해 분석할 수 있습니다. 논리적 에러의 경우 중간중간 프린트 문을 통해 해결할 수 있습니다.
최성철 교수님 - String and advanced function concept
1) 문자열(String)
문자열은 시퀀스 자료형으로 문자형 data를 메모리에 저장합니다. 영문자 한 글자는 1byte의 메모리 공간을 사용하는 특징을 가지고 있습니다. 여기서 1 byte = 8 bit = 256까지 저장이 가능합니다(1bit는 0 or 1). 데이터 타입 별로 메모리 공간을 할당받는 크기가 다릅니다. int형의 경우 4바이트, 실수형의 경우 8바이트를 할당받습니다. 추후에 메모리가 부족할 때, 데이터를 어떻게 선언하는지에 따라 메모리의 효율적 활용이 가능해집니다.
문자열로 각 문자는 개별 주소(offset)를 가집니다. 그래서, 이 주소를 통해서 할당된 값에 접근할 수 있습니다. 리스트와 비슷하게 슬라이싱(slicing)도 가능합니다. 문자열 함수에서 잘 사용되는 종류를 아래의 표에서 확인할 수 있습니다.
함수명 | 기능 | 함수명 | 기능 |
len(a) | 문자열의 문자 개수 반환 | a.upper() | 대문자로 변환 |
a.lower() | 소문자로 변환 | a.capitalize() | 첫문자를 대문자로 변환 |
a.title() | 띄워쓰기 후 첫글자만 대문자 | a.count(문자) | 문자의 횟수 반환 |
a.find(문자), a.rfind(문자) | 문자가 들어간 위치 반환 | a.startwith(문자) | 문자로 시작하는 문자열 여부 반환 |
a.endwith(문자) | 문자로 끝나는 문자열 여부 반환 | a.strip() | 좌우 공백을 없앰 |
a.rstrip(), a.lstrip() | 오른쪽/왼쪽 공백을 없앰 | a.split() | 공백을 기준으로 나눠 리스트로 반환 |
a.split(문자) | 문자를 기준으로 나눠 리스트로 반환 | a.isdigit() | 문자열이 숫자인지 여부 반환 |
a.islower() | 문자열이 소문자인지 여부 반환 | a.isupper() | 문자열이 대문자인지 여부 반환 |
참고사항
1. 문자열에서 큰 따옴표나 작은따옴표를 어떻게 표현할 수 있는가?
- 큰따옴표로 문자열을 정의하면, 작은따옴표가 안에 들어가 있어도 문자로 인식합니다.
2. 두줄 이상은 어떻게 저장할까?
- \n이나 ''' '''로 저장할 수 있습니다.
2) 함수(function)
함수에서 parameter를 전달하는 방식에는 총 3가지 방법이 존재합니다. 첫 번째, 값에 의한 호출(Call by Value)은 함수에 인자를 넘길 때 값만 넘깁니다. 함수 내에 인자 값 변경 시에 호출자에게 영향을 주지 않습니다. 두 번째, 참조에 의한 호출(Call by Reference)은 함수에 인자를 넘길 때 메모리 주소를 넘깁니다. 함수 내에 인자 값 변경이 되면 호출자의 값도 변경이 됩니다. 마지막으로 객체 참조에 의한 호출(Call by Object Reference)은 객체의 주소가 함수로 전달되는 방식입니다. 전달된 객체를 참조하여 변경 시 호출자에게 영향을 주나, 새로운 객체를 만들 경우 호출자에게 영향을 주지 않습니다. 아래는 객체 참조에 의한 호출의 예시입니다.
def spam(eggs):
eggs.append(1) # 기존 객체의 주소값에 [1] 추가
eggs = [2, 3]
ham = [0]
spam(ham)
print(ham) # [0, 1]
함수에서 변수 간의 값을 교환(Swap)하는 함수가 존재하는데, 굉장히 헷갈리는 부분이 많이 있습니다. 아래의 예시를 통해서 확인해보겠습니다. swap_offset은 리스트의 전역 변수 값을 직접 변경하는 것을 의미합니다. swap_reference는 리스트 객체의 주소 값을 받아 값을 변경하는 것을 의미합니다.
# 1번 함수
def swap_value(x, y):
temp = x
x = y
y = temp
# 2번 함수
def swap_offset(offset_x, offset_y):
temp = a[offset_x]
a[offset_x] = a[offset_y]
a[offset_y] = temp
# 3번 함수
def swap_reference(list, offset_x, offset_y):
temp = list[offset_x]
list[offset_x] = list[offset_y]
list[offset_y] = temp
# 테스트
a = [1,2,3,4,5]
swap_value(a[1], a[2])
print(a) # [1,2,3,4,5] swap 발생 안함.
swap_offset(1,2)
print(a) # [1,3,2,4,5] swap 발생.
swap_reference(a, 1, 2)
print(a) # [1,3,2,4,5] swap 발생.
변수의 범위(Scoping Rule)는 변수가 사용되는 범위라고 말하는 데, 여기에는 지역변수와 전역 변수가 존재합니다. 지역변수는 함수 내에서만 사용되는 변수, 전역 변수는 프로그램 전체에서 사용되는 변수입니다. 주의해야 할 부분으로 전역 변수는 함수에서 사용이 가능합니다. 하지만, 함수 내에 전역 변수와 같은 이름의 변수를 선언하면 새로운 지역 변수가 생기게 됩니다.
함수의 종류 중 자기 자신을 호출하는 재귀 함수(recursive Function)도 존재합니다. 점화식과 같은 재귀적 수학 모형을 표현할 때 주로 사용됩니다. 재귀 종료 조건이 존재해서, 종료 조건까지 함수 호출을 반복합니다. 예시로는 팩토리얼을 구하는 방법이 대표적입니다.
python 3.5 버전 이후로 PEP 484에 기반하여 function type hints 기능을 제공하고 있습니다. type hints는 function을 만들 때, parameter와 반환 값의 변수형을 확실하게 알 수 있다는 장점이 있습니다. 아래는 type hints를 적용한 예시입니다.
def type_hint_example(name: str) -> str:
return f"Hello, {name}
마지막으로 함수 작성 가이드라인에 대해서 정리해봤습니다.
함수 작성 가이드라인
1. 함수는 가능하면 짧게 작성할 것
2. 함수 이름에 함수의 역할, 의도가 명확히 나타나도록 할 것
3. 하나의 함수에는 유사한 역할을 하는 코드만 포함
4. 인자로 받은 값 자체를 바꾸진 말 것
2. 피어 세션 정리
알고리즘 문제 풀어보기(백준 2599번)
알고리즘 풀어온 것을 보고 서로 피드백해주고 추가 보완하는 방법에 대해 토의했습니다. 오늘 과제들과 강의 수가 많아져서 내일 알고리즘 말고 basic_math를 반드시 풀어오기로 했습니다.
3. 과제 진행 상황
basic_math와 text processing 1 문제 풀기 완료
참고) git을 이용해서 제출하기 위한 순서
1. 문제 링크를 클릭합니다.
2. git clone <url주소>
3. 코드를 수정합니다.
4. git status로 변동사항이 있는 파일을 확인합니다.
5. git add *.py로 py파일을 추가시킵니다.
6. git commit -m "Update my code"
7. git push origin main
8. 채점을 기다립니다.
문제 풀면서 알게 된 점 : strip() 명령어를 적용할 때는 새로운 변수에 입력해줘야 변경사항이 적용이 된다. A.sort()처럼 내부적으로 변경사항을 반영하지 않습니다.