Upstage AI LAB 부트캠프 5기/실시간 공부내용 복습

[2024.09.30] 파이썬 프로그래밍 이해하기

김 도경 2024. 9. 30. 16:57

* 강의를 듣고 필기한 내용일 이후에 따로 정리한 내용입니다.

 

컴퓨터= 계산기

 

- compute(계산하다) -er(~하는 사람) : 정말 계산만 밖에 못 하지만 고도화 된 기술을 한 것

- 논리구조의 다양한 조합으로 사용하는 것

- 0과 1의 논리연산을 짜는 게 중요한 것 

- 1. 계산할 숫자 저장 : 데이터, 2. 계산 방식 : 연산자, 3. 이전 결과 저장 : 기억

- 이진수 숫자가 어떤 걸 다루는가?

 

- Alan Turing : 인공지능의 아버지, 컴퓨터의 초안을 만든 사람. 1936년에 a-machine이라는 수학 할 수 있는 기계를 만듬

- 이 기계는 기호학을 기반으로 만들어짐 (여러 기호들을 이용-> 논리 연산 수행)

 

- 컴퓨터는 9과 1의 조합으로 여러 논리식들을 표현할 수 있다 : 논리식 = 논리회로 -> cpu나 보드가 나오고 전기신호로 인해서 사용

 

컴퓨터 내부구조 이해

 

Von Neumann Architecture

- 논리 계산을 위해서 필요한 기본적인 요소들을 정의한 구조 : 현대 거의 대부분의 컴퓨터는 이 구조로 이루어져있음

- CPU, Memory, I/O Device로 구성되어있음 : CPU가 가장 중요함! 속도가 빠르면 좋겠다-> CPU를 업그레이드하면 된다

- input device(마우스, 키보드) -> CPU, RAM, SSD -> Output Device (모니터, 프린터)

    - CPU(Central Processing Unit) : 컴퓨터에서 수행하는 여러 명령들을 수행하는 곳
                                                         컴퓨터에서 처리되는 모든 것들을 CPU에서 처리한다.

                                                         실행되는 명령의 순서 관리(Control Unit)+실제 연산처리(Arithmentic/Loic Unit)

    - Memory-SSD(Solid State Drive) : CPU가 처리해야 할 모든 데이터는 Memory Unit에서 관리

                                                             데이터를 반영구적으로 저장할 수 있음, 많은 데이터를 담을 수 있음

                                                             SSD는 전원이 꺼져도 데이터 보존. 저장 기능을 통해서 SSD에 데이터를 기록
                                                             USB/자기 테이프/하드디스트 같은 것도 메모리

     - Memory-RAM(Random Access Memory) : RAM은 전원공급이 도지 않으면 모두 지워짐.-> 처리 완료 후 SSD에 저장

                                                                           RAM에는 2가지 종류 : SRAM이 더 빠르고 비쌈, DRAM이 조금 느리고 쌈

                                                                           CPU는 성능을 위해서 SSD가 아닌 RAM에 담긴 정보를 사용

                                                                           휘발성 :코딩으로 보는 결과는 Ram에서 보여줌

    - Input/Output Device : IO라는 말로 씀 : CPU랑 메모리를 합쳐서 연산처리
                                          IO는 정보가 왔다갔다한다는 것(외부)- 네트워크, 마우스, 키보드, 모니터, 프리터 전부

                                          입력값을 넣기 위함 Input, 컴퓨터가 처리한 것을 보여주기 위함 Output

 

컴퓨터 작동원리 배우기

우리가 쓰는 코드는 전부 RAM에 올라가있음

- cpu가 ram이랑 소통을 하고 ram에서 ssd에서 저장과 불러오기를 함

- ram에서 request와 response를 해서 www(온라인)과 통신을 함

 

컴퓨터가 이해하는 언어

 

사람이 쓰는 언어 : Natural Language(자연어)

컴퓨터가 쓰는 언어 : Formal Language(형식 언어) - Science Language

사람과 컴퓨터를 이어주는 언어 : Programming Language(프로그래밍 언어)

  • C언어 : 시스템 제어를 위해 사용하는 언어
    - 컴퓨터의 여러 하드웨어를 제어하기 위해서 만들어진 언어
    - 1972년 UNIX 운영체제를 만들기 위한 만들어짐 : 직접 컴퓨터 메모리에 접근, 여러 시스템 명령을 호출
    - 요즘엔 IoT 개발을 위해 사용됨
    - legacy(버전)을 굉장히 예전 껏을 써도 괜찮음 (python은 예전 버전과 호환을 안해서 계속 업데이트가 필요)
    - C언어를 하면 컴퓨터를 조금 더 잘 알 수 있음

  • Python : AI를 만들때 많이 사용되는 언어
    - 91년도에 만들어짐, 2000년대에 와서 인기가 있어지고(쉬워서) + 최근 AI가 발전되면서 확 인기 있어짐
    - C언어 같은 언어들보단 휠씬 쉽다 : 파이썬 자체가 쉽지는 않지만, 다른 언어들보단 쉽다.
    - 내부 시스템을 정확히 몰라도 편하게 여러 기능들을 구현하기 쉽게 만들어짐
    - AI에서는 수학, 통계, 컴공, 산업공학 등 여러 분야의 지식을 필요하므로 코딩 난이도가 낮아야함 : 파이썬 인기가 있어짐
    - PyPI : 파이썬 프로그래밍 언어의 패키지 및 모듈을 호스팅하고 배포하는 공식 저장소 : 오픈 소스 생태계 발전+패키지,라이브러리가 많다
    - AI를 위해서 필요한 데이터 수집, 처리, 시각화, AI모델 개발 등 여러 요소를 모두 지원함.

* 이번 부트캠프에서 가장 중요한 것은 Python이다. 파이썬이 안되면, 뒤에서 힘들다. 꼭 파이썬을 열심히 공부하기.

* 부트캠프가 끝나고 무엇을 하고 싶은지에 대해서 꼭 생각하기. : 부캠 7개월은 길다. 매일 8시간이기에...->시간이 많이 쓰여진다. : 마지막에 애매해지는 경우들은 그저 부캠을 따라가는 것 : 부캠이 끝나면 방황을 하게 됨 : 최악의 선택 -> 부캠을 또 들음 : 시간낭비

 

  • Javascript : 웹 페이지를 만들기 위해 사용되는 언어
    - 95년에 만들어진 언어, 90년대 말부터 굉장히 많은 웹 페이지들이 만들어지며, 이를 위한 언어가 필요해져서 생김
    - 현재 사용되는 모든 웹 브라우저는 Javascript를 자체적으로 실행할 수 있는 능력이 탑재되어있음
    - 모든 웹페이지가 Javascript의 여러 기능들을 통해 구현되어있다

  • Programming Language , 프로그래밍 언어의 기본적인 특징
    - 프로그래밍 언어도 사람이 사용하는 언어처럼, 기술한 텍스트가 어떤 의미를 가지는지 정의
    - 모든 프로그래밍 언어는 자체적인 문법을 가지며, 사람의 언어와 다르게 문법이 틀리면 절대 동작하지 않음 
        : 문법을 완벽하게 알아야함. 정말 외워야함 : 많이 써보면 외워진다. : 이게 틀리면 무조건 틀린다. 오류가 나면 내잘못이다.
    - 프로그래밍 언어 자체는 사람의 언어(영어)로 쓰여짐, 이를 컴퓨터가 이해할 수 있는 기계어(Machine Instruction)으로 번역하는 프로그램인 Compiler/Interpreter가 필요하다.
    - Complier/Interpreter를 컴퓨터에 설치해서 해당 프로그래밍 언어를 사용할 수 있다.
    - Coding : 코드를 적는 행위, 어떠한 Logic을 순차적으로 실행하도록 동작하며 이를 위해서 사람이 직접 코드를 작성해야함
    - Programming : 작성된 코드들로 구성된 logic이 특정 기능들을 하면서 프로그램을 만들어가는 과정
    - Programming Language : 컴퓨터에게 우리가 하고 싶은 여러 작업을 시킬 수 있게 해주는 소통 체계
컴퓨터에게 일 시키기

 

코드는 어떻게 적어야할까? : 코딩 : 코드를 쓰는 것임

증명처럼 step by step에 맞추어서 진행하기

컴퓨터에서 돌아갈 수 있게 하냐? 어떻게 하냐가 중요함

 

컴퓨터에게 시키는 이유 : 시간이 오래 걸리고, 귀찮고 단순함 -> 기계에게 시키고 싶음. : 암호를 찾는 것도 그저 연산임.

현재 암호 : 못푼다X, 현재 컴퓨터로 못푼다O : 수학적으로는 해가 존재. 양자컴퓨터에서는 풀림. 

 

Flowchart : 원하는 답을 찾기 위해서는 변수와 조건과 반복이 필요함

     - 변수(데이터) 조건(데이터가 원하는 데이터인지 체크를 반복)

 

코딩 = 프로그래밍 = 개발?

 

개발 = 프로그래밍 + 환경 + 문서화(Documentation) 

- 작성한 프로그램이 실제 환경에서 동작하는 모든 과정까지 포함하는 과정

- 대부분 여러 사람이 함께 작업에 참여하며, 실제로 사용되는 서비스를 만들기 위한 전체 과정을 의미

- 만들어진 코드를 유지/보수하는 것부터 프로그래밍 자체만이 중요한 것이 아니라 무엇을 만들어야하는 명세사항, 협업문서,프로그램과정, 일하는 방식 모두 포함함

- 프로그램 개발을 잘하기 위해서는 컴퓨터 시스템 이해, 작동하는 환경과 구현해야하는 기능에 대한 명확한 이해가 필요

개발은 개인플이 아니다: 나혼자 하기보다는 커뮤니케이션을 하는데, 사람의 말은 전달하는데 오류가 있을 수도 있어서 문서화가 필요 : 과거에 내가 짠 것도 모른다. 나도 꼭 문서화가 필요함.

개발 = 협업이다. 팀프로젝트를 꼭 할 줄 알아야한다. 협업을 할 줄 알아야한다.  


꼭 알아야할 것

  • int, float, str, list, tuple, dict, set
    1. 데이터 타입 정의
    2. mutable VS immutable
           - mutable - list, dict, set
           - immutable - int, float, str, tuple

    3. 연산자 정의
    4. 데이터 타입별 주요 함수

코딩테스트 공부

 

1. 학점 계산하기

    1) 단순 계산

print((3 * 4.5 + 3 * 2.0 + 2 * 3.5 + 3 * 4.0) / 11)

    2) dictionary를 사용하는 맵핑구현

# grade map을 만드는 것
grade_map = {'A+' : 4.5, 'A' : 4.0, 'B+' : 3.5, 'B' : 3.0, 'C+' : 2.5, 'C' : 2.0, 'F' : 0.0}
credit_map = {"글쓰기" : 3, "미적분학I" : 3, "영문법특강" : 2, "컴퓨팅사고력" :3}

(credit_map['컴퓨팅사고력'] * grade_map['A+'] + credit_map['미적분학I'] * grade_map['C']\
         + credit_map['영문법특강'] * grade_map['B+'] + credit_map['글쓰기'] * grade_map['A'])\
                    / (credit_map['컴퓨팅사고력'] + credit_map['미적분학I'] + credit_map['영문법특강'] + credit_map['글쓰기'])

- 같은 코드는 한 줄이 원칙 : 만약 엔터를 치고 싶으면 \(백슬레쉬)를 쳐주면 된다

-  쥬피터 노트북은 셀 단위 실행이 있기 때문에 , 뒤에 엔터를 쳐도 문제가 없다!

- 스페이스바를 뛰우는 것은 취향차이지만, 보기 쉬운 코드를 짜는 게 좋다

 

2. 십의 자리 구하기

    1)  type casting + indexing

num = 46351633
print(int(str((num)[-2])))
# a = str(number)
# a = a[-2]
# a =int(a)

- 3줄로 쓸 수 있는 걸 1줄로도 쓸 수 있다.

- -2는 뒤에서 2번째를 말하는 것이다. 

 

    2) 연산

print(number % 100 // 10)

 

3.출력하기

- 포멧을 먼저 정하고 구하기

epoch = 10
train_accuracy = 0.85; val_accuracy = 0.83; test_accuracy = 0.761234
model_name = "ResNet44"

- train_accuracy = 0.85; val_accuracy = 0.83; test_accuracy = 0.761234 : 여기 사이에 ;를 적어야한다. : 나눠주는것

 

1) print 함수 %

print("%s 모델로 %d epoch를 돌려 학습시킨 결과는 학습 정확도 : %.2f, 검증 정확도 : %.2f, 테스트 정확도 : %.2f으로 나왔습니다." \
      % (model_name, epoch, train_accuracy, val_accuracy, test_accuracy))

- %s : 문자, %d : 정수, %f : 실수

 

2) str.format()

print("{} 모델로 {} epoch를 돌려 학습시킨 결과는 학습 정확도 : {}, 검증 정확도 : {}, 테스트 정확도 : {}으로 나왔습니다."\
.format(model_name, epoch, train_accuracy, val_accuracy, test_accuracy))

 

3) f-string

print(f"{model_name} 모델로 {epoch} epoch를 돌려 학습시킨 결과는 학습 정확도 : {train_accuracy}, 검증 정확도 : {val_accuracy}, 테스트 정확도 : {test_accuracy}으로 나왔습니다")

 

 

-> 소숫점 셋째자리로 바꾸려면

# print 함수 %
print("%s 모델로 %d epoch를 돌려 학습시킨 결과는 학습 정확도 : %.3f, 검증 정확도 : %.3f, 테스트 정확도 : %.3f으로 나왔습니다." \
      % (model_name, epoch, train_accuracy, val_accuracy, test_accuracy))
    
# str.format()
print("{} 모델로 {} epoch를 돌려 학습시킨 결과는 학습 정확도 : {:.3f}, 검증 정확도 : {:.3f}, 테스트 정확도 : {:.3f}으로 나왔습니다.".format(model_name, epoch, train_accuracy, val_accuracy, test_accuracy))

# f-string
print(f"{model_name} 모델로 {epoch} epoch를 돌려 학습시킨 결과는 학습 정확도 : {train_accuracy:.3f}, 검증 정확도 : {val_accuracy:.3f}, 테스트 정확도 : {test_accuracy:.3f}으로 나왔습니다")

- print 함수 % : %.2f 를 %.3f로 바꾸면 됨

- str.format() : 원하는 곳에 뒤에 {:.3f}를 추가. {} -> {:.3f}라고 적음

- f-string : 원하는 곳에 뒤에 {:.3f}를 추가. {accuracy} -> {accuracy:.3f}라고 적음

 

4. 문자열 연습하기

1) str.replace()

oldman_id.replace('234567',"******")

 

1-2) 슬라이싱을 이용하여 

youngman_id.replace(youngman_id[-6:], '******')

슬라이싱

- [0:5] == 0,1,2,3,4  # start는 포함. stop은 포함되지 않음.

- [:5] == 0,1,2,3,4    # start를 생략하면, 맨 처음부터   (index 0가 생략됨)

- [3:]                        # stop을 생략하면, 맨 뒤까지       (index len(youngman_id)가 생략됨)

- [-6:]                       # 뒤에서 6개라는 의미

 

2) str 덧셈 연산

youngwoman_id[:-6] + '******'

 

 

5. 리스트 연습하기

1) list.append()

# 어제 예약목록 처리
book.append(107)
book.append(203)
book.append(304)
book.append(507)

 

2) list 덧셈

book = book + [107,203,304,507]

 

3) list.extend()

book.extend([107, 203, 304, 507])

 

# 예약 취소 처리

book.remove(205)
book.remove(304)

 

6. if문 연습하기

- 패스워드가 8자리 이상

password " adsafdsf1435r4"

if len(password) < 8:
    print("약함")
else:
    if password.isalnum():
        if password.isalpha() or password.isdigit():
            print("약함")
        else:
            print("강함")
    else:
        print("약함")

 

- shift +tab (쥬피터노트북)/ ctrl + shift + space 을 누르면 코드를 확인할 수 있음

- str.isalpha() : 알파벳으로만 구성되어있어야 true, 아니면 false

- str.isdigit() : 숫자으로만 구성되어있어야 true, 아니면 false

- str.isalnum()  : 알파벡 문자와 숫자로만 구성되어있어야 true, 아니면 false

 

3. 별 출력하기

1) 이중 for 문, nested loop

for i in range (number, 0, -1):
    for j in range(i):
        print("*", end='')
    print()v

 

2) str 곱셈 연산

for i in range(number):
    # i -> 5-i
    print('*' * (number-i))