Python



Python 공통 링크

  • 파이썬 공식

    파이썬의 장점

    간결하고 배우기 쉬운 구문

    Python의 구문은 간단하고 자연어에 가깝습니다. 초보 프로그래머라도 학습 임계값을 낮추어 빠르게 시작할 수 있습니다.

    풍부한 표준 라이브러리 및 타사 리소스

    Python은 네트워킹, 데이터 처리 및 그래픽 인터페이스와 같은 다양한 측면을 다루는 광범위한 표준 함수 라이브러리를 제공합니다. 또한 NumPy, Pandas, TensorFlow와 같은 강력한 타사 생태계는 Python을 다목적 개발 도구로 만듭니다.

    크로스 플랫폼 기능

    Python은 크로스 플랫폼 언어입니다. Windows, macOS, Linux 등 동일한 Python 프로그램을 실행할 수 있어 개발 유연성이 크게 향상됩니다.

    많은 분야에서 널리 사용됨

    Python은 데이터 과학, 인공 지능, 웹 개발, 자동화 스크립팅, 게임 개발 등 여러 분야에서 중요한 역할을 수행하므로 개발자는 하나의 언어로 여러 요구 사항을 처리할 수 있습니다.

    적극적인 커뮤니티 지원

    Python은 대규모 글로벌 커뮤니티를 보유하고 있으며 초보자와 숙련된 개발자 모두 교육 리소스, 토론 그룹 및 기술 지원을 쉽게 찾을 수 있습니다.

    효율적인 개발 속도

    Python은 직관적인 구문과 강력한 도구를 제공하므로 개발자는 프로그래밍을 더 빠르게 구현하고 제품 개발 주기를 단축할 수 있습니다.



    Python 개발 환경

    Anaconda

    아나콘다란 무엇입니까?

    Anaconda는 데이터 과학, 기계 학습, 인공 지능, 빅 데이터 분석과 같은 애플리케이션을 포함한 과학 컴퓨팅을 위해 설계된 오픈 소스 Python 및 R 프로그래밍 플랫폼입니다.

    주요 기능

    물체에 적합

    Anaconda는 다음 분야의 사용자에게 적합합니다:

    아나콘다를 설치하는 방법?

    1. 입장아나콘다 공식 홈페이지
    2. 적절한 운영 체제 버전을 선택하고 해당 설치 파일을 다운로드하십시오.
    3. 설치 마법사를 따라 설치를 완료하고 환경 변수를 구성합니다(선택 사항).

    FAQ

    다음은 사용자가 흔히 겪는 문제입니다.



    아나콘다 환경

    Anaconda 환경이란 무엇입니까?

    Anaconda는 사용자가 동일한 컴퓨터에서 여러 개의 독립적인 Python 실행 환경을 만들 수 있도록 하는 가상 환경(Environment) 기능을 제공합니다. 각 환경에는 서로 다른 프로젝트 간의 종속성 충돌을 피하기 위해 서로 다른 Python 버전과 패키지가 있을 수 있습니다.

    환경 구축

    # myenv라는 환경을 생성하고 Python 버전을 지정합니다.
    conda create -n myenv python=3.10

    환경 시작 및 전환

    # 시작 환경
    conda는 myenv를 활성화합니다
    
    #환경에서 나가기
    콘다 비활성화

    환경 보기

    # 모든 환경 나열
    콘다 환경 목록
    # 또는
    콘다 정보 --envs

    환경 내보내기 및 복원

    # 환경 구성을 YAML 파일로 내보내기
    conda env 내보내기 > Environment.yml
    
    # YAML 파일에서 환경 생성
    conda env create -f 환경.yml

    환경 삭제

    # 지정된 환경을 삭제합니다
    conda 제거 -n myenv --all


    Jupyter

    주피터란 무엇입니까?

    Jupyter는 다양한 프로그래밍 언어를 지원하는 오픈소스 대화형 컴퓨팅 환경으로 주로 데이터 과학, 머신러닝, 학술 연구에 사용됩니다.

  • Jupyter

    핵심 기능

    주요 구성품

    적용범위

    Jupyter는 다음 분야에서 널리 사용됩니다.

    주피터를 어떻게 사용하나요?

    1. Anaconda를 설치하거나 Jupyter 독립형을 설치하세요.
    2. 터미널에 입력jupyter notebook주피터 노트북을 시작합니다.
    3. 브라우저를 통해 편집 인터페이스로 들어가 노트북을 생성하고 실행하세요.

    장점과 과제



    VS Code Python 개발 환경

    비주얼 스튜디오 코드 설치

    이동비주얼 스튜디오 코드 공식 홈페이지, 운영 체제에 적합한 버전을 다운로드하여 설치하십시오.

    Python 확장 설치

    Visual Studio Code에서 다음 단계에 따라 Python 확장을 설치합니다.

    1. 왼쪽의 확장 아이콘을 클릭하세요.
    2. "파이썬"을 검색하세요.
    3. Microsoft에서 제공하는 Python 확장을 선택하고 "설치"를 클릭합니다.

    파이썬 설치

    Python이 시스템에 설치되어 있는지 확인하십시오. 에서 얻을 수 있습니다파이썬 공식 홈페이지다운로드하여 설치하세요.

    설치가 완료되면 명령줄에 다음 명령을 입력하여 설치가 성공했는지 확인합니다.

    파이썬 --버전
    # 또는
    python3 --버전

    Python 인터프리터 설정

    Python 프로젝트 또는 파일을 열고 Visual Studio Code의 오른쪽 아래 모서리에 있는 "Python" 상태 표시줄을 클릭하고 적절한 Python 인터프리터를 선택합니다.

    Python 프로그램 실행

    편집기에서 Python 파일을 열고 다음 방법을 사용하여 프로그램을 실행합니다.

    1. 파일 내용을 마우스 오른쪽 버튼으로 클릭하고 "터미널에서 Python 파일 실행"을 선택합니다.
    2. 아니면 단축키를 이용하세요Ctrl + Shift + P, "Python 파일 실행"을 검색하여 실행하세요.

    필요한 패키지 설치

    타사 패키지를 설치해야 하는 경우 내장 터미널을 사용하여 다음을 입력할 수 있습니다.

    pip 설치 패키지 이름

    자동 완성 및 디버깅 활성화

    Python 확장이 제공하는 기능을 통해 자동 완성 및 강력한 디버깅 도구를 사용해 보세요.

    1. 왼쪽의 디버그 아이콘을 클릭하세요.
    2. "launch.json 파일 만들기"를 선택하고 Python을 선택합니다.
    3. 설정이 완료되면 F5를 눌러 디버그 모드를 활성화합니다.

    자주 사용하는 단축키

    일반적으로 사용되는 단축키는 다음과 같습니다.



    VS Code

  • vscode/Vidual Studio Code

    VS Code는 Python 실행 매개변수를 설정합니다.

    launch.json 수정

    Python 프로그램을 실행할 때 매개변수를 전달해야 하는 경우 다음을 설정할 수 있습니다.launch.json마치다:

    1. 왼쪽의 "실행 및 디버그" 아이콘을 클릭하세요.
    2. "launch.json 파일 생성" 또는 "구성 추가"를 클릭합니다.
    3. 환경으로 "Python"을 선택합니다.
    4. 생성된launch.json파일에서 관련 설정을 수정합니다.

    프로그램 및 인수 매개변수 설정

    다음은 프로그램 경로 및 실행 매개변수를 포함한 예시 구성입니다.

    {
        "버전": "0.2.0",
        "구성": [
            {
                "name": "Python: 인수를 사용하여 실행",
                "유형": "파이썬",
                "요청": "실행",
                "program": "${workspaceFolder}/main.py", // 프로그램 경로
                "console": "integratedTerminal", // 터미널 유형
                "args": ["arg1", "arg2", "--option", "value"] // 매개변수 전달
            }
        ]
    }

    인수의 목적

    존재하다args명령줄 매개변수는 다음과 같이 전달될 수 있습니다.

    프로그램의 매개변수 읽기

    사용sys.argv명령줄에서 전달된 매개변수를 읽으려면 다음 안내를 따르세요.

    importsys
    
    print("모든 매개변수:", sys.argv)
    len(sys.argv) > 1인 경우:
        print("첫번째 매개변수:", sys.argv[1])
        print("두 번째 매개변수:", sys.argv[2])

    실행 예

    프로그램이 다음과 같다고 가정합니다:

    python main.py arg1 arg2 --option value

    실행 결과:

    모든 매개변수: ['main.py', 'arg1', 'arg2', '--option', 'value']
    첫 번째 매개변수: arg1
    두 번째 매개변수: arg2


    VS Code Python 디버그 모드

    디버그 모드 활성화

    1. 설치Python Extension확대.

    2. VS Code에서 Python 프로젝트를 시작합니다.

    3. 누르기F5또는 왼쪽의 활동 표시줄을 클릭하세요.Debug상.

    launch.json 설정

    1. 디버그 패널에서 "구성 추가"를 클릭합니다.

    2. 선택Python, 시스템이 자동으로launch.json

    {
        "version": "0.2.0",
        "configurations": [
            {
                "name": "Python: Current File",
                "type": "python",
                "request": "launch",
                "program": "${file}",
                "console": "integratedTerminal"
            }
        ]
    }
    

    중단점 설정

    1. 중단점을 추가하려면 코드 줄 번호 옆을 클릭하세요.

    2. 조건부 중단점을 사용할 수 있습니다. 중단점을 마우스 오른쪽 버튼으로 클릭하고 "조건 편집"을 선택합니다.

    디버깅 기능

    변수 확인

    1. 디버그 패널의 '변수' 영역에서 현재 변수 상태를 확인하세요.

    2. "모니터" 영역에서 특정 표현식을 수동으로 추가할 수 있습니다.

    디버그 콘솔 사용

    1. 디버그 콘솔에 Python 명령을 입력하여 프로그램 상태를 실시간으로 확인합니다.

    2. 변수 쿼리, 함수 호출 등의 작업을 수행할 수 있습니다.



    VS Code는 Python 경로를 설정합니다.

    1단계: Python 및 VS Code 설치

    Python이 설치되어 시스템 환경 변수에 추가되었는지 확인한 다음 Visual Studio Code를 다운로드하여 설치합니다.

    2단계: Python 확장 설치

    Visual Studio Code를 열고 왼쪽의 확장 아이콘을 클릭한 후 검색하세요.Python를 클릭한 다음 Microsoft에서 제공하는 Python 확장을 설치합니다.

    3단계: Python 설치 경로 확인

    Python의 설치 경로를 확인하려면 터미널에 다음 명령을 입력하십시오.

    which python

    또는 (Windows 시스템):

    where python

    4단계: Python 경로 설정

    Visual Studio Code에서 다음을 누릅니다.Ctrl + Shift + P, 입력 및 선택Python: Select Interpreter

    매니페스트에서 올바른 Python 경로를 선택합니다. 표시되지 않으면 전체 경로를 수동으로 입력하세요.

    5단계: 설정 확인

    터미널을 열고 실행python --version올바른 버전의 Python 인터프리터가 선택되었는지 확인합니다.

    추가 정보

    특정 프로젝트의 Python 경로가 필요한 경우 프로젝트 루트 디렉터리에 추가할 수 있습니다..vscode/settings.json파일을 만들고 다음 내용을 추가합니다.

    {
      "python.pythonPath": "Python의 전체 경로"
    }

    바꾸다Python 전체 경로실제 경로입니다.



    VS Code Python 환경 전환

    VS Code로 개발할 때 주로 기본 인터프리터(Interpreter) 설정을 통해 Anaconda나 다른 환경을 사용하기로 결정합니다. 이렇게 하면 패키지 종속성이 프로그램 실행 환경에서 완전히 격리됩니다.


    1. Python 환경을 선택하는 단계


    2. Anaconda 또는 기타 환경 사용 여부를 결정하는 방법

    환경 유형 적용 가능한 상황 주요 장점
    Anaconda 데이터 과학, 머신러닝, 딥러닝 다수의 과학 컴퓨팅 라이브러리가 사전 설치되어 있으며 기본 바이너리 파일(예: DLL)을 강력하게 관리합니다.
    Venv 일반 웹 개발, 자동화 스크립트 가볍고 시작이 빠르며 실행에 필요한 패키지만 포함되어 있습니다.

    3. Conda에서 환경 관리 및 전환

    그래픽 인터페이스 외에도 VS Code의 내장 터미널에 있는 명령을 사용하여 환경을 관리할 수도 있습니다.


    4. 자주 묻는 질문(FAQ) 및 해결 방법



    Chromebook에서 Python 실행

    방법 1: Linux(Crostini) 사용

    1. Chromebook 설정에서 "Linux(베타)" 또는 "개발자 → Linux 개발 환경"을 활성화하세요.
    2. Linux 터미널을 시작하고 다음을 입력합니다.
      
      sudo apt update
      sudo apt install python3 python3-pip -y
          
    3. 입력하다python3Python 대화형 환경으로 들어갑니다.
    4. 추가 모듈을 설치하려면 사용 가능pip3 설치 모듈 이름

    방법 2: 온라인 컴파일러 사용

    방법 3: Android 앱 설치

    방법 4: VS Code 사용

    1. Linux(Crostini) 환경에 VS Code를 설치합니다.
      
      sudo apt install wget gpg -y
      wget -qO- https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > packages.microsoft.gpg
      sudo install -o root -g root -m 644 packages.microsoft.gpg /usr/share/keyrings/
      sudo sh -c 'echo "deb [arch=amd64 signed-by=/usr/share/keyrings/packages.microsoft.gpg] \
      https://packages.microsoft.com/repos/code stable main" > /etc/apt/sources.list.d/vscode.list'
      sudo apt update
      sudo apt install code -y
          
    2. 프로그램을 개발하려면 VS Code에 Python 플러그인을 설치하세요.

    결론적으로



    핍 사용 가이드

    1. 핍이란 무엇입니까?

    2. pip의 기본 동작

    3. 고급 기능

    4. 자주 묻는 질문(FAQ) 및 해결 방법

    5. pip 모범 사례



    pip/cache/http-v2 폴더

    1. pip/cache/http-v2 폴더는 무엇인가요?

    2. http-v2 폴더의 용도

    3. http-v2 폴더 관리

    4. 주의사항



    파이썬 기본 데이터 구조

    변수 유형 확인

    사용 유형()

    type()이 함수는 객체의 유형을 반환할 수 있습니다.

    
    x = 10
    print(type(x))   # <class 'int'>
    
    y = "hello"
    print(type(y))   # <class 'str'>
    

    isinstance() 사용

    isinstance()변수가 특정 유형에 속하는지 확인하고 다중 유형 검사를 지원하는 데 사용됩니다.

    
    x = 10
    
    print(isinstance(x, int))         # True
    print(isinstance(x, str))         # False
    print(isinstance(x, (int, float))) # True
    

    차이점



    Python 부울 데이터 유형

    Python의 부울은 True 또는 False라는 두 가지 논리적 상태를 나타내는 프로그래밍의 기본 데이터 유형입니다. 이는 모든 조건부 판단과 프로세스 제어의 기초가 됩니다.

    1. 부울 값 및 유형

    a = 사실
    b = 거짓
    print(type(a)) # 출력: <class 'bool'>

    2. 볼린저와 숫자의 관계

    파이썬 내부,bool정수이다int의 하위 범주이므로 숫자 연산에 참여할 수 있습니다.

    print(True + 1) # 출력: 2 (1 + 1)
    print(False * 5) # 출력: 0 (0 * 5)

    3. 핵심 용도: 비교 연산자

    비교 연산자는 두 값을 비교하고 부울 결과를 반환합니다.

    연산자 설명하다 결과
    == 동일한 10 == 10 True
    != 같지 않음 5 != 10 True
    > 보다 큼 10 > 5 True
    <= 보다 작거나 같음 5 <= 5 True

    4. 논리 연산자

    논리 연산자는 부울 값 또는 부울 표현식을 결합하거나 수정하는 데 사용됩니다.

    print(True 및 False) # 출력: False
    print(True 또는 False) # 출력: True
    print(not True) # 출력: False

    5. 진실값 테스트

    Python에서는 모든 객체에 진리값이 있습니다. 조건부 판단에 객체가 사용되면 Python은 이를 다음으로 변환합니다.True또는False

    if []: # 빈 목록은 False로 처리됩니다.
        print("실행되지 않습니다.")
    그 외:
        print("목록이 비어있습니다.")
    
    if "hello": # 비어 있지 않은 문자열은 True로 간주됩니다.
        print("문자열이 비어있지 않습니다.")


    파이썬 배열

    배열이란 무엇입니까?

    Python에서 배열은 동일한 유형의 여러 요소를 저장하는 데 사용되는 데이터 구조입니다. Python 자체에는 배열 유형이 내장되어 있지 않지만 다음을 사용할 수 있습니다.list또는array유사한 기능을 구현하는 모듈입니다.

    목록을 배열로 사용

    list다양한 유형의 데이터를 저장할 수 있지만 배열을 시뮬레이션하는 데에도 사용할 수 있는 Python의 내장 데이터 구조입니다.

    my_list = [1, 2, 3, 4, 5]
    print(my_list[0]) # 출력: 1

    어레이 모듈 사용

    실제 배열이 필요한 경우(모든 요소는 동일한 유형이어야 함) 다음을 사용할 수 있습니다.array개조.

    배열 가져오기
    
    my_array = array.array('i', [1, 2, 3, 4, 5])
    print(my_array[0]) # 출력: 1

    여기,'i'배열의 요소가 정수임을 나타냅니다.

    어레이 모듈의 기본 동작

    다음은 몇 가지 기본 작업입니다.

    배열과 NumPy

    수치연산이 필요한 상황에서는numpy더욱 강력한 어레이 지원을 제공합니다.

    numpy를 np로 가져오기
    
    my_numpy_array = np.array([1, 2, 3, 4, 5])
    print(my_numpy_array[0]) # 출력: 1

    NumPy 배열은 다차원 데이터와 벡터화된 작업을 지원하므로 대량의 데이터를 처리하는 데 이상적입니다.

    결론적으로

    Python은 배열 함수를 구현하는 다양한 방법을 제공합니다.list일반적인 상황에 적용 가능array모듈은 동일한 유형의 요소가 필요한 상황에 적합하지만numpy과학 컴퓨팅을 위해 선택한 도구입니다.



    목록이 비어 있는지 확인

    변수에 대한ret_value = [], Python 언어에서 빈 목록인지 확인하는 몇 가지 간단하고 효율적인 방법이 있습니다. 빈 목록은 다음과 같이 처리되므로False, 다음은 일반적으로 사용되는 몇 가지 판단 방법입니다.

    1. 부울 평가 사용(가장 권장되는 Python 방식)

    이는 목록의 부울 값을 직접 확인하는 가장 널리 사용되는 방법입니다. 목록이 비어 있는 경우not연산자는 조건을 true로 평가합니다(True)。

    ret_value = []
    
    ret_value가 아닌 경우:
        #목록이 비어 있으면 여기서 실행
        print("ret_value는 빈 목록입니다.")
    그 외:
        #목록이 비어 있지 않으면 여기서 실행
        print("ret_value는 빈 목록이 아닙니다.")

    2. 사용len()기능

    목록의 길이가 0인지 확인합니다.

    ret_value = []
    
    len(ret_value) == 0인 경우:
        print("ret_value는 빈 목록입니다.")
    그 외:
        print("ret_value는 빈 목록이 아닙니다.")

    3. 동등한 비교를 사용하십시오== []

    빈 목록 리터럴에 변수를 직접 할당[]비교해보세요.

    ret_value = []
    
    ret_value == []인 경우:
        print("ret_value는 빈 목록입니다.")
    그 외:
        print("ret_value는 빈 목록이 아닙니다.")


    배열의 동적 증가 및 감소

    동적 작업에 목록 사용

    파이썬에서는list요소를 쉽게 추가하고 제거할 수 있는 동적 데이터 구조입니다.

    새 요소 추가

    다음 방법을 사용하여 새 요소를 추가할 수 있습니다.

    # 새 요소의 예
    my_list = [1, 2, 3]
    my_list.append(4) # [1, 2, 3, 4]
    my_list.insert(1, 10) # [1, 10, 2, 3, 4]
    my_list.extend([5, 6]) # [1, 10, 2, 3, 4, 5, 6]

    요소 제거

    다음을 사용하여 요소를 제거할 수 있습니다.

    # 요소 제거 예시
    my_list = [1, 2, 3, 4, 5]
    my_list.pop() # [1, 2, 3, 4]
    my_list.remove(2) # [1, 3, 4]
    my_list.clear() # []

    어레이 모듈을 사용한 동적 작업

    동일한 유형의 요소가 필요한 경우 다음을 사용할 수 있습니다.array개조.

    새 요소 추가

    append()그리고extend()방법이 적용됩니다array개조.

    import array
    my_array = array.array('i', [1, 2, 3])
    my_array.append(4)  # [1, 2, 3, 4]
    my_array.extend([5, 6])  # [1, 2, 3, 4, 5, 6]
    

    요소 제거

    remove()그리고pop()방법을 사용할 수 있습니다array개조.

    # 요소 제거 예시
    my_array = array.array('i', [1, 2, 3, 4])
    my_array.remove(2) # [1, 3, 4]
    my_array.pop() # [1, 3]

    결론적으로

    Python은 배열을 동적으로 늘리거나 줄이는 다양한 방법을 제공합니다.list그리고array모듈은 다양한 요구에 적합합니다. 더 많은 기능적 요구 사항이 있는 경우 다음을 사용할 수도 있습니다.numpy



    Python 배열 계산

    파이썬에서는list.count()통계를 위해 특별히 사용되는 도구입니다.특정 요소의 발생 횟수방법. 목록의 길이를 구하는 것과 같습니다.len()이와는 달리 매개변수를 비교 개체로 전달해야 합니다.


    1. list.count()의 기본 구문

    구문은 다음과 같습니다list.count(value), 값이 목록에 나타나는 정수 횟수를 반환합니다. 값이 없으면 0이 반환됩니다.

    과일 = ['사과', '바나나', '사과', '오렌지', '사과']
    
    # '사과'가 나타나는 횟수를 센다
    apple_count = Fruits.count('사과')
    print(apple_count) # 출력: 3
    
    # 존재하지 않는 요소의 개수를 센다
    포도_수 = 과일.수('포도')
    print(grape_count) # 출력: 0

    2. 일반적인 계산 요구 사항 및 도구 비교

    요구 사항(단일 요소, ​​여러 요소 또는 모든 통계를 찾고 있는지 여부)에 따라 다양한 모범 사례가 있습니다.

    필요 권장 방법 샘플 코드
    단일 특정 요소 계산 list.count() arr.count(10)
    목록의 전체 길이를 가져옵니다. len() len(arr)
    모든 요소의 빈도를 계산합니다. collections.Counter Counter(arr)
    조건 수(5보다 큰 경우) 생성기 표현 sum(1 for x in arr if x > 5)

    3. 고급 도구: collections.Counter

    "모든 요소"가 목록에 동시에 몇 번 나타나는지 알고 싶다면 다음을 사용하세요.Counter여러 번 실행됩니다count()훨씬 더 효율적입니다(O(n) 대 O(n^2)).

    컬렉션 수입 카운터에서
    
    데이터 = [1, 2, 2, 3, 3, 3, 4]
    개수 = 카운터(데이터)
    
    print(counts) # 출력: Counter({3: 3, 2: 2, 1: 1, 4: 1})
    print(counts[3]) # 3번의 횟수를 구합니다: 3
    print(counts.most_common(1)) # 가장 많이 나타나는 요소를 가져옵니다.

    4. 쉽게 혼동되는 사용 알림


    5. 실용 기술: 조건부 계산

    특정 논리(예: 길이가 3보다 큰 문자열)를 준수하는 요소의 수를 계산하려면 다음을 결합하면 됩니다.sum()

    단어 = ['안녕하세요', '안녕하세요', '파이썬', 'a', '코드']
    
    # 길이가 3보다 큰 단어 수를 셉니다.
    big_word_count = sum(len(w) > 3인 경우 단어의 w에 대해 1)
    print(big_word_count) # 출력: 3


    2D 목록 병합

    요구사항 설명

    샘플 프로그램

    목록1 = [
        ["a", 1],
        ["b", 2],
        ["c", 3]
    ]
    
    목록2 = [
        ["c", 30],
        ["a", 10],
        ["d", 40]
    ]
    
    #list1을 dict로 변환
    dict1 = {k: v for k, v in list1}
    dict2 = {k: v for k, v in list2}
    
    # 모든 키 찾기
    all_keys = sorted(set(dict1.keys()) | set(dict2.keys()))
    
    # 결과 병합
    병합 = []
    all_keys의 k에 대해:
        v1 = dict1.get(k)
        v2 = dict2.get(k)
        merged.append([k, v1, v2])
    
    병합된 행의 경우:
        인쇄(행)

    출력 결과

    
    ['a', 1, 10]
    ['b', 2, None]
    ['c', 3, 30]
    ['d', None, 40]
    

    결론적으로



    두 개의 목록을 동시에 반복

    Python에서 두 개의 목록이 있는 경우(예:selected_fields_list그리고aSqlValuesStr_list) 동시에 반복해야 하며, 가장 일반적이고 Pythonic한 방법은 내장된zip()기능.

    1. zip() 함수를 사용하세요

    zip()이 함수는 여러 반복 가능한 객체(Iterable)를 일련의 튜플로 압축합니다. 루프를 반복할 때마다 각 목록의 해당 위치에 있는 요소가 제거됩니다.

    다시 가져오기
    
    # 이것이 re.split() 후에 얻는 두 개의 목록이라고 가정합니다.
    selected_fields = "이름, 나이, 도시"
    aSqlValuesStr = "앨리스, 25, 타이페이"
    
    selected_fields_list = re.split(r',', selected_fields)
    aSqlValuesStr_list = re.split(r',', aSqlValuesStr)
    
    # for 루프를 실행
    필드의 경우 zip(selected_fields_list, aSqlValuesStr_list)의 값:
        print(f"필드: {필드}, 값: {값}")

    2. 샘플 출력

    필드: 이름, 값: Alice
    필드: 연령, 값: 25
    필드: 도시, 값: 타이페이

    3. zip()에 대한 중요 사항

    당신이 사용할 때zip()기능을 사용할 때 다음 사항에 주의해야 합니다.

    #예: 목록 길이가 일관되지 않습니다.
    목록1 = [1, 2, 3]
    list2 = ['a', 'b']
    
    zip(list1, list2)의 item1, item2에 대해:
        인쇄(항목1, 항목2)
    #출력은 다음과 같습니다:
    # 1a
    #2b


    2D 배열 표시 정렬

    형식을 사용하여 필드 정렬

    데이터 = [
        [1, 23, 456],
        [7890, 12, 3],
        [45, 678, 9]
    ]
    
    # 각 열의 최대 너비를 계산합니다.
    col_widths = [max(len(str(row[i])) for row in data) for i in range(len(data[0]))]
    
    # 형식 출력
    데이터 행의 경우:
        print(" ".join(str(val).rjust(col_widths[i]) for i, val in enumerate(row)))

    출력 결과

    
       1   23  456
    7890   12    3
      45  678    9
    

    표 모듈 사용

    타사 패키지tabulate정렬된 테이블을 직접 출력할 수 있습니다.

    
    from tabulate import tabulate
    
    data = [
        [1, 23, 456],
        [7890, 12, 3],
        [45, 678, 9]
    ]
    
    print(tabulate(data, tablefmt="grid"))
    

    출력 결과

    
    +------+-----+-----+
    |    1 |  23 | 456 |
    | 7890 |  12 |   3 |
    |   45 | 678 |   9 |
    +------+-----+-----+
    

    결론적으로



    2차원 배열 부동 소수점 숫자의 정렬된 출력

    설명하다

    다음 예에서는 2차원 목록을 인쇄하는 방법을 보여줍니다. 요소가float소수점 이하 두 자리 표시가 수정되었으며, 다른 요소는 필드 정렬을 유지하면서 그대로 출력됩니다.

    프로그램 예

    데이터 = [
        [1, 23.456, 456],
        [7890.1, 12, 3.5],
        [45, 678.9, 9]
    ]
    
    # 각 요소 문자열의 형식을 지정합니다.
    formatted_data = []
    데이터 행의 경우:
        new_row = []
        행의 값:
            isinstance(val, float)인 경우:
                s = f"{val:.2f}" # float -> 소수점 이하 두 자리
            그 외:
                s = str(발)
            new_row.append(들)
        formatted_data.append(new_row)
    
    # 각 열의 최대 너비를 계산합니다.
    col_widths = [formatted_data의 행에 대한 max(len(row[i])) for i in range(len(formatted_data[0]))]
    
    # 형식 출력
    formatted_data의 행에 대해:
        print(" ".join(val.rjust(col_widths[i]) for i, val in enumerate(row)))

    출력 결과

    
        1  23.46  456
    7890.10     12  3.50
       45  678.90     9
    

    집중하다



    사전 목록에서 모든 값 추출

    제공하는 데이터 구조는 여러 사전을 포함하는 목록입니다. 여기서 각 사전은 시계열 레코드(예: K-라인 데이터)를 나타냅니다.

    data = [
        {'time': 1759028400000, 'open': '109398.3', 'close': '109364.8', 'high': '109489.2', 'low': '109364.8', 'volume': '518.7594'},
        {'time': 1759024800000, 'open': '109305.6', 'close': '109398.3', 'high': '109496.4', 'low': '109296.0', 'volume': '757.0290'},
        # ...
    ]

    모든 레코드의 모든 값을 얻으려면 (1759028400000, '109398.3', '109364.8'등)을 목록으로 수집하면 Nested List Comprehension을 사용할 수 있습니다.

    1. 모든 값을 단일 목록으로 추출(평탄화)

    2단계 목록 이해를 사용하여 목록의 각 사전을 반복한 다음 호출합니다..values()메소드는 값을 가져오고 최종적으로 모든 값을 단순 목록으로 수집합니다.

    데이터 = [
        {'시간': 1759028400000, '개시': '109398.3', '종료': '109364.8', '높음': '109489.2', '낮음': '109364.8', '볼륨': '518.7594'},
        {'시간': 1759024800000, '개시': '109305.6', '종료': '109398.3', '높음': '109496.4', '낮음': '109296.0', '볼륨': '757.0290'}
    ]
    
    모든 값 = [
        가치
        for Record in data # 외부 목록의 각 사전 레코드를 탐색합니다.
        for value in Record.values() # 사전 레코드의 모든 값을 탐색합니다.
    ]
    
    인쇄(모든_값)

    2. 결과 출력

    그러면 모든 값을 포함하는 단일 목록이 생성됩니다.

    [1759028400000, '109398.3', '109364.8', '109489.2', '109364.8', '518.7594', 1759024800000, '109305.6', '109398.3', '109496.4', '109296.0', '757.0290']

    3. 특정 필드의 값 추출

    특정 필드만 추출해야 하는 경우(예: 모든 필드open가격), 단일 수준 목록 이해를 사용할 수 있습니다.

    data = [
        {'time': 1759028400000, 'open': '109398.3', ...},
        {'time': 1759024800000, 'open': '109305.6', ...}
    ]
    
    open_prices = [record['open'] for record in data]
    
    print(open_prices)

    출력 결과:

    ['109398.3', '109305.6']


    사전 목록에서 특정 키 값 추출

    1. 목록 이해 기능 사용(권장) ✅

    List comprehension은 기존 목록에서 새 목록을 생성하기 위한 간결한 한 줄 구문입니다.

    Python 구현 예

    날짜/시간에서 날짜/시간 가져오기
    
    데이터_목록 = [
        {'videoid': 'b5HxsaM_E2Y', 'publishedat': datetime(2025, 12, 7, 3, 0, 53), 'rankno': 7, 'viewcount': 913053, 'query': '야구'},
        {'videoid': 'FEbMCBxsoWI', 'publishedat': datetime(2025, 11, 25, 5, 28, 6), 'rankno': 13, 'viewcount': 754598, 'query': '야구'},
        {'videoid': 'nOJUI0PGB68', 'publishedat': datetime(2025, 12, 7, 3, 7, 46), 'rankno': 14, 'viewcount': 748349, 'query': '야구'},
        {'videoid': 'uMHXIudw_w0', 'publishedat': datetime(2025, 12, 2, 10, 1, 38), 'rankno': 8, 'viewcount': 687949, 'query': '야구'}
    ]
    
    target_key = '동영상 ID'
    
    # 목록 이해 사용: data_list의 각 사전 항목에 대해 item[target_key]를 꺼냅니다.
    video_ids = [data_list의 항목에 대한 항목[target_key]]
    
    print(f"추출된 키: {target_key}")
    print("모든 videoid 값:")
    인쇄(video_ids)

    출력 결과

    ['b5HxsaM_E2Y', 'FEbMCBxsoWI', 'nOJUI0PGB68', 'uMHXIudw_w0']

    2. 열쇠가 존재하지 않는 상황에 대처(안전접근)

    목록의 일부 사전에 대상 키가 누락된 경우(예: 일부 사전에 `videoid` 키가 없음) `item[target_key]`를 직접 사용하면 `KeyError` 오류가 발생합니다. 사전의 `.get()` 메소드나 조건문을 사용하여 안전하게 처리할 수 있습니다.

    Python 구현 예(보안 액세스)

    data_with_missing_key = [
        {'videoid': 'A1', 'query': '축구'},
        {'query': 'basketball'}, # 'videoid' 키가 누락되었습니다.
        {'videoid': 'C3', 'query': '배구'}
    ]
    
    target_key = '동영상 ID'
    
    # 옵션 A: .get()을 사용하여 기본값을 None(또는 다른 값)으로 설정합니다.
    safe_video_ids_A = [data_with_missing_key의 항목에 대한 item.get(target_key)]
    # 출력: ['A1', 없음, 'C3']
    
    # 옵션 B: 해당 키가 포함된 값만 추출
    safe_video_ids_B = [항목에 target_key가 있는 경우 data_with_missing_key의 항목에 대한 항목[target_key]]
    # 출력: ['A1', 'C3']
    
    print(f"\n안전한 추출 결과(플랜 B): {safe_video_ids_B}")


    dict 값을 목록으로 변환

    당신은onesymbollist.values()얻은 결과는 Python 사전 뷰 객체입니다.dict_values. 목록처럼 보이지만 인덱싱하거나 수정할 수 있는 표준 목록이 아니라 동적 보기입니다.

    dict_values([1763510400000, '0.00015218', '0.00015336', '0.00015415', '0.00015067', '1634523'])

    표시하지 않음dict_values()태그의 내용을 얻으려면 가장 간단하고 일반적인 방법은 내장된 태그를 사용하는 것입니다.list()함수는 이를 목록으로 캐스팅합니다.

    1. 리스트(list)로 변환

    할 것이다dict_values전달list()뷰 객체의 모든 요소를 ​​새로운 표준 목록에 즉시 복사하는 기능입니다.

    # 이것이 당신이 얻은 dict_values 뷰 객체라고 가정합니다
    dict_values_object = your_dictionary.values() # onesymbollist가 사전이라고 가정합니다.
    
    # 단계: list() 함수를 사용하여 변환합니다.
    결과_목록 = 목록(dict_values_object)
    
    인쇄(결과_목록)

    출력 결과

    [1763510400000, '0.00015218', '0.00015336', '0.00015415', '0.00015067', '1634523']

    2. 튜플로 변환

    불변 시퀀스를 생성하는 것이 목표라면 다음을 사용할 수 있습니다.tuple()함수는 이를 튜플로 변환합니다.

    result_tuple = tuple(dict_values_object)
    
    print(result_tuple)

    출력 결과

    (1763510400000, '0.00015218', '0.00015336', '0.00015415', '0.00015067', '1634523')

    3. 직접 반복(변환 필요 없음)

    참고로 단순히 루프에서 값을 하나씩 처리하려는 경우 명시적으로 목록으로 변환할 필요가 없습니다.dict_values그 자체는 반복 가능한 객체입니다(Iterable).

    # 이것이 당신이 얻은 dict_values 뷰 객체라고 가정합니다
    dict_values_object = your_dictionary.values()
    
    print("출력 요소를 하나씩:")
    dict_values_object의 값:
        인쇄(값)

    요약하면 다음을 사용하십시오.list(your_dict.values())깨끗하고 실행 가능한 값 목록을 얻는 가장 일반적인 방법입니다.



    사전 값을 쉼표로 구분된 문자열로 변환

    ~부터 시작하다dict_values뷰 객체에서 모든 값을 추출하고 이를 쉼표와 공백으로만 구분된 단일 문자열로 결합합니다(예:1763510400000, '0.00015218', ...), 다음 단계를 결합해야 합니다.

    1. 사전에서 얻다dict_values객체를 봅니다.
    2. 이 뷰 객체의 모든 요소를 ​​문자열 유형으로 변환합니다.
    3. 파이썬 사용", ".join()이 문자열을 연결하는 방법입니다.

    1. 파이썬 구현

    원래 사전의 이름이 지정되어 있다고 가정합니다.onesymbol_dict, 문자열이 아닌 값(예: 타임스탬프)을 문자열로 변환하여 사용해야 합니다..join()연결해 보세요.

    onesymbol_dict = {
        '시간': 1763510400000,
        '열기': '0.00015218',
        '닫기': '0.00015336',
        '높음': '0.00015415',
        '낮음': '0.00015067',
        '볼륨': '1634523'
    }
    
    # 1단계 & 2: 값을 가져오고 모든 값을 문자열로 변환
    # 모든 요소가 문자열인지 확인하기 위해 목록 이해를 사용합니다.
    value_as_strings = [onesymbol_dict.values()의 v에 대한 str(v)]
    
    # 3단계: ', '.join()을 사용하여 이 문자열을 결합합니다.
    value_string = ", ".join(values_as_strings)
    
    인쇄(값_문자열)

    2. 결과 출력

    이렇게 하면 내용이 외부 대괄호나 대괄호 없이 값만 포함된 단일 문자열이 생성됩니다.dict_values상표:

    1763510400000, 0.00015218, 0.00015336, 0.00015415, 0.00015067, 1634523

    3. 문자열 따옴표에 대한 참고 사항

    예상되는 예제 출력에서 ​​타임스탬프 이외의 값에는 작은따옴표가 있습니다.1763510400000, '0.00015218', ...

    최종 출력에서 ​​문자열 값이 작은따옴표를 유지하도록 하는 것이 목표라면 연결하는 동안 수동으로 따옴표를 추가해야 합니다. 이는 일반적으로 SQL 문이나 특정 형식에 대한 문자열을 준비할 때 필요합니다.

    # 추가 단계: 정수가 아닌 값에 따옴표가 필요하다고 가정하고 따옴표를 수동으로 처리합니다.
    quoted_values = []
    onesymbol_dict.values()의 v에 대해:
        isinstance(v, (str, float)) 또는 (isinstance(v, int) 및 v인 경우< 1000000000000): # 假設小數字串需要引號
            quoted_values.append(f"'{v}'")
        else:
            quoted_values.append(str(v))
    
    final_quoted_string = ", ".join(quoted_values)
    
    print(final_quoted_string)

    그러면 예상한 형식이 제공됩니다(가정).time따옴표는 필요하지 않으며 다른 숫자 문자열은 필요합니다):

    1763510400000, '0.00015218', '0.00015336', '0.00015415', '0.00015067', '1634523'


    문자열이 숫자인지 확인

    str.isdigit() 사용

    isdigit()문자열에 숫자만 포함되어 있는지 확인하는 데 메서드를 사용할 수 있습니다.

    # 예시
    문자열 = "12345"
    string.isdigit()인 경우:
        print("숫자입니다")
    그 외:
        print("숫자가 아닙니다.")

    알아채다:isdigit()소수점이나 음수 기호를 처리할 수 없습니다.

    소수를 처리하려면 str.replace()를 사용하세요.

    소수점이 있는 문자열을 확인해야 하는 경우 사용하기 전에 소수점을 제거하면 됩니다.isdigit()

    # 예시
    문자열 = "123.45"
    if string.replace(".", "").isdigit():
        print("숫자입니다")
    그 외:
        print("숫자가 아닙니다.")

    이 방법은 음수에는 작동하지 않습니다.

    Try-Exception을 사용하여 숫자로 변환

    가장 일반적인 접근 방식은 문자열을 부동 소수점 또는 정수로 변환하고 변환이 실패할 경우 예외를 포착하는 것입니다.

    # 예시
    문자열 = "-123.45"
    시도해 보세요:
        float(string) # 대신 int(string)을 사용하여 정수를 확인할 수 있습니다.
        print("숫자입니다")
    ValueError 제외:
        print("숫자가 아닙니다.")

    정규 표현식 사용

    정규식은 정수, 소수, 음수를 포함한 숫자와 정확하게 일치할 수 있습니다.

    # 예시
    다시 가져오기
    
    문자열 = "-123.45"
    패턴 = r"^-?\d+(\.\d+)?$"
    re.match(패턴, 문자열)인 경우:
        print("숫자입니다")
    그 외:
        print("숫자가 아닙니다.")

    결론적으로

    간단한 경우에는 다음을 사용하십시오.isdigit(). 더 복잡한 경우(소수 또는 음수 처리 등)에는 다음을 사용하는 것이 좋습니다.try-except또는 정규식.



    Python f-string

    f-string(형식화된 문자열 리터럴)은 Python 3.6에 도입된 강력하고 효율적인 문자열 형식화 방법입니다. 변수 및 표현식의 값을 문자열에 포함하는 간결하고 읽기 쉬운 방법을 제공합니다.

    f-string의 핵심 기능은 문자열 시작 부분에 접두사를 사용하는 것입니다.f또는F, 중괄호 사용{}계산하고 표시할 내용을 포함합니다.

    1. 기본 사용법: 변수 삽입

    중괄호 안에 변수 이름을 직접 입력할 수 있습니다.

    이름 = "앨리스"
    나이=30
    message = f"안녕하세요. 제 이름은 {name}이고 나이는 {age}세입니다."
    # 출력: 안녕하세요. 제 이름은 Alice이고 30살입니다.

    2. 내장된 표현식

    f-string의 장점은 유효한 Python 표현식을 중괄호 안에 넣을 수 있으며 런타임에 평가된다는 것입니다.

    가격 = 19.99
    세율 = 0.05
    총액 = 가격 * (1 + 세금 세율)
    
    # f-문자열 내에서 계산을 수행합니다.
    result = f"세금을 포함한 총 가격은 {price * (1 + Tax_rate):.2f} 위안입니다."
    # 출력: 세금을 포함한 총 가격은 20.99위안입니다.
    
    # 통화 기능
    def get_status():
        "확인"을 반환
    
    status_msg = f"시스템 상태: {get_status()}"
    # 출력: 시스템 상태: OK

    3. 문자열 형식화 및 정렬

    f-문자열 지원 및.format()콜론을 사용하는 형식 지정자 미니 언어와 동일한 방법:표현식과 형식 지정자를 구분합니다.

    형식 코드 사용 산출
    :.2f 소수점 이하 두 자리의 부동 소수점 숫자 f"{3.14159:.2f}" 3.14
    : <10 왼쪽 정렬, 너비 10 f"{'Name':<10}" Name
    : >10 오른쪽 정렬, 너비 10 f"{'Value':>10}" Value
    :^10 가운데 정렬, 너비 10 f"{'Hi':^10}" Hi
    :, 숫자 천 단위 구분 기호 f"{1000000:,}" 1,000,000

    4. F-문자열 디버그

    Python 3.8부터 f-string에는 변수 뒤에 등호를 추가할 수 있는 편리한 디버깅 기능이 도입되었습니다.=, 변수 이름과 해당 값을 자동으로 표시합니다.

    user_id = 42
    is_active = 참
    
    debug_output = f"사용자 ID는 {user_id=}, 상태: {is_active=}"
    # 출력: 사용자 ID는 user_id=42, 상태: is_active=True

    5. 주의사항



    f-문자열은 부동 소수점 소수점을 표시하지 않습니다.

    1. 해결 방법 1: f-문자열 내 정수 변환(권장)

    f-문자열의 중괄호{}내부적으로는 직접 사용할 수 있습니다.int()이 함수는 변수를 다시 정수 유형으로 변환합니다. 이것이 가장 명확하고 직접적인 방법이다.

    Python 구현 예

    inta = 12 # 원시 정수를 가정
    float_a = inta * 2.0 # 결과는 24.0(부동 소수점 수)입니다.
    
    # 부동 소수점 숫자를 f-문자열에서 직접 정수로 다시 변환합니다.
    result_str = f"abc def {int(float_a)}"
    
    print(f"원래 값(float_a): {float_a}")
    print(f"형식화된 결과: {result_str}")

    2. 옵션 2: f-문자열 형식 지정자 사용(형식 지정자)

    서식 미니 언어의 정수 형식 코드를 사용할 수 있습니다.d또는.0f출력 형식을 제어합니다.

    A. 정수 형식 코드를 사용하십시오.:d

    사용:dPython은 표시될 때 값을 정수로 처리하도록 요청받습니다. 변수라면a부동 소수점 숫자인 경우 Python은 표시하기 전에 자동으로 가장 가까운 정수로 반올림합니다(계산 결과가 $24.0$이면 $24$가 표시됩니다).

    float_a = 24.0
    result_d = f"abc def {float_a:d}"
    # 출력: abc def 24

    B. 부동 소수점 형식 코드 사용:.0f

    사용:.0f값을 부동 소수점 숫자로 형식화하지만 소수점 이하 0자리가 필요함을 의미합니다. 이로 인해 결과가 표시되기 전에 반올림됩니다.

    float_a = 24.0
    result_0f = f"abc def {float_a:.0f}"
    # 출력: abc def 24

    요약 및 제안

    결과가 소수점 없는 절대 정수인지 확인하는 것이 목적이라면 옵션 1을 사용하는 것이 좋습니다.

    str = f"abc def {int(a)}"


    Python re.split 함수

    파이썬에서는re.split()기능은re정규식에 정의된 구분 기호(패턴)에 따라 문자열을 분할하고 결과를 목록(목록)으로 반환하는 데 사용되는 (정규식) 모듈의 강력한 도구입니다.

    1. 함수 구문

    re.split(pattern, string, maxsplit=0, flags=0)

    2. 기본 사용법

    정규식을 사용하여 여러 개의 또는 복잡한 구분 기호를 정의합니다.

    다시 가져오기
    
    text = "사과,바나나,오렌지-포도"
    # 쉼표, 세미콜론, 하이픈을 구분 기호로 사용하세요.
    결과 = re.split(r'[;,-]', 텍스트)
    
    인쇄(결과)
    # 출력: ['사과', '바나나', '오렌지', '포도']

    3. 여러 공간 처리(공통 용도)

    표준 문자열 포함split()다른,re.split()여러 연속 구분 기호(예: 여러 공백)는 쉽게 처리하고 무시할 수 있습니다.

    text = "워드1 워드2 워드3"
    # 하나 이상의 공백 문자를 구분 기호로 일치시키려면 \s+를 사용합니다.
    결과 = re.split(r'\s+', text)
    
    인쇄(결과)
    # 출력: ['Word1', 'Word2', 'Word3']

    4. maxsplit을 사용하여 컷 수를 제한하세요.

    설정된 경우maxsplit, 절단 작업은 지정된 횟수만큼만 수행되며 나머지 부분은 목록에 마지막 요소로 유지됩니다.

    text = "하나:둘:셋:넷"
    #한번만자릅니다
    결과 = re.split(r':', text, maxsplit=1)
    
    인쇄(결과)
    # 출력: ['1', '2:3:4']

    5. 구분자를 유지하세요

    괄호 안에 구분자 패턴을 넣으면(), 구분 기호 자체도 결과 목록의 요소 사이에 포함됩니다.

    텍스트 = "2025-01-15"
    # 보존되도록 괄호 안에 하이픈을 넣습니다.
    결과 = re.split(r'(-)', text)
    
    인쇄(결과)
    # 출력: ['2025', '-', '01', '-', '15']


    문자열 시작 부분 확인

    사용

    startswith()Python 문자열입니다(str) 객체 메서드, 문자열이 지정된 하위 문자열로 시작하는지 확인하는 데 사용됩니다. 일치하면 반환True; 그렇지 않으면 반환False

    문법

    
    str.startswith(prefix[, start[, end]])
    

    매개변수 설명

    반환 값

    부울 값: 문자열이 지정된 접두사로 시작하는 경우 반환True,그렇지 않으면False

    text = "파이썬 프로그래밍"
    
    #기본 사용법
    print(text.startswith("Py")) # 참
    print(text.startswith("Java")) # 거짓
    
    #범위 지정
    print(text.startswith("thon", 2)) # True(인덱스 2에서 시작하는 것은 "thon"입니다)
    
    # 다중 정렬
    print(text.startswith(("Py", "Java", "C"))) # True, 일치하는 항목이 있기 때문에
    
    # 대소문자를 구분하지 않음(먼저 소문자로 변환 가능)
    print(text.lower().startswith("py")) # 참

    일반적인 응용

    연장하다

    문자열이 특정 텍스트로 "끝나는지" 확인하려면 다음을 사용할 수 있습니다.endswith()방법, 구문 및startswith()같은.

    파일명 = "보고서.pdf"
    파일 이름.endswith(".pdf")인 경우:
        print("PDF 파일입니다.")


    문자열의 마지막 문자 삭제

    설명하다

    Python에서 문자열은 불변 객체입니다. 마지막 문자를 제거하려면 일반적으로 문자열 슬라이싱을 사용하여 새 문자열을 만듭니다.

    text = "안녕하세요!"
    
    #방법 1: 슬라이싱 사용
    new_text = 텍스트[:-1]
    print(new_text) #출력: 안녕하세요
    
    #방법 2: rstrip()을 사용하여 특정 종료 문자 제거
    text2 = "안녕하세요!!!"
    new_text2 = text2.rstrip("!")
    print(new_text2) #출력: 안녕하세요
    
    #방법 3: 비어 있지 않은지 확인한 후 마지막 문자를 삭제합니다.
    텍스트인 경우:
        텍스트 = 텍스트[:-1]
    인쇄(텍스트)

    출력 결과

    
    Hello
    Hello
    Hello
    

    설명하다

    연장하다

    선행 문자를 제거하려면 다음을 사용하십시오.

    
    text = text[1:]
    

    요약



    문자열에서 하위 문자열 앞의 내용을 찾습니다.

    문제 진술

    문자열이 주어지면str1, 우리는에서 찾을 수 있기를 바랍니다strA또는strB앞서 나오는 부분입니다. 예를 들어:

    str1 = "Hello World, this is a test. Stop here or continue."
    strA = "Stop"
    strB = "continue"
    

    얻는 것이 목표이다"Hello World, this is a test. "

    re.split() 사용

    re.split()여러 키워드를 기반으로 문자열을 분할하고 첫 번째 부분을 취할 수 있습니다.

    import re
    
    def get_substring_before(text, strA, strB):
        result = re.split(f"{re.escape(strA)}|{re.escape(strB)}", text, maxsplit=1)[0]
        return result
    
    str1 = "Hello World, this is a test. Stop here or continue."
    strA = "Stop"
    strB = "continue"
    
    print(get_substring_before(str1, strA, strB))  # "Hello World, this is a test. "
    

    re.search()를 사용하세요.

    re.search()일치하는 데 사용할 수 있습니다strA또는strB, 일치하기 전에 콘텐츠를 가져옵니다.

    import re
    
    def get_substring_before(text, strA, strB):
        match = re.search(f"{re.escape(strA)}|{re.escape(strB)}", text)
        return text[:match.start()] if match else text
    
    str1 = "Hello World, this is a test. Stop here or continue."
    print(get_substring_before(str1, "Stop", "continue"))  # "Hello World, this is a test. "
    

    find() 메소드 사용

    find()가장 이른 날짜를 수동으로 검색할 수 있습니다.strA또는strB, 해당 부분을 검색합니다.

    def get_substring_before(text, strA, strB):
        indexA = text.find(strA)
        indexB = text.find(strB)
        
        indices = [i for i in [indexA, indexB] if i != -1]
        first_index = min(indices, default=len(text))
        
        return text[:first_index]
    
    str1 = "Hello World, this is a test. Stop here or continue."
    print(get_substring_before(str1, "Stop", "continue"))  # "Hello World, this is a test. "
    

    결론적으로



    여러 값을 문자열로 연결

    조인 사용(먼저 모든 것을 문자열로 변환해야 함)

    값 = ["str1", "str2", 123, "str3", 456]
    
    s = ", ".join(값의 v에 대한 str(v))
    print(s) # 출력: str1, str2, 123, str3, 456

    혼합된 문자열과 정수를 자동으로 처리합니다.

    def Join_values(*args, sep=", "):
        sep.join(args의 v에 대해 str(v))을 반환합니다.
    
    print(join_values("str1", "str2", 88, "str3"))
    # 출력: str1, str2, 88, str3

    소스가 dict인 경우 키별로 정렬한 다음 연결합니다.

    데이터 = {
        "str1": "안녕하세요",
        "str2": "세계",
        "int1": 123,
        "str3": "알았어"
    }
    
    # 키별로 정렬한 후 참여
    s = ", ".join(str(data[k]) for k in sorted(data.keys()))
    print(s) # hello, world, 123, ok

    키 + 값을 함께 결합하려면

    s = ", ".join(f"{k}={v}" for k, v in data.items())
    인쇄
    # 출력: str1=hello, str2=world, int1=123, str3=ok

    소스는 dict 목록이며, 각 dict는 하나의 열로 결합됩니다.

    rows = [
        {"str1": "A", "int1": 10},
        {"str1": "B", "int1": 20},
    ]
    
    for row in rows:
        print(", ".join(str(v) for v in row.values()))
    # A, 10
    # B, 20
    

    범용 기능: "따옴표 있음" 또는 "따옴표 없음" 모드 간 전환

    def Join_values(values, sep=", ", quoted=False):
        인용된 경우:
            # 전체 작은따옴표 ' '를 사용합니다.
            return sep.join(f"'{v}'" for v 값)
        그 외:
            return sep.join(값의 v에 대해 str(v))
    
    값 = ["str1", "str2", 88, "str3"]
    
    print(join_values(values, quoted=False))
    # 출력: str1, str2, 88, str3
    
    print(join_values(values, quoted=True))
    # 출력: 'str1', 'str2', '88', 'str3'

    *args 입력 버전을 지원할 수 있습니다.

    def join_args(*args, sep=", ", quoted=False):
        if quoted:
            return sep.join(f"‘{v}’" for v in args)
        return sep.join(str(v) for v in args)
    
    print(join_args("str1", "str2", 88, "str3", quoted=True))
    # ‘str1’, ‘str2’, ‘88’, ‘str3’
    

    dict 지원(출력 값만)

    data = {"str1": "hello", "str2": "world", "int1": 123}
    
    print(join_values(data.values(), quoted=True))
    # ‘hello’, ‘world’, ‘123’
    

    키=값 형식 지원

    def join_key_value(d, sep=", ", quoted=False):
        if quoted:
            return sep.join(f"{k}=‘{v}’" for k, v in d.items())
        return sep.join(f"{k}={v}" for k, v in d.items())
    
    print(join_key_value(data, quoted=True))
    # str1=‘hello’, str2=‘world’, int1=‘123’
    


    re.match()

    re.match()

    파이썬re.match문자열의 시작 부분부터 일치시키는 데 사용되는 정규식 모듈의 함수입니다. 일치가 성공하면Match물체; 그렇지 않으면 반환None

    문법

    re.match(pattern, string, flags=0)

    매개변수 설명:

    공통 속성 및 메서드

    사용 예

    다시 가져오기
    
    #문자열 정의
    text = "123 헬로월드!"
    
    # 처음부터 숫자를 일치시키려면 re.match를 사용하세요.
    일치 = re.match(r"(\d+)\s+(.*)", 텍스트)
    
    일치하는 경우:
        print(f"전체 일치 결과: {match.group(0)}") # 123 Hello World!
        print(f"숫자 부분: {match.group(1)}") # 123
        print(f"텍스트 부분: {match.group(2)}") # Hello World!
    그 외:
        print("일치 실패")

    출력 결과

    전체 일치 결과: 123 Hello World!
    숫자 부분: 123
    텍스트 부분: Hello World!

    주의할 점

    정규식

    정규식(줄여서 Regex)은 문자열 일치 규칙을 설명하는 데 사용되는 구문입니다. 문자열을 검색, 교체 또는 확인하는 데 자주 사용됩니다. 파이썬에서re모듈에서는pattern이것이 이러한 규칙을 정의하는 핵심 부분입니다.

    기본 구문 요소

    고급 사용법

    다시 가져오기
    
    # 예시 1: 숫자로 시작하는 콘텐츠 일치
    패턴 = r"^\d+"
    텍스트 = "123abc"
    일치 = re.match(패턴, 텍스트)
    일치하는 경우:
        print(f"일치 결과: {match.group()}") # 출력: 123
    
    #예 2: 숫자 뒤의 텍스트 일치
    패턴 = r"(\d+)\s+(.*)"
    text = "123 헬로월드"
    일치 = re.match(패턴, 텍스트)
    일치하는 경우:
        print(f"숫자 부분: {match.group(1)}") # 출력: 123
        print(f"텍스트 부분: {match.group(2)}") # 출력: Hello World

    정규식의 응용 시나리오



    re.search() 적용

    기본 사용법

    re.search()문자열에서 정규식과 일치하는 첫 번째 항목을 검색하고 반환하는 데 사용됩니다.Match일치하는 항목이 없으면 반환되는 객체None

    다시 가져오기
    
    text = "안녕하세요 2024!"
    일치 = re.search(r"\d+", 텍스트)
    
    일치하는 경우:
        print("발견된 번호:", match.group()) # 2024

    일치 개체 반환

    언제re.search()일치하는 항목이 발견되면 반환됩니다.Match객체는 다음 방법을 통해 정보에 액세스할 수 있습니다.

    다시 가져오기
    
    text = "파이썬 3.10은 훌륭해요!"
    일치 = re.search(r"\d+\.\d+", 텍스트)
    
    일치하는 경우:
        print("일치하는 내용:", match.group()) # 3.10
        print("시작 인덱스:", match.start()) # 7
        print("끝 인덱스:", match.end()) # 11
        print("범위:", match.span()) # (7, 11)

    그룹 매칭 ​​사용

    괄호를 통해()그룹을 만들어서 사용하려면group(n)해당 일치하는 콘텐츠를 추출합니다.

    다시 가져오기
    
    text = "John Doe, 나이: 25"
    match = re.search(r"(\w+) (\w+), 연령: (\d+)", text)
    
    일치하는 경우:
        print("성:", match.group(1)) # 존
        print("name:", match.group(2)) # Doe
        print("나이:", match.group(3)) # 25

    re.findall()과의 비교

    re.search()처음으로 일치하는 결과만 반환되지만,re.findall()일치하는 모든 결과가 반환됩니다.

    import re
    
    text = "Price: $10, Discount: $2, Tax: $1"
    
    match = re.search(r"\$\d+", text)
    print("re.search:", match.group())  # $10
    
    matches = re.findall(r"\$\d+", text)
    print("re.findall:", matches)  # ['$10', '$2', '$1']
    

    결론적으로

    re.search()첫 번째로 일치하는 결과를 찾는 데 적합하며 다음 용도로 사용할 수 있습니다.Match자세한 정보를 얻기 위한 객체입니다. 일치하는 결과가 여러 개인 경우 다음을 사용하세요.re.findall()



    비캡처 정규식 그룹

    매칭 성능 향상

    정규 표현식에서는(...)일치하는 콘텐츠가 캡처되어 다음 위치에 저장됩니다.group(n), 그러나 캡처 그룹은 아님(?:...)조직구조에만 사용되며, 그룹번호에는 영향을 미치지 않으므로 매칭이 더 빠릅니다.

    그룹 인덱스에 영향을 주지 마세요

    정규식에 사용되는 경우()영향을 미칠 일치 조건을 구성합니다.group(n)숫자. 사용(?:...)이렇게 하면 그룹 인덱스가 변경되지 않은 상태로 유지됩니다.

    import re
    
    text = "2024-03-12"
    pattern = r"(\d{4})-(?:\d{2})-(\d{2})"
    
    match = re.search(pattern, text)
    print(match.group(1))  # 2024
    print(match.group(2))  # 12
    

    OR 연산자와 쌍을 이룹니다.

    사용(?:...|...)허락할 수 있다|연산자는 일치하는 콘텐츠에 영향을 주지만 그룹 액세스에는 영향을 주지 않습니다.

    import re
    
    text = "bar123"
    pattern = r"(?:foo|bar|baz)\d+"
    
    match = re.search(pattern, text)
    print(match.group())  # bar123
    

    --user-data-dir 구문 분석에 적용됩니다.

    Chrome 매개변수를 구문 분석할 때 다음을 사용하세요.(?:...)이렇게 하면 일치하는 형식이 그룹 번호에 영향을 주지 않습니다.

    import re
    
    cmdline = '--user-data-dir="C:\\Users\\moirg\\AppData\\Local\\Google\\Chrome\\User Data"'
    
    match = re.search(r'--user-data-dir=(?:"([^"]+)"|(\S+))', cmdline)
    user_data_dir = match.group(1) or match.group(2)
    
    print(user_data_dir)  # C:\Users\moirg\AppData\Local\Google\Chrome\User Data
    

    결론적으로

    (?:...)정규식의 성능을 향상시키고 그룹 인덱스에 영향을 주지 않으며 다음에 적합합니다.|작업 및 특정 조건 일치를 통해 코드가 더욱 효율적이고 명확해집니다.



    파이썬 날짜/시간

    모듈 가져오기

    import datetime

    현재 시간 가져오기

    now = datetime.datetime.now()
    print(now)

    지정된 시간 생성

    dt = datetime.datetime(2025, 7, 2, 14, 30, 0)
    print(dt)

    시간 문자열 형식 지정

    now = datetime.datetime.now()
    formatted = now.strftime("%Y-%m-%d %H:%M:%S")
    print(formatted)

    시간 문자열 구문 분석

    dt_str = "2025-07-02 14:30:00"
    parsed = datetime.datetime.strptime(dt_str, "%Y-%m-%d %H:%M:%S")
    print(parsed)

    시간 덧셈과 뺄셈

    now = datetime.datetime.now()
    delta = datetime.timedelta(days=7)
    next_week = now + delta
    print(next_week)

    오늘 날짜 가져오기

    today = datetime.date.today()
    print(today)

    날짜 비교

    dt1 = datetime.datetime(2025, 7, 1)
    dt2 = datetime.datetime(2025, 7, 2)
    print(dt1 < dt2)

    시차 얻기

    dt1 = datetime.datetime(2025, 7, 1, 12, 0, 0)
    dt2 = datetime.datetime(2025, 7, 2, 14, 30, 0)
    diff = dt2 - dt1
    print(diff)
    print(diff.total_seconds())

    요일 가져오기

    오늘 = datetime.date.today()
    print(today.weekday()) # 0 = 월요일, 6 = 일요일


    날짜/시간대 문제

    오프셋 순진 및 오프셋 인식 날짜/시간 빼기 오류

    하나의 datetime 객체에 시간대가 없고(순진) 다른 객체에 시간대(인식)가 있어서 이를 빼면 다음이 생성됩니다.

    TypeError: can't subtract offset-naive and offset-aware datetimes
    

    날짜 시간이 순진하거나 인식되어 있는지 확인하십시오.

    from datetime import datetime
    
    def is_aware(dt):
        return dt.tzinfo is not None and dt.tzinfo.utcoffset(dt) is not None
    
    def is_naive(dt):
        return not is_aware(dt)
    
    dt1 = datetime.now()                 # naive
    dt2 = datetime.now().astimezone()    # aware
    
    print(is_naive(dt1), is_aware(dt1))
    print(is_naive(dt2), is_aware(dt2))
    

    해결 방법 A: 인식으로 전환(권장)

    시간대가 다른 상황이나 정확한 시간 계산이 필요한 경우에 적합합니다.

    날짜/시간 가져오기 날짜/시간, 시간대
    
    sql_dt = sql_dt.replace(tzinfo=timezone.utc) # SQL 데이터 전송 인식
    now_dt = datetime.now(timezone.utc) # 현재 시간에 대한 인식을 사용합니다.
    
    diff = now_dt - sql_dt
    인쇄(diff.total_seconds())

    해결 방법 B: Naive로 변환(권장되지 않음, 시간대 차이는 무시됨)

    sql_dt = sql_dt.replace(tzinfo=None)
    now_dt = datetime.now()
    
    diff = now_dt - sql_dt
    

    요약



    계열의 표준편차 계산

    설명하다

    Python에서는 내장 모듈을 사용할 수 있습니다.statistics~의stdev()또는pstdev()표본 표준편차 또는 모집단 표준편차를 계산합니다.

    수입통계
    
    비율 = [2.3, 2.8, 3.1, 2.5, 3.0]
    
    # 평균
    평균 = 합계(비율) / len(비율)
    
    #표본 표준편차(n-1)
    std_sample = 통계.stdev(비율)
    
    #행렬 표준편차(n)
    std_population = 통계.pstdev(비율)
    
    print(f"평균: {평균:.2f}")
    print(f"표본 표준편차: {std_sample:.3f}")
    print(f"인구 표준편차: {std_population:.3f}")

    출력 결과

    평균: 2.74
    표본 표준편차: 0.303
    모집단 표준편차: 0.271

    공식 방법(모드를 사용하지 않음)

    의지하고 싶지 않다면statistics모듈에서는 수학 공식을 사용하여 직접 계산할 수 있습니다.

    비율 = [2.3, 2.8, 3.1, 2.5, 3.0]
    평균 = 합계(비율) / len(비율)
    
    #표준편차(인구)
    분산 = sum((x - 평균) ** 비율 x의 경우 2) / len(비율)
    std_dev = 분산 ** 0.5
    
    print(f"표준편차: {std_dev:.3f}")

    출력 결과

    표준편차: 0.271

    차이점 설명

    요약



    Python은 ANSI 색상 문자열을 표시합니다.

    기본 예

    # ANSI 색상 코드 예
    print("\033[31m 빨간색 텍스트\033[0m")
    print("\033[32m 녹색 텍스트\033[0m")
    print("\033[33myellow text\033[0m")
    print("\033[34m 파란색 텍스트\033[0m")
    print("\033[35m 보라색 텍스트\033[0m")
    print("\033[36m 청록색 텍스트\033[0m")
    print("\033[37m 흰색 텍스트\033[0m")

    굵게 및 배경색

    print("\033[1;31m 굵은 빨간색 텍스트\033[0m")
    print("\033[42m 녹색 배경 텍스트\033[0m")

    맞춤형 색상 조합

    # 형식: \033[스타일; 전경색; 배경색 m
    # 스타일: 0=기본값, 1=굵게, 4=밑줄
    # 전경색 : 30~37
    # 배경색 : 40~47
    
    print("\033[1;33;44m 굵은 노란색 텍스트 + 파란색 배경\033[0m")

    함수로 캡슐화 가능

    def color_text(텍스트, color_code):
        f"\033[{color_code}m{text}\033[0m" 반환
    
    print(color_text("경고!", "1;31")) # 굵은 빨간색
    print(color_text("성공!", "1;32")) # 굵은 녹색


    현재 터미널이 ANSI 색상을 지원하는지 확인

    방법 1: sys.stdout.isatty() 확인

    importsys
    
    sys.stdout.isatty()인 경우:
        print("터미널은 ANSI 색상을 지원할 수 있습니다.")
    그 외:
        print("색상을 지원하지 않는 파일이나 출력 환경일 수 있습니다.")

    방법 2: colorama 사용(교차 플랫폼 솔루션)

    수입 칼라마
    colorama.init()
    
    print("\033[32m이 텍스트는 녹색이어야 합니다\033[0m")

    방법 3: 실제 테스트 출력

    def support_ansi():
        시도해 보세요:
            print("\033[31m 테스트 레드\033[0m")
            True를 반환
        제외:
            거짓을 반환
    
    print("ANSI가 지원됩니다" if presents_ansi() else "ANSI는 지원되지 않습니다")

    다시 채우다



    Python 입력은 자동 완성을 지원합니다.

    설명하다

    파이썬에서는input()기능 자체는 지원하지 않습니다Tab자동으로 완료됩니다. 이 기능을 달성하려면 다음을 결합할 수 있습니다.readline사용자가 사용할 수 있도록 하는 모듈Tab자동 완성을 수행합니다(Bash 또는 IPython과 유사).

    기본 예

    readline 가져오기
    
    # 완성할 수 있는 문자열 목록을 정의합니다.
    WORDS = ['사과', '바나나', '체리', '포도', '오렌지', '수박']
    
    def 완성자(텍스트, 상태):
        """자동 완성 기능: 입력 접두사를 기준으로 사용 가능한 문자열을 비교합니다."""
        options = [w.startswith(text)인 경우 WORDS의 w에 대한 w]
        상태 < 렌(옵션):
            반품 옵션[상태]
        그 외:
            반환 없음
    
    # 완성 기능 활성화
    readline.set_completer(완성자)
    readline.parse_and_bind('탭: 완료')
    
    # 사용자 입력(Tab 지원)
    user_input = input("과일 이름을 입력하세요(Tab을 눌러 완료할 수 있습니다): ")
    print(f"입력한 내용은 다음과 같습니다: {user_input}")

    작동 지침

    고급: 동적 완성

    현재 컨텍스트나 동적 콘텐츠를 기반으로 완성 목록을 업데이트할 수도 있습니다.

    readline 가져오기
    
    def Dynamic_completer(텍스트, 상태):
        current_words = ['고양이', '자동차', '개', '오리', '사슴']
        옵션 = [w.startswith(text)인 경우 current_words의 w에 대한 w]
        상태 < 렌(옵션):
            반품 옵션[상태]
        반환 없음
    
    readline.set_completer(동적_완성자)
    readline.parse_and_bind('탭: 완료')
    
    command = input("동물 이름을 입력하세요: ")
    print("입력하신 내용:", command)

    주의할 점

    요약



    파이썬 프로세스

    파이썬 루프

    범위()를 사용하는 경우

    가장 일반적인 루프는 고정된 횟수 또는 시퀀스를 실행하는 데 사용됩니다.

    # 0부터 4까지
    범위 내의 i에 대해(5):
        인쇄(i) #0,1,2,3,4
    
    #시작점, 끝점 및 단계 크기 지정
    i가 범위(2, 10, 2)에 있는 경우:
        인쇄(i) #2,4,6,8

    반복 가능한 객체의 경우

    목록, 문자열, 사전 등을 직접 반복합니다.

    과일 = ["사과", "바나나", "체리"]
    
    과일 속의 과일:
        인쇄물(과일)
    
    "hello"의 ch에 대해:
        인쇄(채널)
    
    #사전 반복
    사람 = {"이름": "톰", "나이": 25}
    키의 경우 person.items()의 값:
        인쇄(키, 값)

    while 루프

    조건이 True일 때 항상 실행됩니다.

    
    count = 0
    while count < 5:
        print(count)
        count += 1
    

    끊고 계속하다

    루프 프로세스를 제어합니다.

    범위(10)에 있는 i의 경우:
        내가 == 3인 경우:
            계속 # 이번에는 건너뛰기
        내가 == 7인 경우:
            break # 일찍 종료
        인쇄(i)

    중첩 루프

    원으로 돌아가서 다시 원에 넣으세요.

    
    for i in range(3):
        for j in range(2):
            print(f"i={i}, j={j}")
    

    다른 루프 매칭

    동안 또는 동안에 추가할 수 있습니다.else, "정상 완료(중단 없음)"만 실행됩니다.

    범위 내의 i에 대해(5):
        인쇄(i)
    그 외:
        print("루프가 정상적으로 종료됩니다.")

    목록 이해

    간결한 작성 방법을 사용하면 루프를 완성하고 한 줄에 목록을 생성할 수 있습니다.

    
    squares = [x**2 for x in range(5)]
    print(squares)  # [0,1,4,9,16]
    

    결론적으로



    Python 예외 처리

    기본 문법 구조

    Python은 프로그램 충돌을 방지하기 위해 프로그램 실행 중에 발생하는 오류를 가로채고 처리하기 위해 try...out 문을 사용합니다.

    시도해 보세요:
        # 예외가 발생할 수 있는 코드
        결과=10/0
    ZeroDivisionError 제외:
        # 특정 예외가 발생했을 때 실행되는 코드
        print("제수는 0이 될 수 없습니다.")
    e와 같은 예외를 제외하고:
        #다른 모든 유형의 예외 포착
        print(f"오류가 발생했습니다: {e}")
    그 외:
        # try 블록에서 예외가 발생하지 않으면 실행됩니다.
        print("정상적으로 작동합니다.")
    마지막으로:
        # 예외 발생 여부에 관계없이 실행됩니다.
        print("리소스를 정리하거나 파일을 닫습니다.")

    블록 기능 설명

    여러 예외 잡기

    여러 오류 유형을 동시에 처리하기 위해 예외에 튜플을 사용할 수 있습니다.

    시도해 보세요:
        # 작업 수행
        통과
    제외(ValueError, TypeError):
        print("입력한 데이터 유형이나 값이 올바르지 않습니다.")

    적극적으로 예외 발생

    논리적 요구 사항에 따라 예외를 수동으로 트리거하려면 raise 키워드를 사용하세요.

    age = -1
    if age < 0:
        raise ValueError("年齡數值不可為負數")

    모범 사례



    파이썬 카테고리

    1. 기본 카테고리 개념

    Python 클래스는 데이터와 동작을 캡슐화하는 데 사용되는 구조입니다. 범주는 범주의 인스턴스인 개체를 만드는 데 사용됩니다. 예를 들어:
    클래스 MyClass:
        def __init__(자체, 값):
            self.value = 가치
    
        def 디스플레이(자체):
            print(f"값: {self.value}")
    
    obj = MyClass(10)
    obj.display() # 출력: 값: 10

    2. 정적 방법

    정적 메서드는 `@staticmethod` 데코레이터를 사용하여 정의되며 카테고리 및 개체와 관련이 없습니다. 범주 속성이나 개체 속성에 액세스할 수 없습니다. 일부 악기 기능에 적용됩니다.

    클래스 MyClass:
        @staticmethod
        정의 추가(a, b):
            a + b를 반환
    
    결과 = MyClass.add(5, 3)
    print(result) # 출력: 8

    3. 수업방법

    클래스 메서드는 `@classmethod` 데코레이터를 사용하여 정의되며 첫 번째 매개 변수는 클래스 자체(일반적으로 `cls`라고 함)이며 클래스 특성에 액세스할 수 있습니다.

    클래스내클래스:
        개수 = 0
    
        @classmethod
        def increment_count(cls):
            cls.count += 1
    
    MyClass.increment_count()
    print(MyClass.count) # 출력: 1

    4. 상속과 다형

    Python은 클래스 상속을 지원합니다. 하위 클래스는 상위 클래스의 속성과 메서드를 상속하고 상위 클래스 메서드를 재정의할 수 있습니다.

    클래스 상위:
        데프 인사(자신):
            print("부모님께서 안녕하세요!")
    
    클래스 아동(부모):
        데프 인사(자신):
            print("안녕하세요 from Child!")
    
    obj = 자식()
    obj.greet() # 출력: Hello from Child!

    5. 카테고리 속성과 객체 속성

    카테고리 속성은 전체 카테고리에 속하며 모든 개체에서 공유됩니다. 객체 속성은 각 객체에 속합니다.

    클래스내클래스:
        class_attr = "나는 클래스 속성입니다"
    
        def __init__(자체, 값):
            self.instance_attr = 값
    
    obj1 = MyClass(10)
    obj2 = MyClass(20)
    
    print(MyClass.class_attr) # 출력: 나는 클래스 속성입니다.
    print(obj1.instance_attr) # 출력: 10
    print(obj2.instance_attr) # 출력: 20

    6. 객체를 기본 클래스로 사용

    Python의 모든 클래스는 기본적으로 `__str__` 및 `__eq__`와 같은 몇 가지 기본 메서드를 제공하는 내장 기본 클래스인 `object`에서 상속됩니다.

    클래스 MyClass(객체):
        def __init__(자체, 값):
            self.value = 가치
    
        def __str__(자체):
            f"값이 {self.value}인 MyClass"를 반환합니다.
    
    obj = MyClass(5)
    print(obj) # 출력: 값이 5인 MyClass

    7. 요약

    - **정적 방법**: 카테고리와 무관하며 주로 도구 기능에 사용됩니다. - **클래스 방법**: 카테고리 수준에서 데이터를 조작합니다. - **객체 메소드(Instance Method)**: 객체 수준의 데이터를 조작합니다. - **상속 및 다형**: 코드 재사용 및 유연한 디자인을 지원합니다. - **객체 기본 클래스**: 모든 카테고리가 일관된 동작을 갖도록 기본 메소드를 제공합니다.

    클래스 상속

    1. 기본 상속 개념

    Python에서 클래스 상속을 사용하면 하위 클래스(파생 클래스)가 상위 클래스(기본 클래스)의 속성과 메서드를 상속하여 코드 재사용을 달성할 수 있습니다. 예를 들어:

    클래스 상위:
        데프 인사(자신):
            print("부모님께서 안녕하세요!")
    
    클래스 아동(부모):
        통과
    
    c = 자식()
    c.greet() # 출력: Hello from Parent!

    2. 하위 클래스가 상위 클래스 메서드를 재정의합니다.

    하위 클래스는 상위 클래스의 메서드를 재정의(Override)하고 해당 함수를 다시 작성할 수 있습니다.

    클래스 상위:
        데프 인사(자신):
            print("부모님께서 안녕하세요!")
    
    클래스 아동(부모):
        데프 인사(자신):
            print("안녕하세요 from Child!")
    
    c = 자식()
    c.greet() # 출력: Hello from Child!

    3. super()를 사용하여 상위 클래스 메서드를 호출합니다.

    하위 클래스에서는 `super()`를 통해 상위 클래스의 메서드를 호출하고 상위 클래스의 동작을 확장할 수 있습니다.

    클래스 상위:
        데프 인사(자신):
            print("부모님께서 안녕하세요!")
    
    클래스 아동(부모):
        데프 인사(자신):
            슈퍼().인사()
            print("안녕하세요 from Child!")
    
    c = 자식()
    c.인사()
    # 출력:
    # 안녕하세요 학부모님!
    # 안녕하세요 차일드입니다!

    4. 다중 상속

    Python은 다중 상속을 지원하며 하위 클래스는 동시에 여러 부모 클래스를 상속할 수 있습니다.

    클래스 Parent1:
        데프 인사(자신):
            print("Parent1님 안녕하세요!")
    
    클래스 Parent2:
        데프 인사(자신):
            print("Parent2님 안녕하세요!")
    
    클래스 하위(Parent1, Parent2):
        통과
    
    c = 자식()
    c.greet() # 출력: Hello from Parent1! (상속 순서에 따라)

    5. MRO(방법 해결 순서)

    다중 상속은 MRO(Method Resolution Order)를 사용하여 메서드의 해결 순서를 결정합니다. 이는 `__mro__` 속성을 사용하여 확인할 수 있습니다:

    인쇄(Child.__mro__)
    # 출력: (, , , )
    

    6. 추상 기본 클래스

    `abc` 모듈을 사용하여 추상 기본 클래스를 정의하여 하위 클래스가 특정 메서드를 구현하도록 합니다.

    abc에서 ABC 가져오기, 추상 메서드
    
    클래스 AbstractParent(ABC):
        @추상방법
        데프 인사(자신):
            통과
    
    클래스 Child(AbstractParent):
        데프 인사(자신):
            print("안녕하세요 from Child!")
    
    c = 자식()
    c.greet() # 출력: Hello from Child!

    7. 요약

    - 상속을 통해 클래스 코드의 재사용성과 확장성이 향상됩니다. - 하위 클래스는 상위 클래스 메서드를 재정의하고 'super()'를 사용하여 상위 클래스 메서드를 호출할 수 있습니다. - 다중 상속을 지원하지만 MRO(Method Resolution Order)에 주의해야 합니다. - 추상 기본 클래스를 사용하면 하위 클래스가 인터페이스 디자인에 적합한 특정 메서드를 구현하도록 강제할 수 있습니다.

    ClassB를 상속하는 임시 클래스 만들기

    샘플 코드

    클래스ClassB:
        데프 인사(자신):
            print("ClassB에서 안녕하세요!")
    
    # ClassB에서 상속된 임시 클래스를 동적으로 생성합니다.
    TempClass = type('TempClass', (ClassB,), {
        'greet': 람다 self: (print("Hello from TempClass!"), super(TempClass, self).greet())[0]
    })
    
    #인스턴스 생성 및 테스트
    온도 = TempClass()
    temp.greet()

    설명하다

    1. 유형() 함수:
      type('TempClass', (ClassB,), {...})
      - 'TempClass': 새 카테고리 이름입니다.
      - (ClassB,): 기본 카테고리의 튜플, 여기에는 ClassB만 있습니다.
      - {...}: 새로운 속성 또는 메소드.
    2. Lambda 함수는 메서드를 재정의하는 데 사용됩니다.
      - 사용자 정의greet방법은 새 메시지를 먼저 인쇄한 다음 전달하는 것입니다.super()상위 카테고리에 전화하기greet

    출력 결과

    Hello from TempClass!
    Hello from ClassB!


    동일한 인터페이스로 다른 카테고리 사용 간에 전환

    설명하다

    두 가지 범주가 있다고 가정AClass그리고BClass, 이름과 매개변수가 동일한 함수가 있습니다. 우리는 메인 프로그램 로직을 수정하지 않고도 사용할 카테고리를 쉽게 전환할 수 있기를 원합니다.

    샘플 프로그램

    클래스 A클래스:
        def 프로세스(자기, 데이터):
            print(f"A클래스 처리: {data}")
    
        def 결과(자기):
            "AClass의 결과"를 반환합니다.
    
    
    클래스 B클래스:
        def 프로세스(자기, 데이터):
            print(f"BClass 처리: {data}")
    
        def 결과(자기):
            "BClass의 결과"를 반환합니다.
    
    
    # 설정을 통해 사용할 카테고리를 제어할 수 있습니다.
    USE_A = 참
    
    #동적 카테고리 선택
    SelectedClass = USE_A가 아니면 BClass인 경우 AClass
    
    # 인스턴스를 생성하고 사용
    obj = 선택클래스()
    obj.process("테스트 데이터")
    인쇄(obj.result())

    출력 결과(USE_A=True)

    AClass 처리: 테스트 데이터
    AClass의 결과

    출력 결과(USE_A=False)

    BClass 처리: 테스트 데이터
    BClass의 결과

    좀 더 발전된 작성 방법: 팩토리 함수 사용

    def get_class(이름):
        매핑 = {
            "A": A 클래스,
            "B": B클래스
        }
        return mapping.get(name, AClass) # 기본값은 AClass입니다.
    
    # 동적 선택
    cls = get_class("B")
    obj = cls()
    obj.process("테스트 데이터")

    결론적으로



    Python은 추상 범주를 사용합니다.

    짧은 대답

    파이썬에서는반드시 필수는 아님C++ 또는 Java처럼 작성됨abstract class. Python은 "Duck Typing"을 채택했습니다. 객체가 동일한 메서드 이름과 동작을 갖는 한 호환되는 것으로 간주될 수 있습니다.

    오리 타이핑 예

    클래스 A클래스:
        def 프로세스(자기, 데이터):
            print(f"A클래스 처리: {data}")
    
    클래스 B클래스:
        def 프로세스(자기, 데이터):
            print(f"BClass 처리: {data}")
    
    데프 실행(obj):
        obj.process("data") # 이 메소드가 있는 한 유형을 지정할 필요가 없습니다.
    
    실행(A클래스())
    실행(BClass())

    출력 결과

    A클래스 처리: 데이터
    BClass 처리: 데이터

    추상 범주(ABC)를 사용하는 상황

    Python은 유형을 강제하지 않지만 팀 개발이나 대규모 프로젝트에서 인터페이스를 명확하게 정의하려는 경우 다음을 사용할 수 있습니다.abc개조.

    abc에서 ABC 가져오기, 추상 메서드
    
    클래스 BaseClass(ABC):
        @추상방법
        def 프로세스(자기, 데이터):
            통과
    
    클래스 AClass(BaseClass):
        def 프로세스(자기, 데이터):
            print(f"A클래스 처리: {data}")
    
    클래스 BClass(BaseClass):
        def 프로세스(자기, 데이터):
            print(f"BClass 처리: {data}")
    
    # BaseClass()는 추상 메서드가 구현되지 않았기 때문에 오류를 보고합니다.

    결론적으로



    Python 모듈

    정의

    파이썬에서는기준 치수일반적으로 파일 확장자를 갖는 프로그램 코드가 포함된 파일입니다..py끝. 모듈은 함수, 범주, 변수를 정의할 수 있으며 재사용 및 프로그램 구조화를 용이하게 하기 위해 실행 가능한 코드를 포함할 수도 있습니다.

    사용

    용법

    파이썬을 통해import모듈을 소개하는 키워드입니다. 예:

    수학 가져오기
    
    print(math.sqrt(16)) # 출력 4.0

    맞춤형 모듈

    개발자는 자신만의 모드를 만들 수 있습니다. 예를 들어mymodule.py

    
    # mymodule.py
    def greet(name):
        return f"Hello, {name}!"
    

    다른 프로그램 파일에서 사용:

    
    import mymodule
    
    print(mymodule.greet("Alice"))
    

    공통 내장 그룹



    파이썬 제품군

    정의

    파이썬에서는패키지모듈을 구성하는 방법입니다. 패키지는 여러 모듈을 포함하는 디렉터리로, 계층 구조를 통해 프로그램을 더 쉽게 관리하고 유지 관리할 수 있습니다.

    특징

    기본 예

    라는 이름의 파일을 생성합니다.mypackage키트:

    
    mypackage/
    │── __init__.py
    │── module1.py
    └── module2.py
    

    module1.py예:

    
    def add(a, b):
        return a + b
    

    module2.py예:

    
    def multiply(a, b):
        return a * b
    

    키트를 사용하세요

    mypackage.module1 가져오기
    mypackage.module2 가져오기
    
    print(mypackage.module1.add(2, 3)) # 출력 5
    print(mypackage.module2.multiply(2, 3)) # 출력 6

    패키지에서 특정 프로젝트 가져오기

    mypackage.module1에서 가져오기 추가
    mypackage.module2에서 곱하기 가져오기
    
    print(add(10, 5)) # 출력 15
    print(multiply(10, 5)) # 출력 50

    일반적인 용도



    현재 패키지 이름을 가져옵니다

    설명하다

    Python에서 현재 모듈의 값을 얻으려면패키지 이름, 특수 변수를 사용할 수 있습니다__package__. 이것과__module__현재 모듈 이름을 얻는 개념은 비슷합니다.

    예: 모듈 및 키트 구조

    
    mypackage/
    │── __init__.py
    └── submodule.py
    

    submodule.py콘텐츠:

    
    print("__name__:", __name__)
    print("__package__:", __package__)
    print("__module__:", __module__)
    

    실행 결과

    다른 프로그램에서 다음과 같이 사용하는 경우import mypackage.submodule가져오기, 출력은 대략 다음과 같습니다.

    
    __name__: mypackage.submodule
    __package__: mypackage
    __module__: __main__
    

    설명하다

    애플리케이션 시나리오



    Python 패키지 버전

    Python 패키지 버전을 확인하는 두 가지 주요 방법은 터미널(명령줄)을 통하거나 Python 코드에서 실행하는 것입니다. 이는 환경이 프로젝트 요구 사항을 충족하는지 확인하는 데 도움이 될 수 있습니다.


    1. 터미널(명령줄)을 통해 확인

    이는 가장 빠른 방법이며 Python 대화형 환경에 들어갈 필요가 없습니다.


    2. Python 코드 체크인

    프로그램 실행 시 버전을 확인해야 하는 경우 다음 두 가지 방법을 사용할 수 있습니다.


    3. 검사방법 비교표

    방법 지침/코드 적용 가능한 상황
    핍 명령 pip show 설치 경로, 작성자, 종속성 등의 자세한 정보를 봅니다.
    핍 목록 pip list 현재 환경의 모든 패키지와 버전에 대한 빠른 개요를 확인하세요.
    내부 속성 .__version__ 스크립트가 실행되는 동안 논리적인 판단을 내리세요.
    Metadata version() 전체 제품군을 로드하지 않고 확인하는 표준화된 방법입니다.

    4. Python 자체 버전 확인

    때로는 문제가 제품군에 있는 것이 아니라 Python 인터프리터 자체에 있는 경우도 있습니다.


    5. 자주 묻는 질문(FAQ) 및 알림



    카테고리 및 모듈 객체에서 패키지 이름 가져오기

    클래스 객체

    Python에서는 다음을 통해 클래스 객체에 액세스할 수 있습니다.cls.__module__카테고리를 정의하는 모듈의 이름을 찾아 다음을 사용하십시오.sys.modules모듈 객체를 가져와서 마지막으로 읽습니다.__package__패키지 이름을 가져오는 속성입니다.

    importsys
    
    # 카테고리가 mypackage.submodule에 정의되어 있다고 가정합니다.
    클래스 MyClass:
        통과
    
    # 카테고리가 속한 모듈의 이름을 가져옵니다.
    module_name = MyClass.__모듈__
    print("모듈 이름:", module_name)
    
    # 모듈 객체를 얻습니다
    모드 = sys.modules[모듈_이름]
    
    # 모듈 객체에서 패키지 이름을 가져옵니다.
    print("패키지 이름:", mod.__package__)

    모듈 객체

    모듈 자체는 객체이며 직접 액세스할 수 있습니다.__package__재산.

    수학 가져오기
    mypackage.submodule을 하위로 가져오기
    
    # 수학은 표준 함수 라이브러리 모듈이고 패키지가 없으므로 __package__는 빈 문자열입니다.
    print("math.__package__:", math.__package__)
    
    # 맞춤형 키트용 모듈
    print("sub.__package__:", sub.__package__)

    실행 결과 예

    모듈 이름: mypackage.submodule
    패키지 이름: mypackage
    수학.__패키지__:
    sub.__package__: 내패키지

    결론적으로



    inspect.getfile

    Python 파일이 직접 실행될 때 해당 모듈 이름은 다음과 같습니다.__main__. 이것은 단지cls.__module__원본 파일 이름과 경로를 가져올 수 없습니다.

    프로젝트 구조가 다음과 같다고 가정합니다.

    /프로젝트
      |-- test_runner.py <-- 직접 실행하는 파일(__main__으로 처리됩니다)
      |-- 테스트/
            |-- db_test.py <-- DbCmdAgent를 정의하는 파일

    `test_runner.py`에서 다음 코드를 실행하면:

    test.db_test에서 DbCmdAgent 가져오기
    Agent_obj = DbCmdAgent(...) # 인스턴스화
    
    # 현재 cls.__module__은 여전히 'test.db_test'입니다(올바른 모듈 이름).

    그러나 `test_runner.py`에 카테고리를 정의하는 경우:

    # test_runner.py의 내용
    클래스 DbCmdAgent:
        통과
    
    Agent_obj = DbCmdAgent()
    #이때 cls.__module__ == '__main__' (잘못된 모듈 이름)

    이는 정보를 얻고 있는 클래스가 `__main__`으로 실행되는 파일에 정의되어 있음을 나타냅니다.

    사용inspect모듈은 파일 경로를 직접 얻을 수 있습니다

    카테고리가 `__main__`에 정의되어 있는지 여부에 관계없이 `__module__` 속성을 우회하고 사용할 수 있습니다.inspect이 카테고리에 해당하는 소스 코드 파일 경로를 얻기 위한 모듈입니다. 이는 보다 안정적이고 일반적인 방법입니다.

    Python 수정 구현

    수입 검사
    수입 OS
    
    # --- 시뮬레이션 상황: __main__(현재 실행 중인 스크립트)에 정의된 카테고리 ---
    
    클래스 DbCmdAgent:
        """이 범주는 현재 실행 중인 기본 스크립트에 정의되어 있습니다."""
        def __init__(자기, 데이터):
            self.data = 데이터
    
    Agent_obj = DbCmdAgent("some_data")
    
    def get_class_location_robust(obj):
        """
        __module__ == '__main__' 문제를 우회하려면 Inspection.getfile을 사용하십시오.
        """
        cls = 유형(obj)
        
        # 1. 카테고리를 정의하는 파일 경로를 가져오려면 Inspection.getfile()을 사용하십시오.
        시도해 보세요:
            file_path=inspect.getfile(cls)
            
            # 2. 파일 이름과 디렉터리 가져오기
            file_name = os.path.basename(파일_경로)
            디렉토리 = os.path.dirname(file_path)
            py_name = os.path.splitext(파일_이름)[0]
            
            # 3. __module__이 __main__인 경우 더 많은 컨텍스트를 제공하기 위해 이를 아카이브 이름으로 대체합니다.
            module_name = cls.__모듈__
            module_name == '__main__'인 경우:
                module_name = py_name # db_test 또는 test_runner를 컨텍스트로 사용합니다.
                
        제외유형오류:
            # 내장 유형 처리
            file_path = "해당 없음(내장 또는 C 확장)"
            file_name = "해당 사항 없음"
            디렉토리 = "해당 사항 없음"
            py_name = "해당 사항 없음"
            module_name = cls.__모듈__
            
        반환 {
            "모듈_이름_또는_메인": 모듈_이름,
            "py_name_no_ext": py_name,
            "디렉토리": 디렉토리,
            "파일_경로": 파일_경로,
        }
    
    # 실행하고 결과를 봅니다.
    location_info = get_class_location_robust(agent_obj)
    
    print("--- 카테고리 정의 파일 정보 ---")
    print(f"파일 이름(.py 이름): {location_info['py_name_no_ext']}")
    print(f"디렉터리 경로(패키지): {location_info['directory']}")
    print(f"전체 파일 경로: {location_info['file_path']}")

    4. 요점 요약



    동적 가져오기 모듈

    기능 설명

    이 방법은importlib.import_module지정된 모듈을 가져오십시오. 당신이 만난다면ModuleNotFoundError, 현재 로드된 패키지에서 하위 모듈을 가져오려고 시도합니다.

    프로그램 예

    import importlib
    importsys
    
    def safe_import(모듈_이름):
        시도해 보세요:
            # 직접 가져오기를 시도해보세요
            return importlib.import_module(모듈_이름)
        ModuleNotFoundError 제외:
            # 실패하면 알려진 패키지에서 하위 모듈을 가져오려고 시도합니다.
            목록(sys.modules.keys())의 패키지에 대해:
                pkg.startswith("_")가 아닌 경우:
                    시도해 보세요:
                        return importlib.import_module(f"{pkg}.{module_name}")
                    ModuleNotFoundError 제외:
                        계속하다
            raise # 여전히 찾을 수 없으면 예외를 발생시킵니다.

    사용 예

    numpy 가져오기
    
    mod1 = safe_import("random") # 표준 라이브러리이므로 바로 성공 가능
    mod2 = safe_import("linalg") # numpy.linalg를 시도합니다.
    print(mod2.__name__) # numpy.linalg 출력

    설명하다



    Python 모듈 검색 경로: sys.path 구성

    파이썬에서는sys.path모듈을 가져오려고 할 때 Python 인터프리터가 순서대로 검색할 모든 디렉터리 경로가 포함된 목록입니다. 실행할 때import some_module, Python이 순서대로 확인합니다.sys.path이름이 지정된 디렉토리를 찾을 때까지 목록의 각 디렉토리some_module파일(예:some_module.pysome_module/__init__.py기다리다).

    sys.path의 세 가지 주요 구성 요소

    sys.path목록은 일반적으로 다음 세 부분으로 구성되며 다음 순서로 검색됩니다.

    1. 프로그램 코드의 진입 디렉토리(진입점)

    2. PYTHONPATH 환경 변수

    3. 표준 기능 라이브러리 및 설치 디렉터리

    ---

    sys.path와 관련된 시스템 변수

    위 내용 외에도PYTHONPATH또한 Python 실행 환경과 관련된 여러 환경 변수가 있는데, 이는 인터프리터의 동작과 경로 찾기에 영향을 주지만 영향을 미칩니다.sys.path을 구성하는 주요 변수PYTHONPATH

    시스템 변수 기능 설명 sys.path와의 관계
    PYTHONPATH 모드 검색 경로에 추가할 추가 디렉터리를 정의합니다. 직접적인 영향sys.path구성.
    PYTHONHOME 특히 임베디드 시스템의 경우 Python 설치 디렉터리에 대한 대체 경로를 설정하는 데 사용됩니다. 표준 라이브러리에 간접적으로 영향을 미치며site-packages위치.
    PATH 운영 체제에서 실행 파일(예:python.exe) 길. 직접적인 영향을 미치지는 않습니다sys.path, 그러나 어떤 Python 인터프리터가 실행되는지에 영향을 미칩니다.
    VIRTUAL_ENV 가상 환경에 있는 경우 이 변수는 가상 환경의 루트 디렉터리를 가리킵니다. 간접적인 영향sys.path, 그것이 보장하는 것처럼site-packages전체 시스템이 아닌 가상 환경에서 비롯됩니다.

    sys.path를 수정하는 방법

    왜냐하면sys.path프로그램이 실행되는 동안 동적으로 수정할 수 있는 일반적인 Python 목록이지만 이러한 수정은 현재 인터프리터 세션 내에서만 적용됩니다.

    importsys
    수입 OS
    
    # 검색 경로에 상위 디렉터리를 추가합니다(일반적으로 테스트 또는 내부 프로젝트 참조에 사용됨).
    sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))


    모드 섀도우

    모듈 섀도잉(또는 이름 섀도잉)은 Python에서 흔히 발생하는 오류 또는 프로그래밍 문제입니다. 이는 가져오거나 사용하려는 내장 모듈 또는 타사 라이브러리의 이름과 충돌하는 코드 파일이나 변수 이름을 실수로 생성한 경우에 발생합니다.

    1. 발생의 정의 및 원인

    그 결과 로컬 파일이 로드되어야 하는 표준 모듈을 "덮거나" "재정의"하여 코드가 표준 모듈 기능(예:socket.AF_UNSPEC)은 로드한 로컬 파일에 이러한 속성이 없기 때문에 실패합니다.

    2. 일반적인 예

    표준 모듈 이름 그림자를 발생시킨 로컬 파일 이름 결과적으로
    socket socket.py 표준을 사용할 수 없습니다socket모듈의 네트워크 상수(예:AF_INET, AI_PASSIVE)。
    json json.py 표준을 사용할 수 없습니다json모듈식loads또는dumps기능.
    test(프로젝트 이름) test.py 단위 테스트 환경에서는 테스트 프레임워크의 내부 로직과 충돌이 발생할 수 있습니다.

    3. 솔루션

    1. 아카이브 이름 바꾸기: 이것이 가장 간단하고 효과적인 솔루션입니다. 표준 모듈이나 라이브러리 이름과 충돌하는 로컬 파일이나 디렉터리의 이름을 바꾸면 됩니다. 예를 들어, 변경socket.py이름이 변경됨network_handler.py
    2. sys.path 확인: 코드에서 이 작업을 수행하세요.import sys; print(sys.path)Python의 검색 경로를 확인하여 표준 라이브러리 디렉터리보다 로컬 파일을 우선적으로 로드하는지 확인하세요.
    3. 가상 환경 사용: 가상 환경 자체가 로컬 아카이브 섀도잉을 방지하지는 않지만 설치한 타사 패키지가 다른 환경과 충돌하지 않도록 할 수 있습니다.


    현재 항목 .py 이름 가져오기

    설명하다

    Python 프로그램의 현재 실행을 얻으려면__main__사용할 수 있는 해당 파일이 속한 .py 파일의 이름__main__.__file__또는sys.argv[0]. 하지만 대화형 모드에서는 Jupyter 또는-c실행 시에는 존재하지 않을 수 있으므로 안전한 처리가 필요합니다.

    현재 기본 .py 파일 이름 가져오기(안전한 버전)

    수입 OS
    importsys
    __main__ 가져오기
    
    def get_main_py_path():
        """main이 속한 .py의 절대 경로를 반환합니다. 찾을 수 없으면 None을 반환합니다."""
    
        # 사례 1: 정상 실행 .py
        main_file = getattr(__main__, "__file__", 없음)
        main_file인 경우:
            os.path.abspath(main_file)를 반환합니다.
    
        # 사례 2: sys.argv[0]의 판단
        len(sys.argv) > 0인 경우:
            argv0 = sys.argv[0]
            argv0이 ("", "-c", "에 없는 경우)"):
                후보 = os.path.abspath(argv0)
                os.path.exists(후보)인 경우:
                    복귀 후보
    
        # 사례 3: 대화형 모드, Jupyter, 삽입 등
        반환 없음
    
    # 예시
    경로 = get_main_py_path()
    경로인 경우:
        print("기본 경로:", 경로)
        print("주 파일명:", os.path.basename(path))
    그 외:
        print("main.py를 찾을 수 없습니다(대화형 환경에 있거나 아카이브에서 실행되지 않았을 수 있습니다)")

    파일 이름(기본 이름)만

    path = get_main_py_path()
    filename = os.path.basename(path) if path else None
    print(filename)

    요약



    현재 함수의 매개변수 이름과 값을 가져옵니다.

    To get the parameter names and their corresponding values of a function in Python, you can use the `inspect` module, which provides introspection utilities. Specifically, `inspect.signature()` can help you retrieve the names of the parameters, and you can pass the current frame's local variables to get their values.
    
    Here is an example that demonstrates how to get the function name, parameter names, and their values:
    
    ```python
    import inspect
    
    # Sample function
    def my_function(a, b, c=5):
        # Get the current frame
        frame = inspect.currentframe()
        
        # Get the function name
        func_name = frame.f_code.co_name
        print(f"Function name: {func_name}")
        
        # Get the parameter names and their values
        args, _, _, values = inspect.getargvalues(frame)
        
        # Print parameter names and values
        for arg in args:
            print(f"Parameter name: {arg}, Value: {values[arg]}")
    
    # Call the function
    my_function(1, 2)
    ```
    
    ### Output:
    ```
    Function name: my_function
    Parameter name: a, Value: 1
    Parameter name: b, Value: 2
    Parameter name: c, Value: 5
    ```
    
    ### Explanation:
    1. **`inspect.currentframe()`**: Retrieves the current execution frame.
    2. **`frame.f_code.co_name`**: Extracts the name of the current function.
    3. **`inspect.getargvalues(frame)`**: Gets the argument names and their corresponding values from the frame. This function returns a tuple containing:
       - `args`: List of argument names.
       - `_`: Placeholder for unused information.
       - `values`: Dictionary containing argument names as keys and their values.
    
    This allows you to print both the names of the function's parameters and their values at runtime.
    


    함수 매개변수의 유형을 가져옵니다.

    검사 모듈 사용

    Python에서는 다음을 사용할 수 있습니다.inspect.signature()함수 매개변수 정보를 가져옵니다. 그리고 더 멀리Parameter.annotation이 속성은 각 매개변수에 대한 유형 주석(유형 힌트)을 가져옵니다.

    수입 검사
    
    def my_function(a: int, b: str, c: float = 3.14) -> bool:
        str(a) == b를 반환합니다.
    
    시그 = 검사.서명(my_function)
    
    이름의 경우 sig.parameters.items()의 매개변수:
        print(f"매개변수 이름: {이름}")
        print(f"기본값: {param.default}")
        print(f"유형 주석: {param.annotation}")
        인쇄()

    출력 결과

    매개변수 이름: a
      기본값: <class 'inspect._empty'>
      유형 주석: <class 'int'>
    
    매개변수 이름: b
      기본값: <class 'inspect._empty'>
      유형 주석: <class 'str'>
    
    매개변수 이름: c
      기본값: 3.14
      유형 주석: <class 'float'>

    설명하다

    get_type_hints 사용

    이 방법은 전방 참조(문자열로 표시된 유형)를 자동으로 해결합니다.

    
    from typing import get_type_hints
    
    hints = get_type_hints(my_function)
    print(hints)
    

    출력 결과

    
    {'a': <class 'int'>, 'b': <class 'str'>, 'c': <class 'float'>, 'return': <class 'bool'>}
    

    요약



    객체의 클래스 이름을 가져옵니다.

    설명하다

    Python에서는 객체의__class__속성 또는type()기능, 그것이 속한 카테고리(클래스)를 가져온 다음 카테고리 이름을 가져옵니다.

    클래스 동물:
        통과
    
    클래스 개(동물):
        통과
    
    obj = 개()
    
    #방법 1: __class__.__name__ 사용
    print(obj.__class__.__name__) # 출력: 개
    
    #방법 2: type() 사용
    print(type(obj).__name__) # 출력: 개
    
    #방법 3: 전체 모듈 및 카테고리 이름 가져오기
    print(obj.__class__) # 출력: <class '__main__.Dog'>
    print(obj.__class__.__module__) # 출력: __main__

    출력 결과

    
    Dog
    Dog
    <class '__main__.Dog'>
    __main__
    

    설명하다

    고급 애플리케이션

    완전한 "모듈 + 카테고리 이름"을 동시에 얻으려면 다음과 같이 작성할 수 있습니다.

    
    cls = type(obj)
    full_name = f"{cls.__module__}.{cls.__name__}"
    print(full_name)
    

    출력 결과

    
    __main__.Dog
    

    요약



    속성이 속한 카테고리를 감지합니다.

    다음은 Python을 사용하여 속성이 속한 상속 클래스를 확인하는 샘플 코드입니다.

    샘플 코드

    수입 검사
    
    클래스 BaseClass:
        base_attr = "저는 BaseClass의 속성입니다."
    
    클래스 하위 클래스(BaseClass):
        sub_attr = "나는 SubClass의 속성입니다"
    
    # 속성이 속한 카테고리를 찾는 함수를 정의합니다.
    def find_attribute_owner(cls, attr_name):
        for base in Inspection.getmro(cls): # MRO 가져오기(메서드 해결 순서)
            base.__dict__에 attr_name이 있는 경우:
                반환 기지
        반환 없음
    
    # 테스트
    sub_obj = 서브클래스()
    속성 = sub_obj.__class__.__dict__.items() # 카테고리 수준에서 모든 속성을 가져옵니다.
    이름, 속성 값:
        소유자 = find_attribute_owner(sub_obj.__class__, 이름)
        print(f"'{name}' 속성은 다음 카테고리에 속합니다: {owner.__name__}")

    프로그램 설명

    실행 결과

    예시의 카테고리에 대한 실행 결과는 다음과 같습니다.

    '__module__' 속성은 다음 클래스에 속합니다: SubClass
    'sub_attr' 속성은 다음 클래스에 속합니다: SubClass
    속성 '__doc__'은(는) 클래스에 속합니다: SubClass
    'base_attr' 속성은 BaseClass 클래스에 속합니다.


    함수 주석 가져오기(Docstring)

    __doc__ 사용

    class MyClass:
        def fun1(self):
            '''
            Fun1 comment
            '''
            pass
    
    obj = MyClass()
    print(obj.fun1.__doc__)
    

    검사 모듈 사용

    import inspect
    
    class MyClass:
        def fun1(self):
            '''
            Fun1 comment
            '''
            pass
    
    print(inspect.getdoc(MyClass.fun1))
    


    더 이상 사용되지 않는 것으로 표시된 함수

    경고 모듈 사용

    Python에서는 내장된 기능을 사용할 수 있습니다.warnings컴파일 시간이 아닌 실행 시간에 사용자에게 함수가 더 이상 사용되지 않음을 알리고 새로운 대안을 제안하는 모듈입니다.

    수입 경고
    
    def old_function(x, y):
        경고.경고(
            "old_function() 함수는 더 이상 사용되지 않습니다. 대신 new_function(x, y)를 사용하십시오.",
            카테고리=지원 중단 경고,
            스택레벨=2
        )
        x + y를 반환
    
    def new_function(x, y):
        x + y를 반환

    실행 예

    
    result = old_function(3, 4)
    print(result)
    

    출력 결과

    DeprecationWarning: old_function() 함수는 더 이상 사용되지 않습니다. 대신 new_function(x, y)를 사용하십시오.
      결과 = old_function(3, 4)
    7

    추가 정보

    고급: 더 이상 사용되지 않는 기능을 자동으로 표시하는 데코레이터 만들기

    데코레이터를 사용하면 여러 기존 함수가 동일한 지원 중단 프롬프트 논리를 공유할 수 있습니다.

    수입 경고
    functools 가져오기 랩에서
    
    def는 더 이상 사용되지 않습니다(new_func_name):
        def 데코레이터(func):
            @wraps(기능)
            def 래퍼(*args, **kwargs):
                경고.경고(
                    f"{func.__name__}() 함수는 더 이상 사용되지 않습니다. 대신 {new_func_name}()을 사용하십시오.",
                    카테고리=지원 중단 경고,
                    스택레벨=2
                )
                return func(*args, **kwargs)
            반환 포장지
        반환 장식자
    
    @deprecated("new_function")
    def old_function(x, y):
        x + y를 반환


    @staticmethod와 @classmethod의 차이점

    파이썬에서는@staticmethod그리고@classmethod두 데코레이터 모두 클래스를 인스턴스화하지 않고 호출할 수 있는 메서드를 정의할 수 있지만 목적과 동작은 다릅니다.

    @staticmethod

    @staticmethod 예:

    클래스내클래스:
        @staticmethod
        def static_method(x, y):
            x + y를 반환
    
    # 인스턴스를 생성하지 않고도 정적 메서드를 호출할 수 있습니다.
    result = MyClass.static_method(5, 10) # 결과: 15

    집중하다@staticmethod카테고리에 접근할 수 없습니다(cls) 또는 인스턴스(self)。

    @classmethod

    @classmethod 예:

    클래스내클래스:
        클래스_변수 = 0
    
        def __init__(자체, 값):
            self.value = 가치
            MyClass.class_variable += 1
    
        @classmethod
        def get_class_variable(cls):
            cls.class_variable을 반환합니다.
    
    #인스턴스 생성
    obj1 = MyClass(10)
    obj2 = MyClass(20)
    
    # 통화 카테고리 방법
    print(MyClass.get_class_variable()) # 결과: 2

    집중하다@classmethod카테고리 수준 상태에 액세스할 수 있습니다(cls)。

    요약

    특징 @staticmethod @classmethod
    첫 번째 매개변수 암시적인 첫 번째 인수 없음 cls(카테고리 자체)
    액세스 인스턴스 없음 없음
    액세스 카테고리 없음 가지다
    용법 카테고리와 관련되어 있지만 인스턴스나 카테고리가 필요하지 않은 유틸리티 기능 카테고리 수준 데이터를 조작하거나 대체 생성자를 제공해야 함


    정적 클래스가 초기화를 수행합니다.

    Python 자체는 "기본 정적 메서드" 또는 "기본 클래스 메서드", 즉 정적 또는 클래스 메서드가 처음 호출될 때 자동으로 메서드를 실행하는 기능을 제공하지 않습니다. 그러나 지연 로딩 기술을 통해 유사한 동작을 달성할 수 있습니다.

    해결 방법: 정적 변수 및 지연 로딩 사용

    클래스에 정적 변수를 정의하여 초기화된 상태를 추적한 다음 정적 또는 클래스 메서드가 처음 호출될 때 초기화 논리를 실행할 수 있습니다.

    예:

    클래스내클래스:
        초기화 = False # 초기화 여부를 추적하는 정적 변수
    
        @staticmethod
        def init_once():
            MyClass.initialized가 아닌 경우:
                print("초기화 로직 실행...")
                MyClass.initialized = True
    
        @classmethod
        def class_method(cls):
            cls.init_once()
            print("클래스 메소드 호출")
    
        @staticmethod
        def static_method():
            MyClass.init_once()
            print("정적 메소드 호출")
    
    # 초기화를 트리거하기 위해 처음으로 카테고리 메소드를 호출합니다.
    MyClass.class_method() # 출력: 초기화 논리 실행...클래스 메소드 호출
    
    # 두 번째로 카테고리 메소드를 호출하고 더 이상 초기화를 수행하지 않습니다.
    MyClass.class_method() # 출력: 클래스 메소드 호출
    
    # 정적 메서드를 처음 호출하면 이미 초기화되었기 때문에 초기화가 수행되지 않습니다.
    MyClass.static_method() # 출력: 정적 메서드 호출

    작동 방식:

    요약

    Python에는 기본 제공되는 "기본 정적 메서드" 또는 "기본 클래스 메서드"가 없지만 정적 변수 및 지연 로딩 기술을 사용하면 정적 또는 클래스 메서드가 처음 호출될 때 초기화 논리를 자동으로 실행할 수 있으며 이 논리가 한 번만 실행되도록 할 수 있습니다.



    파이썬 스레드

    Python에서 스레드는 동시성을 구현하는 데 사용되는 메커니즘입니다. 이를 통해 프로그램은 단일 프로세스(Process) 내에서 여러 작업을 동시에 수행할 수 있습니다. 이는 I/O 집약적인 작업(예: 네트워크 통신, 파일 읽기 및 쓰기)을 수행하는 데 매우 유용하며 프로그램이 외부 작업이 완료될 때까지 기다리는 것을 차단(Blocking)하는 것을 방지할 수 있습니다.

    1. 스레드를 사용하는 이유는 무엇입니까?

    2. Python 스레드 제한 사항: GIL(Global Interpreter Lock)

    표준 CPython 인터프리터에는 "Global Interpreter Lock"(Global Interpreter Lock, GIL)이 있습니다. GIL은 주어진 시간에 하나의 스레드만 Python 비트코드를 실행할 수 있도록 보장합니다. 이는 다음을 의미합니다.

    3. 실행 스레드 모듈:threading

    Python은 표준 함수 라이브러리를 사용합니다.threading실행 스레드를 처리하는 모듈입니다. 스레드 생성에는 두 가지 주요 방법이 있습니다.

    방법 1: 함수를 대상으로 전달(Target Function)

    이것은 가장 간단하고 가장 일반적인 사용법입니다.

    수입 스레딩
    수입 시간
    
    def 작업(이름, 지연):
        """스레드에서 실행할 태스크 함수"""
        print(f"스레드 {이름}: 시작 중...")
        time.sleep(delay) # 시간이 많이 걸리는 I/O 작업을 시뮬레이션합니다.
        print(f"스레드 {name}: 작업이 완료되었습니다.")
    
    #실행 스레드 생성
    thread1 = threading.Thread(대상=작업, args=("T1", 2))
    thread2 = threading.Thread(대상=작업, args=("T2", 4))
    
    # 스레드를 시작합니다
    스레드1.시작()
    스레드2.시작()
    
    # 모든 스레드가 완료될 때까지 기다립니다(완료될 때까지 메인 스레드를 차단합니다).
    thread1.join()
    thread2.join()
    
    print("모든 실행 스레드가 완료되었습니다. 메인 프로그램이 종료됩니다.")

    방법 2: 상속threading.Thread범주

    카테고리에 실행 스레드의 논리를 캡슐화하여 보다 복잡한 시나리오에 적합합니다.

    수입 스레딩
    수입 시간
    
    클래스 MyThread(threading.Thread):
        def __init__(자신, 이름, 지연):
            슈퍼().__init__()
            self.name = 이름
            self.delay = 지연
    
        def 실행(자기):
            """
            스레드가 시작되면 run() 메서드가 자동으로 호출됩니다.
            여기에서는 스레드가 수행할 작업을 정의합니다.
            """
            print(f"스레드 {self.name}: 시작 중...")
            시간.수면(self.delay)
            print(f"스레드 {self.name}: 작업이 완료되었습니다.")
    
    #스레드 생성 및 시작
    thread3 = MyThread("T3", 3)
    thread3.시작()
    thread3.join()
    
    print("사용자 정의 실행 스레드가 완료되었습니다.")

    4. 스레드 동기화 및 데이터 공유

    여러 스레드가 공유 데이터에 액세스하고 수정하면 경쟁 조건이 발생할 수 있습니다. 데이터를 보호하려면 동기화 메커니즘을 사용해야 합니다.

    잠금 예 사용

    수입 스레딩
    
    # 공유 리소스
    카운터 = 0
    # 잠금 생성
    잠금 = 스레딩.Lock()
    
    def increment_counter():
        글로벌 카운터
        # 동시에 단 하나의 스레드만이 이 블록을 실행할 수 있도록 잠금을 획득합니다.
        잠금.획득()
        시도해 보세요:
            # 공모전 섹션
            현재_값 = 카운터
            time.sleep(0.001) # 전환 시뮬레이션
            카운터 = 현재_값 + 1
        마지막으로:
            # 잠금 해제
            잠금.해제()
    
    스레드 = []
    범위(100)에 있는 i의 경우:
        t = 스레딩.스레드(대상=increment_counter)
        스레드.추가(t)
        t.시작()
    
    스레드의 t에 대해:
        t.join()
    
    print(f"최종 카운터 값: {counter}") # 잠금이 없으면 이 값은 100이 아닐 수 있습니다.


    Python 스레드 시작, 동기화 및 중지

    파이썬threading모듈은 실행 스레드를 생성하고 관리하는 기능을 제공하지만 운영 체제 제한 및 설계 철학으로 인해 Python은 외부 실행 스레드를 중지(Kill)하는 안전하고 직접적이며 강제적인 방법을 제공하지 않습니다. 강제로 중지하면 리소스 누출이나 데이터 손상이 발생할 수 있습니다.

    따라서 실행 스레드를 중지하려면 **협력 메커니즘****을 통해 이루어져야 합니다. 즉, 실행 스레드가 스스로 중지 플래그를 확인하고 정상적으로 종료되도록 해야 합니다.

    1. 실 정지 메커니즘 : 플래그(Flag) 사용

    이는 가장 안전하고 권장되는 스레드 중지 방법입니다. 스레드가 작업 실행 루프에서 외부 변수(플래그)를 주기적으로 확인해야 합니다.

    Python 구현 예

    수입 스레딩
    수입 시간
    
    # 공유 중지 플래그
    stop_flag = 스레딩.이벤트()
    
    def monitor_task(이름, 지연):
        """
        정지 플래그를 주기적으로 확인하는 태스크 기능
        """
        print(f"스레드 {이름}: 시작 중...")
        나는 = 0
        while not stop_flag.is_set(): # 플래그가 설정되어 있는지 확인합니다.
            나는 += 1
            print(f"스레드 {이름}: 실행 단계 {i}")
            
            # 시간이 많이 걸리는 작업을 시뮬레이션하고 정기적으로 확인합니다.
            시간.수면(지연)
            
            # 여기에서는 무한 루프가 발생하지 않도록 실행 횟수 제한을 설정할 수 있습니다.
            내가 >= 5인 경우:
                휴식
                
        print(f"실행 스레드 {name}: 중지 신호를 받았거나 작업이 종료되어 정상적으로 종료되었습니다.")
    
    # --- 메인 프로그램 제어 블록 ---
    
    #실행 스레드 생성
    Worker_thread = threading.Thread(target=monitored_task, args=("Worker-1", 1))
    
    # 스레드를 시작합니다
    작업자_스레드.시작()
    
    print("\n메인 프로그램: 실행 스레드가 시작되었습니다. 3초 동안 기다리십시오...\n")
    time.sleep(3) # 잠시 동안 스레드를 실행하도록 둡니다.
    
    # 정지 신호 보내기
    print("\n메인 프로그램: 정지 플래그 설정...\n")
    stop_flag.set() # 이벤트를 설정하고 is_set()가 True를 반환하도록 합니다.
    
    # 스레드가 정상적으로 완료되고 종료될 때까지 기다립니다(보통 빠르게).
    작업자_스레드.조인()
    
    print("\n메인 프로그램: 스레드가 안전하게 중지되고 조인되었습니다. 프로그램이 종료되었습니다.")

    2. 주요 구성품 설명

    3. 기타 정지 메커니즘(강제 정지는 권장되지 않음)

    `_thread.stop()`을 사용하거나 예외를 발생시키는 등 강제로 중지하는 몇 가지 실험적이거나 안전하지 않은 방법이 있지만 이러한 방법으로 인해 다음이 발생할 수 있습니다.

    따라서 Python에서는 항상 조정된 플래그 지정 메커니즘을 사용하여 스레드를 중지해야 합니다.



    다중 스레드 공유 객체 충돌에 대한 솔루션

    1. 가장 일반적으로 사용되는 솔루션: Thread-Local Storage

    이는 다중 스레드 환경에서 가장 권장되는 접근 방식입니다. 모든 스레드가 동일한 개체를 가져오는 대신 각 스레드는 개체의 독립적인 복사본을 갖습니다. Python에서는 다음을 사용할 수 있습니다.threading.local()달성하기 위해.

    수입 스레딩
    
    # 객체를 저장할 스레드 영역을 만듭니다.
    thread_data = threading.local()
    
    def get_service():
        # 현재 스레드에 자체 서비스가 없으면 새로 만듭니다.
        hasattr(thread_data, 'service')가 아닌 경우:
            print(f"{threading.current_thread().name} 스레드에 대한 새 연결을 생성합니다")
            thread_data.service = create_new_connection()
        thread_data.service를 반환합니다.
    
    데프 작업():
        서비스 = get_service()
        # 작업 수행...

    2. 두 번째로 가장 많이 사용되는 방법: 잠금 메커니즘(Locking)

    객체가 동일해야 하는 경우(예: 동일한 파일에 쓰거나 동일한 전역 카운터에서 작동) 다음을 사용해야 합니다.Lock. 이렇게 하면 경쟁 조건을 방지하면서 동시에 하나의 스레드만 개체에 액세스할 수 있습니다.

    잠금 = 스레딩.Lock()
    
    def safe_task():
        자물쇠 포함:
            # 이 블록 내에서 다른 스레드는 기다려야 합니다.
            shared_object.do_something()
    ---

    멀티스레딩의 대안: 비동기식 및 다중 처리

    여러 스레드에서 발생하는 잠금 경합이나 충돌의 위험을 피하려면 고려해야 할 두 가지 주요 대안이 있습니다.

    1. 비동기 코루틴(Asyncio) - I/O 집약적인 작업에 적합

    이는 현재 Python에서 가장 널리 사용되는 접근 방식입니다(예: FastAPI의 핵심 원칙). 단일 스레드 내에서 실행되며 작업을 전환하여 I/O(예: API 요청, 데이터베이스 쿼리)를 기다립니다.

    비동기 가져오기
    
    비동기 def fetch_api(url):
        # aiohttp와 같은 비동기 라이브러리를 사용합니다.
        응답 = call_api(url) 대기
        응답 반환
    
    비동기 정의 메인():
        # 동시에 여러 작업을 실행하지만 단일 스레드 내에서 전환합니다.
        결과 = asyncio.gather(fetch_api("url1"), fetch_api("url2"))를 기다립니다.

    2. 다중 처리 - 계산 집약적인 작업에 적합

    Python의 실행 스레드는 GIL(Global Interpreter Lock)에 의해 제한되며 작업을 실제로 병렬화할 수 없습니다.multiprocessing여러 개의 독립적인 Python 인터프리터 인스턴스가 열립니다.

    다중 처리 가져오기 프로세스에서
    
    def 작업(이름):
        print(f"{name} 프로세스가 실행 중입니다.")
    
    __name__ == "__main__"인 경우:
        p = 프로세스(대상=작업, args=('A',))
        p.start()
        p.join()

    3. 작업 대기열 - 분산 처리에 적합

    작업을 완전히 분리하려면 Celery 또는 Redis Queue를 사용할 수 있습니다. 작업을 대기열에 넣고 백엔드 작업자(여러 프로세스 또는 다중 시스템일 수 있음)가 이를 선택하고 실행하도록 합니다.

    ---

    요약 제안

    계획 해결책 적용 가능한 상황
    Thread-Local 각 스레드는 복사본을 얻습니다. API 서비스, 데이터베이스 연결
    Asyncio 단일 스레드 전환(비동기) 높은 동시 네트워크 요청(권장)
    Multiprocessing 독립 기억 공간 공유 충돌을 완전히 방지하는 CPU 컴퓨팅


    스레드 영역 저장과 정보 공유 간의 균형

    핵심 개념

    TLS(스레드 로컬 저장소)를 사용하는 경우 목적은 "스레드로부터 안전하지 않은" 개체(예: API 서비스, 데이터베이스 연결)를 보호하는 것입니다. 그러나 스레드 간에 데이터를 교환해야 하는 경우(예: 스레드 A에서 다운로드한 결과를 스레드 B에서 처리해야 하는 경우) 특별한 "통신 채널"을 설정해야 합니다.

    1. 스레드로부터 안전한 큐(Queue) 사용 - 가장 권장됨

    파이썬queue.Queue스레드로부터 안전합니다. 이는 스레드 간에 정보를 전송하는 가장 표준적이고 안전한 방법입니다. 이미 내부적으로 모든 잠금 로직을 처리했습니다.

    수입 스레딩
    가져오기 대기열
    
    # 모든 실행 스레드가 접근할 수 있는 전역 큐를 생성합니다.
    task_queue = 대기열.큐()
    
    데프 생산자():
        # 데이터를 생성하고 대기열에 넣습니다.
        데이터 = {"video_id": "abc", "status": "보류 중"}
        task_queue.put(데이터)
    
    데프 소비자():
        # 큐에서 데이터를 가져옵니다
        데이터 = task_queue.get()
        # 데이터 처리...
        task_queue.task_done()

    2. 스레드 보안 변수 사용(예: 공유 목록 잠금)

    큰 목록이나 사전을 공유해야 하는 경우 일반 전역 변수를 사용할 수 있지만 일치하는 항목으로 액세스해야 합니다.threading.Lock

    공유_결과 = []
    results_lock = 스레딩.잠금()
    
    데프 작업():
        result = "일부 작업 결과"
        
        #공유 리소스에 액세스하기 전에 잠금
        results_lock 사용:
            shared_results.append(결과)
        # with 블록을 떠난 후 자동으로 잠금 해제

    3. Event 또는 Condition 객체 사용(신호 동기화)

    때로는 "데이터"가 아닌 "상태"를 공유하고 싶을 때가 있습니다(예: API가 초기화되었음을 다른 스레드에 알리기).

    api_ready = 스레딩.이벤트()
    
    def 초기화():
        #초기화 수행
        api_ready.set() # 신호 보내기
    
    데프 작업자():
        api_ready.wait() # 초기화 프로그램이 set()을 호출할 때까지 신호를 기다립니다.
        print("작업 시작")

    요약: 지역 저장소와 공유 정보

    콘텐츠 유형 저장 위치 경영 스타일
    도구 개체(API, DB 연결) 스레드-로컬(지역) 각각에는 충돌을 방지하기 위한 사본이 있습니다.
    미션정보(ID, 매개변수) 대기열(전역) 스레드로부터 안전한 대기열 전달을 사용합니다.
    계산 결과(통계) 전역 목록/사전(전역) 일치해야 함threading.Lock

    간단히 말하면: **"개인 도구(연결)를 직접 가져오고 대기열(큐/잠금)에서 공개 정보(데이터)를 가져옵니다."**



    스레드 잠금

    기본 개념

    멀티 스레드 환경에서는 여러 스레드가 동일한 전역 변수나 공유 리소스(예: 파일, 데이터베이스 연결, 전역 목록)를 동시에 수정하려고 하면 오류가 발생합니다.경쟁 조건, 데이터 혼란을 초래합니다.threading.Lock한 번에 하나의 스레드만 보호된 코드 블록에 들어갈 수 있도록 보장하는 동기화 기본 요소입니다.

    1. 표준 사용법

    가장 안전하고 권장되는 방법은 일치하는 것입니다.with서술형 문장을 사용하세요. 이렇게 하면 블록 내에서 예외가 발생하더라도 교착 상태를 방지하기 위해 잠금이 올바르게 해제됩니다.

    수입 스레딩
    
    # 1. 잠금 객체 생성
    my_lock = 스레딩.잠금()
    공유 카운터 = 0
    
    def increment_task():
        전역 공유_카운터
        # 2. acquire() 및 release()를 자동으로 관리하려면 with를 사용하세요.
        my_lock 사용:
            # 이 블록의 코드는 한 번에 하나의 스레드에서만 실행될 수 있습니다.
            온도 = 공유_카운터
            온도 += 1
            shared_counter = 임시
    
    # 다중 스레드 테스트 시작
    스레드 = [threading.Thread(target=increment_task) for _ in range(100)]
    스레드의 t에 대해: t.start()
    스레드의 t에 대해: t.join()
    
    print(f"최종 개수: {shared_counter}")

    2. 수동 제어 방법

    권장되지는 않지만 때로는 더 미세한 제어가 필요할 수 있습니다. 수동으로 전화해야 합니다.acquire()자물쇠를 획득하고finally블록에 전화release()

    잠금 = 스레딩.Lock()
    
    def manual_task():
        lock.acquire() # 잠금을 획득합니다. 잠금이 이미 점유된 경우 여기에서 차단(대기)됩니다.
        시도해 보세요:
            # 작업 실행
            통과
        마지막으로:
            lock.release() # 해제되어야 합니다. 그렇지 않으면 다른 스레드가 절대 실행될 수 없습니다.

    3. 잠금 특성: 비재진입

    threading.Lock재진입이 아닙니다. 이는 동일한 스레드가 이미 잠금을 보유하고 있을 때 동일한 잠금을 다시 요청하면 자체적으로 "잠김"(교착 상태)이 발생함을 의미합니다.

    4. 언제 잠금을 사용해야 합니까?

    성능 고려사항

    잠금을 과도하게 사용하면 여러 스레드가 "실행 대기" 상태가 되므로 프로그램 성능이 저하됩니다. 가능하다면 우선적으로 사용하세요.queue.Queue아니면 우리가 이전에 논의한 것Thread-Local Storage, 이러한 방법은 일반적으로 빈번한 잠금보다 더 효율적이고 오류가 덜 발생합니다.



    Python 비동기 프로그래밍

    파이썬에서는async def그리고await실현된다비동기 프로그래밍핵심 구문. I/O 작업(예: 네트워크 요청, 파일 읽기)을 기다리는 동안 프로그램이 멈추는 것을 방지하고 대신 다른 작업을 처리하여 성능을 크게 향상시킬 수 있습니다.


    1. async def: 코루틴 함수 정의

    함수 정의 앞에 다음을 추가하면async, 함수는 다음과 같습니다.코루틴 함수. 호출하면 콘텐츠가 즉시 실행되지 않지만 "코루틴 개체"가 반환됩니다.

    비동기 def fetch_data():
        print("데이터 가져오기 시작...")
        # 시간이 많이 걸리는 작업을 시뮬레이션합니다.
        {"데이터": "성공"}을 반환합니다.
    
    # 직접 호출은 코루틴 객체만 가져오고 인쇄는 실행하지 않습니다.
    결과 = fetch_data()
    print(result) # 출력: <코루틴 객체 fetch_data at ...>

    2. wait: 일시 중지하고 기다립니다.

    await오직 될 수 있다async def내부용. 그 기능은 "현재 코루틴을 일시적으로 중단하고 후속 작업이 완료될 때까지 기다린 후 반환 값을 얻는 것"입니다. 기다리는 동안 시스템은 다른 비동기 작업을 수행할 수 있습니다.

    비동기 가져오기
    
    비동기 정의 메인():
        # 코루틴을 실행하고 결과를 얻으려면 wait를 사용하세요.
        데이터 = fetch_data()를 기다립니다
        print(f"캡처 결과: {data}")
    
    # 비동기 프로그램에 대한 항목을 시작합니다.
    asyncio.run(메인())

    3. 주요 비교표

    문법 기능 설명 주의할 점
    async def 비동기 함수 선언 반환되는 것은 실행 결과가 아닌 코루틴 객체입니다.
    await 비동기 작업이 완료될 때까지 기다립니다. 비동기 함수 내에서만 작성할 수 있습니다.
    asyncio.run() 가장 바깥쪽 비동기 항목 시작 프로그램은 일반적으로 한 번만 호출하면 됩니다.

    4. 일반적인 오류 및 수정


    5. 비동기식을 사용하는 이유는 무엇입니까?

    당신이 요리를 하고 있다고 상상해보세요:



    코루틴을 완료하고 결과를 반환합니다.

    loop.run_until_complete()asyncio모듈의 하위 수준 메서드는 코루틴이 완료될 때까지 실행하고 결과를 반환하는 데 사용됩니다. Python 3.7 이후에는 공식적으로 사용을 권장하지만asyncio.run(), 그러나 일부 특정 상황(예: 이벤트 루프를 재사용해야 하거나 시작 논리를 사용자 정의해야 하는 경우)에서는 여전히 이 방법을 사용해야 합니다.

    1. 기본 이용과정

    사용run_until_complete먼저 이벤트 루프 객체를 얻거나 생성한 다음 여기에 코루틴을 전달해야 합니다.

    비동기 가져오기
    
    비동기 def my_task():
        asyncio.sleep을 기다립니다(1)
        "작업 완료"를 반환합니다.
    
    # 1. 이벤트 루프 가져오기
    루프 = asyncio.get_event_loop()
    
    # 2. 완료될 때까지 코루틴을 실행하고 반환 값을 직접 가져옵니다.
    결과 = loop.run_until_complete(my_task())
    
    print(result) #Output: 작업 완료

    2. asyncio.run()과의 차이점

    둘 다 반환 값을 얻을 수 있지만 수명 주기를 다르게 관리합니다.

    특성 asyncio.run() (권장) loop.run_until_complete()
    자동화 정도 높은. 자동으로 루프를 생성하고 닫고 작업을 정리합니다. 낮은. 루프의 수명주기는 수동으로 관리해야 합니다.
    재사용성 낮은. 호출할 때마다 새로운 루프가 생성됩니다. 높은. 동일한 루프에서 여러 작업을 실행할 수 있습니다.
    사용 제한 이미 실행 중인 루프 내에서는 사용할 수 없습니다. 더 유연하며 레거시 코드 또는 테스트 환경에서 자주 사용됩니다.

    3. 기존 루프에서 결과 얻기

    이미 실행 중인 스크립트에서 코루틴이 실행되고 값을 얻었는지 확인하려는 경우 다음 방법을 사용할 수 있습니다.

    비동기 가져오기
    
    비동기 def 추가(a, b):
        a + b를 반환
    
    루프 = asyncio.new_event_loop()
    asyncio.set_event_loop(루프)
    
    시도해 보세요:
        # 첫 번째 작업을 실행
        val1 = loop.run_until_complete(추가(10, 20))
        #두번째 작업 실행
        val2 = loop.run_until_complete(추가(val1, 5))
        print(f"최종 결과: {val2}")
    마지막으로:
        # 수동으로 닫아야 함
        루프.닫기()

    4. 여러 작업의 결과 얻기

    여러 코루틴을 병렬로 실행하고 반환 값을 균일하게 검색하려면 다음을 일치시켜야 합니다.asyncio.gather

    비동기 def 작업(id):
        f"결과 {id}"를 반환합니다.
    
    루프 = asyncio.get_event_loop()
    # 수집은 여러 코루틴을 하나의 작업으로 래핑하고, run_until_complete는 모두 완료될 때까지 기다립니다.
    결과 = loop.run_until_complete(asyncio.gather(task(1), task(2), task(3)))
    print(results) #출력: ['결과 1', '결과 2', '결과 3']

    5. 공통 주의사항



    asyncio.run()Python 3.7부터 도입된 고급 API입니다. 비동기 프로그램을 시작하는 데 가장 권장되는 방법입니다. 자동으로 처리됩니다이벤트 루프를 설정하고, 코루틴을 실행하고, 완료 후 루프를 닫습니다.. 가장 중요한 것은 코루틴으로 직접 다시 전달된다는 것입니다.return값.

    1. 기본 획득 방법

    당신은 단지async def전달된 함수 호출은asyncio.run(), 일반 동기 함수와 같은 결과를 반환합니다.

    비동기 가져오기
    
    비동기 def 계산_점수(이름):
        print(f"{name}의 점수를 계산하는 중...")
        wait asyncio.sleep(1) # 시간이 많이 걸리는 작업을 시뮬레이션합니다.
        95를 반환
    
    # 반환 결과를 직접 가져옵니다.
    final_score = asyncio.run(calculate_score("장샤오밍"))
    
    print(f"최종 점수: {final_score}") # 출력: 95

    2. 여러 작업의 결과 처리

    일반적으로 우리는main()진입점으로 기능하고 내부의 모든 하위 작업 결과를 얻습니다.asyncio.run(main())통합 출력.

    비동기 def task_a():
        "사과"를 반환
    
    비동기 def task_b():
        "바나나"를 반환
    
    비동기 정의 메인():
        # 동시에 실행하려면 메인에서 수집을 사용하세요.
        결과 = asyncio.gather(task_a(), task_b())를 기다립니다.
        결과 반환 # 목록 반환
    
    # asyncio.run을 통해 main의 반환 값을 가져옵니다.
    all_fruits = asyncio.run(main())
    print(all_fruits) # 출력: ['apple', 'banana']

    3. asyncio.run()의 실행 규칙

    규칙 항목 설명하다
    단일 입구 연속 실행에서는 일반적으로 한 번만 호출됩니다.asyncio.run()
    자동 청소 나머지 작업을 모두 자동으로 취소하고 스레드 풀을 닫으므로 매우 안전합니다.
    중첩 한도 할 수 없다이미async def함수 내부 호출asyncio.run()

    4. 일반적인 오류: RuntimeError

    다른 비동기 함수의 결과를 얻으려는 비동기 함수 내부에 있는 경우 다음을 사용하세요.await, 대신asyncio.run()

    # 오류 시연
    비동기 def sub_task():
        10을 반환
    
    비동기 정의 메인():
        # 여기서 오류가 발생합니다: RuntimeError: asyncio.run()은 실행 중인 이벤트 루프에서 호출할 수 없습니다.
        res = asyncio.run(sub_task())
        
    # 올바른 교정
    비동기 정의 메인():
        res = wait sub_task() # 비동기 환경에서는 wait를 사용하세요

    5. 실용적인 제안



    파이썬 데이터 분석

    Python 과학 연산 NumPy

    NumPy(Numerical Python)은 Python에서 가장 중요한 과학 컴퓨팅 라이브러리입니다. 효율적인 다차원 배열 객체를 제공합니다.ndarray, 그리고 이러한 배열을 조작하기 위한 대규모 수학 함수 라이브러리. 이는 데이터 과학, 기계 학습(예: Pandas, Scikit-learn, TensorFlow) 및 기타 분야의 기본 기둥입니다.


    1. 기본 List 대신 NumPy를 선택하는 이유는 무엇입니까?


    2. 핵심 객체: ndarray 기본 작업

    numpy를 np로 가져오기
    
    # 1차원 배열과 2차원 배열을 만듭니다.
    arr1 = np.array([1, 2, 3])
    arr2 = np.array([[1, 2], [3, 4]])
    
    # 특정 배열을 빠르게 생성
    zeros = np.zeros((3, 3)) # 모두 0인 3x3 행렬
    ones = np.ones((2, 4)) # 모두 1인 2x4 행렬
    eye = np.eye(3) # 3x3 단위 행렬
    range_arr = np.arange(0, 10, 2) # [0, 2, 4, 6, 8]

    3. 일반적으로 사용되는 배열 연산 및 속성

    기능 코드 예시 설명하다
    형태체크 arr.shape 각 차원의 크기를 반환합니다(예: (3, 2)).
    모양을 바꾸다 arr.reshape(1, 6) 데이터를 변경하지 않고 차원을 변경합니다.
    행렬 곱셈 np.dot(a, b)또는a @ b 선형 대수학에서 행렬 곱셈을 수행합니다.
    통계 함수 np.mean(), np.std() 평균, 표준편차, 최대값, 최소값을 계산합니다.

    4. 슬라이싱 및 인덱싱

    NumPy의 슬라이싱 구문은 Python List와 유사하지만 더 강력하고 다차원 동시 슬라이싱을 지원합니다.

    arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
    
    # 두 번째 열(인덱스 1)을 가져옵니다.
    print(arr[1, :]) # [4, 5, 6]
    
    # 오른쪽 하단 모서리에 있는 2x2 하위 행렬을 가져옵니다.
    print(arr[1:, 1:]) # [[5, 6], [8, 9]]

    5. 설치 및 버전 확인


    6. Numba와 함께 사용

    앞서 언급했듯이,NumbaNumPy의 배열 구조를 완벽하게 인식하고 복잡한 NumPy 연산을 기계어 코드로 컴파일하여 네이티브 C 언어에 가까운 실행 한계에 도달할 수 있습니다.



    Python은 대량의 데이터를 효율적으로 처리합니다. Numba

    Numba대용량 데이터를 처리하는 Python 코드를 가속화하도록 특별히 설계된 오픈 소스 JIT(Just-In-Time) 컴파일러입니다. C, C++ 또는 Fortran에 필적하는 실행 속도로 Python 함수를 기계어 코드로 변환할 수 있으며 특히 다음과 같은 경우에 적합합니다.NumPy배열 작업.


    1. 핵심 기능 및 장점


    2. 기본 사용 예

    Numba를 사용하는 가장 쉬운 방법은 다음을 추가하는 것입니다.@jit또는@njit데코레이터.

    numba import njit에서
    numpy를 np로 가져오기
    
    # @njit는 "nopython" 모드를 나타내며, Python 파서에 들어가지 않도록 하며 가장 빠릅니다.
    @njit
    def fast_function(n):
        합계=0
        범위(n)에 있는 i의 경우:
            합계 += 나
        반품 총액
    
    # 첫 번째 호출은 컴파일되고, 두 번째 호출은 기계어 코드를 직접 실행합니다.
    인쇄(fast_function(10000000))

    3. 패턴 비교: nopython 대 객체

    모델 데코레이터 설명하다
    노파이썬 모드 @njit 추천합니다.Python 인터프리터와 완전히 분리되어 기계어 코드로 직접 컴파일됩니다. 프로그램 코드에 컴파일할 수 없는 부분이 포함되어 있으면 오류가 보고됩니다.
    객체 모드 @jit 컴파일할 수 없으면 실행을 위해 Python 파서로 대체됩니다. 성능 향상은 일반적으로 제한됩니다.

    4. 일반적으로 사용되는 기술: 병렬 작업

    CPU의 멀티 코어 기능을 활용하려면 간단히 전원을 켜십시오.parallel=True그리고 사용prange

    numba import njit, prange에서
    
    @njit(병렬=참)
    def 병렬_합(A):
        초 = 0
        # prange는 자동으로 루프를 다른 CPU 코어에 할당합니다.
        i의 경우 prange(A.shape[0]):
            s += A[i]
        반환하다

    5. 설치 및 종속성 확인


    6. 이용제한



    Pandas 데이터 분석 도구

    팬더는 무엇입니까?

    Pandas는 표 형식 데이터 또는 시계열 데이터와 같은 구조화된 데이터를 처리하도록 설계된 Python 기반 데이터 분석 및 조작 도구입니다.

    Pandas 핵심 데이터 구조

    팬더의 주요 기능

    사용 예

    팬더를 PD로 가져오기
    
    # 데이터프레임 생성
    data = {'이름': ['앨리스', '밥', '찰리'],
            '나이': [25, 30, 35],
            '도시': ['타이베이', '타이중', '가오슝']}
    df = pd.DataFrame(데이터)
    
    # 데이터 보기
    인쇄(df)
    
    # 28세보다 오래된 정보를 필터링합니다.
    filtered_df = df[df['나이'] > 28]
    인쇄(filtered_df)

    적용 가능한 시나리오

    팬더를 선택하는 이유는 무엇입니까?

    Pandas는 효율적이고 유연하며 직관적인 작업 방법을 제공하며 이는 특히 데이터 분석 및 처리에 적합합니다. 이는 데이터 과학 및 기계 학습에 없어서는 안될 도구 중 하나입니다.

    결론적으로

    Pandas는 강력한 데이터 분석 도구이며 초보자와 고급 사용자 모두 사용하기 쉬운 디자인과 광범위한 기능의 이점을 누릴 수 있습니다.



    Python Googletrans

    Googletrans 설치

    먼저 설치해야합니다googletrans전부. 명령줄에 다음 명령을 입력합니다.

    pip install googletrans==4.0.0-rc1

    참고: 설치 시 버전을 확인하세요.4.0.0-rc1, 이전 버전은 더 이상 작동하지 않을 수 있습니다.

    기본 사용 예

    다음은 영어를 중국어 번체로 번역하는 예입니다.

    googletrans 가져오기 번역기에서
    
    #Translator 개체 초기화
    번역가 = 번역가()
    
    # 텍스트 번역
    text = "안녕하세요?"
    결과 = Translator.translate(text, src="en", dest="zh-tw")
    
    # 번역 결과 출력
    print("원본 텍스트:", text)
    print("번역:", result.text)

    지원되는 언어 코드

    여러 언어를 번역할 수 있습니다. 공통 언어 코드는 다음과 같습니다.

    주의할 점

    Googletrans는 비공식 Google 번역 API이며 Google 측의 변경으로 인해 작동이 중단될 수 있습니다. 번역 기능이 작동하지 않는 경우 Google 공식 Cloud Translation 등 다른 번역 API를 사용해 보세요. API.



    Python 기타 번역 키트

    DeepL Translator

    DeepL은 정확도가 높은 번역 서비스를 제공하지만 개발자 API를 사용하려면 API 키가 필요합니다.

    Microsoft Translator

    Microsoft에서 제공하는 번역 도구는 다국어 번역을 지원하지만 Azure API 키 설정을 사용해야 합니다.

    Amazon Translate

    Amazon Web Services(AWS)에서 제공하는 번역 서비스는 다국어 텍스트를 효율적으로 번역하며 AWS에서 제공하는 API 키를 통해 액세스해야 합니다.

    LibreTranslate

    LibreTranslate는 자체 서버를 설정할 수 있고 API 키가 필요하지 않은 오픈 소스 번역 도구입니다. 일부 타사 공개 서버는 API 키 없이도 사용할 수 있는 옵션을 제공합니다.

    TextBlob

    TextBlob은 Google 번역 기능이 내장된 자연어 처리 기반 도구입니다. 그러나 이전 버전에는 API 키가 필요하지 않으며 버전 지원에 주의가 필요할 수 있습니다.

    MyMemory

    MyMemory는 메모리 기반 번역을 제공합니다. 일부 기능에는 API 키가 필요하지 않지만 고급 사용에는 애플리케이션이 필요할 수 있습니다.

    결론적으로

    Googletrans의 경쟁사 중에서 LibreTranslate 및 일부 버전의 TextBlob은 API 키가 필요하지 않은 옵션을 제공합니다. 완전 무료이고 추가 설정이 필요하지 않은 도구가 필요한 경우 다음 옵션을 고려하십시오.



    OpenCC 중국어 변환

    OpenCC(Open Chinese Convert)는 중국어 간체를 중국어 번체로 변환하는 데 전념하는 오픈 소스 프로젝트입니다. 단순한 단어 대 단어 변환이 아니라, 더 중요한 것은어휘 수준지역별(중국 본토, 대만, 홍콩) 단어 사용 습관의 전환 및 차이.


    1. OpenCC의 핵심 장점