본문 바로가기
BOOSTCAMP AI TECH/1주차_Python Basics For AI

[BOOSTCAMP AI TECH] 2일차_파이썬 기초 문법

by 이민우 2021. 1. 19.
728x90
반응형
  • 강의 목록

-Variables

-Function and Console IO

-Conditionals and Loops

-String and advanced function concept


  • 요약

강의

파이썬의 기초적인 문법과 함수들을 학습했다.

변수와 함수, 조건문과 반복문, Console 입출력, 문자형 변수의 사용법 등 여러 가지를 배웠다.

 

피어세션

바쁜 와중 시간을 내어 회의에 참여해주신 조교님과 인사를 나누었다. 이후 질의응답 시간을 가졌고, 앞으로의 활동 방법에 대한 공지를 들었다.

전날 정한 피어세션의 활동 계획을 보다 확실하게 정했다.


  • 학습정리

 

변수

  • 데이터(값을) 저장하는 메모리 공간이다.
  • 메모리 주소를 가진 값은 해당 메모리 주소에 할당된다.

*폰 노이만 아키텍처에서는 사용자가 컴퓨터에 값을 입력하거나 프로그램을 실행시키면 정보를 먼저 메모리에 저장하고 CPU가 순차적으로 정보를 해석하고 계산한 결과값을 전달한다.

 

 

메모리

  • 변수가 선언되는 순간 메모리 특정영역에 물리적인 공간이 할당된다.
  • 변수에는 값이 할당되고 해당 값은 할당된 메모리에 저장된다.

 

변수 타입별 메모리 공간 할당 크기

종류 타입 크기 표현 범위
정수 int 4 byte -2^31~2^31-1
long 무제한 무제한
실수 float 8 byte 10^-308 ~ 10^308

*메모리 공간에 따라 표현할 수 있는 숫자범위가 다름

*데이터 타입은 메모리의 효율적 활용을 위해 매우 중요함

 

변수명 작명법

  • 알파벳, 숫자, 언더스코어로 선언한다.
  • 의미있는 단어로 표기해 협업하는 동료가 알기 쉽게 한다.
  • 대소문자가 구분된다. ex) Abc와 aBC는 다르다.
  • 특별한 의미가 있는 예약어는 사용하지 않는다. (for, while 등)

 

자료형

  • 기본 자료형 (Primitive type) : 프로그램이 제공하는 기본 자료형
유형 설명 선언
수치 정수 integer /음의 정수 a = 10
실수 float 소수점을 포함한 실수 a = 10.1
문자 string 따음표 안의 문자형 a = "abc"
a = 'abc'
논리 boolean 참 또는 거짓 a = True
a = False
  • 참조형 자료형 (Reference type) : 기본형 타입을 제외한 자료형

 

다이나믹 타이핑 (Dynamic Typing)

  • 인터프리터 언어는 실행시점에 데이터의 타입을 결정한다.
  • 그래서 Java, C 계열 언어와 달리 변수 선언 시 자료형을 함께 선언할 필요가 없다.
  • 장점 : 사용자 입장에서 쉬움
  • 단점 : 프로그래밍 속도가 느려짐

 

연산

  • 연산자 (Operator) : 기호
  • 피연산자 (Operand) : 숫자
  • 연산의 순서는 수학의 연산 순서와 같다.
  • string간 +와 *도 가능하다.
연산자 설명 예시 출력
** 제곱 5**3 125
// 정수형 몫 6//4 1
% 나머지 6%4 2
+= 덧셈 연산 3+=1 4
-= 뺄셈 연산 3-=1 2
*= 곱셈 연산 3*=2 6
/= 나눗셈 연산 2/=2 1
float() 실수형 변환 float(10) 10.0
int() 정수형 변환 int(10.3) 10
str() 문자형 변환 str('10.321') 10.321

*++, -- 같은 연산자는 파이썬에 없다.

*피연산자에 float 변수가 포함되어 있으면 결과값은 float 출력

*문자열에 숫자를 더할 경우 에러 발생. 만약 하고 싶으면 숫자에 str() 씌워서 하기

*컴퓨터의 반올림 오차
Python 2.7까지 c=38.8을 저장하면 c=38.799999... 가 저장되는 현상이 있었다.
단순 실수이지만 이진수로 변환 시 무한소수가 되기 때문인데,
반올림 오차는 값이 작아서 일반적으로 문제가 되지 않았다.

 

 

컴퓨터가 2진수를 사용하는 이유

  • 컴퓨터는 실리콘으로 만든 반도체로 구성된다. 반도체는 특정 자극을 가했을 때만 전기를 통하게 하는 물질이기에 전류 흐름 제어가 가능하다.
  • 이를 토대로 컴퓨터는 전류가 흐를 때 1, 흐르지 않을 때 0으로 숫자를 표현한다.
  • 이진수 한 자리를 bit라 칭한다.
byte kiloByte megaByte gigaByte teraByte
8 bit 1024 byte 1024 kb 1024 mb 1024 gb

 

List 자료형

  • 시퀀스 자료형으로 여러 데이터들의 집합이다.
  • 파이썬의 List는 한 가지 데이터 타입으로 통일하지 않아도 된다.
  • List에는 주소값이 저장되어 shallow copy가 가능하다.
  • 인덱싱 (indexing) : list에 있는 값들은 주소(offset)을 가지고 주소로 호출이 가능하다. ex) print(colors[2])
  • 슬라이싱 (slicing) : list의 주소 값을 기반으로 부분 값을 잘라 사용이 가능하다. ex) cities[0:6], cities[-9:], cities[3:]

cities[::2] #2칸 단위로 슬라이싱

cities[::-1] #역 슬라이싱

cities[:9999] #만약 cities9999개가 아니면 되는 데까지만 반환

 

lists = list(range(100))

#----------------------------------------------------#
#--인덱싱--#
#list에 있는 값들은 주소(offset)을 가진다.
#주소를 사용해 할당된 값을 호출할 수 있다.

print(lists[0]) #0
#print(lists[101]) #Error
print(lists.index(10)) #10의 위치 반환
#print(lists.index(101)) #Error

#----------------------------------------------------#
#--슬라이싱--#
#list의 주소 값을 기반으로 부분 리스트로 잘라 활용

print('[:]', lists[:]) #전체
print('list[0:5]', lists[0:5]) #[0,1,2,3,4]
print('list[:5]', lists[:5]) #[0,1,2,3,4]
print('list[-5:]', lists[-5:]) #뒤에서 다섯 개 [95, 96, 97, 98, 99]
print('list[-5:9999]', lists[-5:9999]) #범위 초과시 범위 까지만
print('list[0:10:2]', lists[0:10:2]) #0~10까지 2칸 단위 [0,2,4,6,8]
print('list[10::-1]', lists[10::-1]) #10개 역순
print('list[-90::-1]', lists[-90::-1]) #10개 역순


#----------------------------------------------------#
#--추가--#
color1 = ["red", "blue", "green"]
color2 = ["purple", "black", "white"]

print(color1 + color2) #['red', 'blue', 'green', 'purple', 'black', 'white']
print(color1 * 2) #['red', 'blue', 'green', 'red', 'blue', 'green']

color2.extend(["gray"])
print(color2) #['purple', 'black', 'white', 'gray']
color2.append('gray') 
print(color2) #['purple', 'black', 'white', 'gray', 'gray']
#만약 color2.extend('gray') 하면?
#자연스럽게 split되어 ['purple', 'black', 'white', 'g', 'r', 'a', 'y']이 됨

#----------------------------------------------------#
#--삭제--#
color2.remove('gray')
print(color2) #['purple', 'black', 'white', 'gray']
del color2[len(color2)-1]
print(color2) #['purple', 'black', 'white']

#----------------------------------------------------#
#--검색--#
print("red" in color1) #True
print(color1.index("red")) #0
print(color1[2]) #green

#----------------------------------------------------#
#--기타 연산--#
import numpy as np
print(max(lists), min(lists), sum(lists), np.mean(lists)) #최대, 최소, 합, 평균
print(len(lists)) #길이

strs = 'a b c'
strSplit = strs.split()
print(strs, strSplit)
strsCopy = ''.join(strs)
print(strsCopy)

lists.sort() #정렬
print(lists)
lists.reverse() #역정렬
print(lists)

#----------------------------------------------------#
#--복사--#
a=[1,2,3]
b=[1,2,3]
c=a #얕은 복사
d=a[:] #깊은 복사
print(a == b, b == c, a==d) #true true true
print(a is b, a is c, a is d) #false true false

 

패킹과 언패킹

  • 패킹 : 한 변수에 여러 데이터를 넣는 것
  • 언패킹 : 한 변수의 데이터를 각각의 변수로 반환
#----------------------------------------------------#
#--패킹과 언패킹--#
#패킹 : 한 변수에 여러 데이터를 넣는 것
#언패킹 : 한 변수의 데이터를 각각의 변수로 반환
t = [1,2,3] #1,2,3를 t에 패킹
tCopy = t
a,b,c = t #t의 값들을 a,b,c에 언패킹
print(t, tCopy, a, b, c) #[1,2,3] 1 2 3

#언패킹의 경우에는 원래 값의 변동이 다른 값에 변동을 일으키지 않음.
t[0] = 4
print(t, tCopy, a, b, c)

#deep copy
#1차원은 [:]으로 되지만 2차원부터는 copy.deepcopy만 활용 가능
import copy
tDeepCopy1 = copy.deepcopy(t)
tDeepCopy2 = t[:]
print(t, tDeepCopy1, tDeepCopy2)
t[0] = 0
print(t, tDeepCopy1, tDeepCopy2)

 

Command Line IO

#----------------------------------------------------#
#--CLI 입출력--#
#출력
print('hi','hello') #, 사용시 자동 띄어쓰기
print('hi'+'hello') #+ 사용시 띄어쓰기 없음
#+ 사용시 string과 integer가 섞일 수 없음
#그러니까 + 사용시에는 str()로 형변환 필수
print('hi',100)
print('hi '+str(100))

#출력 양식 지정
# % formatting과 str.format(), fstring 함수 사용
print("%d %d %d" %(1,2,3))
print("{} {} {}".format(1,2,3))
print("{0} {2} {1}".format(1,2,3)) #안의 숫자는 format() 파라미터의 순번
value = 3
print(f"value is {value}")

#소수점 지정
value = 123.456789
#123.45를 출력하려면
print("%.2f" %value)
print("{0:.2f}".format(value))

#패딩 : 여유 공간을 지정하여 글자배열 + 소수점 자릿수 맞추기
name = 'lmw'
age = 27
score = 99.9888
print("name : %s, age : %d, score : %0.2f" %(name, age, score))
print("name : %5s, age : %5d, score : %0.2f" %(name, age, score))
print("name : {0:5s}, age : {1:5d}, score : {2:.2f}".format(name, age, score))
#format의 string 패딩은 디폴트가 왼쪽정렬임
print("name : {0:>5s}, age : {1:5d}, score : {2:.2f}".format(name, age, score))
#그러니까 오른쪽 정렬은 이렇게
print("name : %10s, age : %10d, score : %0.2f" %(name, age, score))
print("name : {0:>10s}, age : {1:10d}, score : {2:.2f}".format(name, age, score))
print("name : {0:10s}, age : {1:10d}, score : {2:.2f}".format(name, age, score))


print(f"name : {name}, age : {age}, score : {score}")
print(f"{name:10}")
print(f"{name:>10}")
print(f"{name:<10}")
print(f"{name:*<10}")
print(f"{name:*>10}")
print(f"{name:*^10}")
print(f"{score:.2f}")

#입력
val = input('입력하세요') #input은 string으로 입력받음
#숫자로 입력받고 싶으면
val = float(input('입력'))
print(val)
val = int(input('입력'))
print(val)
val = eval(input('입력'))
print(val)

 

 

함수 (Function)

  • 특정한 작업을 수행하는 코드의 덩어리
  • 반복적인 수행을 1회 작성만으로 반복 호출이 가능하다.
  • 코드를 논리적이 단위로 분리가 가능하다.

*캡슐화 : 객체의 변수와 함수를 하나로 묶고 구현 내용을 은닉한다. 인터페이스만 알면 타인의 코드 활용이 가능하다.

 

함수의 선언

  • 함수 이름, 파라미터, 들여쓰기, return으로 구성
  • 함수의 선언은 함수가 사용될 코드보다 상단에 작성되어야 한다. 그래야 메모리에 올라가서 사용이 가능하다.
  • 파이썬은 {}을 사용하지 않아 들여쓰기 (indentation)으로 구분한다.
  • 파라미터와 return이 필수인 건 아니다.

*parameter : 함수의 입력 값 인터페이스

*argument : 함수 호출 시 파라미터에 대입하는 값

 

조건문

  • 파이썬의 조건문은 if-elif-else로 활용한다.
  • if문은 조건 미충족시 다음 if문을 순차적으로 실행하기에, 같은 조건문이면 elif로 엮는다.

*파이썬에는 switch문이 없다.

 

 

조건 판단 방법

연산자 비교상태 설명
a < b ab보다 작음  
a > b ab보다 큼  
a == b ab가 같음 같은 값인가
a is b 같은 객체인가
a != b ab가 다름 다른 값인가
a is not b 다른 객체인가
a >= b ab보다 크거나 같음  
a <= b ab보다 작거나 같음  
a and b 둘 다 참이어야 참  
a or b 둘 중 하나만 참이어도 참  
not (a) 참이면 거짓, 거짓이면 참  
all(리스트) 리스트 내에 하나라도 falsefalse  
any(리스트) 하나라도 truetrue  

*데이터는 존재하면 참, 없으면 거짓 => if "abc", if 1 은 참.

 

삼항 연산자 (Ternary operators)

  • 조건문을 사용해 참일 경우와 거짓일 경우를 한 줄에 표현하는 방법

 

반복문

  • for와 while을 사용하고 조건문에는 range를 사용한다.
  • for문은 반복 실행횟수를 명확하게 알 때, while그렇지 않을 때 사용한다.
  • break : 특정 조건에서 반복 종료
  • continue : 특정 조건에서 남은 반복 명령 스킵
  • else : 반복문 뒤에 부착되며, 반복 조건을 만족하지 않으면 실행 (break 시에는 x)

*range(1,5) = [1,2,3,4] / range(0,5) = [0,1,2,3,4] = range(5)

*range(1,10,2) = [1,3,5,7,9] / range(10,1,-1) = [10, 9, 8, 7, 6, 5, 4, 3, 2]

*무한 루프 : 반복 명령이 끝나지 않는 프로그램 오류로 CPU와 메모리 등 컴퓨터 리소스 과다 점유

 

디버깅 (Debugging)

  • 코드의 오류를 발견하고 수정하는 과정 (원인을 알고 해결책을 찾는 과정)
  • 문법적 에러와 논리적 에러가 있다.
  • 문법적 에러 : 들여쓰기 오류, 오탈자, 대소문자 구분 오류 등으로, 인터프리터가 에러 메시지로 알려준다.
  • 논리적 에러 : 의도대로 실행이 되지 않는 코드로, 사이마다 출력문을 입력해 테스트하며 확인해야 한다.

 

문자열 (string)

  • 영문자는 한 글자에 1byte의 메모리 공간을 사용한다.
  • 컴퓨터는 문자를 직접적으로 인식하지 않고 2진수로 인식하기 때문.
  • 이를 위해 2진수를 문자로 변환하는 표준 규칙이 존재한다.
  • 우리나라 같은 경우는 cp940, utf-8

 

문자열은 인덱싱을 가진다

  • 각 문자는 개별 주소(offset)을 가지기에 할당된 값을 가져올 수 있다.
  • ex) a = 'abc' / print(a[0]) #a / print(a[2]) #c / print(a[-1]) #c

 

문자열은 슬라이싱이 가능하다.

  • 문자열의 주소값을 기반으로 부분값 반환이 가능하다.
  • ex) a = 'abcd' / print(a[0:2]) #ab / print(a[-2:]) #cd / print(a[:9]) #abcd / print(a[::2]) #ac

 

문자열은 연산이 가능하다.

  • a = 'abc' / print(a*2) #abcabc

 

문자열은 문자 포함여부 검사도 가능하다.

  • a = 'abc' / if 'a' in a : print(True) #True

 

문자열 함수

함수명 기능 함수명 기능
len(a) a의 길이 a.strip() 좌우 공백 삭제
a.upper() 대문자로 변환 a.rstrip() 우측 공백 삭제
a.lower() 소문자로 변환 a.lstrip() 왼쪽 공백 삭제
a.capitalize() 첫 문자만 대문자로 a.split() 공백을 기준으로 리스트 반환
a.title() 제목형태로 변환
띄어쓰기 후 첫 글자만 대문자
a.split('-') -을 기준
a.count('abc') a에 있는 'abc' 횟수 a.isdigit() 문자열이 숫자인지
a.find('abc')
a.rfind('abc')
a에 있는 ‘abc’ 위치 a.islower() 문자열이 소문자인지
a.startswith('abc') a‘abc'로 시작하는가? a.isupper() 문자열이 대문자인지
a.endswith('abc') a‘abc'로 끝나는가?    

 

다양한 문자열 표현

  • 문자열 선언은 큰따음표도, 작은따음표도 가능하다.
  • 큰따음표 안의 작은 따음표는 문자로 인식한다. ex) print("hi 'lmw'") #hi 'lmw'
  • 하지만 작은 따음표 안의 작은 따음표는 불가능하기에 앞에 \를 붙인다.
  • print('hi \'lmw\'') #hi 'lmw'
  • 두 줄 이상 작성 시 \n으로 구분하거나, 큰따음표 또는 작은 따음표를 세 번 연속 사용한다.
문자 설명 문자 설명
\[Enter] 다음 줄과 연속 \n 줄바꿈
\\ \ \t TAB
\' ' \e ESC
\" " \b 백스페이스

 

RAW_STRING

  • 문자열 선언 시 앞에 r 부착.
  • 특수기호 없이 그대로 인식
  • print(r'hi \n') #hi \n

 

call by value

  • 함수에 인자를 넘길 때 값만 전달하는 방식
  • 함수 내에 인자 값 변경 시 호출자에 영향 없다.

 

call by reference

  • 함수에 인자를 넘길 때 메모리 주소를 전달하는 방식
  • 함수 내에 인자 값 변경 시 호출자의 값도 변경된다.

 

call by object reference

  • 파이썬은 객체의 주소가 함수로 전달된다.
  • 전달된 객체를 참조하여 변경 시 호출자에게 영향을 준다.
  • 새로운 객체를 만들 경우 호출자에게 영향을 주지 않는다.

 

변수의 범위

  • 지역변수 (local variable) : 함수 내에서 사용
  • 전역변수 (global variable) : 프로그램 전체에서 사용

*함수 내에서 전역변수와 같은 변수명의 변수 선언시 지역변수 선언으로 취급.

*함수 내에서 전역변수 사용시 global 키워드 사용

 

재귀함수 (recursive function)

  • 자기자신을 호출하는 함수
  • 점화식과 같은 재귀적 수학 모형을 표현할 때 사용
  • 재귀 종료 조건이 존재해야 하고, 종료 조건까지 함수호출을 반복한다.

 

Function type hints

  • 파이썬은 Dynamic typing이라 변수타입을 선언하지 않는다.
  • 처음 함수를 사용하는 사용자가 interface를 알기 어렵다는 단점이 있다.
  • 그래서 Python 3.5 버전 이후로는 PEP 484에 기반하여 Type hints 기능을 제공한다.
  • def func(a : var_type) -> return_type :
  • ex) def func(a : int) -> str :
  • ex) def func(a : int, mod : Module) -> None :
  • 사용자에게 인터페이스를 명확히 알려줄 수 있다.
  • 함수의 문서화시 파라미터에 대한 정보를 명확히 알 수 있다.
  • mypy 또는 IDE, linter 등을 통해 코드의 발생 가능한 오류를 사전에 확인할 수 있다.
  • 시스템 전체적인 안정성을 확보할 수 있다.

 

 

Docstring

  • 파이썬 함수에 대한 상세스펙을 사전에 작성하여 사용자의 이해도를 늘린다.
  • 세개의 따음표로 함수명 아래에 영역을 표시한다.
  • 최근에는 black 모듈을 활용해 pep8 like 수준을 준수한다. (black codename.py 명령어 사용)

 

 

함수 작성 가이드 라인

  • 공통적으로 사용되는 코드는 함수로 바꾼다.
  • 복잡한 수식이나 조건은 식별 가능한 이름의 함수로 변환한다.
  • 함수명은 가능한 짧게 (줄 수 줄이기)
  • 함수명에 역할과 의도를 명확히 드러내기
  • 하나의 함수에는 유사한 역할을 하는 코드만 포함한다.
  • 인자로 받은 값 자체를 바꾸지 말고 임시 변수를 선언하자. (★)

 

 

코딩 컨벤션

  • 사람이 이해할 수 있는 코드를 짜기 위한 규칙
  • 사실 명확한 규칙은 없다. 팀마다, 프로젝트마다 따로 가지고 있기 때문.
  • 일관성이 가장 중요하고 읽기 좋은 코드가 좋은 코드
  • 들여쓰기는 일반적으로 4 Space를 권장하나, 혼합하지만 않으면 됨
  • 들여쓰기 공백 4칸 권장
  • 한 줄은 최대 79자까지
  • 불필요한 공백 제거
  • =연산자는 1칸 이상 띄우지 않는다
  • 주석은 항상 갱신하며 불필요한 주석은 삭제한다.
  • 코드의 마지막에는 항상 한 줄을 추가한다.
  • 소문자 I, 대문자 O, I 같은 헷갈리는 문자의 사용을 자제한다.
  • 함수명은 소문자로 구성하고 필요시 밑줄로 나눈다.

*파이썬은 flask8 모듈로 코드의 문제점들을 확인할 수 있다.

*flask 파일명.py : 문제점 찾기

*black 파일명.py : 문제점 자동으로 수정


  • 피어세션 회의 내용

매일 학습한 내용을 대표자가 다시 강의하며 복습하는 시간을 가지기로 했다.

하지만 오늘의 경우 강의 수강 시간은 2시간인데 비해 강의 길이는 4시간에 달했다.

이럴 경우 당일 학습을 완료할 수 없으며, 가능하더라도 복습할 시간이 없어 대표자에게 부담이 될 수 밖에 없다.

이런 점을 들어 대표자는 당일 학습이 아닌 전날 학습을 발표하여 함께 복습하기로 결정했다.

추가로 각자의 과제를 발표하며 피드백을 가지기로 결정했다.


  • 해야할 일

처음 프로그래밍을 배울 때 표기법으로 카멜 표기법으로 배웠다. 사실 내가 사용하는 표기법이 '카멜 표기법'이라는 이름이 있는 지도 몰랐다. 그냥 교수님들과 선배님들께서 '이렇게 해' 라고 하신 가르침을 아무것도 모르고 4년간 따랐을 뿐이었다.

 

하지만 오늘 강의에서 코딩 컨벤션에 대해 들으며 카멜 표기법 외에도 다양한 표기법들이 있고, 앞으로 계속 개발을 하면 언젠가 다른 표기법도 사용해야 할 일이 많음을 깨달았다.

 

여러 표기법을 배우고 응용력을 다져야 함을 알고, 공부를 진행했다.

 

java119.tistory.com/7

 

[Naming] 프로그래밍 표기법 총 정리 with Java (Programming Naming rules)

절대 정답이 아니며 , 회사마다 사람마다 쓰는 네이밍은 다릅니다 참고만 해주시면 감사하겠습니다. 네이밍( Naming ) 종류 1.camelCase(캐멀, 단봉낙타 표기법) 각 단어의 첫 단어를 대문자로 표기하

java119.tistory.com


 

728x90
반응형