"Python"의 두 판 사이의 차이

ph
이동: 둘러보기, 검색
3번째 줄: 3번째 줄:
 
나열하면 다음과 같다.
 
나열하면 다음과 같다.
 
<pre>
 
<pre>
__abs__ __add__ __aenter__ __aexit__ __aiter__
+
__abs__       __add__       __aenter__     __aexit__    
__and__ __anext__ __annotations__ __await__ __bases__
+
__aiter__     __and__       __anext__     __annotations__
__bool__ __bytes__ __call__ __ceil__ __class__
+
__await__     __bases__     __bool__       __bytes__    
__classcell__ __closure__ __code__ __complex__ __contains__
+
__call__       __ceil__       __class__     __classcell__ 
__defaults__ __del__ __delattr__ __delete__ __delitem__
+
__closure__   __code__       __complex__   __contains__  
__dict__ __dir__ __divmod__ __doc__ __enter__
+
__defaults__   __del__       __delattr__   __delete__    
__eq__ __exit__ __file__ __float__ __floor__
+
__delitem__   __dict__       __dir__       __divmod__    
__floordiv__ __format__ __func__ __future__ __ge__
+
__doc__       __enter__     __eq__         __exit__      
__get__ __getattr__ __getattribute__ __getitem__ __globals__
+
__file__       __float__     __floor__     __floordiv__ 
__gt__ __hash__ __iadd__ __iand__ __ifloordiv__
+
__format__     __func__       __future__     __ge__        
__ilshift__ __imatmul__ __imod__ __import__ __imul__
+
__get__       __getattr__   __getattribute____getitem__   
__index__ __init__ __instancecheck__ __int__ __invert__
+
__globals__   __gt__         __hash__       __iadd__      
__ior__ __ipow__ __irshift__ __isub__ __iter__
+
__iand__       __ifloordiv__ __ilshift__   __imatmul__  
__itruediv__ __ixor__ __kwdefaults__ __le__ __len__
+
__imod__       __import__     __imul__       __index__     
__lshift__ __lt__ __matmul__ __missing__ __mod__
+
__init__       __instancecheck____int__        __invert__    
__module__ __mro__ __mul__ __name__ __ne__
+
__ior__       __ipow__       __irshift__   __isub__      
__neg__ __new__ __next__ __objclass__ __or__
+
__iter__       __itruediv__   __ixor__       __kwdefaults__  
__pos__ __pow__ __prepare__ __qualname__ __radd__
+
__le__         __len__       __lshift__     __lt__        
__rand__ __rdivmod__ __repr__ __reversed__ __rfloordiv__
+
__matmul__     __missing__   __mod__       __module__   
__rlshift__ __rmatmul__ __rmod__ __rmul__ __ror__
+
__mro__       __mul__       __name__       __ne__        
__round__ __rpow__ __rrshift__ __rshift__ __rsub__
+
__neg__       __new__       __next__       __objclass__  
__rtruediv__ __rxor__ __self__ __set__ __setattr__
+
__or__         __pos__       __pow__       __prepare__  
__setitem__ __slots__ __str__ __sub__ __subclasscheck__
+
__qualname__   __radd__       __rand__       __rdivmod__  
__traceback__ __truediv__ __trunc__ __weakref__ __xor__
+
__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__  
 
</pre>
 
</pre>
 +
<code>grep -ho -e '__[a-z]*__' x.txt | sort -u | xargs -n 4 printf '%-15s%-15s%-15s%-15s\n'</code>
  
 
==2.7과 3.6 동시에 쓰기==
 
==2.7과 3.6 동시에 쓰기==

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

재정의

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

__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__   

grep -ho -e '__[a-z]*__' x.txt | sort -u | xargs -n 4 printf '%-15s%-15s%-15s%-15s\n'

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