-
파이썬공부/ML 모의 인터뷰 스터디 2024. 1. 26. 11:15728x90
https://boostdevs.gitbook.io/ai-tech-interview/interview/4-python
문제가 전부 영어였어서 번역하고 번역체스럽지 않게 다시 의역함
- Python에서 list과 tuple의 차이점은 무엇입니까?
- 둘 다 시퀀스(순서가 있는 데이터)를 나타내는 데이터 타입
- list : mutable, '[]', 가변성으로 인해 더 많은 메모리 사용, 데이터가 동적으로 변경해야하는 경우나 순서가 있을 때 유용
- tuple : immutable, '()', 불변성으로 인해 메모리 사용이 덜함, 데이터에 불변성이 필요한 경우(함수에서 여러 값을 반환하거나, 딕셔너리의 키로 사용되는 경우)
- 파이썬의 주요 특징은 무엇입니까?
- 간결하고 가독성 높은 문법
- 동적 타이핑 : 변수의 타입을 미리 선언할 필요가 없음, 실행 중에 자동으로 타입이 결정
- 인터프리터 언어 : 코드를 직접 실행할 수 있어 컴파일 단계가 필요 없음, 빠른개발과 테스트가 가능
- 객체 지향 프로그래밍 : 클래스와 객체를 사용하여 모듈화와 재사용성을 촉진
- 동적 메모리 관리 : 자동으로 메모리 관리하며 불필요한 메모리를 자동으로 회수
- 다양한 표준 라이브러리
- 크로스 플랫폼 지원 : 여러 운영체제에서 동작함
- 커뮤니티와 생태계
- 대중적인 사용 : 웹 개발, 데이터 분석, 인공지능, 기계학습, 자동화 등에 사용
- 오픈 소스
- 파이썬은 어떤 언어인가요? 프로그래밍인가, 스크립팅인가?
- 파이썬은 프로그래밍 언어이면서 동시에 스크립팅 언어임
- 프로그래밍 언어 : sw개발 및 다양한 응용 프로그램을 작성하는 데 사용, 객체 지향 프로그래밍과 함수형 프로그래밍의 특징을 지원하며, 대규모 프로젝트 및 시스템 개발에도 적합
- 스크립팅 언어 : 해석기를 통해 소스코드를 직접 실행하며, 보통 작은 규모의 작업이나 스크립트를 작성하는 데 특화, 간결한 문법과 빠른 개발 사이클로 인해 스크립트 작성에 매우 적합
- Python은 interpreted 언어입니다. 설명해주세요.
- 인터프리터 언어 : 소스 코드를 바로 실행하는 언어, 코드를 한 줄씩 읽고 해석하여 실행하는 방식
- 컴파일러 언어 : 소스 코드를 먼저 기계어로 번역한 후, 나중에 실행하는 방식
- 인터프리터 언어 동작방식 : 소스 코드 작성=>인터프리터 실행=>코드 해석 및 실행=>실행 결과 출력 또는 오류 메세지
- 장점 : 빠른 개발 사이클/플랫폼 독립성
- 단점 : 성능(속도가 느림)/코드 보호 어려움
- pep 8이란 무엇입니까?
- "Python Enhancement Proposal 8"의 약자, 파이썬 코드의 스타일 가이드를 정의한 문서
- 들여쓰기/코드라인 길이(코드길이 : 79자 제한, 문자열 : 72자 제한)/공백/import문/명명규칙/주석/함수와 메서드
- Python에서 메모리는 어떻게 관리됩니까?
- 자동으로 메모리 관리를 제공하여 개발자가 명시적으로 메모리를 할당하거나 해제할 필요가 없음
- 자동 메모리 관리
- 가비지 컬렉션 : 더이상 참조되지 않는 객체를 자동으로 식별하고 제거
- 참조 카운트 : 객체의 참조 수를 추적함, 객체의 참조 수가 0이 되면 해당 객체는 가비지 컬렉션에 의해 해제
- 자동 메모리 관리 이외
- 사용자 정의 객체의 메모리 관리 : '__del__'이라는 메서드를 사용하여 사용자가 직접 만든 클래스에서 사용
- 메모리 누수 방지 : 명시적인 메모리 해제가 없더라도 잘못된 코드나 데이터 구조 설계로 인해 누수가 발생할수도 있음=>프로파일링 도구를 사용하여 코드 검토, 메모리사용을 최적화
- Python의 namespace란 무엇입니까?
- 변수가 객체에 바인딩되는 이름과 객체 자체를 관리하는 시스템=>변수 이름과 해당 변수가 참조하는 객체 간의 매핑을 제공
- local namespace : 함수 내부에서 정의된 변수들이 속함, 함수가 호출될 때 생성하고 실행이 끝나면 소멸
- global namespce : 모듈 수준에서 정의된 변수들이 속함, 프로그램 시작 시 생성되고 종료될때까지 유지
- built-ind namespace : 파이썬 언어 자체에서 정의한 변수들이 속함 ex)"print()","len()" 등
- namespace는 딕셔너리와 유사한 형태로 구현되어 있음, 이에 접근하고 조작하는데는 globals(), locals()함수를 통해 할 수 있음, dir()함수를 사용하면 현재 namespace에 속한 식별자들의 list를 얻을 수 있음
- 즉, namespace는 변수 이름과 그에 대응하는 객체 간의 매핑을 관리하여, 변수의 범위와 생명주기 제어
- PYTHONPATH란 무엇입니까?
- 파이썬 인터프리터가 모듈을 찾을 때 사용하는 환경변수, 모듈을 찾을 때 파이썬에게 추가적인 디렉터리 경로를 알려주는 역할, 모듈을 import할 때 파이썬은 "PYTHONPATH"에 정의된 디렉터리들과 현재 작업 디렉터리를 검색하여 해당 모듈을 찾음=>사용자는 파이썬 모듈이 특정 디렉터리에 위치한 경우에도 쉽게 import가능
- 파이썬 모듈이란 무엇입니까? Python에서 일반적으로 사용되는 내장 모듈의 이름은 무엇입니까?
- 파이썬 모듈 : 파이썬 코드를 구조화하고 재사용 가능하도록 하는 단위, 변수,함수,클래스 등을 정의한 파일
- import를 사용하여 쓸 수 있으며, 코드의 모듈화와 재사용성을 촉진함
- ex)math, random, datetime, os, sys 등
- Python의 지역 변수와 전역 변수는 무엇입니까?
- 지역변수 : 함수 내부에서 정의된 변수, 함수호출 시 지역변수 생성되며 실행이 끝나면 소실, 함수내부에서만 접근
- 전역변수 : 함수 외부에서 정의된 변수, 프로그램 전체에서 접근가능하며, 여러 함수에서 공유가능
- 파이썬은 대소문자를 구분하나요?
- 구분함
- Python에서 type 변환이란 무엇입니까?
- 변수나 값의 데이터 타입을 다른 타입으로 변경하는 과정
- 파이썬은 동적 타이핑언어로 변수에 할당된 값에 따라 자동으로 데이터 타입이 결정되지만, 때로는 명시적으로 형변환할 필요도 있음
- Windows에 Python을 설치하고 경로 변수를 설정하는 방법은 무엇입니까?
- 파이썬 설치 : 공식홈페이지에서 다운로드가능하며, "Add Python to PATH"옵션을 체크해주는 게 좋음
- 환경변수 설정 : 제어판의 시스템 및 보안>시스템>고급 시스템 설정에서 고급탭에서 환경변수를 찾아 사용자변수/시스템변수 PATH를 선택하고 편집을 눌러 python설치경로를 추가함
- 확인 및 테스트 : cmd를 열고 'python'명령을 입력하여 파이썬 셀이 실행되는 지 확인
- 파이썬에서는 들여쓰기가 필요합니까?
- Yes, 파이썬에서 들여쓰기를 강제하여 코드블록을 나타냄으로써 가독성을 올림
- Python array와 list의 차이점은 무엇입니까?
- array
- 배열 내 모든 요소는 동일한 데이터 타입
- array모듈을 사용하여 생성
- 배열의 크기를 생성할 때 결정하고 이후에는 변경하기 어려움
- 배열의 기능이 제한적
- list
- 다양한 데이터 타입의 요소를 포함할 수 있는 동적 배열
- 별도의 모듈 필요없음
- 동적으로 크기 조절가능
- 다양한 메서드와 함수를 사용하여 리스트 조작가능
- array
- Python의 함수란 무엇입니까?
- 재사용가능한 코드 블록, 특정한 작업을 수행하도록 설계됨, 일련의 명령문들을 묶어서 하나의 단위로 만들어주고, 필요할 때마다 호출하여 사용할 수 있음, 'def'키워드를 사용하여 정의
- 함수의 주요 구성 요소 : 매개변수, 인수, 함수 본문, 반환 값
- __init__이 무엇인가요?
- 파이썬 클래스에서 특별한 메소드로 객체가 생성될 때 자동으로 호출되는 초기화 메서드, 사용하면 객체의 초기 상태를 설정하거나 필요한 초기화 작업을 수행 가능, 코드의 가독성을 높이고 객체 생성과 초기화를 효율적처리
class Dog: def __init__(self, name, age): self.name = name self.age = age def bark(self): print("Woof!") # 객체 생성 및 초기화 my_dog = Dog(name="Buddy", age=3) # 객체의 속성에 접근 print(my_dog.name) # 출력: Buddy print(my_dog.age) # 출력: 3 # 메서드 호출 my_dog.bark() # 출력: Woof!
- 람다 함수란 무엇입니까?
- 익명함수, "def"라는 키워드를 사용하지 않고 "lambda"키워드를 사용하여 간단하게 작성됨
add = lambda x, y: x + y result = add(3, 5) print(result) # 출력: 8
- 파이썬에서 self란 무엇입니까?
- 클래스의 인스턴스를 나타내는 특별한 키워드, self를 통해 메서드 내 인스턴스 변수에 접근,수정 가능
class MyClass: def __init__(self, value): self.value = value def print_value(self): print(self.value) def update_value(self, new_value): self.value = new_value # 클래스 인스턴스 생성 obj = MyClass(value=10) # 메서드 호출 obj.print_value() # 출력: 10 # 다시 메서드 호출 obj.update_value(20) obj.print_value() # 출력: 20
- break, continue, pass는 어떻게 작동하나요?
- 반복문과 조건문을 제어하기 위한 키워드들
- break : 반복문을 종료하는 데 사용됨
- continue : 반복문 내에서 현재 반복을 종료하고 다음 반복으로 넘어감
- pass : 아무런 동작도 하지 않고, 단순히 코드 블록을 건너뛰는 데 사용
- [::-1]은 무엇을 합니까?
- 시퀀스(문자열, 리스트 등)을 역순으로 뒤집는 표현
- 슬라이싱의 일반적인 구문은 [start:stop:step], start는 시작 인덱스, stop은 종료 인덱스, step은 슬라이스 간격
- Python에서 list의 item을 어떻게 random하게 생성할 수 있습니까?
import random # 1부터 10까지의 무작위 정수 생성 random_number = random.randint(1, 10) print(random_number)
- iterator와 iterable의 차이점은 무엇입니까?
- iterable
- "__iter__()"메서드를 구현하거나, "__getitem__()"메서드가 있는 객체
- iter()함수를 사용하여 iterator로 변환가능
- 반복이 가능한 객체이지만 직접 값을 반환하지 않음
- ex)튜플, 리스트, 문자열
- iterator
- "__iter__()"와 "__next__()"메서드를 구현한 객체
- iter()함수를 사용하여 자기자신을 반환
- next()함수를 사용하여 값을 하나씩 순차적으로 가져올 수 있음
- 순파적으로 반환할 수 있는 객체
- ex)range(), zip(), enumerate()
- iterable
- Python에서 난수를 어떻게 생성할 수 있나요?
import random #0이상 1미만의 무작위 실수 반환 random_number = random.random() print(random_number) #a부터 b까지의 무작위 정수를 반환 random_integer = random.randint(1, 10) print(random_integer) #a부터 b까지의 무작위 실수를 반환 random_float = random.uniform(1.0, 5.0) print(random_float) #시퀀스에서 무작위로 하나의 요소를 선택 my_list = [1, 2, 3, 4, 5] random_element = random.choice(my_list) print(random_element) #시퀀스의 요소들을 무작위로 섞음 my_list = [1, 2, 3, 4, 5] random.shuffle(my_list) print(my_list)
- range와 xrange의 차이점은 무엇입니까?
- 파이썬 2버전엔 둘 다 있었으나 파이썬 3버전에는 xrange가 사라짐
- range : 주어진 범위의 정수를 나타내는 객체를 생성, 범위 내의 모든 값을 리스트로 생성하여 반환함, 큰범위일 경우 메모리를 많이 사용할 수도 있음
- xrange : 실제로 범위 내의 값들을 미리 생성하여 리스트로 만들지 않고, 필요한 값이 요청될 때마다 생성함, 메모리 효율적으로 사용
- =>3버전에서는 xrange가 없어지면서 range가 xrange처럼 동작하도록 됨
- 파이썬에서는 주석을 어떻게 작성하나요?
- 한 줄 주석은 #, 여러 줄 주석은 """~~~내용~~~~""" 이케 쓰면 됨
- pickling과 unpickling이란 무엇입니까?
- 객체를 직렬화(serialize)하고 역직렬화(deserialize)하는 프로세스를 나타냄, 이런 프로세스는 데이터를 파일에 저장하거나 네트워크를 통해 전송하고, 나중에 원래의 객체로 복원하는 데 사용
- 직렬화(serialization)란?
- 데이터 구조나 객체를 바이트 스트림 또는 다른 형태로 변환하는 과정, 직렬화된 데이터는 파일에 저장하거나 네트워크를 통해 전송할 수 있고, 직렬화된 데이터는 이후, 역직렬화를 통해 원복가능
- 목적 : 데이터 저장, 네트워크 통신, 프로세스 간 통신
import pickle # 객체 직렬화 data = {'name': 'Alice', 'age': 25, 'city': 'Wonderland'} serialized_data = pickle.dumps(data) # 직렬화된 데이터를 파일에 저장 with open('serialized_data.pkl', 'wb') as file: file.write(serialized_data) # 파일에서 직렬화된 데이터 읽어오기 with open('serialized_data.pkl', 'rb') as file: loaded_data = pickle.load(file) print(loaded_data) # 출력: {'name': 'Alice', 'age': 25, 'city': 'Wonderland'}
- 파이썬의 generator는 무엇입니까?
- 이터레이터(iterator)를 생성하는 함수, 일반적인 함수가 값을 반환하고 종료되면, 제너레이터는 값을 반환하고 일시적으로 중단되며, 나중에 다시 시작하여 계속 진행하게 됨, 제너레이터는 이터레이터를 간단화, 메모리 효율화
- 제너레이터를 생성하는 방법은 함수 정의 시 return 대신 yield키워드를 사용하는 것, yield는 값을 반환하면서 현재의 상태를 보존하고 함수의 실행을 일시 중단함
def simple_generator(): yield 1 yield 2 yield 3 # 제너레이터 객체 생성 gen = simple_generator() # 값을 순차적으로 가져오기 print(next(gen)) # 출력: 1 print(next(gen)) # 출력: 2 print(next(gen)) # 출력: 3
- 문자열의 첫 글자를 어떻게 대문자로 변환하시겠습니까?
#capitalize() : 메서드는 문자열의 첫 글자는 대문자로 만듦 original_string = "hello world" new_string = original_string.capitalize() print(new_string) # 출력: Hello world #upper() : 문자열의 첫 번째 글자에 인덱스를 사용하여 해당 문자를 대문자로 변환가능 original_string = "hello world" new_string = original_string[0].upper() + original_string[1:] print(new_string) # 출력: Hello world #title() : 각 단어의 첫 글자를 대문자로 만듦 original_string = "hello world" new_string = original_string.title() print(new_string) # 출력: Hello World
- 문자열을 모두 소문자로 어떻게 변환합니까?
original_string = "Hello World" original_string = original_string.lower() print(original_string) # 출력: hello world
- 파이썬에서 여러 줄을 주석 처리하는 방법은 무엇입니까?
- """~~~내용~~~"""
- Python의 docstrings이란 무엇입니까?
- docstrings(문서 문자열) : 모듈, 클래스, 함수, 메서드 등의 정의에 첨부된 문자열 , 이러한 문자열은 해당 코드 요소의 문서화에 사용되며 주로 도움말 문서를 생성하거나 코드를 이해하기 쉽게 만들기 위해 활용됨
def square(x): """<-여기서 This function squares the input. Parameters: - x: The number to be squared. Returns: The square of the input. """<-여기까지 같은 걸 docstrings라고 함 return x ** 2
- is, not 및 in 연산자의 목적은 무엇입니까?
#is : 객체의 동일성 비교, 두 객체가 메모리 상에서 정확히 같은 객체인지 확인 a = [1, 2, 3] b = a c = [1, 2, 3] print(a is b) # True (a와 b는 동일한 객체) print(a is c) # False (a와 c는 다른 객체) #not : 부울값의 부정을 수행 condition = True print(not condition) # False #in : 시퀀스에 특정 값이 있는지 여부 확인 my_list = [1, 2, 3, 4, 5] print(3 in my_list) # True print(6 in my_list) # False
- Python에서 help() 및 dir() 함수의 사용법은 무엇입니까?
- help() : 주어진 객체에 대한 도움말 정보를 표시
- dir() : 주어진 객체가 가지고 있는 속성 및 메서드의 목록을 반환, 인터렉티브 환경에서 객체의 내부 구조를 살펴볼 때 유용하며, 어떤 속성과 메서드를 사용할 수 있는지 확인하는데 도움
- Python이 종료될 때마다 왜 모든 메모리 할당이 해제되지 않습니까?
- 파이썬은 메모리를 관리하는데에 CPython이라고 불리는 구현을 주로 사용
- CPython은 메모리관리를 위해 자체적인 가비지 컬렉션 메커니즘을 가지고 있음
- 종료될 때마다 모든 메모리 할당을 해제하지 않는 이유는?
- 효율성 : 프로그램이 실행되는 동안 자주 사용되는 모듈이나 데이터를 캐시에 유지하여 다음실행에 대비
- 최적화 : 일부 구현에서는 메모리를 해제하는 데 드는 비용이나 오버헤드를 줄이기 위해 일부 메모리를 해제하지 않을 수도 있음
- 플랫폼 종속성 : 운영체제에 따라 메모리의 해제는 다르게 동작할 수도 있음
- 주로 파이썬 인터프리터가 실행되는 환경에 의존하며, 일반적으로 파이썬이 종료되면 운영체제가 할당된 메모리를 해제함, 파이썬이 실행 중일 때 가비지 컬렉션이 주기적으로 실행되어 더이상 사용되지 않는 객체들을 해제하고 메모리 회수
- Python에서 dictionary란 무엇입니까?
- 키와 값의 쌍으로 이루어진 데이터 구조
- 각각의 키는 고유하며 이 키에 연결된 값은 어떤 데이터 형태든지 가능함
my_dict = {'이름': '홍길동', '나이': 25, '성별': '남성'}
- 파이썬에서 삼항 연산자를 어떻게 사용할 수 있나요?
result = value_if_true if condition else value_if_false
- *args, **kwargs는 무엇을 의미하나요? 그리고 우리는 그것을 왜 사용할까요?
- *args(Positional Arguments) : 함수에 임의의 개수의 위치 인자를 전달할 수 있게 해줌
- **kwargs(Keyword Arguments) : 함수에 임의의 개수의 키워드 인자를 전달
- =>다양한 수의 인자를 처리하거나, 동적인 함수를 작성할 때 유용, 특히 함수의 시그니처를 더 유연하게 만들어주어 다양한 상황에서 함수를 사용하기 편리하게 함
#*args def example_function(*args): for arg in args: print(arg) example_function(1, 2, 3, 4) #**kwargs def example_function(**kwargs): for key, value in kwargs.items(): print(key, value) example_function(name="John", age=25, city="New York")
- len()은 무엇을 합니까?
- 파이썬 내장 함수로 주어진 시퀀스(리스트, 튜플, 문자열 등)의 길이를 반환
- Python에서 “re” 모듈의 split(), sub(), subn() 메서드를 설명합니다.
- "re"모듈 : 정규 표현식을 사용하는데 도움을 주는 파이썬 내장 모듈
- split() : 주어진 패턴에 맞게 문자열을 나누고 결과를 리스트로 반환
- sub() : 주어진 패턴과 일치하는 부분을 대체 문자열로 교체함
- subn() : 주어진 패턴과 일치하는 부분을 대체 문자열로 교체하고 교체된 횟수를 함께 튜플의 형식으로 반환
import re #split(pattern, string, maxsplit=0) text = "apple,orange,banana" result = re.split(",", text) print(result) # 출력: ['apple', 'orange', 'banana'] #sub(pattern, repl, string, count=0) text = "apple orange apple orange" result = re.sub("orange", "banana", text) print(result) # 출력: 'apple banana apple banana' #subn(pattern, repl, string, count=0) text = "apple orange apple orange" result, count = re.subn("orange", "banana", text) print(result) # 출력: 'apple banana apple banana' print(count) # 출력: 2
- 음수 인덱스란 무엇이며 왜 사용됩니까?
- 파이썬에서 시퀀스의 끝에서부터 역방향으로 인덱싱할 때 사용됨, -1은 시퀀스의 마지막요소
- 사용이유?
- 역순 접근
- 편리한 길이계산
- 인덱스 범위 확인
- Python 패키지란 무엇입니까?
- 모듈들의 계층적인 디렉터리 구조를 가진 모듈의 집합, 여러 모듈을 묶어놓은 디렉터리
- 패키지를 만들기 위해서는 해당 디렉터리 안에 '__init__.py'파일이 있어야함, 이 파일은 해당 디렉터리를 패키지로 인식하게끔하는 역할을 함, 패캐지 내에는 다수의 모듈과 하위 패키지들이 위치할 수 있음
- 모듈을 구조적으로 정리하고 네임스페이스를 관리하는데 도움이 되며, 큰 프로젝트에서 코드를 조직화하고 모듈 간의 충돌을 피하는 데 유용함
- Python에서 파일을 어떻게 삭제할 수 있나요?
- 운영체제와 상호작용하기 위한 여러 기능을 제공하는 'os'모듈을 사용하여 os.remove()함수를 사용하여 파일삭제
- 기본적으로 제공해주는 Python type은 무엇입니까?
- int, float, str, bool, list, tuple, dict, set, ...
- NumPy arrays은 (중첩된) Python list에 비해 어떤 이점을 제공합니까?
- NumPy arrays는 파이썬의 과학 및 수학 연산을 위한 라이브러리, 다차원 배열인 NumPy배열이 핵심
- 성능 향상 : NumPy배열은 c로 구현되어 있어 연산이 효율적, 반복문 없이 배열의 모든 요소에 대한 연산을 병렬로 처리할 수 있도록 해줌
- 메모리 효율성 : NumPy배열은 연속된 메모리 블록에 저장되므로 메모리 효율성이 좋음, 리스트의 중첩 구조보다 적은 메모리를 사용하게 되어 대용량 데이터에 유리
- 편리한 연산 : 다양한 수학 및 통계 함수를 제공하며, 배열에 대한 간편한 연산을 지원, 반복문을 사용하지 않고 배열에 대한 연산을 수행할 수 있음
- 브로드캐스팅 : 서로다른 모양의 배열 간에도 연산이 가능하도록 하는 브로드캐스팅 기능을 제공, 배열의 모양이 다르더라도 일정한 규칙에 따라 자동으로 연산이 가능
- 선형 대수 연산 : 선형 대수 연산을 위한 다양한 함수를 제공하며, 행렬분해, 특이값 분해, 역행렬 계산등 지원
- 빠른 속도로 구현된 함수 : 다양한 수치 계산 함수를 내장하고 있어, 사용자가 직접 반복문으로 구현하는 것보다 빠르게 작동
- 풍부한 기능과 유용한 메서드
- NumPy arrays는 파이썬의 과학 및 수학 연산을 위한 라이브러리, 다차원 배열인 NumPy배열이 핵심
- 파이썬 배열에 값을 추가하는 방법은 무엇입니까?
- list - append(), insert()
- numpy - np.append()
- 파이썬 배열에서 값을 제거하는 방법은 무엇입니까?
- list - remove(), pop()
- numpy - delete(array, obj, axis=None)
- Python에는 OOps 개념이 있습니까?
- OOps=Object Oriented Programming=객체지향 프로그래밍
- 객체 지향 프로그래밍은 프로그램을 객체라는 기본 단위로 나누고 이러한 객체들 간의 상호작용을 통해 프로그램을 구성하는 프로그래밍 패러다임
- 클래스, 객체, 상속, 다형성, 캡슐화
- 깊은 복사와 얕은 복사의 차이점은 무엇입니까?
- 깊은 복사 : 새로운 객체를 생성하고 원본 객체의 내부에 있는 요소들을 새로운 객체에 재귀적으로 복사, 내부에 있는 객체도 새로 생성됨, 복사된 객체와 원본 객체는 완전히 독립적이므로 하나의 객체를 변경해도 다른 객체에 영향을 주지 않음 import copy - deepcopy()
- 얕은 복사 : 새로운 객체를 생성하고, 원본 객체의 내부에 있는 요소들을 새로운 객체에 복사함, 동일한 객체를 참조하게 되므로 내부 객체가 변경되면 복사된 객체에도 영향을 미침 import copy - copy()
- Python에서 멀티스레딩은 어떻게 할 수 있습니까?
- 'threading'모듈을 사용, 멀티스레딩은 여러 스레드를 사용하여 동시에 여러 작업을 수행하는 것을 의미
- CPU-bounding작업에 더 효과적으로 멀티스레딩을 사용하고 싶다면 'concurrent.futures'모듈의 'TreadPoolExecutor', 'ProcessPoolExecutor'고려 가능
import threading import time def print_numbers(): for i in range(5): time.sleep(1) print(f"Number: {i}") def print_letters(): for letter in 'ABCDE': time.sleep(1) print(f"Letter: {letter}") # 스레드 생성 thread1 = threading.Thread(target=print_numbers) thread2 = threading.Thread(target=print_letters) # 스레드 시작 thread1.start() thread2.start() # 메인 스레드는 스레드가 종료될 때까지 기다림 thread1.join() thread2.join() print("Main thread exiting.")
- 파이썬에서 컴파일과 링킹은 어떻게 진행되나요?
- 파이썬은 고수준 언어로서 인터프리터 방식을 채택하고 있음, 컴파일 단계와 링킹 단계가 명시적으로 구분되지 않음, 코드는 소스코드로부터 직접 실행되기 때문에 번역 단계에서 기계어로 변환되지 않음
- 소스코드작성=>소스코드해석=>바이트코드실행=>동적 실행
- Python 라이브러리란 무엇입니까? 그 중 몇 가지를 말해 보세요.
- 파이썬 프로그램에서 사용할 수 있는 모듈과 패키지의 모음
- math, random,datetimme, os, json 등
- split은 무엇에 사용되나요?
- 문자열을 특정 구분자를 기준으로 분리하는 함수
- Python에서 모듈을 가져오는 방법은 무엇입니까?
- import키워드를 사용하여서 들고옴
- Python의 상속을 예를 들어 설명하십시오.
- 상속은 기존클래스의 특성과 기능을 그대로 물려받아 새로운 클래스를 정의하는 것, 부모 클래스(기본클래스, 슈퍼 클래스)의 특성과 기능을 자식 클래스(파생클래스, 서브 클래스)이 상속받아 확장,수정 가능
# 부모 클래스 정의 class Animal: def __init__(self, name): self.name = name def speak(self): pass # 부모 클래스에서는 구현하지 않음 # 자식 클래스 정의 (상속) class Dog(Animal): def speak(self): return f"{self.name} says Woof!" # 다른 자식 클래스 정의 (상속) class Cat(Animal): def speak(self): return f"{self.name} says Meow!" # 객체 생성 및 사용 dog_instance = Dog("Buddy") cat_instance = Cat("Whiskers") print(dog_instance.speak()) # "Buddy says Woof!" print(cat_instance.speak()) # "Whiskers says Meow!"
- Python에서 클래스는 어떻게 생성되나요?
- 'class'키워드를 사용하여 정의됨
- 클래스 정의는 클래스 이름, 클래스 속성(변수), 클래스 메서드(함수)등을 포함
# 클래스 정의 class MyClass: # 클래스 속성 class_variable = "I am a class variable" # 생성자 메서드 (인스턴스 생성 시 호출되는 메서드) def __init__(self, name): # 인스턴스 속성 self.name = name # 인스턴스 메서드 def say_hello(self): return f"Hello, {self.name}!" # 클래스를 기반으로 객체(인스턴스) 생성 my_instance = MyClass("John") # 객체의 속성 및 메서드 호출 print(my_instance.name) # "John" print(my_instance.say_hello()) # "Hello, John!" print(MyClass.class_variable) # "I am a class variable"
- Python에서 monkey patching이란 무엇입니까?
- 프로그램이 실행중일 때 런타임에 코드를 수정하거나 추가하여 기존 모듈이나 클래스의 동작을 변경하는 것, 일반적으로 모듈이나 클래스의 소스 코드를 직접 수정하지 않고도 해당 모듈이나 클래스의 동작을 수정하거나 확장할 수 있는 유연성 제공
- 사용 사례 : 기능 추가 또는 수정, 디버깅 및 테스트, 외부 라이브러리 확장, 프레임워크 확장
- 파이썬은 다중 상속을 지원합니까?
- 하나의 클래스가 여러 개의 부모 클래스로부터 상속받을 수 있는 기능, 파이썬은 지원함(갓이썬!)
class Parent1: def method1(self): print("Method from Parent1") class Parent2: def method2(self): print("Method from Parent2") # 다중 상속을 받는 클래스 class Child(Parent1, Parent2): def child_method(self): print("Method from Child") # Child 클래스의 인스턴스 생성 my_instance = Child() # 다중 상속으로부터 상속받은 메서드 호출 my_instance.method1() # "Method from Parent1" my_instance.method2() # "Method from Parent2" # 자식 클래스의 메서드 호출 my_instance.child_method() # "Method from Child"
- Python의 다형성이란 무엇입니까?
- 객체 지향 프로그래밍에서 사용되는 개념 중 하나로 여러 개의 클래스가 동일한 메서드,속성,인터페이스 등을 공유하면서도 각 크랠스마다 다른 동작을 하는 능력, 같은 메서드 이름이나 인터페이스를 사용하여 다양한 타입의 객체에 대해 작동할 수 있도록 함
- 재사용성과 유연성을 높여줌
#메서드 다형성 class Dog: def speak(self): return "Woof!" class Cat: def speak(self): return "Meow!" def animal_speak(animal): return animal.speak() # 다형성을 활용하여 다양한 동물의 울음 소리 출력 dog = Dog() cat = Cat() print(animal_speak(dog)) # "Woof!" print(animal_speak(cat)) # "Meow!" #연산자 다형성 # 숫자 덧셈의 다형성 result1 = 5 + 10 result2 = "Hello, " + "World" print(result1) # 15 print(result2) # "Hello, World"
- Python에서 캡슐화를 정의해보십시오.
- 객체지향 프로그래밍에서 중요한 개념으로 관련된 데이터와 메서드를 하나의 단위로 묶어 외부에서의 접근을 제어하는 것을 의미
#1. 접근제어자 class MyClass: def __init__(self): self._my_private_variable = 10 # _로 시작하는 변수는 내부에서 사용되는 것으로 간주 def _my_private_method(self): print("This is a private method.") my_instance = MyClass() print(my_instance._my_private_variable) # 외부에서 접근은 가능하지만, 비공식적으로 간주 my_instance._my_private_method() # 외부에서 호출은 가능하지만, 비공식적으로 간주 #2. 프로퍼티 활용 class MyClass: def __init__(self): self._my_private_variable = 10 @property def my_private_variable(self): return self._my_private_variable my_instance = MyClass() print(my_instance.my_private_variable) # 외부에서 메서드 호출을 통해 간접적으로 접근 #3. 게터(Getter)와 세터(Setter)메서드 정의 class MyClass: def __init__(self): self._my_private_variable = 10 def get_my_private_variable(self): return self._my_private_variable def set_my_private_variable(self, value): if value > 0: self._my_private_variable = value my_instance = MyClass() print(my_instance.get_my_private_variable()) # 외부에서 게터 메서드를 통해 접근 my_instance.set_my_private_variable(20) # 외부에서 세터 메서드를 통해 수정
- Python에서 데이터 추상화를 어떻게 수행합니까?
- 객체지향 프로그래밍에서 중요한 원칙 중 하나로 세부적인 구현 내용을 숨기고 핵심 기능에만 집중하여 프로그램의 유지보수성과 가독성을 향상시키는 것을 목표로 함
#1. 클래스 정의 class Car: def __init__(self, model, color): self._model = model # 데이터 은닉을 위해 _ 사용 self._color = color def get_model(self): return self._model def set_model(self, model): self._model = model def start_engine(self): print(f"The {self._color} car with model {self._model} is starting the engine.") my_car = Car(model="ABC123", color="Blue") print(my_car.get_model()) # 데이터에 간접적으로 접근 my_car.start_engine() #2. 프로퍼티 사용 class Car: def __init__(self, model, color): self._model = model @property def model(self): return self._model @model.setter def model(self, value): self._model = value def start_engine(self): print(f"The car with model {self._model} is starting the engine.") my_car = Car(model="ABC123", color="Blue") print(my_car.model) # 데이터에 간접적으로 접근 my_car.model = "XYZ789" # 데이터에 간접적으로 수정 my_car.start_engine() #3.추상화 클래스 활용 from abc import ABC, abstractmethod class Vehicle(ABC): @abstractmethod def start_engine(self): pass class Car(Vehicle): def start_engine(self): print("Car is starting the engine.") class Motorcycle(Vehicle): def start_engine(self): print("Motorcycle is starting the engine.") my_car = Car() my_car.start_engine() my_motorcycle = Motorcycle() my_motorcycle.start_engine()
- Python은 액세스 지정자를 사용합니까?
- 액세스 지정자(접근 제어자)를 강제하지는 않음, 클래스의 멤버(속성, 메서드)에 대한 외부에서의 접근을 제한하거나 허용하기 위한 키워드로 주로 public, private, protected같은 형태가 있음
- Python에서 빈 클래스를 만드는 방법은 무엇입니까?
class EmptyClass: pass
- object()는 무엇을 합니까?
- 모든 클래스의 부모 클래스인 내장 클래스인 'object'의 생성자, 'object'클래스는 파이썬에서 모든 클래스가 상속받는 기본 클래스이며, 최상위 클래스
- object()를 호출하면 빈 객체(인스턴스)를 생성함, 이 객체는 매우 기본적이며 추가적인 속성이나 메서드를 가지고 있지 않음, 주로 명시적인 부모 클래스를 지정하지 않은 경우, 모든 클래스는 암묵적으로 'object'클래스 상속
- Python의 map함수란 무엇입니까?
- 파이썬에 내장되어 있는 고차 함수(higher-order function)중 하나로, 주어진 함수를 순회 가능한(iterable) 객체의 각 요소에 대해 적용하여 새로운 iterable을 생성
numbers = [1, 2, 3, 4, 5] # 각 원소에 제곱을 적용하여 새로운 리스트 생성 squared_numbers = map(lambda x: x**2, numbers) print(list(squared_numbers)) # [1, 4, 9, 16, 25]
- Python numpy가 list보다 낫습니까?
- 상황 따라 다름, 주로 과학 및 데이터 분석과 관련된 작업, 다차원 배열을 다루는 작업에 특화
- Python 언어로 GIL이란 무엇입니까?
- GIL=Global Interpreter Lock=전역 인터프리터 잠금, CPython 인터프리터에서 발생하는 동시성 관련 문제에 대한 해결책으로 도입되었음
- 한번에 한 스레드만이 CPython인터프리터 내에서 파이썬 바이트코드를 실행할 수 있도록 하는 잠금 매커니즘, 이로 인해 멀티 코어 시스템에서도 동시에 여러 스레드가 병렬로 실행되지 않음
- 영향 : 단일 스레드 실행, I/O 바운드 작업에서는 영향이 적음, 멀티프로세스 사용권장, 다른 파이썬 구현체에서는 GIL이 없음
- CPython이 Python과 다른 점은 무엇입니까?
- Cpython은 Python 언어의 공식 구현체로서, Python 언어 스펙을 따르면서 c언어로 구현되었음
- Python언어의 핵심 기능은 CPython기반으로 하고 있음
- *공식구현체란? 해당 언어의 공식적인 버전 및 참조 구현제로서의 역할, 이는 언어의 스펙을 정의하고 해당 언어로 작성된 프로그램을 실행하는 데 사용됨, 공식 구현체는 언어의 기본적인 동작을 정의하고 해당 언어로 작성된 코드를 실행할 수 있는 중요한 역할
- *공식구현체의 주역할 : 언어스펙 정의/참조구현체 역할/표준라이브러리 제공/생태계 표준화
- Python의 decorator란 무엇입니까?
- 함수나 메소드를 꾸며주는 역할을 하는 간편한 문법적 기능
- 다른 함수를 인자로 받아서 해당 함수에 어떤 기능을 추가하거나 수정하는 역할을 함, 주로 코드 중복을 피하고 코드를 재사용하기 위해 사용됨, 데코레이터는 함수나 메소드의 동작을 확장하거나 변경하기 위해 사용되며, 함수를 감싸고 다양한 작업을 수행할 수 있음
def my_decorator(func): def wrapper(): print("Something is happening before the function is called.") func() print("Something is happening after the function is called.") return wrapper @my_decorator def say_hello(): print("Hello!") # 위의 코드는 아래 코드와 동일한 결과를 갖습니다. # say_hello = my_decorator(say_hello) say_hello() '''출력결과 Something is happening before the function is called. Hello! Something is happening after the function is called. '''
- 객체 interning이란 무엇입니까?
- 파이썬에서 메모리 최적화를 위해 사용되는 기술 중 하나, 불변 객체의 재사용을 의미하며 동일한 값의 불변 객체가 여러 개 생성되는 것을 방지하여 메모리 사용을 절약하는 목적
- 가변 객체에 대해서는 인터닝이 적용되지 않음
'''1. 정수 인터닝: 일정 범위의 정수 값은 미리 생성되어 캐싱되며, 동일한 값을 가지는 정수 객체는 메모리에서 재사용됩니다. 이 범위는 -5부터 256까지이며, 이 범위 안의 정수는 동일한 객체로 인터닝됩니다.''' a = 10 b = 10 print(a is b) # True (인터닝) x = 300 y = 300 print(x is y) # False (인터닝 범위를 벗어난 경우) '''2.문자열 인터닝: 작은 크기의 문자열은 인터닝됩니다. 작은 문자열은 인터닝되어 동일한 문자열 리터럴은 동일한 객체를 참조하게 됩니다.''' str1 = "hello" str2 = "hello" print(str1 is str2) # True (인터닝) str3 = "python" str4 = "python" print(str3 is str4) # True (인터닝)
- @classmethod, @staticmethod, @property란 무엇인가요?
- @classmethod : 클래스 메소드를 정의할 때 사용됨, 첫번 째 매개변수로 클래스 자체를 나타내는 'cls'를 받고, 클래스의 상태를 변경하거나 클래스 수준의 작업을 수행하는데 사용
- @staticmethod : 정적 메소드를 정의할 때 사용됨, 클래스나 인스턴스와 무관하게 독립적으로 동작하는 메소드를 정의할 때 유용함, 클래스나 인스턴스를 첫번째 매개변수로 받지 않음
- @property : 프로퍼티를 정의할 때 사용, 읽기 전용 속성을 만들어주는 데 사용되며, 속성 값을 가져올 때 메소드처럼 호출하지 않고 속성처럼 참조할 수 있음
#@classmethod class MyClass: class_variable = 10 @classmethod def class_method(cls): print(f"Class variable: {cls.class_variable}") MyClass.class_method() #@staticmethod class MathOperations: @staticmethod def add(x, y): return x + y result = MathOperations.add(3, 5) #@property class Circle: def __init__(self, radius): self._radius = radius @property def radius(self): return self._radius @property def diameter(self): return 2 * self._radius circle = Circle(5) print(circle.radius) # 호출 X, 속성처럼 참조 print(circle.diameter) # 호출 X, 속성처럼 참조
- Python에서 list과 tuple의 차이점은 무엇입니까?