반응형

멀티태스킹은 여러 작업을 동시에 실행하는 것입니다.

 

멀티태스킹 유형은 다음과 같습니다.

 

1.    프로세스 기반 멀티태스킹:

모든 작업이 단일 프로세서에서 실행되는 동시에 여러 작업을 실행하는 것이 프로세스 기반 멀티태스킹입니다. 예를 들어, 이력서를 입력하고, 인터넷을 통해 영화를 다운로드하고, 같은 컴퓨터에서 동시에 노래를 들을 수 있습니다. 이것은 작업을 동시에 독립적으로 실행하는 예입니다. OS 레벨에 가장 적합합니다.

 

2.    스레드 기반 멀티태스킹:

모든 작업이 동일한 프로그램의 개별 부분인 시간에 다양한 작업을 실행하는 것을 스레드 기반 멀티태스킹이라고 하고 모든 개별 부분을 스레드라고 합니다. 프로그래밍 수준에서 가장 적합합니다.

 

여러 개의 독립적인 작업을 동시에 실행해야 하는 경우 멀티스레딩이 선호됩니다. 스레드 배포에 선호되는 Python에서 지원하는 "threading"이라는 내장 모듈이 있습니다. 모든 Python 프로그램에서 사용할 수 있는 메인 스레드가 있습니다. 프로그래밍 수준에서 가장 적합합니다.

 

다음 스크립트는 현재 처리중인 스레드의 이름을 출력하는 예제입니다.

 

import threading

print("Current Executing Thread:", threading.current_thread().getName())

 

Output:

Current Executing Thread: MainThread

 

스레드를 생성하는 방법

1.  클래스를 사용하지 않고 스레드 생성

프로그램에서 여러 스레드를 사용할 경우 실행 순서를 예측할 수 없으므로 다중 스레드 프로그램의 정확한 출력을 예측할 수 없습니다. 따라서 동일한 프로그램에 대해 정확한 출력을 제공할 수 없습니다.

 

from threading import *

 

def func():

  for i in range(1, 5):

    print("Child Thread Part")

 

t = Thread(target = func)

t.start()

 

for i in range(1, 5):

  print("Main Thread Part")

 

Output:

Child Thread PartMain Thread Part

Main Thread Part

Main Thread Part

Main Thread Part

 

Child Thread Part

Child Thread Part

Child Thread Part

 

2.  스레드 클래스를 확장하여 스레드 생성

스레드 클래스에 대한 자식 클래스를 만들어야 합니다. 자식 클래스에서 run() 메서드는 필요한 작업을 재정의해야 합니다. start() 메서드를 호출하면 run() 메서드가 자동으로 실행되고 필요한 작업을 수행합니다.

 

from threading import *

 

class user_class(Thread):       # Thread 클래스 상속

  def run(self):

    for i in range(1, 5):

      print("Child Thread Part")

 

t = user_class()

t.start()

 

for i in range(1, 5):

  print("Main Thread Part")

 

Output:

Child Thread PartMain Thread Part

Main Thread Part

Main Thread Part

Main Thread Part

 

Child Thread Part

Child Thread Part

Child Thread Part

 

3.  스레드 클래스로 확장하지 않고 스레드 생성

 

from threading import *

 

class user_class:

  def func(self):

    for i in range(1, 5):

      print("Child Thread Part")

 

a = user_class()

t = Thread(target = a.func)

t.start()

 

for i in range(1, 5):

  print("Main Thread Part")

 

Output:

Child Thread PartMain Thread Part

Main Thread Part

Main Thread Part

Main Thread Part

 

Child Thread Part

Child Thread Part

Child Thread Part

 

다음 스크립트는 멀티 스레딩 없이 두 함수를 호출해서 결과를 출력하고 시간을 측정한 예제입니다.

 

from threading import *

import time

 

def func1(n):

  for i in n:

    time.sleep(1)

    print("Double:", 2*i)

 

def func2(n):

  for i in n:

    time.sleep(1)

    print("Square:", i*i)

 

n = [2, 4]

begin_time = time.time()

func1(n)

func2(n)

print("Total time:", time.time()-begin_time)

 

Output:

Double: 4

Double: 8

Square: 4

Square: 16

Total time: 4.006982088088989

 

다음 스크립트는 멀티 스레딩을 사용하여 두 함수를 호출해서 결과를 출력하고 시간을 측정한 예제입니다.

 

from threading import *

import time

 

def func1(n):

  for i in n:

    time.sleep(1)

    print("Double:", 2*i)

 

def func2(n):

  for i in n:

    time.sleep(1)

    print("Square:", i*i)

 

n = [2, 4]

begin_time = time.time()

t1 = Thread(target = func1, args = (n,))

t2 = Thread(target = func2, args = (n,))

t1.start()

t2.start()

t1.join()

t2.join()

print("Total time:", time.time()-begin_time)

 

Output:

Double: 4

Square: 4

Double: Square: 16

8

Total time: 2.0042953491210938

 

스레드 이름 설정 및 가져오기

Python에서 모든 스레드에는 이름이 있습니다. 이름은 PVM(Parallel Virtual Machine)에 의해 생성된 기본 이름이거나 프로그래머가 할당한 사용자 정의 이름일 수 있습니다. 스레드 이름을 가져오고 설정하는 데 다음 방법이 사용됩니다.

 

t.getName(): 스레드의 이름이 반환됩니다.

t.setName(): 사용자 정의 이름이 설정됩니다.

 

다음 스크립트는 스레드 이름을 출력하고 설정하는 예제입니다.

from threading import *

 

print(current_thread().getName())

current_thread().setName("UserName")

print(current_thread().getName())

print(current_thread().name)

 

Output:

MainThread

UserName

UserName

 

스레드 식별 번호

고유 식별 번호는 Python에서 제공합니다. 이 식별 번호는 암시적 변수 "ident"로 액세스할 수 있습니다.

 

from threading import *

 

def func():

  print("Child Thread Part\n")

 

t = Thread(target = func)

t.start()

print("Main Thread Identification Number:", current_thread().ident)

print("Child Thread Identification Number:", t.ident)

 

Output:

Child Thread Part

Main Thread Identification Number: 139818129758080

Child Thread Identification Number: 139817633142528

 

Active_count() 함수

현재 실행 중인 활성 스레드 수를 반환합니다.

 

from threading import *

import time

 

def func():

  print(current_thread().getName(), "    start")

  time.sleep(3)

  print(current_thread().getName(), "    end")

  print("Active Thread:", active_count())

 

t1 = Thread(target = func, name = "ChildThread-1")

t2 = Thread(target = func, name = "ChildThread-2")

t1.start()

t2.start()

print("Active Thread:", active_count())

time.sleep(5)

print("Active Thread:", active_count())

 

Output:

ChildThread-1ChildThread-2     start

Active Thread: 12

     start

ChildThread-2     end

Active Thread: 12

ChildThread-1     end

Active Thread: 11

Active Thread: 10

 

열거 기능

현재 실행 중인 모든 활성 스레드 목록을 생성합니다. 종료된 스레드나 아직 시작되지 않은 스레드는 포함되지 않습니다.

 

from threading import *

import time

 

def func():

  print(current_thread().getName(), "--> started")

  time.sleep(3)

  print(current_thread().getName(), "--> ended")

 

t1 = Thread(target = func, name = "ChildThread-1")

t2 = Thread(target = func, name = "ChildThread-2")

t1.start()

t2.start()

 

el = enumerate()

for e in el:

  print("Thread Name:", e.name)

 

time.sleep(5)

 

el = enumerate()

for e in el:

  print("Thread Name:", e.name)

 

Output:

ChildThread-1 --> started

ChildThread-2 --> started

Thread Name: UserName

Thread Name: Thread-2

Thread Name: Thread-3

Thread Name: Thread-1

Thread Name: pydevd.Writer

Thread Name: pydevd.Reader

Thread Name: pydevd.CommandThread

Thread Name: Thread-9

Thread Name: pydevd.CheckAliveThread

Thread Name: _colab_inspector_thread

Thread Name: ChildThread-1

Thread Name: ChildThread-2

ChildThread-1 --> endedChildThread-2

 --> ended

Thread Name: UserName

Thread Name: Thread-2

Thread Name: Thread-3

Thread Name: Thread-1

Thread Name: pydevd.Writer

Thread Name: pydevd.Reader

Thread Name: pydevd.CommandThread

Thread Name: Thread-9

Thread Name: pydevd.CheckAliveThread

Thread Name: _colab_inspector_thread

 

IsAlive() 메서드

스레드 객체를 사용하여 지정된 스레드가 현재 실행 중인지 여부를 확인합니다. 스레드가 살아 있으면 True, 그렇지 않으면 False를 반환합니다.

 

from threading import *

import time

 

def func():

  print(current_thread().getName(), "--> started")

  time.sleep(3)

  print(current_thread().getName(), "--> ended")

 

t1 = Thread(target = func, name = "ChildThread-1")

t2 = Thread(target = func, name = "ChildThread-2")

t1.start()

t2.start()

 

print(t1.name, "isAlive :", t1.isAlive())

print(t2.name, "isAlive :", t1.isAlive())

time.sleep(5)

print(t1.name, "isAlive :", t1.isAlive())

print(t2.name, "isAlive :", t1.isAlive())

 

Output:

ChildThread-1 --> started

ChildThread-2 --> started

ChildThread-1 isAlive : True

ChildThread-2 isAlive : True

ChildThread-1 --> ended

ChildThread-2 --> ended

ChildThread-1 isAlive : False

ChildThread-2 isAlive : False

 

Join() 메서드

스레드가 다른 스레드가 완료될 때까지 기다리려면 join() 메서드가 사용됩니다.

join() 메서드를 호출하면 주 스레드 객체가 종료될 때까지 호출 스레드가 차단됩니다. 스레드 개체는 다음 경우 중 하나에서 종료됩니다.

 

정상 종료

처리되지 않은 예외

선택적 타임아웃까지

 

따라서 join() 메서드는 메인 스레드 객체가 종료될 때까지 대기 상태를 보여줍니다. 시간 제한 값은 조인 방법과 관련하여 지정할 수도 있습니다. 몇 번이든 호출할 수 있습니다.

 

다음 스크립트는 메인 스레드가 자식 스레드 실행을 완료할 때까지 기다리는 예제입니다. 자식 스레드가 모두 수행될 때까지 기다렸다가 메인 스레드를 실행하였습니다.

 

from threading import *

import time

 

def func():

  for i in range(5):

    print("Child thread")

    time.sleep(2)

 

t1 = Thread(target = func)

t1.start()

t1.join()

 

for i in range(3):

  print("Main thread")

 

Output:

Child thread

Child thread

Child thread

Child thread

Child thread

Main thread

Main thread

Main thread

 

다음 스크립트는 메인 쓰레드가 join() 메소드에서 주어진 시간만큼 기다리는 예제입니다.

 

from threading import *

import time

 

def func():

  for i in range(5):

    print("Child thread")

    time.sleep(2)

 

t1 = Thread(target = func)

t1.start()

t1.join(5)

 

for i in range(3):

  print("Main thread")

 

Output:

Child thread

Child thread

Child thread

Main thread

Main thread

Main thread

 

데몬 스레드

데몬 스레드는 백그라운드에서 실행되는 스레드입니다. 기본적으로 GC(가비지 수집기)와 같은 데몬이 아닌 스레드에 대한 지원을 제공합니다. 메인 스레드가 메모리 부족에 직면하면 PVM은 즉시 가비지 수집기를 실행하여 쓸모 없는 개체를 제거하고 여유 메모리를 제공하므로 메인 스레드가 메모리 문제에 직면하지 않고 처리를 계속합니다.

 

스레드가 데몬 스레드인지 확인하려면 t.isDaemon()을 사용하면 됩니다.

 

from threading import *

 

print(current_thread().isDaemon())

print(current_thread().daemon)

 

반응형
반응형

모듈이 필요한 이유

모듈이 필요한 이유는 재사용성 때문입니다.

 

모듈은 여러 애플리케이션에서 사용할 수 있는 기능을 구현하는 데 도움이 됩니다. 예를 들어, 데이터베이스와의 상호 작용을 위한 다양한 기능을 포함하는 모듈을 개발할 수 있습니다. 여러 응용 프로그램에서 이 모듈을 사용할 수 있습니다.

 

모듈 개발의 또 다른 이점은 유연한 코드 관리입니다. 모듈을 사용하면 응용 프로그램의 모든 기능을 포함하는 하나의 큰 파일에 비해 관리하기 쉬운 여러 파일로 응용 프로그램을 나눌 수 있습니다.

 

모듈의 생성과 임포팅

모듈은 파이썬 파일에 지나지 않습니다. 모듈을 만들려면 Python 파일을 만들고 해당 파일에 모듈 쓰기 기능을 추가하기만 하면 됩니다. 다른 Python 파일과 마찬가지로 모듈에는 함수, 속성, 클래스 등이 포함될 수 있습니다.

 

첫 번째 모듈을 만들어 보겠습니다. 이름을 mymodule로 지정하겠습니다. mymodule이라는 모듈을 생성하려면 mymodule.py라는 Python 파일을 생성해야 합니다.

모듈에 show_message()라는 간단한 함수를 추가해 보겠습니다. 이 함수는 콘솔에 문자열을 출력합니다.

 

def show_message():

  print("Hello from your custom module")

 

Python 애플리케이션에서 이 모듈을 사용하려면 다른 Python을 생성하고 모듈 파일 mymodule.py를 저장한 동일한 디렉토리에 저장해야 합니다.

 

새 파일에 아무 이름이나 지정할 수 있습니다. 이름을 test.py로 지정하겠습니다. test.py 파일에서 mymodule 모듈을 사용하려면 먼저 mymodule을 가져와야 합니다. import 키워드를 사용하고 모듈 이름 mymodule을 사용해야 합니다.

 

모듈의 파일 이름은 mymodule입니다. 모듈을 가져오는 동안 .py 확장자를 지정하지 않습니다. 확장자 없이 모듈 이름만 쓰면 됩니다.

 

모듈에서 속성, 함수 또는 클래스에 액세스하려면 모듈 이름 뒤에 점 연산자와 호출해야 하는 속성 또는 함수를 사용할 수 있습니다.

 

다음 스크립트는 테스트에서 mymodule 모듈을 가져와서 show_message() 함수를 호출합니다.

 

import mymodule

 

mymodule.show_message()

 

Output:

Hello from your custom module

 

점 연산자를 사용하여 모듈 함수 또는 속성에 액세스하는 것 외에도 모듈 함수를 직접 가져올 수도 있습니다. 이렇게 하려면 import 키워드를 사용할 수 있습니다.

 

다음 스크립트는 mymodule 모듈에서 show_message() 함수를 가져옵니다.

 

from mymodule import show_message

 

show_message()

 

Output:

Hello from your custom module

 

이제 mymodule 모듈에 또 다른 함수 find_square()를 추가해 보겠습니다. find_Square() 함수는 숫자를 받아들이고 제곱을 반환합니다. 다음 스크립트를 사용하여 mymodule.py 파일을 업데이트합니다.

 

def show_message():

  print("Hello from your custom module")

 

def find_square(num):

  return num * num

 

이제 mymodule 모듈에 두 가지 기능이 있습니다. 다음 스크립트는 test.py 파일의 mymodule 모듈에서 show_message() 함수를 가져옵니다. 다음으로 find_square() 함수를 호출합니다.

 

from mymodule import show_message

 

find_square(5)

 

다음은 위 스크립트의 출력입니다. 출력은 find_square 함수가 정의되지 않았음을 보여줍니다.

 

Output:

NameError: name ‘find_square’ isnot defined

 

이 오류의 원인은 스크립트 5에서 가져오기 기능이 mymodule 모듈에서 모든 것을 가져오지 않기 때문입니다. show_message() 함수만 가져옵니다. 가져오지 않은 find_square() 함수를 호출하였기 때문에 오류가 발생한 것입니다.

 

모듈에서 모든 것을 가져오려면 import 키워드 뒤에 별표를 추가해야 합니다.

 

다음 스크립트는 test.py 파일의 mymodule 모듈에서 모든 것을 가져옵니다. test.py 파일에서 show_message() find_square() 함수를 모두 호출할 수 있습니다.

 

from mymodule import *

 

show_message()

find_square(5)

 

여러 모듈 생성 및 임포팅

여러 사용자 지정 모듈을 만들고 응용 프로그램으로 가져올 수 있습니다.

 

mymodule2라는 모듈을 만들어 보겠습니다. 이렇게 하려면 mymodule과 동일한 디렉토리에 mymodule2.py라는 파일을 만듭니다. py 및 모듈을 가져오는 테스트 파일인 test. 이 경우 파이.

 

mymodule2라는 모듈을 만들어 보겠습니다. 그렇게 하려면 mymodule.py와 동일한 디렉토리에 mymodule2.py라는 파일을 만들고 모듈을 가져올 테스트 파일(이 경우 test.py)을 만듭니다.

 

mymodule2에는 전달된 숫자의 큐브를 반환하는 find_cube() 함수가 포함되어 있습니다. find_cube() 메서드 내에서 숫자는 mymodule 모듈의 find_square() 메서드에 전달됩니다.

 

그런 다음 find_square() 메서드에서 반환된 값에 입력 숫자를 곱합니다.

 

import mymodule

 

def find_cube(num):

  return num * mymodule.find_square(num)

 

test.py 파일에서 다음 스크립트와 같이 mymodule2 모듈을 가져와서 모든 것을 가져올 수 있습니다. 그런 다음 find_ cube() 함수를 사용하여 임의의 수의 큐브를 계산할 수 있습니다.

 

from mymodule2 import *

 

result = find_cube(5)

print(result)

 

mymodule mymodule2를 개별적으로 가져올 수도 있습니다. 다음 스크립트는 mymodule 모듈의 find_square() 메서드를 사용하여 숫자의 제곱을 계산하고 mymodule2 모듈의 find_cube() 메서드를 사용하여 숫자의 세제곱을 찾습니다.

 

import mymodule

import mymodule2

 

result = mymodule.find_square(5)

print(result)

 

result = mymodule2.find_cube(5)

print(result)

 

Output:

25

125

 

사용자 정의 모듈에 클래스 추가

함수와 마찬가지로 모듈에 클래스를 추가할 수도 있습니다. mymodule 내부에 간단한 클래스 CustomClass를 생성합니다.

CustomClass에는 show_message() find_square()의 두 가지 메서드가 있습니다.

 

class CustomClass:

  def show_message(self):

    print("Hello from your custom module")

 

  def find_square(num):

    return num * num

 

이제 CustomClass find_square() 메서드를 호출하는 다음 스크립트와 같이 애플리케이션의 mymodule에서 CustomClass를 가져올 수 있습니다.

 

import mymodule

 

my_class = mymodule.CustomClass()

result = my_class.find_square(5)

print(result)

 

Output:

25

 

다른 경로에서 모듈 가져오기

이전 스크립트에서 모듈 파일과 테스트 파일을 동일한 디렉토리에 배치했습니다. 그러나 모듈 파일을 다른 디렉토리에 저장하고 모듈을 애플리케이션으로 가져올 수도 있습니다.

 

mymodule3.py라는 파일을 만듭니다. 파일에 다음 스크립트를 추가하고 텍스트 파일의 디렉터리와 다른 디렉터리에 저장합니다.

 

class CustomClass3:

  def show_message(self):

    print("Hello from your custom module")

 

  def find_square(num):

    return num * num

 

mymodule3.py 파일을 D:/python 디렉토리에 저장했다고 가정합니다. mymodule3을 애플리케이션으로 가져오기 전에 Python 인터프리터가 모듈을 검색할 경로 목록에 D:/python 디렉토리를 포함해야 합니다. 이렇게 하려면 아래와 같이 sys 모듈의 경로 개체에서 append() 메서드를 사용할 수 있습니다.

 

import sys

sys.path.append("D:/python")

 

이제 애플리케이션의 D:/python 디렉토리에 있는 모든 모듈을 가져올 수 있습니다.

다음 스크립트는 mymodule3 모듈을 가져온 다음 mymodule3 모듈에서 CustomClass3 find_square() 메서드를 호출합니다.

 

import mymodule3

 

my_class = mymodule3.CustomClass3()

result = my_class.find_square(5)

print(result)

 

Output:

25

 

Python 경로에 모듈 추가

모듈을 가져올 때 Python 인터프리터는 다양한 경로에서 모듈을 검색합니다. Python 인터프리터에 액세스할 수 있는 모든 경로를 보려면 다음 스크립트를 사용할 수 있습니다.

 

import sys

print(sys.path)

 

출력은 다음과 같을 것입니다. Python 설치 디렉토리와 설치한 패키지에 따라 출력이 다르게 보일 수 있습니다.

 

Python 패키지의 기본 경로에 사용자 정의 모듈을 추가하려면 사이트 패키지가 포함된 경로를 찾으십시오. 그리고 이 경로에 mymodule3.py 파일을 저장합니다. 이제 mymodule3.py 파일의 경로를 애플리케이션에 명시적으로 추가하지 않고도 mymodule3 모듈에서 기능을 호출할 수 있습니다.

반응형
반응형

DateTime 모듈

Python DateTime 모듈은 날짜 및 시간 유형의 데이터를 저장하는 데 사용됩니다. DateTime 모듈을 사용하여 객체를 생성할 수 있으며, 객체는 연, , , , , 초와 같은 날짜-시간 정보에 액세스하는 데 사용할 수 있습니다.

 

다음 스크립트는 datetime 모듈의 datetime 클래스에서 now() 메서드를 사용하여 시스템의 현재 날짜와 시간을 포함하는 datetime 객체를 반환합니다. 현재 시간을 문자열 형식으로 표시하려면 datetime 객체에서 ctime() 메서드를 호출해야 합니다.

 

import datetime

 

datetime_now = datetime.datetime.now()

 

print(datetime_now)

print(datetime_now.ctime())

 

Output:

2022-02-21 00:36:17.671414

Mon Feb 21 00:36:17 2022

 

datetime 클래스의 모든 속성을 보려면 아래와 같이 마지막 스크립트에서 생성된 datetime 객체를 dir() 메서드에 전달하면 됩니다.

 

print(dir(datetime_now))

 

Output:

['__add__', '__class__', '__delattr__', '__dir__', '__doc__', … , 'utcnow', 'utcoffset', 'utctimetuple', 'weekday', 'year']

 

출력에서 datetime 객체를 사용하여 연도, 요일, , 타임스탬프, , , 마이크로초 등과 같은 날짜에 대한 다양한 정보를 저장할 수 있음을 알 수 있습니다.

 

이제 두 날짜 사이의 초 카운트를 구해 보겠습니다. 그렇게 하려면 하나의 datetime 객체를 선언하고 차이를 구하고자 하는 datetime 객체를 선언한 후 두 객체를 빼면 됩니다. 다음으로 빼기의 결과로 반환된 객체에서 total_seconds() 메서드를 호출합니다.

 

import datetime

 

date1 = datetime.datetime.now()

date2 = datetime.datetime(1990, 10, 10)

 

date_dif = date1 - date2

print(date_dif.days)

print(date_dif.total_seconds())

 

Output:

11457

989887451.932207

 

초 수를 3,600으로 나누면 총 시간을 얻을 수 있습니다. 그리고 총 일수를 얻으려면 초 수를 86,400으로 나눕니다.

 

datetime 모듈의 time() 메서드

datetime 모듈의 time 객체를 사용하여 독점적으로 시간으로 작업할 수 있습니다.

다음 스크립트는 새 시간 객체를 만든 다음 객체 유형과 해당 속성 및 메서드를 출력합니다.

 

import datetime

 

new_time = datetime.time()

 

print(type(new_time))

print(dir(new_time))

 

Output:

<class 'datetime.time'>

['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', … , 'second', 'strftime', 'tzinfo', 'tzname', 'utcoffset']

 

다음 스크립트는 시간 값이 3시간 30분인 시간 개체를 만듭니다. 다음으로 시, , 초 및 마이크로초 속성 값이 표시됩니다.

 

import datetime

 

new_time = datetime.time(3, 30)

print(new_time.hour)

print(new_time.minute)

print(new_time.second)

print(new_time.microsecond)

 

Output:

3

30

0

0

 

replace() 함수를 사용하여 시, 분 또는 초 값을 바꿀 수도 있습니다.

 

다음 스크립트는 replace() 함수를 사용하여 시간 개체의 시간 값을 바꿉니다.

 

import datetime

 

new_time = datetime.time(3, 30)

print(new_time.hour)

 

new_time = new_time.replace(hour = 7)

print(new_time.hour)

 

Output:

7

 

datetime 모듈의 date()

다음 스크립트와 같이 시간 정보 없이 날짜 정보만 저장하는 객체를 생성할 수도 있습니다.

 

import datetime

 

new_date = datetime.date(2022, 2, 21)

print(new_date.ctime())

 

Output:

Mon Feb 21 00:00:00 2022

 

다음 스크립트는 날짜 개체의 속성과 기능을 출력합니다.

 

import datetime

 

new_date = datetime.date(2022, 2, 21)

print(dir(new_date))

 

Output:

['__add__', '__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', … , 'today', 'toordinal', 'weekday', 'year']

 

마지막으로, replace() 함수를 사용하여 날짜 객체의 일, 월 및 기타 속성을 바꿀 수도 있습니다.

 

다음 스크립트는 날짜 개체의 날짜를 바꿉니다.

 

import datetime

 

new_date = datetime.date(2022, 2, 21)

print(new_date.ctime())

 

new_date = new_date.replace(day = 20)

print(new_date.ctime())

 

Output:

Mon Feb 21 00:00:00 2022

Sun Feb 20 00:00:00 2022

 

Math 모듈

Python Math 모듈은 다양한 유형의 수학 연산을 수행하는 데 사용됩니다.

다음 스크립트는 radians() 함수를 사용하여 각도를 도에서 라디안으로 변환합니다.

 

import math

 

angle = math.radians(90)

print(angle)

 

Output:

1.5707963267948966

 

다음 스크립트는 각도의 사인, 코사인 및 탄젠트 값을 찾습니다. 각도 값은 각각 sin(), cos() tan() 함수에 라디안 단위로 전달됩니다.

 

import math

 

angle = math.radians(90)

print(math.sin(angle))

print(math.cos(angle))

print(math.tan(angle))

 

Output:

1.0

6.123233995736766e-17

1.633123935319537e+16

 

Math 모듈의 pow() 메서드를 사용하여 정수를 다른 정수의 거듭제곱으로 올릴 수 있습니다.

다음 스크립트는 정수 4 5의 거듭제곱으로 올릴 때 결과를 인쇄합니다.

 

import math

 

print(math.pow(4, 5))

 

Output:

1024.0

 

유사하게, 아래와 같이 sqrt() 메서드를 사용하여 정수의 제곱근을 찾을 수 있습니다.

 

import math

 

print(math.sqrt(100))

 

Output:

10.0

 

다음 스크립트와 같이 log() log10() 함수를 사용하여 밑이 10인 자연 로그 및 로그를 계산할 수도 있습니다.

 

import math

 

print(math.log(100))

print(math.log10(100))

 

Output:

4.605170185988092

2.0

 

Random 모듈

Python Random 모듈은 난수 생성 및 목록에서 임의 값 선택과 같은 작업을 수행하는 데 사용됩니다.

0 1 사이의 난수를 생성하려면 다음 스크립트와 같이 random 모듈에서 random() 함수를 호출하기만 하면 됩니다.

 

import random

 

print(random.random())

 

Output:

0.7293231179114905

 

특정 범위 내에서 임의의 정수를 생성하려면 randint() 함수를 사용할 수 있습니다. 하한과 상한을 매개변수 값으로 전달해야 합니다.

 

다음 스크립트는 0에서 50 사이의 임의의 정수 세 개를 생성합니다.

 

import random

 

print(random.randint(0, 50))

print(random.randint(0, 50))

 

Output:

42

28

 

randrange() 함수를 사용하여 두 값 범위 사이에 임의의 정수를 생성할 수도 있습니다. 그러나 randrange() 함수를 사용하면 임의의 정수 생성 단계를 지정할 수도 있습니다.

 

다음 스크립트에서 randrange() 함수는 먼저 0 1 사이의 임의의 정수를 생성합니다. 두 번째 줄에서 randrange() 함수를 사용하여 3의 배수인 임의의 숫자가 생성됩니다. 마지막으로 5의 배수인 임의의 정수가 생성됩니다.

 

import random

 

print(random.randrange(0, 50))

print(random.randrange(0, 50, 3))

print(random.randrange(0, 50, 5))

 

Output:

25

6

20

 

random 모듈의 choice() 함수를 사용하여 목록에서 무작위로 항목을 선택할 수도 있습니다.

 

import random

 

cars = [4, 43, 10, 55, 10, 3]

print(random.choice(cars))

 

Output:

10

 

마지막으로 목록 내 항목을 무작위로 섞기 위해 Random 모듈에서 shuffle() 함수를 사용할 수 있습니다..

 

import random

 

listdata = ["a", "b", "c"]

print(listdata)

 

random.shuffle(listdata)

print(listdata)

 

Output:

['a', 'b', 'c']

['b', 'a', 'c']

 

Python 스크립트의 실행 시간 찾기

실행 시간은 특정 코드 조각의 성능을 측정하기 위한 중요한 측정기준입니다.

Python에서 스크립트의 실행 시간을 찾는 세 가지 주요 방법이 있습니다.

시간 및 시간 모듈을 사용할 수 있습니다. Jupyter Notebook을 사용하는 경우 ##timeit 명령을 사용하여 스크립트의 실행 시간을 찾을 수도 있습니다.

 

피보나치 수의 값을 계산하는 두 개의 프로그램을 작성해 보겠습니다. 첫 번째 프로그램은 재귀 함수를 사용하고 두 번째 프로그램은 단순 for 루프를 사용합니다. 그런 다음 Python에서 서로 다른 접근 방식을 사용하여 두 프로그램의 실행 시간을 비교할 것입니다. 다음 스크립트는 재귀 함수를 사용하여 피보나치 수의 값을 계산하는 get_fib()라는 메서드를 정의합니다.

 

def get_fib(num):

  if num == 1 or num == 2:

    return 1

  else:

    return get_fib(num-1) + get_fib(num-2)

 

get_fib(20)

 

Output:

6765

 

다음 스크립트는 for 루프를 사용하여 피보나치 수의 값을 계산하는 get_fib2() 메서드를 정의합니다.

 

def get_fib2(num):

  if num == 1:

    return 0

 

  if num == 2:

    return 1

 

  num1 = 1

  num2 = 1

 

  for i in range(3, num+1):

    val = num1 + num2

    num1 = num2

    num2 = val

    

  return val

 

get_fib2(20)

 

Output:

6765

 

Time 모듈 사용

Python time 모듈은 Python 스크립트의 실행 시간을 계산할 수 있습니다. 이렇게 하려면 실행 시간을 측정하려는 스크립트 전후에 time() 메서드를 호출해야 합니다. 다음으로 스크립트 실행 후의 타임스탬프에서 스크립트 실행 전의 타임스탬프를 빼면 됩니다.

 

다음 스크립트는 피보나치 수열의 30번째 숫자를 계산하기 위한 get_fib() 함수의 실행 시간을 측정합니다.

 

import time

 

start_time = time.time()

get_fib(30)

end_time = time.time()

 

script_time = end_time - start_time

print(str(script_time))

 

Output:

0.3249504566192627

 

마찬가지로 다음 스크립트는 피보나치 수열의 30번째 숫자를 계산하기 위한 get_fib2() 함수의 실행 시간을 계산합니다.

 

import time

 

start_time = time.time()

get_fib2(30)

end_time = time.time()

 

script_time = end_time - start_time

print(str(script_time))

 

Output:

6.437301635742188e-05

 

비교 결과 for 루프를 사용하는 get_feb2() 함수가 재귀 함수를 사용하는 get_feb() 함수보다 피보나치 수열에서 30번째 숫자의 값을 계산하는 것이 더 빠릅니다.

반응형
반응형

Python Math 모듈을 사용하면 다양한 수학 연산을 수행할 수 있습니다.

마찬가지로 DateTime 모듈은 날짜 및 시간과 관련된 다양한 작업을 수행하는 데 사용할 수 있는 함수 및 개체를 제공합니다.

 

Python 모듈

1. 디버거 모듈

2. 컬렉션 모듈

3. 날짜/시간 모듈

4. 수학 모듈

5. 랜덤 모듈

6. 시간 및 Timeit 모듈

 

디버거 모듈

디버거 모듈은 이름에서 알 수 있듯이 Python 애플리케이션을 디버그하는 데 사용됩니다. 런타임에 어떤 값이 변수에 할당되는지 알고 싶다면 콘솔에서 값을 간단히 출력할 수 있습니다. 그러나 런타임에 여러 변수의 값을 확인하려면 코드의 다른 위치에 여러 명령문을 출력해야 하므로 코드가 복잡해지고 애플리케이션 성능에도 영향을 미칠 수 있습니다.

Python 디버거 모듈을 사용하면 런타임에 다양한 변수의 값을 확인할 수 있습니다.

 

Python 디버거를 사용하는 방법의 예를 살펴보겠습니다.

항목 이름과 항목의 총 판매 가격이 포함된 딕셔너리를 정의하고 각 항목에 대한 수향을 정의하는 리스트를 정의합니다.

예를 들어 다음 스크립트에서 total_price 딕셔너리의 첫 번째 항목인 laptop의 총 가격은 100이고 수량은 quantities 리스트의 첫 번째 항목에서 볼 수 있듯이 5입니다.

다음으로 항목 이름과 모든 항목의 평균 가격을 표시하는 루프를 실행합니다.

total_price 딕셔너리에 있는 항목의 평균 가격은 해당 항목에 대한 딕셔너리 값을 수량 리스트의 해당 값으로 나누어 계산할 수 있습니다.

예를 들어, 첫 번째 품목인 노트북의 평균 가격은 100을 수량 리스트의 첫 번째 품목 5로 나누어 계산할 수 있습니다.

 

total_price = {'laptop':100, 'cell phone':75, 'keyboard':40, 'mouse':15}

quantities = [5, 5, 5, 5]

 

for (item, price), quantity in zip(total_price.items(), quantities):

  average_price = (price/quantity)

  print("The average price for a ", item, "is", str(average_price))

 

Output:

The average price for a  laptop is 20.0

The average price for a  cell phone is 15.0

The average price for a  keyboard is 8.0

The average price for a  mouse is 3.0

 

이제 항목 중 하나의 수량이 0이라고 가정합니다. 다음 스크립트를 실행하면 예외가 발생합니다. 아래 예외는 키보드의 수량에 해당하는 수량 리스트의 세 번째 항목의 값이 0이기 때문에 발생합니다. 따라서 모든 키보드의 총 가격인 40 0으로 나누면 예외가 발생합니다.

 

total_price = {'laptop':100, 'cell phone':75, 'keyboard':40, 'mouse':15}

quantities = [5, 5, 0, 5]

 

for (item, price), quantity in zip(total_price.items(), quantities):

  average_price = (price/quantity)

  print("The average price for a ", item, "is", str(average_price))

 

Output:

ZeroDivisionError: division by zero

 

수천 개의 레코드 목록에서 데이터를 읽는 경우 목록만 보면 수량이 0인 항목을 찾기가 어렵습니다.

다음 스크립트와 같이 평균 가격을 인쇄하기 전에 항목을 출력해서 위치를 오류 위치를 찾아볼 수 있습니다. 출력을 보면 키보드 항목의 평균 가격을 출력하는 중 에러가 발생하는 것을 볼 수 있습니다.

 

total_price = {'laptop':100, 'cell phone':75, 'keyboard':40, 'mouse':15}

quantities = [5, 5, 0, 5]

 

for (item, price), quantity in zip(total_price.items(), quantities):

  print(item)

  average_price = (price/quantity)

  print("The average price for a ", item, "is", str(average_price))

 

Output:

laptop

The average price for a  laptop is 20.0

cell phone

The average price for a  cell phone is 15.0

keyboard

ZeroDivisionError: division by zero

 

그러나 수천 개의 레코드가 있는 경우 하나의 변수에 대해 수천 개의 출럭문을 실행해야 합니다. 수량 변수의 값도 출력하려면 다른 출력 명령문을 작성하거나 값을 항목 값과 연결해야 합니다. 따라서 많은 계산이 수행되어야 합니다.

 

위와 같은 문제를 해결하기 위해서 Python 디버거를 사용하여 애플리케이션의 모든 변수를 추적할 수 있습니다.

Python 디버거로 애플리케이션을 디버그하려면 pdb 모듈을 가져와야 합니다.

다음으로 set_trace() 메서드로 정의된 변수 값을 확인하려는 코드의 해당 지점에서 set_trace() 메서드를 호출해야 합니다.

 

코드가 해당 지점에 도달하면 변수 이름을 입력하여 변수 값을 확인할 수 있는 텍스트 필드가 표시됩니다.

 

다음 스크립트에서는 try 블록에서 예외를 throw할 가능성이 있는 코드를 래핑합니다. 예외는 예외 블록에서 catch되므로 예외 블록에서 pdb.set_trace() 메서드를 호출합니다.

 

import pdb

 

total_price = {'laptop':100, 'cell phone':75, 'keyboard':40, 'mouse':15}

quantities = [5, 5, 0, 5]

 

for (item, price), quantity in zip(total_price.items(), quantities):

  try:

    average_price = (price/quantity)

    print("The average price for a ", item, "is", str(average_price))

  except:

    pdb.set_trace()

 

위의 코드는 예외 블록에서 catch될 예외를 throw하므로 set_trace() 메서드 호출이 실행되고 아래와 같이 출력에 텍스트 필드가 표시됩니다.

 

 

값을 보려면 텍스트 상자에 변수 이름을 입력합니다.

예를 들어 항목을 입력하면 아래와 같이 출력에 "keyboard"가 표시됩니다.

 

 

 

마찬가지로 텍스트 필드에 가격과 수량을 입력하여 해당 값을 볼 수 있습니다.

마지막으로 Python 디버거를 종료하려면 문자 q를 입력하고 Enter 키를 누르기만 하면 됩니다.

 

컬렉션 모듈

리스트, 튜플 및 딕셔너리와 같은 기본 컬렉션 외에도 Python은 컬렉션의 모듈에서 몇 가지 고급 컬렉션을 제공합니다. 이 컬렉션은 목록의 총 항목 수 계산 등과 같은 특수 기능을 수행하는 데 사용됩니다.

 

카운터

카운터는 목록에서 각 항목의 발생을 계산하는 데 사용할 수 있는 컬렉션 유형입니다.

다음 스크립트는 컬렉션의 모듈에서 Counter 클래스를 가져옵니다.

 

from collections import Counter

 

다음으로 다양한 자동차 제조업체 리스트를 만듭니다. Counter 클래스의 개체를 만들려면 리스트를 Counter에 전달할 수 있습니다.

다음 스크립트는 자동차 리스트를 사용하여 Counter 클래스를 생성합니다.

 

from collections import Counter

 

cars =["Honda","Honda","Honda","Honda","Ford","Ford","BMW"]

print(Counter(cars))

 

Output:

Counter({'Honda': 4, 'Ford': 2, 'BMW': 1})

 

Counter는 일종의 딕셔너리입니다. 개별 항목의 개수에 액세스하려면 항목 이름을 인덱스 값으로 카운터에 전달할 수 있습니다.

예를 들어 다음 스크립트는 Honda 항목의 개수를 인쇄합니다.

 

from collections import Counter

 

cars =["Honda","Honda","Honda","Honda","Ford","Ford","BMW"]

cars_counter = Counter(cars)

print(cars_counter["Honda"])

 

Output:

4

 

문자열은 기본적으로 문자 목록이므로 문자열을 사용하여 Counter 개체를 만들 수 있습니다. 이러한 카운터는 문자열의 각 문자에 대한 카운트를 포함합니다.

 

from collections import Counter

 

str_count = Counter("adskdhssalkfhss")

print(str_count)

 

Output:

Counter({'s': 5, 'a': 2, 'd': 2, 'k': 2, 'h': 2, 'l': 1, 'f': 1})

 

Default Dictionaries

Default dictionary는 일반 딕셔너리와 유사한 컬렉션 유형입니다. 그러나 Default dictionary에서는 사전에 존재하지 않는 키에 대한 기본값을 지정할 수 있습니다.

 

일반적인 딕셔너리와 Default dictionary의 차이점을 살펴보겠습니다.

다음 스크립트는 자동차 이름과 차량 수로 normal_dic 사전을 만듭니다. BMW 항목이 normal_dic에 있으므로 해당 값이 콘솔에 출력됩니다.

 

from collections import defaultdict

 

normal_dic={'BMW':7,'Honda':4,'Ford':2}

print(normal_dic["BMW"])

 

Output:

7

 

이제 존재하지 않는 키로 사전 항목에 액세스해 보면 오류가 발생합니다.

 

print(normal_dic["Toyota"])

 

Default dictionary를 사용하여 딕셔너리에 기본값을 할당할 수 있습니다. Default dictionary을 만들려면 키워드 defaultdic을 사용할 수 있습니다.

생성자에서 사전에 키가 없는 경우 반환하려는 값이 포함된 람다 식을 전달해야 합니다.

다음 스크립트에서 딕셔너리에 없는 키에 사용할 수 없는 문자열을 전달합니다.

다음으로, BMW Toyota 키를 def_dic이라는 Default dictionary에 전달합니다. BMW 키가 사전에 있으므로 해당 값 7이 표시됩니다. Toyota 키의 경우 Not Available 문자열이 인쇄되고 예외가 발생하지 않습니다.

 

from collections import defaultdict

 

def_dic = defaultdict(lambda:"Not Available")

def_dic["BMW"] = 7

 

print(def_dic["BMW"])

print(def_dic["Toyota"])

 

Output:

7

Not Available

 

Named Tuples

Named Tuples은 명시된 인덱스가 있는 튜플 유형입니다.

일반 튜플의 경우 0부터 시작하는 인덱스로 항목에 액세스할 수 있습니다. 예를 들어, 튜플의 첫 번째 항목에 액세스하려면 인덱스 값으로 0을 전달할 수 있습니다. Named Tuples의 경우 명시된 값, 즉 문자열 등을 튜플 인덱스로 전달하여 튜플 요소에 액세스할 수 있습니다.

 

Named Tuples과 일반 튜플의 차이점을 살펴보겠습니다.

다음 스크립트는 세 개의 요소가 있는 일반 튜플을 만듭니다. 세 번째 요소는 튜플의 인덱스 값으로 2를 전달하여 콘솔에 출력됩니다.

 

normal_tuple ("BMW", 10, "Black")

print(normal_tuple[2])

 

Output:

Black

 

이제 Named Tuples의 예를 살펴보겠습니다. Named Tuples을 생성하려면 컬렉션 모듈에서 Named Tuples 클래스를 사용할 수 있습니다.

명시된 튜플의 식별자를 전달하고 인덱스 이름 목록을 전달해야 합니다.

예를 들어 다음 스크립트에서는 식별자 이름이 CarNamed Tuple car_tuple 개체를 만듭니다. 다음으로 Name, Model Color의 세 가지 인덱스 이름으로 목록을 만듭니다.

이제 이 명시된 튜플의 개체를 생성하는 경우 다음 스크립트에서 볼 수 있듯이 Name, Model Color 인덱스에 대한 값을 전달해야 합니다.

 

from collections import namedtuple

 

car_tuple=namedtuple('Car',['Name','Model','Color'])

cars =car_tuple(Name ="BMW", Model=10, Color ="Black")

 

인덱스 이름을 사용하여 명시된 튜플 객체 자동차의 항목을 확인할 수 있습니다. 예를 들어, 세 번째 항목에 액세스하려면 다음 스크립트와 같이 정수 인덱스 2 또는 명시된 인덱스 Color를 사용할 수 있습니다.

 

print(cars[2])

print(cars.Color)

 

Output:

Black

Black

반응형

+ Recent posts