[AIFFEL 울산 1기] Day 3 파이썬 잘 하는척 해보자

정경민·2021년 12월 31일
0

학습목표

  • 파이썬에 대해서 알아보자.

  • 코드 재사용에 대해서 알아보자.

  • 프로그래밍 패러다임에 대해서 알아보자.

  • 파이썬 코드를 이쁘게 해보자.


후기


학습내용

Fundamental 8. 파이썬 잘 하는척 해보자

1. 성능 및 한계

  • 퍼포먼스
  • 생산성
    • 똑같은 기능을 하는 프로그램을 얼마나 빨리 작성할 수 있는가?
  • 퍼포먼스 vs 생산성
    • trade-off 관계
      2. 파이썬의 성능
  • 높은 생산성
    • 굉장히 다양한 라이브러리와 패키지 존재
  • 코드의 간결함
  • 빠른 개발 속도
  • 스크립트 언어(인터프리터 언어)
    • 컴파일 언어
      -> 실행 전 소스 코드를 컴파일하여 기계어로 변환 후 해당 파일을 실행
      ->이미 기계어로 변환된 것을 실행하므로 비교적 빠름
      컴파일 시점에 소스 코드의 오류를 잡기 쉬움
      ->같은 소스 코드도 다른 환경(PC, mobile 등)에서 실행하려면 다시 컴파일(기계어로 변환) 해야함
    • 스크립트 언어(인터프리터 언어)
      -> 코드를 작성함과 동시에 인터프리터가 기계어로 번역하고 실행함
      -> 코드 번역 과정이 있어 비교적 느림
      -> 주 사용 목적이 뚜렷하게 개발되어 사용하기 쉬운 편
      -> 명령줄로 코드를 즉시 실행할 수 있음

3. For문

  • enumerate()
    • 리스트, 문자열 튜플 등의 순서와 값을 함께 반환
	my_list = ['a','b','c','d']

	for i, value in enumerate(my_list):
	print("순번 : ", i, " , 값 : ", value)
    
    >>> 순번 :  0  ,:  a
	순번 :  1  ,:  b
	순번 :  2  ,:  c
	순번 :  3  ,:  d
  • 리스트 컴프리헨션(list comprehension)
    • 이중포문 형태를 1줄로 구현가능

<이중포문>

	my_list = ['a','b','c','d']
	result_list = []
	
	for i in range(2):
		for j in my_list:
			result_list.append((i, j))

<리스트 컴프리헨션>

	my_list = ['a','b','c','d']

	result_list = [(i, j) for i in range(2) for j in my_list]
  • 제너레이터(Generator) 이해 안됩니다...ㅠㅠ

4. Try- Except 예외 처리하기

  • 형태
  try:
    #실행 코드
		
  except:
    #에러가 발생했을 때 처리하는 코드

5. Multiprocessing

  • 실행 시간 측정

    • time 모듈을 import 해야함
    • time.time() 함수는 현재 시간을 반환
    • 측정하고자 하는 부분의 시작 부분에 현재 시간을 저장하는 변수를 선언하고, 마지막 부분에 현재 시간을 다시 측정하여 시작 시간이 저장된 변수의 값을 빼주면 실행 시간이 측정됨
  • Multiprocessing(멀티프로세싱)

    • 컴퓨터가 작업을 처리하는 속도를 높여주는 방법 중 하나

    • 기존의 순차 처리 방식이 아닌, 다중 cpu를 이용한 병렬 처리 방식

    • multiprocessing 모듈을 import해야함

    • pool = multiprocessing.Pool(processes = 4) : 병렬 처리 시, 4개의 프로세스를 사용하도록 합니다. CPU 코어의 개수만큼 입력해 주면 최대의 효과를 볼 수 있습니다.

    • pool.map(count, num_list) : 병렬화를 시키는 함수로, count 함수에 num_list의 원소들을 하나씩 넣어 놓습니다. 여기서 num_list의 원소는 4개이므로 4개의 count 함수에 각각 하나씩 원소가 들어가게 됩니다.
      즉, count('p1'), count('p2'), count('p3'), count('p4')가 만들어집니다.

    • pool.close() : 일반적으로 병렬화 부분이 끝나면 나옵니다. 더 이상 pool을 통해서 새로운 작업을 추가하지 않을 때 사용합니다.

    • pool.join() : 프로세스가 종료될 때까지 대기하도록 지시하는 구문으로써 병렬처리 작업이 끝날 때까지 기다리도록 합니다.

      • 작업 완료 후 메모리가 계속 쓰이는 것을 막기 위함
    • 왜 프로세스를 4개 쓸 때보다 2개 쓸 때가 더 빠르지...???

6. 함수 사용하기

  • 반복되는 작업을 효율적으로 하기위해 하나의 함수로 정의해두고 호출하여 사용
  • 코드의 효율성과 재사용성을 높여줌
  • 코드의 가독성 또한 좋아짐
  • 'def 함수이름(입력인자):' 형태로 이루어지며, 이 다음줄 부터 들여쓰기를 통해 구분됨

7. 함수 사용 팁

  • 이름만 작성 후 나중에 내부를 구현하기 위한 빈 함수를 생성할 때는 내부에 pass를 입력한다
    -> pass: 아무것도 하지않는 명령어
  • 함수에 함수 사용
    • 반환 값이 있는 함수(a)를 다른 함수(b)의 입력 인자로 사용
    • 실행 시, 인자에 있는 함수의 반환 값을 먼저 확인하기 위해 a함수가 실행되고, 반환된 값이 b함수의 인자로 입력된다.
  • 함수 안의 함수 & 2개 이상의 return
    • 리스트로 반환
      -> 울타리 함수 안에 각각 반환 값을 가지는 내부 함수들을 구현한 후, 각 내부 함수들의 반환 값들을 리스트로 저장하여 울타리 함수의 반환 값으로 지정해주면 반환 값이 여러개인 효과를 줌
    • 여러 변수로 반환
      -> 반환 값을 하나가 아닌 두 개 이상으로 지정해도 된다.

8. 람다 표현식

  • 런타임에 생성해서 사용할 수 있는 익명 함수
    (예시)

    print((lambda x, y: x + y)(10, 20))
    >>> 30
    • x, y는 입력값을 의미
    • x + y 부분은 return 부분과 같음(: 이후에 작성)
    • (10, 20)은 실제로 x와 y에 값을 넣어준다는 의미
    • 보통 함수 안의 함수를 간다히 만들 때 사용
  • map()

    • 입력받은 자료형의 각 요소가 함수에 의해 수행된 결과를 묶어서 map iterator 객체로 출력하는 역할
    • 형태: map(함수, 반복 가능한 객체)
      (ex)
	result = list(map(lambda i: i * 2, [1, 2, 3]))
	print(result)
  	>>> [2, 4, 6]

9. 클래스, 모듈, 패키지

  • 클래스: 비슷한 역할을 하는 함수들의 집합
  • 모듈: 함수, 변수, 클래스를 모아 놓은 파일
    • import하여 사용가능
    • 모듈 이름을 입력하고 .를 입력한 후 원하는 함수 호출
    • 'import 모듈이름 as 단축이름'의 형태를 통해 긴 모듈이름을 짧게 줄여서 사용할 수 있음
  • 패키지: 라이브러리라고도 부름
    • 파이썬에서 패키지는 여러 모듈을 하나로 모아둔 폴더
    • 패키지 설치
      • $ pip install 패키지명

10. 패러다임과 함수형 프로그래밍

  • 패러다임: 어떤 한 시대의 사람들의 견해나 사고를 근본적으로 규정하고 있는 테두리를 말하며, 인식의 체계 또는 사물에 대한 이론적인 틀이나 체계를 의미하는 개념

    • 프로그래밍 패러다임: 프로그래머에게 프로그래밍의 관점을 갖게 해 주고, 결정하는 역할
    • 프로그래밍 언어들은 각자 언어 저마다의 프로그래밍 패러다임을 갖고 있음
  • 절차 지향 프로그래밍과 객체 지향 프로그래밍

    • 절차 지향 프로그래밍: 순차적으로 프로그래밍 하는 방법
      • 순서대로 읽으면 되기에 이해가 가능하나, 유지 보수가 어렵고 코드가 길어 분석이 어려움
    • 객체 지향 프로그래밍: 객체를 먼저 작성하고 함수를 작성
      • 코드 분석과 재사용이 쉽고 아키텍쳐를 바꾸는 것이 쉬움
      • 객체 간의 상호작용이 있기에 설계에 많은 시간이 소요되며, 설계를 전체적으로 바꿔야 할 수도 있다.
  • 함수형 프로그래밍

    • 효율성, 버그 없는 코드, 병렬 프로그래밍과 같은 장점을 제공
  • 함수형 프로그래밍의 특징

    • 순수성
      • 부작용이 있는 함수를 사용하지 않음
        -> 함수 내에 함수 밖의 값을 가져오거나 함수 밖의 값을 변경하지 않음
    • 모듈성
      • 문제를 작은 조각으로 분해하도록 강제
      • 작은 함수는 가독성도 좋고 오류를 확인하기도 더 쉬움
    • 디버깅과 테스트 용이성
      • 각각의 함수가 작고 명확하게 명시되기 때문에 디버깅을 쉽게 할 수 있음

11. 파이써닉하게 코드를 짜보자

  • 파이썬의 장점은 뛰어난 가독성
  • pep8 이라는 코드 스타일 가이드를 따름
  • Whitespace
    • 한 줄의 코드 길이가 79자 이하여야 한다.
    • 함수와 클래스는 다른 코드와 빈 줄 두 개로 구분
    • 클래스에서 함수는 빈 줄 하나로 구분
    • 변수 할당 앞뒤에 스페이스를 하나만 사용
    • 리스트 인덱스, 함수 호출에는 스페이스를 사용하지 않음
    • 쉼표(,), 쌍점(:), 쌍반점(;) 앞에서는 스페이스를 사용하지 않음
  • 주석
    • 코드의 내용과 일치하지 않거나 불필요한 주석은 피해야 함
  • 이름 규칙
    • 변수명 앞에 _(밑줄)이 붙으면 함수 등의 내부에서만 사용되는 변수를 일컫는다.
    • 변수명 뒤에 _(밑줄)이 붙으면 라이브러리 혹은 파이썬 기본 키워드와의 충돌을 피하고 싶을 때 사용
    • 소문자 L, 대문자 O, 대문자 I를 가급적 사용하지 않는다
      -> 특정 폰트에서 가독성이 매우 안좋음
    • 모듈(Module) 명은 짧은 소문자로 구성되며, 필요하다면 밑줄로 나눔
    • 클래스 명은 파스칼 케이스(PascalCase) 컨벤션으로 작성
    • 함수명은 소문자로 구성하되 필요하면 밑줄로 나눔
    • 상수(Constant)는 모듈 단위에서만 정의하고 모든 단어는 대문자이며, 필요하다면 밑줄로 나눔
  • 네이밍 컨벤션(Naming convention)
    • snake_case
      • 모든 공백을 "_"로 바꾸고 모든 단어는 소문자입니다.
      • 파이썬에서는 함수, 변수 등을 명명할 때 사용합니다.
      • ex) this_snake_case
    • PascalCase
      • 모든 단어가 대문자로 시작합니다.
      • UpperCamelCase, CapWords라고 불리기도 합니다.
      • 파이썬에서는 클래스를 명명할 때 사용합니다.
      • ex) ThisPascalCase
    • camelCase
      • 처음은 소문자로 시작하고 이후의 모든 단어의 첫 글자는 대문자로 합니다.
      • lowerCamelCase라고 불리기도 합니다.
      • 파이썬에서는 거의 사용하지 않습니다 (Java 등에서 사용)
      • ex) thisCamelCase

0개의 댓글