python

python - interview questions (Turing) Q1 ~ Q10

monsangter 2024. 12. 19. 19:23

1. [::-1] 에서 파이썬이 하는 것

 

[::-1] in Python is a slicing operation that reverses a sequence (like a list, string, or tuple).

새 객체를 생성하지만 , 내부의 참조된 요소는 원본 객체와 공유한다. copy() 도 이에 해당.


깊은 복사를 사용하고 싶다면 import copy, copy.deepcopy(객체)를 사용할 것.

2. 플라스크에서의 데이터베이스 커넥션.


클라이언트 측으로부터 http요청이 들어오는 경우, 즉 사용자가 브라우저에서 URL을 입력하거나, FLASK API에 데이터를 보내는 경우를

FLASK에서 처리하게 된다. 만약 GET /users 요청이 들어오면, Flask는 before_request()를 실행해 데이터 베이스와 연결을 열고,

after_request()나 teardown_request()를 통해 연결을 닫는다. after_request 는 성공한 경우에만,(로깅) teardown_request()는 요청이 끝난 경우, 예외가 발생한 경우에도 무조건 실행된다.(리소스 정리)

 

from flask import Flask, g
import sqlite3

app = Flask(__name__)

def connect_db():
    return sqlite3.connect('example.db')

@app.before_request
def before_request():
    g.db = connect_db()  # DB 연결 열기

@app.after_request
def after_request(response):
    if hasattr(g, 'db'):
        g.db.close()  # 요청이 정상 처리된 경우 닫기
    return response

@app.teardown_request
def teardown_request(exception):
    if hasattr(g, 'db'):
        g.db.close()  # 예외가 발생하더라도 닫기

decorator 방식으로 사용하였다. g는  flask에서 샤옹되는 요청 컨텍스트 동안 유지되는 객체

의존성 주입은, 객체의 의존성을 외부에서 주입하여, 내부에서 직접 생성하지 않음으로 결합도를 낮추고, 싱글톤이나, 특정 블락, 컨텍스트등 특정 스코프에서 객체를 재사용하거나 관리 가능하다. 이를 통해 결합도를 낮추고 테스트와 확장성을 높인다.

 

 

from fastapi import FastAPI, Depends

app = FastAPI()

def get_user():
    return {"name": "Alice", "role": "admin"}

@app.get("/")
def home(user=Depends(get_user)):
    # user는 get_user()의 반환값
    return f"Hello, {user['name']}!"

 

아래는 fast api의 의존성 주입 형태.

 

 

3. 도그파일 효과란?

 

서버에서 데이터를 캐시에 저장하고, 일정 시간이 지나면 캐시가 만료되는데, 서버측에서 공유 캐시를 사용할 경우, 하나의 캐시 데이터가 만료되면, 이를 사용하는 모든 클라이언트가 동시에 새 데이터를 요청하게 된다.

주로 여러 서버가 동일한 캐시 데이터를 공유하는 redis등의 분산 시스템, CDN(edge server)등의 경우에도 발생할 수 있다.

주로 세마포어 락을 통해 이를 방지할 수 있다.

 

import threading
import time

counter = 0
lock = threading.Lock()

def increment(thread_id):
    global counter
    print(f"Thread {thread_id} is waiting to lock...")
    with lock:
        print(f"Thread {thread_id} has locked.")
        local_counter = counter
        time.sleep(1)
        counter = local_counter + 1
        print(f"Thread {thread_id} incremented counter to {counter}")
    print(f"Thread {thread_id} has released the lock.")

threads = []
for i in range(4):
    t = threading.Thread(target=increment, args=(i,))
    threads.append(t)
    t.start()

for t in threads:
    t.join()

print(f"Final counter value: {counter}")

threding.lock(공유자원 동기화) 은 컨텍스트 매니저로 구현되어 with문과 사용시 자동으로 액콰이어 부터 릴리즈 까지 수행한다. args=(i,) 는 튜플.

join()은 서브 스레드들이 끝날떄까지 main스레드가 기다린다.

 

 

4.파이썬에선 다중 상속이 허용되는가 ?

파이썬에서는 자식 클래스가 두개 이상 부모클래스를 상속 받을 수 있다. 

다만 부모 클래스에 동일한 이름의 메소드가 존재하는 경우에는 c3 선형화 알고리즘 MRO (method Resolution Order) 이 적용된다.

 

- 다중 상속에서 부모 클래스가 정의된 순서에 따라 왼쪽부터 탐색
- 자식 클래스는 자신보다 더 높은 클래스(부모 클래스)보다 우선적으로 탐색.
- 동일한 조상을 여러 번 참조하는 경우, DFS, 선형화 규칙을 통해 한 번만 탐색하며 중복을 제거.
- 상속의 충돌을 피하기 위해 일관된 순서를 유지.

 

4.파이썬은 전통적인 접근 제어자를 사용하는가 ?

파이썬에서 전통적인 public, protected, private 같은 접근 제어자는 명시적으로 제공되지 않으며, 접근수준은 암시적으로 지정된다.

 

Python에서는 변수나 메서드 이름에 사용되는 접두사를 통해 접근 제한을 표현하고 캡슐화를 구현한다.

 

public  모든 변수와 메서드는 public이며, 클래스 외부에서 자유롭게 접근할 수 있다.

protected 변수 이름 앞에 단일 밑줄을 붙인다. 클래스 외부에서는 접근하지 않는 것이 권장된다.

private 변수 이름 앞에 이중 밑줄을 붙이면 python  name mangling 기능을 통해 변수 이름이 변경되어, 외부에서 접근하기 어려워진다.

 

class Example:
    def public_method(self):
        print("This is a public method")  # 누구나 호출 가능

    def _protected_method(self):
        print("This is a protected method")  # 내부적으로 사용 권장

    def __private_method(self):
        print("This is a private method")  # 외부에서 직접 호출 불가

    def access_private(self):
        # 클래스 내부에서는 private 메서드 호출 가능
        self.__private_method()


# 객체 생성
example = Example()

# Public 메서드 호출
example.public_method()  # 정상 호출

# Protected 메서드 호출 (권장하지 않음)
example._protected_method()

# Private 메서드 호출 (직접 호출 불가)
# example.__private_method()  # AttributeError

# Private 메서드 호출 (클래스 내부에서만 가능)
example.access_private()

# Name mangling을 우회한 Private 메서드 호출 (권장하지 않음)
example._Example__private_method()

 

Python에서의 생성자는 init 메소드를 통해 정의된다.
해당 메서드는 객체가 생성될떄 자동으로 호출되며, 초기화 작업을 수행한다.
멤버 변수는 생성자에서 정의되며 객체의 상태를 저장된다. 클래스 변수는 클래스 내에서 정의돼 모든 객체가 공유하는 값이며, 인스턴스변수는 self.를 사용해 선언돼 각 인스턴스 별로 관리되는 변수이다.

 

7. url을 알떄 이미지 파일을 로컬로 저장하는 법.

import urllib.request

# 이미지 URL
url = "https://example.com/sample-image.jpg"

# 로컬에 저장할 파일 이름
filename = "sample-image.jpg"

# URL에서 파일 다운로드 및 저장
urllib.request.urlretrieve(url, filename)

print(f"Image successfully saved as {filename}")

 

8. 파이썬에서 join()함수 사용

 

join()은 반복 가능한 객체(리스트, 튜플, 스트링)의 문자열 요소를 특정 구분자로 연결하는데 사용되는 문자열 메서드 이다.

조인과 리스트

words = ["Python", "is", "awesome"]

sentence = " ".join(words)
print(sentence)

#Python is awesome

조인과 문자열

str = "Turing"
str2 = "vj"

str2= str.join(str2)

print(str)
#vTuringj

 

9. 판다스 데이터 프레임에서 null 밸류를 확인하고 처리하는 법

 

import pandas as pd
import numpy as np

# 데이터프레임 생성
data = {'A': [1, 2, np.nan], 'B': [4, np.nan, 6]}
df = pd.DataFrame(data)

# 누락된 값 확인
print(df.isnull())

       A      B
0  False  False
1  False   True
2   True  False


# 열별로 누락된 값의 개수 확인
print(df.isnull().sum())


A    1
B    1
dtype: int64

#널 값의 대체 df['A'] = df['A'].fillna(df['A'].mean())

# 널값의 삭제 
df_cleaned = df.dropna(axis=1)
#axis 1은 수직. 컬럼에 대하여. 
#how, all any
#thresh 최소 요구 유효값
#subset 특정 subset만 기준으로 nan 값 삭제.

 

10. 파이썬에서 manage.py의 사용?

 

manage.py는 장고 프로젝트에서 자동으로 생성되는 명령줄 유틸리티 파일이다.

django에서 제공하는 기본 명령어와, 사용자 정의 명령어를 실행할 수 있는 인터페이스를 제공하여,

서버의 실행과, 데이터베이스 마이그레이션, 앱 생성등 프로젝트의 주요 작업을 실행한다.

프로젝트의 설정 파일인 settings.py와 연결되어, 프로젝트의 환경설정을 쉽게 불러온다.

마이그레이션 파일은 데이터 베이스의 구조(스키마) 변경을 기록하며, orm을 사용하여 데이터베이스와 파이썬 코드 간의 구조를 동기화 한다. (버전 별관리, 변경사항의 데이터베이스 일치, 롤백)

 

 

Source

https://www.turing.com/interview-questions/python#advanced-python-interview-questions-and-answers

 

100+ Python Interview Questions and Answers for 2024

This article will help you answer some frequently asked Python interview questions or to develop more such questions.

www.turing.com