객체 지향 프로그래밍 23

딕셔너리와 zip함수 이해하기

📌딕셔너리 dict()함수 혹은 중괄호('{}')를 이용해 딕셔너리를 생성할 수 있다. 딕셔너리란 key와 value로 이루어진 자료형이다. dict1 = dict(a=1, b=2, c=3) dict2 = dict([('a',1),('b',2),('c',3)]) dict3 = {'a':1, 'b':2, 'c':3} print(dict1) print(dict2) print(dict3) # {'a':1, 'b':2, 'c':3} 📌zip() zip()함수를 이용해서도 딕셔너리를 만들 수 있다. dict1 = dict(zip(['a','b','c'], [1,2,3])) print(dict1) zip의 1,2번째 모두 길이가 같은 Iterable한 객체를 받는다. 그리고 각각의 요소를 차례로 짝지어주는 역할을 ..

enumerate함수(feat. 문자열비교)

📌enumerate란? enumerate함수는 enumerate 객체를 생성해주는 함수다. 그럼 enumerate 객체는 무엇일까? enumerate 객체는 순서 번호가 들어간 iterator 객체이다. 만약 반 학생들을 이름순으로 정렬한 뒤 각각 번호를 매긴다면 어떻게 해야할까? 이름순 정렬은 sort()나 sorted() 함수로 해결 가능할 것이다. 그런데 번호는 i=1부터 선언해서 각각 추가해 주어야 한다. 이를 간단하게 처리해주기 위한 함수가 enumerate 함수이다. student = ['Jihyeon', 'Andy', 'Chris', 'Songhye', 'Danny'] student.sort() enum_student = enumerate(student) for x in enum_studen..

코딩테스트에서 사용할만한 정렬기법

정렬 기술 📌sort 메서드 오름 차순 정렬 리스트에는 기본 내장된 sort 메서드가 존재한다. 이를 사용하면 쉽게 정렬이 가능하다. list1 = [7,1,5,3,2,4,6] list1.sort() print(list1) # [1, 2, 3, 4, 5, 6, 7] 내림 차순 정렬 list1 = [7,1,5,3,2,4,6] list1.sort(reverse = True) print(list1) # [7,6,5,4,3,2,1] 📌특정 조건으로 정렬하기 단순한 크기순 정렬이 아니라 특정 조건으로 정렬하려면 어떻게 해야 할까? 예를 들어 딕셔너리 경우 key와 value로 자료형이 구성되어 있다. 그 중 value로 정렬하려면 다음과 같은 방법을 이용할 수 있다. 정렬의 기준이 되는 함수를 정의한다. 정의한 ..

패킹과 언패킹 이해하기

Packing & Unpacking 패킹은 묶는 것, 언패킹은 다시 푼다는 뜻이다. Iterable한 객체들을 대상으로 패킹과, 언패킹을 수행할 수 있다. 대표적으로 튜플이나 리스트를 대상으로 패킹과 언패킹을 사용할 수 있다. 튜플 패킹시에는 소괄호를 사용해도 되고 안해도 가능하다. 튜플을 언패킹할 때는 *를 사용하며 결과는 리스트로 묶인다. 📌Packing t = 1,2,3,4,5 print(t) 📌Unpacking nums = (1,2,3,4,5) n1, n2, *others = nums print(others) # [3,4,5] 📌파라미터에 대해 함수의 파라미터에 *를 붙일 경우 나머지 값들은 패킹해서 전달하겠다는 것을 의미한다. def sum(*nums): result = 0 for x in nu..

map과 filter 함수 활용하기

📌map 함수 map 함수는 Iterable한 객체로부터 각각의 값을 꺼내 적용시킬 수 있는 함수이다. def power(x): return x**2 list1 = [1,2,3,4,5] squared = list(map(power, list1)) print(squared) # list1의 각각의 요소를 제곱한 값 출력 : 1,4,9,16,25 리스트 외에 튜플, 문자열과 같은 Iterable객체면 모두 전달이 가능하다. 📌슬라이싱 슬라이싱 시 세 번째 요소가 음수이면 꺼내는 방향이 바뀐다. list1 = ['one', 'two', 'three'] print(list(map(lambda x:x[::-1], list1))) # eno, owt, eerht print(list(map(lambda x:x[::-..

파이썬에서는 모든 것이 객체!

📌함수도 객체 파이썬에서는 클래스도, 함수도, 변수도 모두 객체이다. 따라서 함수의 파라미터로 전달할 인자로 함수도 전달할 수 있다. 📌람다 함수 이름이 없는 함수지만 한 번만 사용하기 위해서 사용하는 함수가 람다함수이다. 함수도 객체이므로 람다함수를 변수에 저장해서 사용할 수 있다. # 전달받은 string의 길이를 측정하는 함수 ref ref = lambda x: len(x) print(ref('String value')) # 공백 포함 12 출력📌스페셜 메서드 스페셜메서드란 인터프리터가 호출하는 메서드이다. 대표적으로 len() 함수, 리스트의 pop(), insert(), append() 등의 메서드가 있다. 📌Iterable 객체 Iterable 객체는 반복 가능한 객체이다. 예를..

리스트 컴프리헨션으로 가독성 높이기

📌for문 대체하기 리스트를 정의할 때 for 루프를 대체하는 방식이다. 리스트에 1부터 100까지 for문으로 서넌 list1 = [] for i in range(1, 101): list1.append(i) 벌써 3줄이나 사용해야 한다. 리스트 컴프리헨션은 이를 대체할 수 있는 방법이다. list1 = [x for x in range(1,101)] 리스트 컴프리헨션을 더 쉽게 이해한 방법은 뒤의 for문을 먼저 작성하는 것이다. x를 1부터 100까지 loop를 돌고, 그 때마다 x를 리스트 요소에 추가한다. if문이 들어간 리스트 컴프리 헨션도 같은 방식이다. 📌if문 포함 만약 1부터 100까지 짝수만 리스트에 추가하고 싶을 땐 어떨까? list1 = [x for x in range(1,101) i..

얕은 복사, 깊은 복사란?

복사는 복사인데 얕은 것과 깊은 것의 차이는 무엇일까? 핵심은 값의 복사이냐 주소값의 복사이냐의 차이이다. C에서는 포인터 개념이 존재하므로 언어 학습 시 꼭 배우게 되는 개념이다. Call by Reference냐 Call by Value이냐를 갖고 고민했던 기억이 난다. 파이썬에서는 얕은 복사가 Call by Reference, 깊은 복사가 Call by Value이다. 📌얕은 복사 = 주소값 복사 # Python list_1= [1,2,3] list_2 = list_1 # list_1과 list_2가 참조하는 대상(객체)이 같습니까? if list_1 is list_2: print('list_1과 list_2는 같은 객체를 참조합니다.') # list_1과 list_2가 참조하는 대상에 담긴 값이 ..

변경 불가능한 자료형 주의하기

변경 가능한 객체와 불가능한 객체 📌Immutable 변경 불가능한 객체는 무엇이 있을까? 파이썬에서는 대표적으로 문자열, 튜플이 있다. str1 = 'Rainy day' str1 = 'Sunny day' str1에 저장한 문자열을 바꾸었다. 하지만 여기서 문자열을 수정한 것은 아니다. 서로 다른 객체로 바꿔치기 한 것이다. 문자열 객체는 총 두 번 생성되었기 때문이다. 'Rainy day'와 'Sunny day' 즉, immutable한 객체는 문자열이 변경되지 않고 새롭게 생성된다. 튜플도 마찬가지이다. 튜플은 값을 변경하려고 시도하면 에러가 발생한다. 📌Mutable Mutable 객체는 변경 가능한 객체이다. 대표적으로 리스트, 딕셔너리가 있다. list1 = [1,2,3,4,5] list1[-1..

파이썬은 정말 인터프리터 언어일까?

📌파이썬 인터프리터 파이썬이 동작하는 방식은 인터프리터가 파이썬 코드를 바이트 코드로 변환한다. 바이트 코드가 PVM(Python Virtual Machine) 위에서 실행된다. 인터프리터가 파이썬 코드를 변환하고나면 .pyc 파일이 생성된다. 그런데 .pyc는 컴파일 된 파일이 아닌가? 라는 생각이 들었다. 📌자바와의 차이점 자바 코드의 실행 과정을 생각해 보았다. 자바 코드를 컴파일러(javac.exe)가 컴파일하여 .class 파일(byte code) 생성 컴파일된 .class 파일을 JVM에서 실행한다. 소스코드를 바이트 코드로 변환한 뒤 가상머신에서 실행한다는 점은 같다. 자바의 경우 컴파일러가 변환한 .class 파일이 생성된다. 이분법적으로 이것을 구분하는 것 자체가 문제라고 생각된다. 굳이..