try: print(f"연산결과") except: print("에러 발생") else: print("정상 동작") finally: print("수행 종료") Q) finally는 왜 쓰는걸까? 어차피 오류가 나던, 안나던 실행된다면 try문 바깥쪽에 적어도 되는거 아닌가? A) try나 except에 return문이 있으면 함수 자체가 종료되어 버린다. finally문에서 함수가 끝날 때 처리해야 하는 액션들을 처리하고 리턴하도록 할 수 있다. except에서 오류 종류로 판단하기 except ImportError: # 대응하기 except ValueError: # 대응하기 직접 오류 발생: raise로 오류 발생시키기 raise ValueError("입력값을 다시 확인하세요!") Custom Excep..
def printme(func): def new_function(*args, **kwargs): print("Name:", func.__name__) print("Positional Arguments:", args) print("Keyword Arguments:", kwargs) result = func(*args, **kwargs) print("Result:", result) return result return new_function @printme def add_ints(a, b): return a + b add_ints(1, 2) Name: add_ints Positional Arguments: (1, 2) Keyword Arguments: {} Result: 3
print(print.__doc__) print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False) Prints the values to a stream, or to sys.stdout by default. Optional keyword arguments: file: a file-like object (stream); defaults to the current sys.stdout. sep: string inserted between values, default a space. end: string appended after the last value, default a newline. flush: whether to forcibly flush th..
# Definition for singly-linked list. class ListNode: def __init__(self, x): self.val = x self.next = None class Solution: def isPalindrome(self, head: ListNode) -> bool: rev = None slow = fast = head # 런너를 이용해 역순 연결 리스트 구성 while fast and fast.next: fast = fast.next.next rev, rev.next, slow = slow, rev, slow.next if fast: slow = slow.next # 팰린드롬 여부 확인 while rev and rev.val == slow.val: slow, rev ..
is는 id값을 비교하는 함수 ==은 값을 비교하는 함수
ASCII, Unicode, UTF-8 ASCII: 글자당 1 byte Unicode: 글자당 4 byte UTF-8: 공간 낭비를 막는다. 글자당 1~4byte 사이로 필요한 byte만큼 사용한다. UTF-8이 공간 낭비를 막는 방식 UTF-8이 공간 낭비를 막는 방식에 대해서 살펴보자! 결론적으로 기억할 사실은 UTF-8은 US-ASCII와 호환성을 가졌다는 사실이다. 첫 바이트의 맨 앞 비트가 0이면 1바이트 문자, 10인 경우 특정 문자의 중간 바이트, 110인경우 2바이트, 1110인경우 3바이트, 11110인경우 4바이트 인걸로 문자 바이트의 길이를 인식할 수 있다. ASCII는 128개의 글자가 있다. 그러므로 2^7 -> 7 bit로 표현 가능하다. 1byte에 store 할 수 있는 것이..
파이썬은 원래 동적 타입 언어라서 타입이 없지만... 타입을 명시해서 혼란을 낮추는 방법이 존재한다. 그 중 Generics는 여러 타입을 허용한다. 데이터 형식에 의존하지 않고 인자, 변수 또는 반환값 등이 여러 다른 데이터 타입들을 가질 수 있는 방식을 제네릭이라고 한다. from typing import TypeVar T = TypeVar('T') U = TypeVar('U') def are_equal(a:T, b:U) -> bool: return a == b print(are_equal(10, 10.0)) # True example async def _crawl_and_reduce( self, urls: Iterable[str], parse_fn: Optional[Callable[[str], T]..
import sys sys.executable
파이썬에는 원래 struct가 없다... namedtuple이라는 라이브러리를 사용해서 구현할 수 있었다. from collections import namedtuple MyStruct = namedtuple("MyStruct", "a b c") m = MyStruct("a", "b", "c") ====파이썬 3.7이상이면 dataclass를 사용할 수 있다. 파이썬의 decoration(자바의 annotation같은거) 를 쓰면 된다. from dataclasses import dataclass @dataclass class Product: weight:int = None price:int = None apple = Product() apple.weight = 10
Chapter 9의 내용이다! automaton의 4가지 부류 Finite-state machine : 간단~ Pushdown automata Linear-bounded automata Turing machine: 복잡~ finite state machine인데 inverse가 true 아니다. 그 중 Turing Machine은 최고 등급의 automaton라고 볼 수 있다. 이 챕터를 배우기 위해서 그동안 오토마타를 배워왔다고 해도 과언이 아닐 만큼... https://namu.wiki/w/튜링%20머신 https://namu.wiki/w/오토마타 꽤 재미있으니까 위 나무위키 문서를 읽어보길 바란다 :) Turing Machine의 정의 Turing Machine M은, M = (Q, Σ, Γ, 𝛿,..
Chapter 8의 내용이다! CFG의 특성에 대해서는 이미 정의할 때 한번 다뤘는데 왜 또 얘기하지? 싶었는데 Pumping Lemma를 다루기 위한 것이였던 것 같다! Theorem 8.3, 8.4 CFL은 union, concatenation, star-closure에 닫혀 있다. intersection과 complementation에는 닫혀 있지가 않다. Theorem 8.5 L1이 context free language이고 L2이 regular language라면 L1 교집합 L2는 context free이다. Theorem 8.6 Context-free grammar G=(V, T, S, P)에 대하여, L(G)가 비어있는지 아닌지를 결정하는 알고리즘이 있다. Theorem 8.7 Contex..
Chapter 7의 내용이다! 일단 Pushdown Automata와 그 전의 automata와 가장 크게 다른 점은 pushdown automata는 스택을 사용할 수 있다는 것이다! Nondeterministic Pushdown Automata Pushdown Automata의 정의 M = (Q, Σ, Γ, 𝛿, q_0, z, F) * Γ 은 감마라고 부른다. 잘 보면 기존에 배웠던 finite automata에서 2가지의 원소가 추가되었다. 바로 Γ 와 z이다. Q: control unit의 initernal state의 유한 집합Σ: input alphabet Γ: 유한한 개수의 집합인 stack alphabet 𝛿: Q X ( Σ sum {ƛ}) X Γ : transifion function이 ..
friend함수는, 클래스의 멤버함수가 아닌 다른 외부 함수에게 클래스의 모든 멤버를 접근할 수 있는 권한을 부여한다. 클래스의 멤버로 선언하기에는 무리가 있고, 클래스의 모든 멤버를 자유롭게 접근할 수 있는 함수를 작성할 때 쓰면 좋다. 프렌드 유형에는 3가지가 있다. 1) 전역 함수 예: // 외부 함수 equals() 가져오기 class Rect { ... friend bool equals(Rect r, Rect s); }; 2) 다른 클래스의 멤버 함수 예: // RectManager 클래스의 equals() 가져오기 class Rect { ... friend bool RectManager::equals(Rect r, Rect s); }; 3) 다른 클래스 전체 // RectManager 클래스의..
Chapter2에 나오는 이야기이다! 2.1 Zuse’s Plankalkül 2.2 Pseudocodes 2.3 The IBM 704 and Fortran 2.4 Functional Programming: Lisp 2.5 The First Step Toward Sophistication: ALGOL 60 2.6 Computerizing Business Records: COBOL 2.7 The Beginnings of Timesharing: Basic 2.8 Everything for Everybody: PL/I 2.9 Two Early Dynamic Languages: APL and SNOBOL 2.10 The Beginnings of Data Abstraction: SIMULA 67 2.11 Ortho..
Chapter6의 내용이다! 앞서 배운 문맥자유문법 같은 경우, 우변에 오는 형태에 어떠한 제약도 없었다. 그런데 이게 항상 좋기만 한것도 아니다.. 따라서 이번 챕터에서는 문법을 단순하게 만드는 방법에 대해서 다뤄보려고 한다. 하지만 단순화 한다고 해서 무조건! 개수가 줄어야 하는 것이 아니라는걸 염두에 두자. 유용한 치환 규칙 어렵지 않은 규칙이다. A->aB B->c라면 A->ac로 바꿀 수 있다는 규칙이다. 증명은 생략하겠다. 필요없는 production 삭제하기 먼저 변수가 필요없다와 필요 있다를 구분하는 방법을 알아야 하는데, (Definition 6.1) 필요 있다 : L(G)에 포함되는 w에 대하여, S->xAy->w 으로 만들어질 수 있는 x, y가 (V set T)* 에 대하여 w가 하..
대부분의 언어에서는 pass by value를 쓴다. 그것이 안전하기 때문!!! pass by value 함수 호출 시에 매개변수의 값을 복사해서 전달한다. int val = 3 add(val) add함수 안에서 인자는 바꿔보았자 바깥이 val이 바뀌지 않는다. pass by reference 인자로 받은 값을 바꾸면 바깥의 값도 바뀐다. c에서는 아예 pass by reference 지원하지 않고, c++에서는 pass by reference도 지원한다. c에서 간혹 가다 포인터를 매개변수로 넘겨주는 것을 pass-by-reference로 가르치는 경우가 있는데 이는 명백한 오류이다. pass by assignment mutable한 오브젝트면 pass-by-reference방식으로, immutable..
MIPS Green Card를 보면, Text(Code), Static Data, Dynamic Data 영역과 Stack이 있는것을 볼 수 있다. Text영역에는 실행할 프로그램의 코드가 저장된다. CPU는 코드 영역에 저장된 명령어를 하나씩 들고가서 처리한다. Static Data 영역에서는 전역 변수와 static 변수가 들어간다. 프로그램의 시작과 동시에 할당된다. Dynamic Data영역이 heap인데, 사용자가 동적할당한 데이터로 채워진다. 런타임에 크기가 결정된다. C에서 realloc()이나 Java의 new같은 명령어를 실행할 때 사용되는 공간이다. 동적 할당의 단점은 1. memory leak: malloc했는데 주소 까먹음..ㅠ 다른 malloc으로 포인터를 실수로 뒤집어 씌웠다. ..
overloading: 이름만 같은 함수, 매개변수는 다르다 overriding: 완전히 같은 함수를 재작성 overloading은 함수 오버로딩, 생성자 오버로딩, 연산자 오버로딩 등 다양한 overloading이 있지만 연산자 오버로딩을 다뤄보려고 한다.. 원래의 +는 int나 float를 더하는 기능만 있다면 overloading을 통해서 행렬과 행렬을 더하는 기능으로도 확장할 수 있다. Matrix operator+(Matrix &another){ return Matrix(nums[0] + another.nums[0], nums[1] + another.nums[1], nums[2] + another.nums[2], nums[3] + another.nums[3]); } 전위증감과 후위증감... ht..
Chapter 5의 내용이다! 이전 포스팅에서 다뤘듯이 정규언어가 좋긴 한데, 프로그래밍 언어를 다루기에는 조금 부족한 요소들이 있었다. L = {a^n b^n: n>=0} 이면, a=(, b=)일 때 프로그래밍에서 괄호가 중첩인지 확인하기 좋지만 얘 역시 정규언어가 아니였다. (정규언어가 아님은 펌핑lemma를 통해서 보였다.) 따라서 우리는 정규언어보다 더 큰 개념인 '문맥 자유 언어'를 다룬다. 정규언어의 큰 단점은, 좌변은 한개의 변수이고 우변은 특정한 형태여야 했다. (정의임) 문맥 자유언어는 우변에 특정한 형태 대신 아무거나 올 수 있게 허용해줌으로써 더 강력해진다!! 정규언어 ⊂ 문맥 자유 언어이다. * linear grammar? 문제들은 주로, 주어진 언어가 문맥자유언어인지 보이라는 유형..
from collections import deque deque = deque(배열) deque.append(원소) : 오른쪽에 삽입 deque.appendleft(원소) : 왼쪽에 삽입 deque.popleft() : 왼쪽 pop deque.pop() : 오른쪽 pop deque.clear() : 삭제 deque.insert(i, 원소) : i번째에 원소 삽입 list()보다는 확실히!! 빠른것을 확인할 수 있다. list도 append, pop, len 다 O(1)이어서 괜찮을 줄 알았는데...😢 * list는 끝 원소의 pop만 O(1)이고 pop(0)은 O(N)이라고 한다 * [시간복잡도] https://wiki.python.org/moin/TimeComplexity https://j-ungry...