"Python"의 두 판 사이의 차이
1번째 줄: | 1번째 줄: | ||
+ | ==<code>__call__</code>== | ||
+ | <pre>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__</pre> | ||
+ | [https://stackoverflow.com/a/9663601/766330] | ||
+ | |||
==jupyter notebook matplotlib on OSX== | ==jupyter notebook matplotlib on OSX== | ||
Insert below code at the head of the note. | Insert below code at the head of the note. |
2018년 3월 27일 (화) 10:27 판
목차
- 1 __call__
- 2 jupyter notebook matplotlib on OSX
- 3 한글외 문자 제거
- 4 ternary operator
- 5 print color to terminal stdout
- 6 filter
- 7 ipython (jupyter notebook)
- 8 Multiple input stream
- 9 file position
- 10 Interactive session detection
- 11 Temporary file or directory
- 12 Check syntax without running
- 13 Time
- 14 String replace
- 15 is and ==
- 16 Access index in for loop
- 17 Max integer
- 18 Argument parsing
- 19 range by step
- 20 File existence
- 21 Define source code encoding
- 22 encoding
- 23 Reading another encoding from a file
- 24 randint
- 25 groupby example
- 26 Suppress scientific notation
- 27 To ignore exception
- 28 Delete items from a dictionary while iterating over it
- 29 Print without newline
- 30 if else in list comprehension
- 31 filtering a dictionary according to an arbitrary condition
- 32 Executing multi-line statements within PDB
- 33 Converting a IPython Notebook into a Python file via commandline
- 34 Write float(or int) to a binary file
- 35 cross reference between files
__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__
jupyter notebook matplotlib on OSX
Insert below code at the head of the note.
import matplotlib as mpl mpl.use('TkAgg')
한글외 문자 제거
hangul = re.compile('[^ ㄱ-ㅣ가-힣]+') # 한글과 띄어쓰기를 제외한 모든 글자 # hangul = re.compile('[^ \u3131-\u3163\uac00-\ud7a3]+') # 위와 동일 result = hangul.sub('', target_text) # 한글과 띄어쓰기를 제외한 모든 부분을 제거
ternary operator
a if condition else b
print color to terminal stdout
print('\x1b[6;30;42m' + 'Success!' + '\x1b[0m')
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'])
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”
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'
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
Access index in for loop
enumerate
for idx, val in enumerate(ints): print(idx, val)
Max integer
sys.maxint
python 3에서는 안된다고 한다. 어차피 안쓰니 상관없지만 그래서 다음과 같이 한다고.
import sys max = sys.maxsize min = -sys.maxsize
다음도 간단하고 좋은 것 같다. 2,3에서 모두 동작
float('inf') float('-inf')
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]
File existence
os.path.exists(file_path)
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 *