반응형

출처 : https://stackoverflow.com/questions/4260280/if-else-in-pythons-list-comprehension

파이썬 list comprehension에서 if/else 구문 사용법?

파이썬에서 어떻게 다음 구문을 할 수 있습니까?

row = [unicode(x.strip()) for x in row if x is not None else '']

특별히:

  1. 빈 문자열을 None으로 대체하고

  2. 함수를 실행하고 싶습니다.


3 개의 답변 중 1 개의 답변만 추려냄.

이렇게 하실 수 있고 순서의 문제입니다.

[ unicode(x.strip()) if x is not None else '' for x in row ]

일반적으로,

[f(x) if condition else g(x) for x in sequence]

if 조건만으로 for list comprehensions을 사용한다면

[f(x) for x in sequence if condition]

이는 실제로 다른 언어 구문인 조건부 표현식을 사용하는 데, 그 자체는 list comprehension 문법의 일부가 아니며 if 뒤에 for…in 이 list comprehension이며 원래 데이터(source)를 순회(iterable)하면서 각 요소를 필터링하는데 (조건부 표현식이) 사용됩니다.

조건식은 2가지 값 중 선택하려는 모든 종류의 상황에서 사용할 수 있습니다. 이 조건식은 다른 언어에도 존재하는 ?: 삼항 연산자 와 같습니다. 예를 들면

value = 123
print(value, 'is', 'even' if value % 2 == 0 else 'odd')

이렇게 사용하실 수 있습니다.

반응형
반응형

출처 : https://stackoverflow.com/questions/4770297/python-convert-utc-datetime-string-to-local-datetime

파이썬 - UTC 날짜시간 문자열을 local 날짜시간으로 변환하기

저는 시간과 utc간에 변환 할 필요가 없었습니다. 최근에 제 앱이 시간대를 인식하도록 요청이 있었으며 스스로 알아보고 있었습니다. 현지 시간을 utc로 변환하는 방법에 대한 많은 정보를 얻었는데 초보자 (어쩌면 그렇게 잘못하고있는 것 같습니다)라 최종 사용자 시간대로 UTC 시간을 쉽게 변환하는 방법에 대한 정보는 찾을 수 없습니다.

간단히 말해서 android app은 나를 (appengine app) 데이터로 보내고 그 데이터는 타임 스탬프입니다. 해당 타임 스탬프를 utc 시간으로 저장하기 위해 다음을 사용하였습니다.

datetime.utcfromtimestamp(timestamp)

이는 효과가 있는 것 같습니다. 내 앱이 데이터를 저장하면 5시간 이전 시간으로 저장됩니다. (저는 EST-5 시간대에 있습니다.)

데이터가 appengine의 BigTable에 저장되고 검색되면 다음과 같은 문자열로 나타납니다.

"2011-01-21 02:37:21"

이 문자열을 사용자의 올바른 시간대에있는 DateTime으로 변환하려면 어떻게 해야 합니까?

또한, 사용자 시간대 정보가 주로 저장됩니까? tz(시간대) 정보를 일반적으로 어떻게 저장합니까? (예시: "-5:00" 또는 "EST" 등등?) 첫 번째 질문에 대한 대답에는 두 번째 대답에 포함될 수 있습니다.


7 개의 답변 중 1 개의 답변만 추려냄.

당신이 tzinfo 객체를 제공하기 원하지 않으면 python-dateutil 라이브러리를 확인하시면 됩니다. 시간대에 대한 표준명으로 시간대 규칙을 참조할 수 있도록 zoneinfo (Olson) 데이터베이스 위에 tzinfo 구현을 제공합니다.

from datetime import datetime
from dateutil import tz

# 방법 1: 시간대 하드코딩:
from_zone = tz.gettz('UTC')
to_zone = tz.gettz('America/New_York')

# 방법 2: 시간대 자동감지:
from_zone = tz.tzutc()
to_zone = tz.tzlocal()

# utc = datetime.utcnow()
utc = datetime.strptime('2011-01-21 02:37:21', '%Y-%m-%d %H:%M:%S')

# 날짜시간 객체가 기본으로 '순수'하기 때문에  
# UTC 시간대에 있다고 날짜시간 객체에게 알려줍니다.
utc = utc.replace(tzinfo=from_zone)

# 시간대를 변환합니다.
central = utc.astimezone(to_zone)

편집 strptime 사용법을 보여주기 위해 예제를 확장함

편집2 더 좋은 entry point 메소드를 보여주기 위해 API 사용법을 수정

편집3 시간대 (Yarin)를 자동 감지하기 위한 메소드 포함

반응형
반응형

출처 : http://stackoverflow.com/questions/2184181/decoding-tcp-packets-using-python

파이썬을 사용하여 TCP 패킷 decode하기

저는 TCP 접속을 통해 데이터를 decode하려고 합니다. 그 패킷은 작고 100바이트를 넘지 않습니다. 하지만 제가 받은 그 패킷들이 많을 때 그 패킷 중 일부는 결합 됩니다. 이를 방지할 수 있는 방법이 있습니까? 저는 파이썬을 사용합니다.

저는 그 패킷들을 분리하고 싶소 제 소스는 밑에 있습니다. 패킷은 STX 바이트로 시작하며 ETX 바이트로 끝납니다. STX 뒤의 바이트는 패킷 길이이며, (패킷 길이가 5 미만이면 유효하지 않습니다.) checksum은 ETX 이전 바이트입니다.

def decode(data):
  while True:
    start = data.find(STX)
    if start == -1: #메세지에 STX가 없다면
        pkt = ''
        data = ''
        break
    #stx 발견 , 다음 바이트는 길이
    pktlen = ord(data[1])
    #ETX로 메세지가 끝나는 지 체크 또는 checksum이 유효하지 않을 때
    if pktlen < 5 or data[pktlen-1] != ETX or checksum_valid(data[start:pktlen]) == False:
        print "Invalid Pkt"
        data = data[start+1:]
        continue
    else:
        pkt = data[start:pktlen]
        data = data[pktlen:]
        break

return data , pkt

저는 이것을 다음처럼 사용했습니다.

#process reports
try:
    data = sock.recv(256) 
except: continue 
else:
    while data:
        data, pkt = decode(data) 
        if pkt:
           process(pkt)

데이터 스트림에서 여러 개의 패킷이 있다면 리스트의 모음으로 패킷을 리턴하거나 첫 번째 패킷만 리턴하는 것이 최선입니다.

저는 C는 익숙하지만 파이썬에 익숙하지 않습니다. 이 방법이 괜찮나요? 어떠한 충고도 감사합니다.

5 개의 답변 중 1 개의 답변만 추려냄.

저는 이것처럼 스트림에서부터 패킷을 decoding에 대응하는 클래스를 만들었습니다.

class PacketDecoder(object):

    STX = ...
    ETX = ...

    def __init__(self):
        self._stream = ''

    def feed(self, buffer):
        self._stream += buffer

    def decode(self):
        '''
        Yields packets from the current stream.
        '''
        while len(self._stream) > 2:
            end = self._stream.find(self.ETX)
            if end == -1:
                break

            packet_len = ord(self._stream[1])
            packet = self._stream[:end]
            if packet_len >= 5 and check_sum_valid(packet):
                yield packet
            self._stream = self._stream[end+1:]

그리고나서 이를 다음처럼 사용합니다.

decoder = PacketDecoder()
while True:
    data = sock.recv(256) 
    if not data:
        # handle lost connection... 접속이 끊어졌을 때 다룰 코드
    decoder.feed(data)
    for packet in decoder.decode():
        process(packet)
반응형
반응형

출처 : http://stackoverflow.com/questions/2682745/how-to-create-a-constant-in-python

Python에서 상수를 만드는 방법

파이썬에서 상수를 선언할 수 있는 방법이 있습니까? 자바에서는 다음 방법으로 상수를 만들 수 있습니다.

public static final String CONST_NAME = "Name";

파이썬에서 위의 자바 상수 선언과 같은 방법은 무엇입니까?


41 개의 답변 중 2 개의 답변만 추려냄.

아니오. 방법이 없습니다. 파이썬에서 상수를 선언할 수 없습니다. 그저 그 변수를 바꾸지 마세요.만약 클래스에 있으면, 같은 방법은

class Foo(object): 
    CONST_NAME = "Name"

클래스에 없다면,

CONST_NAME = "Name"

처럼 사용할 수 있습니다.

하지만, Alex Martelli에 Constants in Python 의 코드 조각을 보시길 원하실 거라 생각합니다.

Python 3.8부터, (mypy처럼) 정적 타입 체커가 변수가 재할당되지 말아야 한다고 알려주는 typing.Final 표기법이 있습니다. 이는 Java의 final과 거의 같습니다. 하지만, 재할당을 실제 막지는 못합니다.

from typing import Final

a: Final = 1

# 잘 실행됩니다, 하지만 mypy에서 이를 실행한다면 오류를 보고할 것입니다.
a = 2

다른 언어처럼 키워드가 없습니다. 하지만, 데이터를 읽는 "getter 함수"를 가지지만 데이터를 다시 쓰는 "setter 함수"가 없는 Property를 생성할 수 있습니다. 이는 본질적으로 식별자가 바뀌는 것을 방지합니다.

여기에 클래스 구현을 사용하여 다른 방법으로 구현하였습니다.

이 코드는 상수에 관해 독자가 쉽게 이해할 수 없습니다. 아래 설명이 있습니다.

def constant(f):
    def fset(self, value):
        raise TypeError
    def fget(self):
        return f()
    return property(fget, fset)

class _Const(object):
    @constant
    def FOO():
        return 0xBAADFACE
    @constant
    def BAR():
        return 0xDEADBEEF

CONST = _Const()

print CONST.FOO
##3131964110

CONST.FOO = 0
##Traceback (most recent call last):
##    ...
##    CONST.FOO = 0
##TypeError: None

코드 설명:

  1. 표현식을 취하는 constant 함수를 정의하고 "getter"를 생성하기 위해 그것을 사용합니다. 함수는 오직 표현식의 값만 리턴합니다.
  2. setter 함수는 읽기 전용이기 때문에 TypeError를 발생시킵니다.
  3. 읽기 전용 properties를 정의하기 위한 decoration으로써 우리가 방금 생성한 함수 constant를 사용합니다.

... 중략 ...

반응형
반응형

출처 : http://stackoverflow.com/questions/4960048/python-3-and-mysql

Python 3과 MySQL

저는 Windows에서 ActiveState Python 3를 사용하고 있고 MySQL 데이터베이스에 접속 하기를 원했습니다. 저는 mysqldb 가 사용할 수 있는 모듈이라 들었습니다. 저는 Python 3 용 mysqldb을 찾을 수 없었습니다.

mysqldb용 바이너리 파일이 있는 가능한 저장소가 있습니까? 윈도우즈에서 Python 3로 MySQL에 어떻게 접속할 수 있습니까?


14 개의 답변 중 1 개의 답변

mysql과 함께 Python 3를 사용할 수 있는 몇 가지 옵션이 있습니다.

https://pypi.python.org/pypi/mysql-connector-python

  • Oracle에 의해 공식적으로 지원됨
  • 순수 파이썬
  • 약간 느림
  • MySQLdb와 호환되지 않음

https://pypi.python.org/pypi/pymysql

  • 순수 파이썬
  • mysql-connector 보다 빠름
  • pymysql.install_as_MySQLdb()를 호출한 후, MySQLdb와 거의 대부분 호환됨.

https://pypi.python.org/pypi/cymysql

  • C 속도 향상을 위한 pymysql의 복제버전

https://pypi.python.org/pypi/mysqlclient

  • Django에서 추천하는 라이브러리
  • 원래 MySQLdb의 복제버전, 언젠가 다시 합쳐지길 희망함.
  • 가장 빠른 실행을 보이며 C 기반이기 때문
  • 가장 MySQLdb와 호환성이 좋고, 이 라이브러리가 복제버전이기 때문
  • python-mysqldb패키지와 python3-mysqldb 패키지 둘 다 제공하기 위해 Debian과 Ubuntu가 이를 사용

참고할 벤치마크: https://github.com/methane/mysql-driver-benchmarks

반응형
반응형

TA-Lib 설치

pip로 설치가 안 됨

확인해보니 ta-lib c library를 먼저 설치해야 함.

  • TA-Lib c 라이브러리 설치

참고주소: https://mrjbq7.github.io/ta-lib/install.html

$ wget http://prdownloads.sourceforge.net/ta-lib/ta-lib-0.4.0-src.tar.gz
$ untar and cd
$ ./configure --prefix=/usr
$ make
$ sudo make install
  • pip 설치
    (venv) $ pip install TA-Lib
    

위 작업까지 해도 python에서 import talib이 다음처럼 실패함을 확인

(venv) $ python
>>> import talib
Traceback (most recent call last):                                                                                                          
  File "", line 1, in                                                                                                         
  File "/home/kfits/tf/venv/lib/python2.7/site-packages/talib/__init__.py", line 4, in                                               
    from . import common
ImportError: libta_lib.so.0: cannot open shared object file: No such file or directory
  • LD_LIBRARY_PATH 설정

HOME 디렉터리에서 다음 작업을 합니다.

$ cd
$ vi .bash_profile
# 다음 2줄 소스 추가.
LD_LIBRARY_PATH=/usr/lib:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH
  • jupyter notebook을 재기동
    $ cd
    $ cd tf
    $ source source/bin/activate
    (venv) $ jupyter notebook --ip=0.0.0.0 --port=8080 --no-browser &


TensorFlow 오류

scikit-learn을 pip로 설치하고 나서 TensorFlow가 Segmentation 오류가 납니다. 다음은 해결 방법입니다.

import numpy as np
import tensorflow as tf

위에처럼 'import numpy'를 'import tensorflow' 이전에 추가합니다.


코딩 reference

전일비 구하기

df_all['Target'] = df_all['Close'].shift(1)/df_all['Close']
  • Dataframe.shift: period 수만큼 index를 이동시킨다. (period일 전 데이터를 구할 때 사용)

참고주소: http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.shift.html

데이터프레임 랜덤하게 섞기

http://stackoverflow.com/questions/29576430/shuffle-dataframe-rows

  • df.iloc[np.random.permutation(len(df)] 참고함.

데이터프레임 행(row) iterator

for inx, row in df_master.iterrows():
# inx는 df_master 각 행의 index, row는 df_master 각 행의 값.


반응형
반응형

출처 : http://stackoverflow.com/questions/37061089/trouble-with-tensorflow-in-jupyter-notebook

Jupyter Notebook에서 TensorFlow 사용 문제

저는 Ubuntu 14.04에서 Anaconda를 통해 Jupyter Notebook을 설치했고 바로 TensorFlow를 설치 하였습니다. 저는 TensorFlow가 Notebook에서나 간단히 스트립트를 작성하는 것과 상관 없이 작동하게 하고 싶습니다. 이를 이루기 위한 저의 시도에서, 저는 TensorFlow를 두 번 설치를 했는데 첫 번째는 Anaconda를 사용하였고 그 다음은 pip를 사용하였습니다. Anaconda 설치가 잘 되었지만 "source activate tensorflow"를 python에서 먼저 실행할 필요가 있었습니다. 만약 python을 (터미널에서) 일반적인 방법으로 시작하면 pip 설치는 잘 작동하였고 tensorflow도 잘 불러 왔습니다.

저의 질문은 어떻게 Jupyter notebook에서 이를 잘 실행할 수 있을까요? 입니다.

이는 저를 더 일반적인 질문으로 이끌었습니다. 저의 Jupyter/Anaconda에서 python kernel은 시스템에서 널리 사용되는 python kernel(또는 환경? 여기서 용어는 확실하지 않습니다)과 분리되어 있는 거 같습니다. 이 커널들을 동시에 제어한다면 좋겠습니다. 이게 된다면 제가 새로운 python 라이브러리를 설치할 때 python을 실행하는 모든 다양한 방법으로 접근할 수 있기 때문입니다.


4 개의 답변 중 1 개의 답변만 추려냄.

업데이트

TensorFlow 웹 사이트는 5 개의 설치를 지원합니다.

제가 이해한 바로는 Pip 설치를 직접 사용하여 Jupyter Notebook에서 TensorFlow를 가져 오는 것이 좋습니다 (Jupyter Notebook이 설치되어 있고 다른 문제가 없는 한) b/z 가상 환경을 만들지 않았습니다.

virtualenv 설치 및 conda 설치를 사용하려면 새로 생성된 TensorFlow 환경에 jupyter를 설치하여 TensorFlow가 Jupyter Notebook에서 작동할 수 있도록 해야 합니다. (자세한 내용은 다음 원본 게시물 섹션 참조).

Docker 설치는 VirtualBox에 일부 포트 설정이 있어야 Jupyter Notebook에서 TensorFlow가 작동 할 수 있습니다 (이 게시물 참조).

소스에서 설치하는 경우 소스 코드가 빌드되고 설치된 환경에 따라 다릅니다. 새로 생성된 가상 환경 또는 Jupyter Notebook이 설치되지 않은 가상 환경에 설치된 경우 Jupyter Notebook에서 Tensorflow를 사용하려면 Jupyter Notebook도 가상 환경에 설치해야 합니다.

원래 글

Ipython 또는 Jupyter(Ipython) Notebook에서 TensorFlow를 사용하려면 tensorflow가 활성화된 환경에서 (tensorflow를 설치한 뒤에) Jupyter와 Ipython을 설치해야 합니다.

tensorflow 환경에서 Ipython과 Jupyter를 설치하기 전에 터미널에서 다음 명령어를 실행합니다.

username$ source activate tensorflow

(tensorflow)username$ which ipython
(tensorflow)username$ /Users/username/anaconda/bin/ipython

(tensorflow)username$ which jupyter
(tensorflow)username$ /Users/username/anaconda/bin/jupyter

(tensorflow)username$ which python
(tensorflow)username$ /User/username//anaconda/envs/tensorflow/bin/python

이는 당신이 터미널에서 python을 열었을 때, tensorflow가 설치된 "환경"에서 설치된 것들을 이렇게 사용중이라고 당신에게 말해줍니다. 그러므로 당신은 실제 import tensorflow가 성공적으로 가능합니다. 하지만, ipython 또는 jupyter notebook을 실행한다면, 이들은 tensorflow에 장착된 "환경"에서 설치되지 않았기 때문에 tensorflow 모듈이 없는 일반적인 환경을 사용하기 때문에 import 오류가 나오게 됩니다.

당신은 envs/tensorflow/bin 디렉터리에서 파일 목록을 봄으로서 이를 검증할 수 있습니다.

(tensorflow) username$ ls /User/username/anaconda/envs/tensorflow/bin/

당신은 "ipython"이나 "jupyter" 목록이 없음을 알 수 있습니다.

Ipython 또는 Jupyter Notebook에서 tensorflow를 사용하려면, 간단하게 tensorflow 환경에서 Notebook을 설치하면 됩니다.

(tensorflow) username$ conda install ipython
(tensorflow) username$ pip install jupyter #(use pip3 for python3)

이들을 설치한 후, "jupyter"와 "ipython"은 envs/tensorflow/bin 디렉터리에서 보일 것입니다.

알아두세요: jupyter notebook에서 tensorflow 모듈을 import하기 전에, notebook을 먼저 닫으세요. 그리고 "source deactivate tensorflow"를 먼저 하고 "같은 페이지"에서 이들의 실행을 보장하기 위해 다시 그것을 ("source activate tensorflow") 활성화 하세요. 그리고 notebook을 다시 열어 import tensorflow 해보세요. 성공적으로 import 될 것입니다. (적어도 저는 작동했습니다.)

반응형
반응형

출처 

http://chrisalbon.com/python/pandas_create_column_with_loop.html

For 루프로 Pandas 열 만들기


사전준비

import pandas as pd
import numpy as np

데이터프레임 예시 만들기

raw_data = {'student_name': ['Miller', 'Jacobson', 'Ali', 'Milner', 'Cooze', 'Jacon', 'Ryaner', 'Sone', 'Sloan', 'Piger', 'Riani', 'Ali'], 
        'test_score': [76, 88, 84, 67, 53, 96, 64, 91, 77, 73, 52, np.NaN]}
df = pd.DataFrame(raw_data, columns = ['student_name', 'test_score'])


학점을 할당하기 위한 함수 만들기

# 데이터를 저장할 list(리스트)를 만듭니다. grades = [] # 열에 추가할 각 행을 For로 순회합니다, for row in df['test_score']: # 이 값보다 크면, if row > 95: # 'A' 학점으로 list에 추가합니다. grades.append('A') # 아니고, 이 값보다 크면, elif row > 90: # 'A-' 학점으로 list에 추가합니다. grades.append('A-') # 아니고, 이 값보다 크면, elif row > 85: # 'B' 학점으로 list에 추가합니다. grades.append('B') # 아니고, 이 값보다 크면, elif row > 80: # 'B-' 학점으로 list에 추가합니다. grades.append('B-') # 아니고, 이 값보다 크면, elif row > 75: # 'C' 학점으로 list에 추가합니다. grades.append('C') # 아니고, 이 값보다 크면, elif row > 70: # 'C-' 학점으로 list에 추가합니다. grades.append('C-') # 아니고, 이 값보다 크면, elif row > 65: # 'D' 학점으로 list에 추가합니다. grades.append('D') # 아니고, 이 값보다 크면, elif row > 60: # 'D-' 학점으로 list에 추가합니다. grades.append('D-') # 아니면, else: # 'F' 학점을 추가합니다. grades.append('Failed') # list(리스트)로부터 'grades'열을 추가합니다. df['grades'] = grades

# 새로운 dataframe(데이터프레임)을 봅니다. df

student_nametest_scoregrades
0Miller76C
1Jacobson88B
2Ali84B-
3Milner67D
4Cooze53Failed
5Jacon96A
6Ryaner64D-
7Sone91A-
8Sloan77C
9Piger73C-
10Riani52Failed
11AliNaNFailed


반응형
반응형

출처 : http://stackoverflow.com/questions/279561/what-is-the-python-equivalent-of-static-variables-inside-a-function

Python에서 함수 안의 static 변수와 같은 것은 무엇입니까?

이 C/C++ 코드와 Python에서 같은 것은 무엇입니까?

void foo()
{
    static int counter = 0;
    counter++;
    printf("counter is %d\n", counter);
}

특별히, 클래스 레벨과는 다르게 함수 레벨에서 어떻게 static 멤버를 구현할 수 있습니까? 함수를 클래스로 넣는 것을 다른 걸로 바꿀 수 있습니까?


18 개의 답변 중 2 개의 답변만 추려냄.

다음은 작동해야 합니다.

def foo():
    foo.counter += 1
    print "Counter is %d" % foo.counter
foo.counter = 0

counter의 초기화 코드를 제일 밑에 대신에 제일 위에 오도록 하고 싶다면 decorate를 만들 수 있습니다.

def static_vars(**kwargs):
    def decorate(func):
        for k in kwargs:
            setattr(func, k, kwargs[k])
        return func
    return decorate

그리고 나서 다음처럼 코드를 사용합니다.

@static_vars(counter=0)
def foo():
    foo.counter += 1
    print "Counter is %d" % foo.counter

불행히도 접두사로는, 여전히 foo를 사용해야합니다.


당신은 함수에 속성(attribute)을 추가할 수 있습니다. 그것을 static 변수로 사용하면 됩니다.

def myfunc():
  myfunc.counter += 1
  print myfunc.counter

# 속성은 반드시 초기화 되어야 합니다.
myfunc.counter = 0

다른 대안으로 함수 밖에 변수를 설정하길 원하지 않는다면, 당신은 AttributeError exception을 피하기 위해 hasattr()를 사용할 수 있습니다.

def myfunc():
  if not hasattr(myfunc, "counter"):
     myfunc.counter = 0  # it doesn't exist yet, so initialize it
  myfunc.counter += 1

static 변수는 드물게 사용되기 때문에 당신은 이 변수를 사용하기 더 좋은 위치를 찾는게 좋고 대부분은 클래스 안에 멤버변수로 사용합니다.

반응형
반응형

출처 : http://stackoverflow.com/questions/3422685/what-is-python-buffer-type-for

Python의 buffer 타입은 무엇을 위한 건가요?

Python에는 buffer타입이 있습니다만 저는 어떻게 그것을 사용해야 할 지 모르겠습니다.

Python doc 설명은 다음과 같습니다.

buffer(object[, offset[, size]])

object 매개변수는 buffer 호출 인터페이스(문자열, 배열, 버퍼등)를 지원하는 객체여야 합니다. 새로운 buffer 객체는 object 매개변수를 참조하도록 만들어질 것입니다. buffer 객체는 객체의 시작부터 (또는 offset 위치부터) slice 될 수 있습니다. 이 slice는 객체의 끝 (또는 size 매개변수로 주어진 길이)까지 확장될 수 있습니다.


2 개의 답변 중 1 개의 답변만 추려냄.

다음은 사용 예시입니다.

>>> s = 'Hello world'
>>> t = buffer(s, 6, 5)
>>> t
<read-only buffer for 0x10064a4b0, size 5, offset 6 at 0x100634ab0>
>>> print t
world

이 경우 buffer는 6번째 위치에서 시작하며 길이가 5인 부분 문자열(sub-string)입니다. 그리고 이는 추가 저장 공간을 필요로 하지 않습니다. 그 이유는 string의 slice를 참조하기 때문 입니다.

이 코드 예시처럼 짧은 문자열에는 매우 유용하지는 않습니다. 하지만 큰 데이터를 사용할 때 필요할 수 있습니다. 이 예시는 변경가능한 bytearray를 사용하였습니다.

>>> s = bytearray(1000000)   # 백만개의 0 값인 바이트배열 
>>> t = buffer(s, 1)         # 인덱스 1의 바이트만 자름
>>> s[1] = 5                 # s에서 두 번째 요소를 5로 세팅
>>> t[0]                     # t에서 첫번째 요소가 s[1]이기도 함
'\x05'

이는 데이터에서 하나 이상의 view가 필요할 때 매우 유용하며 메모리에서 여러개의 복사본을 만들고 싶지 않을 때 유용합니다.

buffer(buffer)는 Python 2.7에도 사용할 수 있지만 Python 3에서 더 좋은 이름인 memoryview(memoryview)로 바뀌었습니다.

또한 C API를 살펴 보지 않고는 자체 객체에 대한 버퍼 인터페이스를 구현할 수 없습니다. 즉, 순수 Python에서는 수행 할 수 없습니다.

반응형

+ Recent posts