2021년 5월 15일 토요일

[파이썬] input 함수의 split 메서드로 여러 개의 값을 입력받는 법

 

파이썬에서 원하는 값을 입력받기 위해서는 input 함수를 사용합니다.

 

아래 소스가 일반적인 값을 입력받는 방법입니다.

 

age = input (“Input age : “)

 

print (“Age is “, age, “ yesrs old”)

 

입력받는 값들이 많을때는 일일이 각각 input 함수를 사용하는 것이 번거로울 수 있습니다.

 

파이썬에는 이를 위해 input 함수의 split이라는 메서드를 사용하여 여러 개의 값을 입력받을 수 있습니다.

 

아래 소스가 그런 방법을 보여 줍니다.

 

s1, s2 = input (“Please input two scores : “).split()

 

i1 = int (s1)

 

i2 = int (s2)

 

print (“Sum of two scores is “, i1 + i2)

 

2개의 값을 입력할 때 일반적을 빈칸을 띄어서 입력하게 되면 서로 분리가 되어 s1, s2 변수에 저장이 됩니다.

 

그 결과는 아래와 같이 나옵니다.

 

Please input two scores : 123 34

 

Sum of two scores is 157

 

2021년 5월 14일 금요일

[파이썬] 파이썬의 특이한 dict 데이타형

 

파이썬에는 다른 프로그래밍 언어에서는 볼 수 없는 데이터형들이 있는데, 바로 dict형인데 아주 특이합니다.

 

list형이나 tuple형과 비슷하면서도 다른 점은 각각의 값에 대해 key가 항상 짝으로 있다는 것입니다.

 

아래가 dict형의 기본 형식입니다.

 

{key1:value1, key2:value2, key3:value3, …}

 

dict형은 ‘{‘‘}’와 같은 괄호로 둘러싸여져 있습니다.

 

아래는 비어있는 dict형에 대해 보여줍니다.

 

>>> a = {}

>>> print (a)

{}

>>> print (type(a))

<class 'dict'>

 

아래를 보면 key는 숫자일 수도 있고, 문자열일 수도 있습니다. 물론 value도 숫자 및 문자열 모두 가능합니다.

 

>>> a = {0:1, 1:-20, 4:5}

>>> print (a)

{0: 1, 1: -20, 4: 5}

>>> b = {'Name':'Steve', 'Age':20, 'Address':'NewYork'}

>>> print (b)

{'Name': 'Steve', 'Age': 20, 'Address': 'NewYork'}

 

이제 보면 dict형이 마치 데이터베이스로서 아주 유용하게 사용될 수 있을 도 같습니다.

 

그러면 위의 변수 b에서 다른 keyvalue를 추가하려면 아래와 같이 하면 됩니다.

 

>>> b['Company'] = 'Microsoft'

>>> print (b)

{'Name': 'Steve', 'Age': 20, 'Address': 'NewYork', 'Company': 'Microsoft'}

 

위에서 보다시피 ‘Company’라는 key‘Microsoft’라는 문자열 value가 추가됨을 볼 수 있습니다.

 

물론, 추가하는 것이 가능하다면 특정 keyvalue를 삭제하는 것도 가능합니다.

 

조금 전에 추가한 ‘Company’를 삭제하도록 하겠습니다.

 

>>> del b['Company']

>>> print (b)

{'Name': 'Steve', 'Age': 20, 'Address': 'NewYork'}

 

역시 ‘del’을 사용하는 것은 list형과 마찬가지입니다.

 

특정 key에 대한 value 변경은 아래와 같이 간단합니다.

 

>>> b['Address'] = 'Chicago'

>>> print (b)

{'Name': 'Steve', 'Age': 20, 'Address': 'Chicago'}

 

특정 keyvalue를 불러오는 것은 아래와 같이 하면 됩니다.

 

>>> print (b['Name'])

Steve

>>> print (b.get('Name'))

Steve

 

>>> print (b['Company'])

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

KeyError: 'Company'

>>> print (b.get('Company'))

None

 

위를 2가지 방식이 있는데, get 메서드를 사용하는 것이 보다 안전합니다. 해당되는 key가 있을때는 둘다 별 문제가 발생되지 않고 해당 keyvalue를 잘 불러오지만, get 메서드를 사용하지 않는 방식에서는 실행중 오류가 발생되면 실행중인 프로그램이 비정상적으로 종료가 됩니다. 이를 방지하기 위해서 get 메서드를 사용합니다.

 

이외에도 여러가지 dict형에 대한 기능들이 많이 있습니다.

 

2021년 5월 12일 수요일

NVMe이란 (Non-Volatile Memory express)

 

NVMe (Non-Volatile Memory express)는 컴퓨터의 고속 PCIe (Peripheral Component Interconnect Express) 버스를 통해 엔터프라이즈 및 클라이언트 시스템과 SSD (Solid-State Drive) 사이의 데이터 전송 속도를 가속화하기 위해 생성된 호스트 컨트롤러 인터페이스 및 스토리지 프로토콜입니다.

 

Solid-State 기술이 스토리지 시장에서 가장 선호하는 기술이 되면서 기존 인터페이스 및 프로토콜, SATA (Serial Advanced Technology Attachment) SAS (Serial-Attached SCSI)가 데이터 센터와 같은 환경에서는 적합하지 않게 되었습니다. NAND 플래시용으로 특별히 설계된 새로운 프로토콜에 대한 작업은 인텔이 주도권을 잡고 2007년에 시작되었으며, 2011년초에 초기 NVMe 사양이 발표되었고, 거의 100개의 회사가 개발에 참여했습니다.

 

NVMe 규격은 광범위한 NVM 서브시스템에서 고성능 및 상호 운용성을 목표로 PCIe 기반 SSD에 대한 레지스터 인터페이스, 커맨드 세트 및 기능 등을 정의합니다. NVMe 사양은 Solid-State 스토리지, 메인 메모리, 캐시 메모리 또는 백업 메모리와 같은 것들을 규정하지는 않습니다.

 

NVMe SCSI (Small Computer System Interface) 표준 및 ATA 표준에 대한 대안을 제공하여 호스트 시스템과 주변 저장 장치를 연결하고 데이터를 전송합니다. SATA SSD와 함께 사용되는 ATA 커맨드 세트와 SAS SSD SCSI 커맨드 세트는 하드 디스크 드라이브 (HDD)와 마그네틱 테이프가 주요 스토리지 미디어이었을때 개발되었는데,  NVMe는 그보다 더 빠른 미디어와 함께 사용하도록 설계되었습니다.

 

SAS 기반 및 SATA 기반 SSD에 비해 NVMe 기반 PCIe SSD의 주요 이점은 호스트 소프트웨어 스택의 지연 시간 감소, IOPS (Input/Output Operations per Second) 증가, 낮은 전력 소비입니다.

 

NVMe 프로토콜은 NAND 플래시와 Intel Micron Technology에 의해 개발된 3D XPoint 기술을 포함하여 다양한 유형의 비휘발성 메모리를 사용하는 SSD를 지원할 수 있습니다. NVMe 드라이버는 Windows Linux를 포함한 다양한 운영 체제 (OS)에서 사용할 수 있습니다.

 

NVMe는 기존 애플리케이션을 더 빠르고 효율적으로 실행할 수 있도록 지원을 하지만, 사물인터넷 (IoT), 인공지능 (AI) 및 머신러닝 (ML)과 같은 새롭고 진화하는 기술 및 애플리케이션에서는 더욱 중요해지고 있습니다.

 

NVMe 동작 방식

 

NVMe는 입력/출력 명령과 응답을 PCIe 인터페이스를 통해 호스트 컴퓨터의 공유 메모리에 매핑합니다. NVMe 인터페이스는 멀티코어 프로세서와 함께 병렬 I/O를 지원하여 높은 처리량을 촉진하고 중앙처리장치 (CPU) 병목현상을 완화합니다.

 

NVMe는 입력/출력 요청을 처리하기 위해 SCSI ATA 커맨드 세트보다 보다 간소화된 커맨드 세트를 제공합니다. SAS 장치에서 사용되는 SCSI 커맨드 세트와 SATA 드라이브에서 사용되는 ATA 커맨드 세트에 비해 NVMe는 절반 미만의 CPU 명령만을 필요로 합니다.

 

NVMe SSD SATA/SAS SSD

 

SATA는 컴퓨터가 HDD 저장 시스템과 상호 작용하기 위해 개발된 통신 프로토콜입니다. 2000년에 주요 기술 업체 그룹에 의해 도입된 SATA는 병렬 ATA를 대체하고 노트북에서 서버에 이르는 컴퓨터를 위한 일반적인 저장 시스템 프로토콜이 되었습니다. 수년에 걸쳐 규격이 수정되었으며 현재 최대 600MBps의 유효 처리량으로 6Gbps로 실행됩니다.

 

기계식 회전 플래터와 액추에이터 제어 기반의 Read/Write 헤드가 있는 하드 디스크용으로 개발되었지만 초기 SSD는 기존 SATA 에코 시스템을 활용하기 위해 SATA 인터페이스와 함께 판매되었습니다. 편리한 디자인이었고 SSD 채택을 가속화하는 데 도움이 되었지만 NAND 플래시 저장 장치에 이상적인 인터페이스는 아니었습니다.

 

플래시용으로 설계된 NVMe의 속도와 낮은 대기 시간은 SATA를 압도하며, M.2와 같은 작은 폼 팩터에서 훨씬 높은 스토리지 용량을 가능하게 합니다. 일반적으로 NVMe 성능 지표는 SATA의 성능 지표보다 5배 이상 높습니다.

 

NVMe 기반 PCIe SSD는 현재 동일한 용량의 SAS SATA 기반 SSD보다 더 비쌉니다. 그러나 그 차이는 좁아지고 있습니다.

2021년 5월 7일 금요일

[파이썬] 데이타의 패킹(Packing)과 언패킹(Unpacking)

 

파이썬만의 특이한 동작이 있는데, 이중 데이터의 패킹과 언패킹이 있습니다.

 

패킹은 말그대로 둘러싼다는 의미로 하나의 변수에 여러 개의 데이터를 넣는 것입니다.

 

앞서 언급된 튜플이라는 데이터형이 있었는데, 바로 이걸 사용하면 데이터 패킹이 됩니다.

 

아래의 소스를 보면 test1, 3 그리고 9를 한번에 넣을 수가 있는데, 이때 test라는 변수는 튜플 데이타형으로 자동으로 됩니다.

 

test = 1, 3, 9

 

그것은 아래와 같이 하면 바로 확인이 가능합니다. test의 변수 타입이 튜플임을 알 수 있고 3개의 값이 저장되어 있음을 알 수 있습니다.

 

>>> print (type(test), test)

<class 'tuple'> (1, 3, 9)

 

언패킹은 여러 개의 데이터가 패킹된 것을 풀어서 각각의 다른 변수에 저장하는 것입니다.

 

아래를 보면 test1, 3 그리고 9가 저장되어 있었는데, 이것을 a, b, c라는 변수에 하나씩 언패킹되어 저장됨을 알 수 있습니다.

 

>>> a, b, c = test

>>> print (type(a), a, type(b), b, type(c), c)

<class 'int'> 1 <class 'int'> 3 <class 'int'> 9

 

이는 파이썬만의 독특한 동작입니다. 그리고 언패킹은 list형의 변수인 경우에도 가능합니다.

 

아래에 보면 이번에는 testlist형인데, 앞에서와 마찬가지로 a, b, c 변수에 하나씩 언패킹하여 저장할 수도 있습니다.

 

>>> test = [1, 3, 9]

>>> a, b, c = test

>>> print (type(a), a, type(b), b, type(c), c)

<class 'int'> 1 <class 'int'> 3 <class 'int'> 9

 

패킹과 언패킹을 이용하면 2개의 변수 값을 바로 치환할 수 있습니다.

 

아래를 보시면 다른 언어에서는 임시 변수를 하나 만들어 2개의 변수 값을 변경해야 하는데, 파이썬에서는 아주 간단하게 2개 변수의 값을 치환할 수 있음을 알 수 있습니다.

 

>>> a = 5

>>> b = 10

>>> a, b = b, a   # b, a가 패킹되었다가 a, b에 언패킹되어 바로 치환가능

>>> print (a, b)

10 5

 

2021년 3월 23일 화요일

[파이썬] 런타임 오류 처리를 위한 try, except, else, finally 구문

 

프로그래밍 언어들로 코딩을 하다보면 문법이나 알고리즘상으로는 문제가 없이 실행이 잘 될것같아 보일 수 있습니다.

 

대부분의 경우, 문제는 발생되지는 않을 것입니다.

 

하지만 생각하지 못한 조건에서는 심각한 오류가 발생되고 이 오류로 인해 애써 코딩한 프로그램이 중단되거나, 잘못 동작될 수가 있습니다.

 

이런 오류가 발생했을 경우에 오류를 검출하고 이 오류의 위험성을 피하거나 최소화가 필요합니다.

 

파이썬에서는 이를 위해 “try”, “except”, “else”, “finally” 구문을 사용하여 오류 처리를 합니다. 일반적인 구문 형식은 아래와 같습니다.

 

try:

    ...

except [오류종류]:

    ...

else:

    ...

finally:

    ...

 

“try” 구문에서는 오류가 잠재된 일반적인 코드를 프로그래밍합니다.

 

“except” 구문에서는 오류가 발생시 실행될 코드를 넣습니다. “except” 구문에서는 처리할 오류의 종류를 지정할 수도 있습니다. 처리할 오류종류에 따라 “except” 구문을 추가할 수도 있습니다. 모든 “except” 구문에는 실행가능한 코드가 있어야 합니다.

 

오류가 발생시에는 “else” 구문에 있는 코드가 실행됩니다.

 

마지막으로 “finally” 구문에는 오류발생여부와 상관없이 실행될 코드를 넣습니다.

 

이들 구문들중에서 “try”를 뺀 “except”, “else”, “finally” 구문은 필요할때만 사용해도 됩니다.

 

아래의 예를 보면,

 

import requests

from bs4 import BeautifulSoup

 

# 잘못된 url로 페이지 내용 조회

url = "https://finance.naver.com/item/main.nhn?code=111"

 

response = requests.get (url)

 

if response.status_code == 200:

    html = response.text

    soup = BeautifulSoup (html, 'html.parser')

    print (soup.dl.text)   # 이 부분에서 오류 발생

 

네이버 증권에서 잘못된 종목코드가 포함된 URL을 사용하면 주가정보 페이지를 프린트하는 코드에서 오류가 발생됩니다.

 

Traceback (most recent call last):

  File "err_handle1.py", line 11, in <module>

    print (soup.dl.text)

AttributeError: 'NoneType' object has no attribute 'text'

 

이를 처리하기 위해 아래와 같이 코드를 보완할 수 있습니다.

 

import requests

from bs4 import BeautifulSoup

 

url = "https://finance.naver.com/item/main.nhn?code=111"

 

response = requests.get (url)

 

if response.status_code == 200:

    html = response.text

    soup = BeautifulSoup (html, 'html.parser')

    try:

        print (soup.dl.text)

    except:

        print ("에러 : 종목코드 오류")

 

그러면 아래와 같이 “except” 구문이 실행됩니다.

 

에러 : 종목코드 오류

 

“except” 구문에 아래와 같이 오류종류를 지정해도 되는데,

 

except AttributeError:

        print ("에러 : 종목코드 오류")

 

그러면 위와 같은 실행결과가 나오는 것을 볼 수 있습니다.

 

에러 : 종목코드 오류

 

이제 “else”“finally” 구문까지 모두 사용한 아래 코드를 보면,

 

import requests

from bs4 import BeautifulSoup

 

url = "https://finance.naver.com/item/main.nhn?code=005930"

 

response = requests.get (url)

 

if response.status_code == 200:

    html = response.text

    soup = BeautifulSoup (html, 'html.parser')

    try:

        print (soup.dl.text)

    except:

        print ("에러 : 종목코드 오류")

    else:

        print ("오류없음!!!")

    finally:

        print ("실행완료!!!")

 

“else” 구문은 오류가 없는 경우 실행되었고, “finally” 구문도 오류발생여부와 관계없이 실행됨을 알 수 있습니다.

 

종목 시세 정보

2021 03 23 15 57분 기준 장마감

종목명 삼성전자

종목코드 005930 코스피

현재가 81,800 전일대비 하락 200 마이너스 0.24 퍼센트

전일가 82,000

시가 82,600

고가 82,900

상한가 106,500

저가 81,800

하한가 57,400

거래량 13,181,031

거래대금 1,083,111백만

 

오류없음!!!

실행완료!!!

 

프로그래밍시에는 항상 발생할 수도 있는 오류종류를 미리 파악하는 것이 중요하며, 그에 맞는 오류처리도 중요합니다.

 

2021년 3월 22일 월요일

[파이썬] 주가정보을 조회하기 코드에서 주식종목 수정기능 및 런타임 오류처리 추가

 

이전에 포스팅한 주가정보 조회하기 코드에서 만약 주식종목코드가 잘못되었을 경우에는 오류가 발생할 수 있습니다.

 

오류가 발생하면 실행되던 코드가 오류를 디스플레이하면서 멈추게 되는데, 이러면 짜증이 날 듯 합니다.

 

그래서 오류가 발생시에 코드를 멈추지 않고 오류발생을 알려주면서 오류가 발생된 주식종목을 삭제하거나 수정할 수 있게 코드를 좀더 보완했습니다.

 

import requests

from bs4 import BeautifulSoup

 

stock_list = []   # 관심종목 목록

stock_item = ["", ""]   # 추가할 관심종목 입력

sel = ""

st_no = ""

st_name = ""   # 관심종목 이름 입력

st_code = ""   # 관심족옥 코드 입력

 

url = ""

url_temp = "https://finance.naver.com/item/main.nhn?code="

 

while True:

    print ("==========")

print ("96 : 관심종목 추가")   # 주식종목 추가

    print ("97 : 관심종목 수정")   # 주식종목 수정

    print ("98 : 관심종목 삭제")   # 주식종목 삭제

print ("99 : 종료")

    print ("종목코드 번호 : 선택한 종목 주가정보 조회")

    print ("==========")

 

    i = 0

    for i in range ( len(stock_list) ):

        print (i, " - ", stock_list[i][0], stock_list[i][1])

        i = i + 1

 

    print ("==========")

 

    sel = input ("원하는 항목을 입력하세요 : ")

    sel_no = int(sel)

 

    if sel == "96":   # 새로운 주식종목 추가

        st_name = input ("종목이름 : ")

        st_code = input ("종목코드 : ")

        stock_item[0] = st_name

        stock_item[1] = st_code

        stock_list.append(list(stock_item))

 

elif sel == "97":

        st_no = input ("종목항목번호 : ")

        st_name = input ("종목이름 : ")

        st_code = input ("종목코드 : ")

        stock_item[0] = st_name

        stock_item[1] = st_code

        stock_list.copy(list(stock_item))   # 수정한 종목코드를 목록에 복사

 

    elif sel == "98":   # 지정된 주식종목 삭제

        st_no = input ("종목항목번호 : ")

        del stock_list[ int(st_no) ]

 

    elif sel == "99":   # 종료

        break

 

    else:   # 선택한 주식종목 주가정보 보여주기

        url = url_temp + stock_list[sel_no][1]

 

        response = requests.get (url)

 

        if response.status_code == 200:

            html = response.text

            soup = BeautifulSoup (html, 'html.parser')

print ("----------")

 

            try:   # 오류발생을 처리

                print (soup.dl.text)

            except:

                print ("주식종목코드 오류")

 

            print ("----------")

 

아래와 같이 삼성전자를 예를 들어 보면 종목코드를 잘못 입력했습니다.

 

원하는 항목을 입력하세요 : 96

종목이름 : samsung

종목코드 : 111

==========

96 : 관심종목 추가

97 : 관심종목 수정

98 : 관심종목 삭제

99 : 종료

종목코드 번호 : 선택한 종목 주가정보 조회

==========

 

만약 삼성전자 주가정보를 조회하면 에러가 발생됩니다 (AttributeError).

 

런타임 에러가 발생되면 바로 에러표시를 하면서 코드가 멈추게 되는데, 오류처리를 하여 발생한 오류표시를 하고 계속 코드는 동작합니다.

 

원하는 항목을 입력하세요 : 0

----------

주식종목코드 오류

----------

==========

 

그러면 삼성전자 종목코드를 수정하면 아래와 같이 수정됨을 알 수 있습니다.

 

원하는 항목을 입력하세요 : 97

종목항목번호 : 0

종목이름 : 삼성전자

종목코드 : 005930

==========

96 : 관심종목 추가

97 : 관심종목 수정

98 : 관심종목 삭제

99 : 종료

종목코드 번호 : 선택한 종목 주가정보 조회

==========

0  -  삼성전자 005930

==========

 

이제 런타임 오류도 문제없이 처리하고 잘못된 종목코드도 수정할 수 있게 되었습니다.