데이코레이터 기능은 자동완성의 기본이다. 앞에 설명했던 @staticmethod, @classmethod, @abstractmethod 또한 데코레이터다 데코레이터는 @ 붙여서 실행한다. def trace(func): def wrapper(): print(func.__name__, '함수 시작') func() print(func.__name__, '함수 끝') return wrapper def hello(): print('hello') def world(): print('world') trace_hello = trace(hello) trace_hello() trace_world = trace(world) trace_world() 이너 함수를 이용해서 실험을 해보았다. 이너함수 자체가 처음 본다면 이해하기..
코루틴은 메인루틴과 서브루틴으로 나뉘어진다. 메인루틴에서 서브루틴을 호출하면 서브루틴의 코드를 실행한 뒤 다시 메인 루틴으로 돌아온다. 이게 현재까지 써온 코드 방식이다. 그러나 코루틴은 서로 협력하는 루틴이라는 뜻이다. 메인루틴과 서브루틴처럼 종속 된 관계가 아니라 대등한 관계이며 특정 시점에 상대방의 코드를 실행한다. 코루틴은 함수가 종료되지 않은 상태에서 메인 루틴의 코드를 실행 한 뒤 다시 돌아와서 코루틴의 코드를 실행한다. 코루틴이 종료되지 않았으므로 코루틴의 내용도 계속적으로 유지된다. 코루틴에 값 보내기 def number_coroutine(): while True: x = (yield) print(x) print('coco') co = number_coroutine() next(co) co..
예외란, 코드를 실행하는 중에 발생한 에러를 뜻한다. 에러가 발생하면 코드 실행이 중단되지만, 예외처리를 하게 된다면 멈추지 않고 계속해서 진행하게 된다. try: x = int(input('나눌 숫자를 입려갛세요. : ')) y = 10 / x print(y) except: print('예외가 발생했습니다.') 0을 입력할 경우 >>> 예외가 발생했습니다. 숫자를 0으로 나누면 ZeroDivisionError 예외가 발생한다. 여기서 except에서 예외 처리를 하도록 만들었으므로 print('에ㅚ가 발생했습니다.')가 실행된다. 특정 예외만 처리하기 y = [10, 20, 30] try: index, x = map(int, input('인덱스와 나눌 숫자를 입력하세요: ').split()) print..
부모 클래스에 있는 클래스를 자기 것 처럼 사용 할수 있는 방식. 이를 상속이라고 부른다. class 기반클래스이름(기반 클래스 이름): 상속 방법은 이와 같다. class Person: def greeting(self): print('안녕하세요.') class Student(Person): def study(self): print('공부하기') james = Student() james.greeting() james.study() >>>안녕하세요. >>>공부하기 Student class에는 greeting 메서드가 없다. 그러나 Person을 상속 했기 때문에 자기것처럼 사용 할 수 있게 되었다. 이를 상속관계라고 부른다.
Class를 생성하고 나서 사용 할 때. class Person: bag = [] def put_bag(self, stuff): self.bag.append(stuff) james = Person() james.put_bag('책') maria = Person() maria.put_bag('열쇠') print(james.bag) print(maria.bag) >>>['책', '열쇠'] >>>['책', '열쇠'] 클래스 속성은 클래스에 속해 있으면 모든 인스턴스에서 공유한다. 그래서 클래스 속성에 접근 할 때 명칭은 self를 사용하기엔 좀 아쉽다. class Person: bag = [] def put_bag(self, stuff): Person.bag.append(stuff) Person.bag 라고 ..
클래스는 class에 클래스 이름을 지정하고 :(콜론)을 붙인 뒤 다음 줄 부터 def로 메서드를 작성하면 된다. 여기서 메서드는 클래스 안에 들어있는 함수를 뜻한다. 메서드의 첫 번째 매개변수는 반드시 self를 지정해야 한다. class Test: def test1(self): a = 'hello' 클래스를 생성하고 test라는 메서드를 만들었다. 여기서 self는 java의 this와 똑같다. 그러나 self는 생략이 안 되므로, 반드시 작성해야 하는 매개변수이다. 클래스 불러오기 james = 클래스() 클래스 불러오기는 다음과 같다. 변수명 = 클래스 이름을 붙인다. james안에 class가 담기게 된 것이다. 메서드 호출하기 james.greeting() 위의 예제에서 james에 클래스를 ..
함수를 포함한 스크립트 전체에 접근할 수 있는 변수를 전역 변수, 변수를 만든 함수안에서만 접근 할 수 있는 것을 지역변수라고 한다. 그래서 지역변수에서 생성된 변수는 함수 밖에서 사용 할 수 없는 것이 일반적인 사실이다. 그러나 만약 같은 이름이 있다면... 우선순위는 자기 함수 내에 있는 변수 즉, 지역변수가 우선순위이다. 이 우선 순위를 변경해보자. 함수 안에서 전역 변수 사용하기 global 전역변수 x = 10 def foo(): global x x = 20 print(x) foo() print(x) >>>20 >>>20 global을 사용할 경우 x의 변수를 지역변수에서 따로 생성하지 않는다. 기존 전역변수 x를 가져와서 전역변수 x의 값을 변경하는 모습을 볼 수 있다. 함수 안에서 함수 만들..
지금까지 def 함수를 정의해서 사용했지만, 람다 표현식으로 익명 함수를 만들 수가 있다. 기존 def 코드 def plus_ten(x): return x + 10 plus_ten(1) 람다식 코드 plus_ten = lambda x : x+ 10 print(plus_ten(1)) 람다식은 이처럼 한 줄 코딩에 도움이 된다. 람다식은 자체를 호출 할 수 있는 기능이 있다. print((lambda x : x +10)(1)) 람다식 식을 세우는 것과 자기 자신을 부르는 방법이다. 람다 표현식의 주의사항 람다 표현식 안에서는 새 변수를 만들 수가 없다. 반환값 부분은 변수 없이 식 한줄로 표현 할 수 있어야 한다. 변수가 필요한 코드일 경우에는 def로 함수를 작성하는 것이 좋다. y = 10 (lambda..
함수에서 위치 인수, 키워드 인수를 사용하는 방법과 리스트, 딕셔너리 언패킹을 황ㄹ용하는 방법을 알아보자. print(10, 20, 30) >>>10, 20, 30 위치 인수를 사용하는 함수를 만들고 호출한다. def print(numbers(a, b, c): print(a) print(b) print(c) fprint_numers에 숫자 세 개를 넣으면 각 줄에 숫자가 출력 된다. 언 패킹 사용하기 x = [10, 20, 30] print_numbers(*x) >>>10, 20, 30 x라는 리스트를 print에 넣었을 뿐인데 정상적으로 출력 되었다. 언패킹이란 리스트(튜플)앞에 * 붙이면 print_numbers(10, 20, 30)과 똑같은 동작이 작동 된다. 다른 말로는 리스트의 포장을 푼다는 뜻..
파일 사용하는 방법 open , write close() 방법이 있다. file = open('hello.txt', 'w') file.write('Hello, world!') file.close() hello.txt 메모장을 생성해서, 그 안의 내용을 저장한다. 파일 위치는 파이썬을 불러올 때 제일처음 보이는 화면, 파이썬 기본 화면에 메모장이 저장 되어있는 것을 확인 할 수가 있다. 파일 불러오기 file = open('hello.txt', 'r') s = file.read() print(s) file.close() 이제 메모장에 있는 내용을 가져오기 위해서는 반대로 'r' 방식을 이용해서 가져온다. 이제 print 함수를 통해 텍스트의 내용을 그대로 가져오는 것을 확인 할 수가 있다. 자동으로 파일 ..
문자를 바꿀때 사용하는 함수이다. 문자열 변경하기 'Hello, world!'.replace('world', 'Python') >>> 'Hello, Python!' 문자를 변경할 때 사용하는 함수는 replace다. 해당 문자열을 받게 된다면 정해진 문자열로 바꿔준다. table = str.maketrans('aeiou', '12345') 'apple'.translate(table) >>> '1ppl2' 각 문자마다 바꿀 문자를 정한 상태로 apple를 받아서 a와 e는 정해진 값으로 변경 되었다. maketrans와 tanslate는 세트이므로 같이 사용해야 효과를 발휘하는 함수이다. 문자열 분열하기 'apple, pear'.split(',') >>>['apple', 'pear'] 본의아니게 계속 사용..
리스트를 사용 할 때 한 줄로 늘어진 1차원 리스트라면, 리스트 2개를 사용한다면 2차원 리스트가 된다. 쉽게 말하면 표의 행과 열의 구분이다. a = [[10, 20],[30, 40],[50, 60]] 이는 3행 2열이다. 그래서 a의 길이는 3이다. 이제 이를 for문을 통해 출력을 한다고 과정 했을 때 a = [[10, 20], [30, 40], [50, 60]] print(a) for i in a: for j in i: print(j) 2개의 리스트를 사용하기 때문에 2개의 for문이 필요하다. 그러나 파이썬을 사용하므로 간략하게 쓰는 방법도 있다. a = [[10, 20], [30, 40], [50, 60]] for x, y in a: print(x, y) 이렇게 for문 하나로도 이차원 배열 ..
리스트를 추가와 삭제를 당연히 할 수 있다. 그 방법에 여러가지 방법이 존재한다. append, extend, insert가 있다. arr = [10, 20, 30] arr.append(500) append는 리스트 끝에 요소 하나를 추가한다. [10, 20, 30[ 에 500을 append 사용 할 경우 [10, 20, 30, 500] 이 된다. 그러나 여기서 조심해야할 점은 파이썬은 타입에 너무 자유롭다는 점이다. arr = [10, 20, 30] arr.append([100, 200]) >>[10, 20, 30,[100,200]] 그러므로 이렇게 append로 100, 200이 한 번에 들어올 경우에 리스트 안에 리스트를 넣는 결과도 낳을 수가 있다. 이에 대한 len(arr) 출력값은 4이다. 이..
조건문, 특정 조건일 때 사용하는 실행 문법. 오른쪽을 할건지 왼쪽을 할건지 구분을 지어야 할 때 x = '오른쪽' if x == '오른쪽: print('오른쪽입니다.) 이런식으로 사용 할 수 있게 된다. if 조건값 : 실행 코드 if로 조건이란 것을 명시하며 조건을 준다. 그리고 : 을 통해 조건문이 실행됨을 알린다. 실행 문자는 들여쓰기로 가능하다. 스페이스 2~4번 혹은 Tab키 하나로 들여쓰기로 조건문 안이라는 것을 명시한다. 이는 다른 언어에서 { } 처럼 중괄호로 명시를 해주지만, Python은 그러지 못 한다는 점에 있다. 그래서 중괄호 대신 들여쓰기로 구분을 짓는다. 그러나 여기서 조심해야 할 점은 if a == 10: print(a) print('가나다') 이렇게 들여쓰기가 일관성 없게..
연결된 값을 묶어서 저장하는 용도로 딕셔너리라는 자료형을 제공한다. a = {'a' : 50, 'b' : 40} 딕셔너리의 특징은 {} 중괄호를 사용한다는 점이다. 그리고 Java에서의 Map 방식을 이용한다. 기존 리스트는 순서대로 들어갔으므로 순서를 통해 위치를 파악한다면 딕셔너리는 a { 키값 : 결과값}의 키값을 통해서 결과값을 비교한다. 즉, 키 값을 임의로 저장 할 수 있으며, 내가 원하는 키값을 통해 결과값을 도출 시킬 수가 있다. 여기서 만약 key값이 중복 된다면? a = {'a' : 10, 'b':20, 'a':30} >>>a :30, b: 20 기존 언어와는 다르게 중복된 데이터가 들어오더라도 Error가 발생하지 않는다. 그러나 기존의 자료는 버리고 새로운 값이 들어감을 확인 할 수..