"Python"의 두 판 사이의 차이

ph
이동: 둘러보기, 검색
1번째 줄: 1번째 줄:
 +
==재정의==
 +
[https://docs.python.org/3/reference/datamodel.html#object.__int__ 이 페이지]에 거의 다 있는듯함.<br>
 +
나열하면 다음과 같다.
 +
__abs__ , __add__ , __aenter__ , __aexit__ , __aiter__ , __and__ , __anext__ , __annotations__ , __await__ , __bases__ , __bool__ , __bytes__ , __call__ , __ceil__ , __class__ , __classcell__ , __closure__ , __code__ , __complex__ , __contains__ , __defaults__ , __del__ , __delattr__ , __delete__ , __delitem__ , __dict__ , __dir__ , __divmod__ , __doc__ , __enter__ , __eq__ , __exit__ , __file__ , __float__ , __floor__ , __floordiv__ , __format__ , __func__ , __future__ , __ge__ , __get__ , __getattr__ , __getattribute__ , __getitem__ , __globals__ , __gt__ , __hash__ , __iadd__ , __iand__ , __ifloordiv__ , __ilshift__ , __imatmul__ , __imod__ , __import__ , __imul__ , __index__ , __init__ , __instancecheck__ , __int__ , __invert__ , __ior__ , __ipow__ , __irshift__ , __isub__ , __iter__ , __itruediv__ , __ixor__ , __kwdefaults__ , __le__ , __len__ , __lshift__ , __lt__ , __matmul__ , __missing__ , __mod__ , __module__ , __mro__ , __mul__ , __name__ , __ne__ , __neg__ , __new__ , __next__ , __objclass__ , __or__ , __pos__ , __pow__ , __prepare__ , __qualname__ , __radd__ , __rand__ , __rdivmod__ , __repr__ , __reversed__ , __rfloordiv__ , __rlshift__ , __rmatmul__ , __rmod__ , __rmul__ , __ror__ , __round__ , __rpow__ , __rrshift__ , __rshift__ , __rsub__ , __rtruediv__ , __rxor__ , __self__ , __set__ , __setattr__ , __setitem__ , __slots__ , __str__ , __sub__ , __subclasscheck__ , __traceback__ , __truediv__ , __trunc__ , __weakref__ , __xor__
 +
 +
 
==2.7과 3.6 동시에 쓰기==
 
==2.7과 3.6 동시에 쓰기==
 
[https://conda.io/docs/user-guide/tasks/manage-python.html 참고링크] [https://conda.io/docs/user-guide/tasks/manage-environments.html#activate-env 참고링크2]
 
[https://conda.io/docs/user-guide/tasks/manage-python.html 참고링크] [https://conda.io/docs/user-guide/tasks/manage-environments.html#activate-env 참고링크2]

2018년 12월 27일 (목) 20:00 판

재정의

이 페이지에 거의 다 있는듯함.
나열하면 다음과 같다.

__abs__ , __add__ , __aenter__ , __aexit__ , __aiter__ , __and__ , __anext__ , __annotations__ , __await__ , __bases__ , __bool__ , __bytes__ , __call__ , __ceil__ , __class__ , __classcell__ , __closure__ , __code__ , __complex__ , __contains__ , __defaults__ , __del__ , __delattr__ , __delete__ , __delitem__ , __dict__ , __dir__ , __divmod__ , __doc__ , __enter__ , __eq__ , __exit__ , __file__ , __float__ , __floor__ , __floordiv__ , __format__ , __func__ , __future__ , __ge__ , __get__ , __getattr__ , __getattribute__ , __getitem__ , __globals__ , __gt__ , __hash__ , __iadd__ , __iand__ , __ifloordiv__ , __ilshift__ , __imatmul__ , __imod__ , __import__ , __imul__ , __index__ , __init__ , __instancecheck__ , __int__ , __invert__ , __ior__ , __ipow__ , __irshift__ , __isub__ , __iter__ , __itruediv__ , __ixor__ , __kwdefaults__ , __le__ , __len__ , __lshift__ , __lt__ , __matmul__ , __missing__ , __mod__ , __module__ , __mro__ , __mul__ , __name__ , __ne__ , __neg__ , __new__ , __next__ , __objclass__ , __or__ , __pos__ , __pow__ , __prepare__ , __qualname__ , __radd__ , __rand__ , __rdivmod__ , __repr__ , __reversed__ , __rfloordiv__ , __rlshift__ , __rmatmul__ , __rmod__ , __rmul__ , __ror__ , __round__ , __rpow__ , __rrshift__ , __rshift__ , __rsub__ , __rtruediv__ , __rxor__ , __self__ , __set__ , __setattr__ , __setitem__ , __slots__ , __str__ , __sub__ , __subclasscheck__ , __traceback__ , __truediv__ , __trunc__ , __weakref__ , __xor__


2.7과 3.6 동시에 쓰기

참고링크 참고링크2

아래로 만들고,

conda create -n py36 python=3.6 anaconda

아래로 activate

source activate py36

환경 리스트

conda env list

__call__ 클래스로도, 함수로도 쓸 수 있음.

The first is used to initialise newly created object, and receives arguments used to do that:

    class Foo:
        def __init__(self, a, b, c):
            # ...

    x = Foo(1, 2, 3) # __init__

The second implements function call operator.

    class Foo:
        def __call__(self, a, b, c):
            # ...

    x = Foo()
    x(1, 2, 3) # __call__

[1]

jupyter notebook matplotlib on OSX

Insert below code at the head of the note.

import matplotlib as mpl 
mpl.use('TkAgg')

[2]

한글외 문자 제거

hangul = re.compile('[^ ㄱ-ㅣ가-힣]+') # 한글과 띄어쓰기를 제외한 모든 글자
# hangul = re.compile('[^ \u3131-\u3163\uac00-\ud7a3]+')  # 위와 동일
result = hangul.sub('', target_text) # 한글과 띄어쓰기를 제외한 모든 부분을 제거

http://jokergt.tistory.com/52

ternary operator

a if condition else b

[3]

print color to terminal stdout

print('\x1b[6;30;42m' + 'Success!' + '\x1b[0m')

[4]

ansi

RED = '\033[91m'
GREEN = '\033[92m'
YELLOW = '\033[93m'
LIGHT_PURPLE = '\033[94m'
PURPLE = '\033[95m'
END = '\033[0m'

코드로도 된다고 하는데 그럴필요까지야.

from __future__ import print_function
from colorprint import *

print('Hello', 'world', color='blue', end='', sep=', ')
print('!', color='red', format=['bold', ‘blink'])

[5]

filter

filter(None, list)

None이나 \(0\)을 제외하게 된다.[6]

ipython (jupyter notebook)

load a file

%load f.py

save current cell to a file

%%writefile f.py

shell command

!ls
!cat “file” 

[7]

Multiple input stream

import fileinput
for line in fileinput.input():
    process(line)

https://docs.python.org/2/library/fileinput.html#module-fileinput

file position

def skip_comments(f):
    while True:
        pos = f.tell()
        line = f.readline().strip()
        if not line.startswith('#'):
            f.seek(pos) #rewind
            break

tell로 현재 위치를 얻고, seek로 set.

>>> f = open('workfile', 'r+')
>>> f.write('0123456789abcdef')
>>> f.seek(5)      # Go to the 6th byte in the file
>>> f.read(1)
'5'
>>> f.seek(-3, 2)  # Go to the 3rd byte before the end
>>> f.read(1)
'd'

https://docs.python.org/2/tutorial/inputoutput.html#methods-of-file-objects


Interactive session detection

sys.stdin.isatty()

http://stackoverflow.com/a/7576567/766330


Temporary file or directory

tempfile.TemporaryFile([mode='w+b'[, bufsize=-1[, suffix=''[, prefix='tmp'[, dir=None]]]]]) [8]

임시파일을 만든다. 아래를 쓸것.

tempfile.NamedTemporaryFile([mode='w+b'[, bufsize=-1[, suffix=''[, prefix='tmp'[, dir=None[, delete=True]]]]]]) [9]

위와 동일하나 visible name의 파일을 만든다. 이름은 반환값의 name속성으로 받을 수 있다.
주의할점은, delete속성의 기본값이 True여서 쓰여진 후 곧바로 지워진다. 계속 쓰려면 해당속성을 False로 해야 한다.

tempfile.mkdtemp([suffix=''[, prefix='tmp'[, dir=None]]]) [10]

임시디렉토리를 만들고, 자동으로 지우지 않는다.

Check syntax without running

python -m py_compile script.py

http://stackoverflow.com/a/8437597/766330


Time

current time

>>> import time
>>> time.time()
1491792653.410371
>>> import datetime
>>> datetime.datetime.fromtimestamp(time.time()).strftime('%Y-%m-%d %H:%M:%S')
'2017-04-10 11:51:17'  
>>> datetime.datetime.utcnow()
datetime.datetime(2017, 4, 10, 2, 51, 34, 356682)
>>> datetime.datetime.now()
datetime.datetime(2017, 4, 10, 11, 51, 36, 572681)
>>> datetime.datetime.now().strftime("%A, %d. %B %Y %I:%M%p")
'Monday, 10. April 2017 11:51AM'

[11]
if you want UTC, use utcfromtimestamp instead of fromtimestamp [12]

yesterday

>>> from datetime import date, timedelta
>>> yesterday = date.today() - timedelta(1)
>>> print yesterday.strftime('%m%d%y')
'110909'

[13]

strftime format manual


String replace

str.replace

str.replace(old, new[, max]) [14]

re.sub

>>> re.sub(r'def\s+([a-zA-Z_][a-zA-Z_0-9]*)\s*\(\s*\):',
 ...        r'static PyObject*\npy_\1(void)\n{',
 ...        'def myfunc():')
 'static PyObject*\npy_myfunc(void)\n{' [15]

commented version example

line = re.sub(r"""
  (?x) # Use free-spacing mode.
  <    # Match a literal '<'
  /?   # Optionally match a '/'
  \[   # Match a literal '['
  \d+  # Match one or more digits
  >    # Match a literal '>'
  """, "", line) [16]

is and ==

is is identity testing, == is equality testing. what happens in your code would be emulated in the interpreter like this:

>>> a = 'pub'
>>> b = ''.join(['p', 'u', 'b'])
>>> a == b
True
>>> a is b
False

[17]


Access index in for loop

enumerate

for idx, val in enumerate(ints):
   print(idx, val)

[18]

Max integer

sys.maxint

[19]

python 3에서는 안된다고 한다. 어차피 안쓰니 상관없지만 그래서 다음과 같이 한다고.

import sys
max = sys.maxsize
min = -sys.maxsize

[20]

다음도 간단하고 좋은 것 같다. 2,3에서 모두 동작

float('inf')
float('-inf')

[21]

Argument parsing

use argparse


range by step

>>> step = .1
>>> N = 10     # number of data points
>>> [ x / pow(step, -1) for x in range(0, N + 1) ]
[0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0]

[22]


File existence

os.path.exists(file_path)

[23] [24]


Define source code encoding

첫째나 둘째줄에,

# coding=<encoding name>

보통 에디터들은 다음 형식을 이해함.

#!/usr/bin/python
# -*- coding: <encoding name> -*-

혹은

#!/usr/bin/python
# vim: set fileencoding=<encoding name> :

정확히는, 첫째나 둘째줄이 아래 정규식에 맞아야 함.

^[ \t\v]*#.*?coding[:=][ \t]*([-_.a-zA-Z0-9]+)

https://www.python.org/dev/peps/pep-0263/

encoding

기본적으로 파이썬은 유니코드를 사용한다. encode/decode할 때, encode하면 유니코드로부터 다른 인코딩으로 가고, decode하면 다른 인코딩으로부터 유니코드로 온다는 얘기. 그래서 unicode().decode()는 매우 쓸데가 없다. [25] 보통은 기본 인코딩을 utf8로 쓰므로 파이썬 코드상에서 가끔 한글이 이상한 동작을 보이면 다 decode('utf-8')붙여주면 된다. 하이픈 없이 utf8이라고 써도 된다.

주의할점은, encode를 부르면 암묵적으로 decode가 먼저 불린다. 따라서 (쓸일도 거의 없지만) encode할 때는 원래 문자열을 decode해주는 것이 안전하다. 안해주면 ascii codec으로 디코딩을 먼저 시도하는데, 한글의 경우는 잘 안되므로 UnicodeEncodeError: 'ascii' codec can't encode characters in position blabla: ordinal not in range(128) 요런 친숙한(?) 에러가 난다. 일단 유니코드로 다 바꾸고 다른 인코딩으로 넘어간다고 생각하면 됨. [26]

스트링format에서, %s로 유니코드를 받으려면 format string도 unicode여야 한다. u'%s' 이렇게. 그래서 섞어 써야 할 때는, ①format string을 놔두고, 유니코드를 utf8로 디코드 해서 넘기든지, ② format string을 unicode로 주고 utf8문자열에 죄다 decode('utf-8')을 붙인다.

시간이 너무 남아돌면 기본 매뉴얼[27]을 읽어보는것도...

Reading another encoding from a file

<shl> import codecs f = codecs.open('unicode.rst', encoding='utf-8') for line in f:

   print repr(line)

</shl> https://stackoverflow.com/a/147756/766330

randint

from random import randint
print(randint(0,9))

0~9 inclusive
https://docs.python.org/2/library/random.html#random.randint


groupby example

from itertools import groupby

things = [("animal", "bear"), ("animal", "duck"), ("plant", "cactus"), ("vehicle", "speed boat"), ("vehicle", "school bus")]

for key, group in groupby(things, lambda x: x[0]):
    for thing in group:
        print "A %s is a %s." % (thing[1], key)
    print " "

output

A bear is a animal.
A duck is a animal.

A cactus is a plant.

A speed boat is a vehicle.
A school bus is a vehicle.

http://stackoverflow.com/a/7286/766330


Suppress scientific notation

use %f

'%f' % (x/y)

http://stackoverflow.com/a/658777/766330


To ignore exception

except:
    pass

http://stackoverflow.com/a/574734/766330


Delete items from a dictionary while iterating over it

iteration중에는 지울 수 없다. 두번 돌아야 함.

remove = [k for k in mydict if k == val]
for k in remove: del mydict[k]

http://stackoverflow.com/a/5385196/766330

Print without newline

import sys
sys.stdout.write('.')

http://stackoverflow.com/a/493399/766330

if else in list comprehension

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

http://stackoverflow.com/a/4260304/766330

filtering a dictionary according to an arbitrary condition

use dict comprehension

{k: v for k, v in points.iteritems() if v[0] < 5 and v[1] < 5}

https://stackoverflow.com/a/16589453/766330

Executing multi-line statements within PDB

(pdb) !import code; code.interact(local=vars()) 
Python 2.6.5 (r265:79063, Apr 16 2010, 13:57:41) 
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> 

https://stackoverflow.com/a/8387484/766330

Converting a IPython Notebook into a Python file via commandline

$ jupyter nbconvert --to script [YOUR_NOTEBOOK].ipynb

or in ipython notebook

!jupyter nbconvert --to script [YOUR_NOTEBOOK].ipynb

https://stackoverflow.com/a/19779226/766330

Write float(or int) to a binary file

import struct
s = struct.pack('f'*len(floats), *floats)
f = open('file','wb')
f.write(s)
f.close()

To read this from C, refer here

https://stackoverflow.com/a/807881/766330

cross reference between files

Use following statements according to appropriate order

from __main__ import *

https://stackoverflow.com/a/16068078/766330