AIFFEL 4일차 12/30(목)

KSHH·2021년 12월 30일

리스트 컴프리헨션 (List Comprehension)

  • 반복문으로 리스트를 생성하는 방식
    	numbers = []
    	for n in range(10):
    	numbers.append[n]
    	-> [0,1,2,3,4,5,6,7,8,9]
  • 리스트 컴프리헨션을 이용하는 방식

    	[x for x in range(10)]
    	-> [0,1,2,3,4,5,6,7,8,9]

    둘의 차이점은 컴프리헨션은 리스트 내부에 코드를 작성한다는 점.

  • if도 쓸 수 있음

    	[x for x in range(10) if x % 2 == 1]
    	-> [1,3,5,7,9]

제너레이터

사실 너무 어렵다 개념이. 그래도 대충 이해한것만 적어보자면,
데이터를 처리하는 반복구조를 만들 때 보통 for문을 이용해서 리스트 형태로 만들지만, 데이터의 양이 너무 많으면 처리속도가 느리고 버겁다. 제너레이터는 그러한 엄청난 양의 순차적인 데이터에서 하나씩 순차적으로 데이터를 꺼낼 때 사용한다. 일반적인 리스트는 단 하나의 값을 출력하더라도 전체를 다 로딩시켜서 확인한 다음 꺼내기 때문에 메모리 낭비가 심하지만, 제너레이터는 그것을 방지할 수 있다.
yield가 일반적인 함수를 제너레이터로 만들어주는 역할을 한다.
조금 더 공부하고 보충해봐야겠다.


Try - Except 예외 처리하기

프로그래밍 중 항상 시도때도 없이 발생하는 에러를 잡기 위한 노력 중 하나라고 한다.
예외 처리는 코드를 수행하다가 예외가 발생했을 때 그 예외를 무시하게 하거나 예외 대신 적절한 처리를 해주게 하는 작업을 의미한다고 한다.

a = 10
b = 0
try:
    print(a/b)
		
except:
    print('에러가 발생했습니다.')

10을 0으로 나눌 수 없으니 에러가 떠야하겠지만, try-except를 쓰면서 '에러가 발생했습니다'를 print하게끔 만들어주었다.


Multiprocessing

프로그램 : 파일이 저장 장치에 저장되어 있지만, 메모리에는 올라가지 않고 실행되지 않은 상태
프로세스 : 실행되어 메모리 위에 올라가있는 프로그램 = 할당된 작업의 단위
스레드 : 프로세스의 실행 흐름의 단위
멀티스레드 : 하나의 프로세스가 여러 작업을 여러 스레드에 사용하여 동시에 처리하는 것처럼 보이지만 스레드를 번갈아가면서 사용함.(동시성)
멀티프로세싱 : 병렬성 프로그래밍. 여러 개의 프로세스가 병렬성을 가지고 실질적으로 동시에 작업이 이루어지는 것, 프로세스를 여러 개 만들어서 동시에 실행


람다표현식

함수를 딱 한줄만으로 만들게 해주는 표현식.
(lambda 인자 : 표현식) 형태

>>> (lambda x,y: x + y)(10, 20)
30

map 함수 : 함수와 리스트를 인자로 받음. 리스트로부터 원소를 하나씩 꺼내서 함수를 적용시킨 뒤 그 결과를 새로운 리스트에 담아줌

>>> list(map(lambda x: x ** 2, range(5)))
[0, 1, 4, 9, 16]

딕셔너리

  • 딕셔너리의 인덱스는 숫자가 아니라 key이다.
  • 여태 딕셔너리가 언제 필요한지 감이 안왔는데, 코딩도장을 읽으면서 게임 캐릭터 능력치를 예시로 들면서 보니깐 이해가 되었다. lux = {'health': 490, 'mana': 334, 'melee': 550}
    마찬가지로 중첩 딕셔너리도 계층형 데이터의 예시인 지구형 행성의 여러 특성 수치들을 표현한다고 생각하니 이해가 쉽다.
  • setdefault나 pop 메서드를 쓸 때 추가하거나 삭제한 값을 반환한다는 것이 신기하다. 리스트의 pop에서 볼때는 그냥 그러려니 했는데, 반환의 개념 자체가 아직 머리속에서 모호해서 공부가 더 필요한듯.
  • 딕셔너리 표현식에서 for와 if를 사용하는 법이 이해가 되는것 같긴 하지만 백지상태에서 이렇게 생각해내기가 너무 어렵다. (수정 : 이게 바로 리스트 컴프리헨션! 이제 알겠다)
  • 그냥 일반 딕셔너리는 copy 메서드로 복사가 되는데 중첩 딕셔너리는 깊은 복사까지 해야한다. 얕은 복사와 깊은 복사의 개념을 숙지하고 비교할 필요가 있다. 특히 깊은 복사는 copy 모듈을 불러와야 한다는 것.
  • 세트는 인덱스가 없다. 따라서 대괄호로 특정 요소를 추출하지 못한다.
    특정값이 있는지 확인하려면 in 연산자를 사용해야 한다.

얕은 복사 & 깊은 복사

copy는 얕은 복사
deepcopy는 깊은 복사
딕셔너리는 deepcopy를 해야 우리가 알고 있는 진정한 복사본이 나온다.


오늘의 상태

노드를 진행하는 속도가 빨라졌다. 이제 조금만 더 집중해서 잘하면 하루에 다 끝내는 노드가 생길수도?
풀잎스쿨 진행하는 것 너무 힘들었다. 처음엔 괜찮았는데, 중간부터 너무 어려운 개념들이 나오더니, 나중에는 아예 포기하고싶을 정도로 어려웠다. 나빼고 다들 파이썬이나 컴공 경험이 많으셔서 내가 그분들의 토론에 낄 수가 없고, 내가 궁금한 것도 질문할 수 있는 분위기도 점점 안되어간다. 다행인것은 그 부분까지 내가 따라가려하지 않아도 괜찮다는 점. 하지만 내가 얘기할 수 있는 부분이 이제 없다. 고민 좀 해봐야겠다.

0개의 댓글