본문 바로가기

프로그래머

[널널한 교수의 고급 파이썬] 01-5 동적 타이핑과 정적 타이핑 01-5 동적 타이핑과 정적 타이핑 동적 타이핑 파이썬 변수의 형은 실행시에 결정된다 변수는 객체에 대해 바운드되며 객체는 임의의 형이 될 수 있다 바인팅 : 변수에 변수와 관련된 속성을 연관시키는 것 만일 한 자료형의 객체에 변수 이름 a가 할당된다면, 나중에 이 이름 a는 다른 자료형의 객체를 참조하는데 사용될 수 있다 정적 타이핑 C, C++, Java와 같은 프로그래밍 언어에서는 char a; 과 같은 선언을 통하여 참조하는 형이 고정된다. 따라서 a = 3.14;와 같이 할당 연산을 사용할 수 없다 이러한 종류의 타이핑(자료형 결정 방식)을 정적 타이핑이라 한다 정적 타이핑 언어는 변수의 자료형이 컴파일할 때 결정된다 더보기
[널널한 교수의 고급 파이썬] 01-4 다차원 리스트의 참조 다차원 리스트를 만들어 보자 1 : board = [[0] * cols] * rows 2 : board = [[0] * cols for _ in range(rows)] 1번이 더 빠른 이유는 객체의 수도 적고 참조도 적게한다 board = [[0] * 3] * 3 print(board) board[0][0] = 1 print(board) #[[1,0,0],[1,0,0],[1,0,0]] board = [[0] * 3 for _ in range(3)] print(board) board[0][0] = 1 print(board) #[[1,0,0],[0,0,0],[0,0,0]] 더보기
[널널한 교수의 고급 파이썬] 01-3 할당, 얕은 복사와 깊은 복사 01-3 할당, 얕은 복사와 깊은 복사 파이썬 리스트 리스트는 변경가능(mutable) 자료형이다 객체 a를 다른 객체 b에 할당할 때(즉 b=a 연산) 데이터의 복사가 발생하지 않는다(효율성의 증대) (리스트, 정수형 등 모든 자료형) a = [1,2,3] b = a # 단순 할당(참조가 이루어지며, 사본을 만들지 않음) print(b) # [1,2,3] assert(id(a) == id(b)) b.append(4) # 리스트는 변경가능(mutable) print(a) # [1,2,3,4] a = [1,2,3] b = a[:] # 얕은 복사 b.append(4) print(a) # [1,2,3] print(b) # [1,2,3,4] 깊은 복사 vs 얕은 복사 얕은 복사와 깊은 복사의 차이점은 리스트나 .. 더보기
[널널한 교수의 고급 파이썬] 01-2 리스트 요소는 참조형이다 01-2 리스트 요소는 참조형이다 리스트 파이썬의 리스트는 타 언어의 배열과 비슷해 보인다 하지만 하나의 리스트에 서로 다른 자료형의 항목을 포함할 수 있다(리스트, 딕셔너리 등을 포함할 수 있다) elemets are references 리스트 요소는 참조형이다 # 리스트 객체 생성 a = [100, "two hundred", 300] 리스트 요소의 재할당 # 리스트 객체 생성 a = ["one", "two", 3, 4] # 리스트 요소의 재할당 a[1] = 2 리스트 요소의 추가 # 리스트 객체 생성 a = [1, 2, 3, 4] # 리스트 객체의 변경(mutating) a.append(5) 리스트의 덧셈과 재할당 # 리스트 객체 생성 a = [1, 2, 3, 4] # 리스트 객체의 재바인딩(rebi.. 더보기
[널널한 교수의 고급 파이썬] 01-1 파이썬 자료형과 참조 변수 01-1 파이썬 자료형과 참조 변수 Everything is an object 파이썬은 객체지향 프로그래밍 언어이다 파이썬은 객체가 중심이 되며, 참조 변수를 통해 객체에 접근할 수 있다 C 언어는 변수가 생성되고 변수에 값이 저장되는 구조이다 자료형 파이썬은 정수형, 실수형, 복소수형, 문자열, 리스트 등의 다양한 자료형이 있다 자료형에 따라서 지원하는 연산자가 다르며 메소드들도 다르다 사용자의 필요성에 따라 적절한 자료형을 선택하여 사용한다 정수 객체와 변수 정수형 객체가 있으면 이 객체에 연산자를 적용하여 연산을 수행할 수 있다 변수에 데이터를 보관하고 필요할 때 참조하면 편리하다 모든 객체는 고유한 id를 가진다 a = 100 print(id(a)) # 4324024528 print(id(100).. 더보기
[포프 tv 복습] Type-Generic 함수 만들기, 정적 어서트, 메모리 정렬, 멀티스레딩 Type-Generic 함수 만들기, 정적 어서트, 메모리 정렬, 멀티스레딩 와 제네릭 선택 매개변수 형에 알맞는 수학 함수를 찾아서 호출해주는 매크로 함수 컴파일러가 알아서 구현해 준 것 프로그래머가 이런 매크로를 직접 만들 방법이 없었음 C11에서는 가능 제네릭 선택(generic selection)이라 부룸 _Generic 키워드를 사용 이제 도 이 키워드를 사용해서 직접 구현 가능 _Generic 키워드 _Generic(, ) 컴파일 도중에 여러가지 표현식 중 하나를 선택하는 방법 실행 중에 선택하는 것이 아님 매크로 함수의 대체 목록으로 사용하는 게 일반적 흡사 switch 문과 비슷해 보임 _Generic으로 ceil() 함수를 구현한 예 #include #include #define ceil.. 더보기
[Effective Python 복습] Chapter 5. 병행성과 병렬성 21. 키워드 전용 인수로 명료성을 강요하자 키워드 인수는 함수 호출의 의도를 더 명확하게 해준다 특히 불 플래그를 여러 개 받는 함수처럼 헷갈리기 쉬운 함수를 호출할 때 키워드 인수를 넘기게 하려면 키워드 전용 인수를 사용하자 파이썬3는 함수의 키워드 전용 인수 문법을 명시적으로 지원한다 리스트에 있는 * 기호는 위치 인수의 끝과 키워드 전용 인수의 시작을 기리킨다 def safe_division_c(number, diviser, *, ignore_overflow=False, ignore_zero_division=False): # ... safe_division_c(1, 10**500, True, False) # TypeError safe_division_c(1, 0, ignore_zero_divisi.. 더보기
[포프 tv 복습] C99, C11 C99 C99 이전의 부동 소수점 연산 오류 처리 부동 소수점 연산 중 오류가 날 경우 그 이유를 오류 조건이라 함 C 라이브러리 함수가 오류 조건을 보고하는 경우가 있음 이 오류 조건의 일부는 errno를 통해 확인 가능 인자가 수학적으로 정의된 범위를 벗어날 경우 : EDOM 오버플로가 발생한 경우 : ERANGE 언더플로가 발생한 경우 : ERANGE가 설정될 수도 있음(구현에 따라 다름) C99의 부동 소수점 연산 오류 처리 좀 더 세분화된 부동 소수점 전용 오류 보고 기능 추가 이것을 '부동 소수점 예외'라고 부름 예외라고 하지만 다르 언어에서 말하는 예외는 아님 그냥 다른 형태의 오류 코드 errno에서 찾을 수 없던 오류 조건도 보고 됨 구현에 따라 다음 중 하나를 지원 여전히 errno을 .. 더보기
[Effective Python 복습] Chapter 4. 메타클래스와 속성 파이썬 코딩의 기술 Chapter4. 메타클래스와 속성 - 메타클래를 이용하면 파이썬의 class문을 가로채서 클래스가 정의될 때마다 특별한 동작을 제공할 수 있다 - 또 하나의 강력한 기능은 속성 접근을 동적으로 사용자화하는 파이썬의 내장 기능이다 - 동적 속성은 객체들을 오버라이드하다가 예상치 못한 부작용을 일으키게 할 수 있다 - 최소 놀랍 규칙을 따르자 29. getter와 setter method 대신에 일반 속성을 사용하자 간단한 공개 속성을 사용하여 새 클래스 인터페이스를 정의하고 setter와 getter method는 사용하지 말자 객체의 속성에 접근할 때 특별한 동작을 정의하려면 @property를 사용하자 @property method에서 최소 놀람 규칙을 따르고 이상한 부작용은 피하.. 더보기
[Effective Python 복습] Chapter 3. 클래스와 상속 파이썬 코딩의 기술 Chapter3. 클래스와 상속 22. 딕셔너리와 튜플보다는 헬퍼 클래스로 관리하자 다른 딕셔너리나 긴 튜플을 값으로 담은 딕셔너리를 생성하지 말자 정식 클래스의 유연성이 필요 없다면 가변운 불변 데이터 컨테이너에는 namedtuple을 사용하자 내부 상태를 관리하는 딕셔너리가 복잡해지면 여러 헬퍼 클래스를 사용하는 방식으로 관리 코드를 바꾸자 class WieghtedGradebook(object): def __init__(self): self._grades = {} def add_student(self, name): self._grades[name] = {} def report_grade(self, name, subject, score, weight): by_subject = se.. 더보기