Hatena::Grouppython

Pythonの覚書

2013-04-09

組み込み関数の一覧を作成する良い方法を知っている人いたら教えて下さい><

| 13:50 | 組み込み関数の一覧を作成する良い方法を知っている人いたら教えて下さい>< - Pythonの覚書 を含むブックマーク はてなブックマーク - 組み込み関数の一覧を作成する良い方法を知っている人いたら教えて下さい>< - Pythonの覚書 組み込み関数の一覧を作成する良い方法を知っている人いたら教えて下さい>< - Pythonの覚書 のブックマークコメント

__builtins__っていうモジュールが組み込みデータ型や組込み関数を持っているということはわかった。

dir()で調べてみる。

>>> dir(__builtins__)
['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException', 'BufferError', 'BytesWarning', 'DeprecationWarning', 'EOFError', 'Ellipsis', 'EnvironmentError', 'Exception', 'False', 'FloatingPointError', 'FutureWarning', 'GeneratorExit', 'IOError', 'ImportError', 'ImportWarning', 'IndentationError', 'IndexError', 'KeyError', 'KeyboardInterrupt', 'LookupError', 'MemoryError', 'NameError', 'None', 'NotImplemented', 'NotImplementedError', 'OSError', 'OverflowError', 'PendingDeprecationWarning', 'ReferenceError', 'RuntimeError', 'RuntimeWarning', 'StandardError', 'StopIteration', 'SyntaxError', 'SyntaxWarning', 'SystemError', 'SystemExit', 'TabError', 'True', 'TypeError', 'UnboundLocalError', 'UnicodeDecodeError', 'UnicodeEncodeError', 'UnicodeError', 'UnicodeTranslateError', 'UnicodeWarning', 'UserWarning', 'ValueError', 'Warning', 'ZeroDivisionError', '_', '__debug__', '__doc__', '__import__', '__name__', '__package__', 'abs', 'all', 'any', 'apply', 'basestring', 'bin', 'bool', 'buffer', 'bytearray', 'bytes', 'callable', 'chr', 'classmethod', 'cmp', 'coerce', 'compile', 'complex', 'copyright', 'credits', 'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval', 'execfile', 'exit', 'file', 'filter', 'float', 'format', 'frozenset', 'getattr', 'globals', 'hasattr', 'hash', 'help', 'hex', 'id', 'input', 'int', 'intern', 'isinstance', 'issubclass', 'iter', 'len', 'license', 'list', 'locals', 'long', 'map', 'max', 'memoryview', 'min', 'next', 'object', 'oct', 'open', 'ord', 'pow', 'print', 'property', 'quit', 'range', 'raw_input', 'reduce', 'reload', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice', 'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', 'unichr', 'unicode', 'vars', 'xrange', 'zip']

この中から、組込み関数だけ抽出したいのだが上手く行かない。

id:Alice1017さんにご教授いただき、組込み関数だけ取得できました。

たぶん、漏れはないはず。

サンプルコード

>>> for attr in dir(__builtin__):
    f = getattr(__builtin__,attr)
    if isinstance(f,types.BuiltinFunctionType):
        print attr
...         
__import__
abs
all
any
apply
bin
callable
chr
cmp
coerce
compile
delattr
dir
divmod
eval
execfile
filter
format
getattr
globals
hasattr
hash
hex
id
input
intern
isinstance
issubclass
iter
len
locals
map
max
min
next
oct
open
ord
pow
print
range
raw_input
reduce
reload
repr
round
setattr
sorted
sum
unichr
vars
zip

~以下、更新前~

命名規則による分類

大文字で始まっている定義は、文字列。

小文字ではじまっているのが、関数なのではないか?と短絡的に考えていたのだけれども、strなど、データ型の名前も小文字ではじまっているではないか・・・。ってことで、命名規則では分類出来ない。

isinstanceで型チェック

type()や、isinstance(obj,typeinfo)でチェックするのが王道だなと思い、以下を試す。

>>> import types
>>> for attr in dir(__builtins__):
...     if isinstance(attr,types.BuiltinFunctionType):
...             print attr
... 

見事に空振り。なぜなら、dir()が返却するのは、名前つまりstrなんです・・・。

>>> type(sum)
<type 'builtin_function_or_method'>

↑のようにfunctionの型を返却してくれると期待していただけにショック。

callableでチェック

>>> for attr in dir(__builtin__):
...     if callable(attr):
...         print attr
...  

これも見事に空振り。

これも理由は同じで、dir()が返却するのは、名前つまりstrだから。

ついでに、関数以外でもcallableがTrueを返却するんで、関数だけ抽出出来ないし・・・。

evalを使う

dir()が文字列で返却すると、こうなったらeval使うしかないなと思い以下を試す。

>>> for attr in dir(__builtin__):
    if eval('isinstance('+attr+',types.BuiltinFunctionType)'):
        print attr,
...         
__import__ abs all any apply bin callable chr cmp coerce compile delattr dir divmod eval execfile filter format getattr globals hasattr hash hex id input intern isinstance issubclass iter len locals map max min next oct open ord pow  File "<string>", line 1
    isinstance(print,types.BuiltinFunctionType)
                   ^
SyntaxError: invalid syntax

printのところで怒られる。。。どうしようか。。。

Alice1017Alice10172013/04/10 17:46初めまして。コメント失礼します。

for attr in dir(__builtins__):
... if isinstance(attr,types.BuiltinFunctionType):
... print attr

この処理で、isinstanceの前に getattr(__builtins__, attr)で関数そのものを取得すればいいんじゃないかと思います
まだコンソールで試してないのですが、動くと思います。

for attr in dir(__builtins__):
... f = getattr(__builtins__, attr)
... if isinstance(f,types.BuiltinFunctionType):
... print attr

oneshotlife_tomoneshotlife_tom2013/04/11 20:40>Alice1017さん
コメントありがとうございます。
ご教授いただいた通りで期待通りの動作をしました。
勉強になりました。

xvwioxqsfqxvwioxqsfq2014/04/12 20:59wbtmvqzuipo, <a href="http://www.cabtgppukz.com/">ajnbtjwxfz</a> , [url=http://www.xcwogexcne.com/]ooupkwdktj[/url], http://www.blrwbwlcoy.com/ ajnbtjwxfz

2013-04-03

Windows7にIPythonをインストールする

| 22:45 | Windows7にIPythonをインストールする - Pythonの覚書 を含むブックマーク はてなブックマーク - Windows7にIPythonをインストールする - Pythonの覚書 Windows7にIPythonをインストールする - Pythonの覚書 のブックマークコメント

主にLinuxPythonを使っているが、Windowsでも使ってみたくなって、ついにインストールした。

Pythonのインストール

http://www.python.org/download/

ここから自分の環境に合ったものをインストールして下さい。

自分は、

  • Python 2.7.3 Windows Installer (Windows binary -- does not include source)

をインストールしました。

IPythonのインストール

http://epd-free.enthought.com/

ここから自分の環境に合ったものをインストールして下さい。

自分は、

をインストールしました。

pyreadlineのインストール

https://pypi.python.org/pypi/pyreadline

ここから自分の環境に合ったものをインストールして下さい。

IPythonを実行したらこのライブラリも必要だと言われたため、インストールしました。

自分は、

  • pyreadline-1.7.1.win32.exe (md5)

をインストールしました。

動作確認

$ipython
Python 2.7.3 (default, Apr 10 2012, 23:31:26) [MSC v.1500 32 bit (Intel)]
Type "copyright", "credits" or "license" for more information.

IPython 0.13.1 -- An enhanced Interactive Python.
?         -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help      -> Python's own help system.
object?   -> Details about 'object', use 'object??' for extra details.

In [1]: print "Hello,World!"
Hello,World!

In [2]:

ちゃんと動いたっぽい。

2013-03-24

Pythonでビット演算(1)2進数表現 def printbin(num,width):print str(bin(num))[2:].zfill(width)

| 22:52 | Pythonでビット演算(1)2進数表現 def printbin(num,width):print str(bin(num))[2:].zfill(width) - Pythonの覚書 を含むブックマーク はてなブックマーク - Pythonでビット演算(1)2進数表現 def printbin(num,width):print str(bin(num))[2:].zfill(width) - Pythonの覚書 Pythonでビット演算(1)2進数表現 def printbin(num,width):print str(bin(num))[2:].zfill(width) - Pythonの覚書 のブックマークコメント

Pythonでビット演算をする必要は無いんだけど、手元にある一番手軽で高機能なCUI環境がIPythonなんで、ついついPythonでやっちまうよね。ビット演算やる前に、2進数表記をしこたま研究しないと使い物にならんぞこれ。

1~10までを2進数表記

>>> for i in range(0,11):print bin(i)
0b0
0b1
0b10
0b11
0b100
0b101
0b110
0b111
0b1000
0b1001
0b1010

この表記も悪くないな。でもビット演算するには邪魔者がいる。先頭の0bが邪魔だ。

>>> for i in range(0,11):print str(bin(i))[2:]
0
1
10
11
100
101
110
111
1000
1001
1010

strでキャストして、2文字目以降を出力している。でも、やっぱ桁数併せたいよね・・・。

>>> for i in range(0,11):print str(bin(i))[2:].zfill(4)
0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010

str.zfill(桁数)で桁数併せられるっぽい。

関数化してみるか・・・。

>>> def printbin(num,width):
    print str(bin(num))[2:].zfill(width)
... 
>>> 
>>> printbin(0,4)
0000
>>> printbin(7,4)
0111

こんなもんでどうでしょうか?

2012-12-04

複数の変数を左辺値に取って、リストを代入する。

22:15 | 複数の変数を左辺値に取って、リストを代入する。 - Pythonの覚書 を含むブックマーク はてなブックマーク - 複数の変数を左辺値に取って、リストを代入する。 - Pythonの覚書 複数の変数を左辺値に取って、リストを代入する。 - Pythonの覚書 のブックマークコメント

これって便利な使い方だよね!コマンドライン引数とか取るときに使えそう。

>>> argv =[]
>>> argv.append('arg1')
>>> argv.append('arg2')
>>> arg1,arg2 = argv
>>> arg1
'arg1'
>>> arg2
'arg2'
>>> 

あんまり良い例とは言えないんだけど(実際にコマンドライン引数を取るにはsysをインポートしたり、可変個引数を取ったりする必要あり),複数の変数を左辺値に取って、リストを代入(リストのスライスかな)出来る説明としては、この辺で勘弁してください。

Python哲学 The Zen of Python

| 22:05 | Python哲学 The Zen of Python - Pythonの覚書 を含むブックマーク はてなブックマーク - Python哲学 The Zen of Python - Pythonの覚書 Python哲学 The Zen of Python - Pythonの覚書 のブックマークコメント

最近知ったのだけれども、裏コマンドみたいな?やつ。

Pythonの哲学が好きでPythonで書いているんだけど、そのオリジナルのドキュメント。

>>> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!

Pythonの組み込み関数一覧(builtin functions)

| 21:43 | Pythonの組み込み関数一覧(builtin functions) - Pythonの覚書 を含むブックマーク はてなブックマーク - Pythonの組み込み関数一覧(builtin functions) - Pythonの覚書 Pythonの組み込み関数一覧(builtin functions) - Pythonの覚書 のブックマークコメント

意外と簡単に網羅出来た。

一応バージョンは以下

Python 2.7.3 (default, Apr 10 2012, 23:31:26) [MSC v.1500 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
まず、locals()関数を呼び出す。
>>> locals()
{'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', '__doc__': None, '__package__': None}

'__builtins__'の中に組み込み関数や予約語の定義がある。

dir()で見る。

Pythonの命名規則で、定義は大文字からはじまり、関数は小文字から始まるようになっている様子。(たぶん・・・)

>>> for spam in dir(__builtins__):
	print spam

	
ArithmeticError
AssertionError
AttributeError
BaseException
BufferError
BytesWarning
DeprecationWarning
EOFError
Ellipsis
EnvironmentError
Exception
False
FloatingPointError
FutureWarning
GeneratorExit
IOError
ImportError
ImportWarning
IndentationError
IndexError
KeyError
KeyboardInterrupt
LookupError
MemoryError
NameError
None
NotImplemented
NotImplementedError
OSError
OverflowError
PendingDeprecationWarning
ReferenceError
RuntimeError
RuntimeWarning
StandardError
StopIteration
SyntaxError
SyntaxWarning
SystemError
SystemExit
TabError
True
TypeError
UnboundLocalError
UnicodeDecodeError
UnicodeEncodeError
UnicodeError
UnicodeTranslateError
UnicodeWarning
UserWarning
ValueError
Warning
WindowsError
ZeroDivisionError
_
__debug__
__doc__
__import__
__name__
__package__
abs
all
any
apply
basestring
bin
bool
buffer
bytearray
bytes
callable
chr
classmethod
cmp
coerce
compile
complex
copyright
credits
delattr
dict
dir
divmod
enumerate
eval
execfile
exit
file
filter
float
format
frozenset
getattr
globals
hasattr
hash
help
hex
id
input
int
intern
isinstance
issubclass
iter
len
license
list
locals
long
map
max
memoryview
min
next
object
oct
open
ord
pow
print
property
quit
range
raw_input
reduce
reload
repr
reversed
round
set
setattr
slice
sorted
staticmethod
str
sum
super
tuple
type
unichr
unicode
vars
xrange
zip
>>> 

HeatherHeather2013/03/15 16:24That's really thininkg of the highest order

kqljbqczdigkqljbqczdig2013/03/17 10:46hFKdyd , [url=http://bsfrfqwkvlph.com/]bsfrfqwkvlph[/url], [link=http://dihwrdrcbnip.com/]dihwrdrcbnip[/link], http://kepbyvbburai.com/

ojznuoojznuo2013/03/18 21:09UxNW0Z <a href="http://sfwavnxqxycb.com/">sfwavnxqxycb</a>

nldvshapclknldvshapclk2013/03/19 07:09Ciqxgl , [url=http://qwtefnzopzhp.com/]qwtefnzopzhp[/url], [link=http://julzfsaydoxt.com/]julzfsaydoxt[/link], http://oprebholqtnw.com/

2012-11-27

NoneTypeの型判定

18:48 | NoneTypeの型判定 - Pythonの覚書 を含むブックマーク はてなブックマーク - NoneTypeの型判定 - Pythonの覚書 NoneTypeの型判定 - Pythonの覚書 のブックマークコメント

type(spam)の戻り値で型判定をやっていたが、それは古い方法らしい。ほんとか?

isinstance()を使うのが新しいやり方らしい。

ちょっと使ってみた。

せっかくなんで、NoneTypeかどうかの型判定をしてみた。

nにNoneを代入

>>> n=None

nの値を出力

>>> n

何も返却されない

nの型を出力

>>> type(n)
<type 'NoneType'>

NoneTypeであるようだ。

nとNoneTypeを型判定

>>> isinstance(n,NoneType)

Traceback (most recent call last):
  File "<pyshell#3>", line 1, in <module>
    isinstance(n,NoneType)
NameError: name 'NoneType' is not defined

NoneTypeは未定義と怒られた・・・。

んじゃ、Noneと比較すればいいのか?!

nとNoneを型判定

>>> isinstance(n,None)

Traceback (most recent call last):
  File "<pyshell#4>", line 1, in <module>
    isinstance(n,None)
TypeError: isinstance() arg 2 must be a class, type, or tuple of classes and types

クラスか型かタプルが引数として必要だと怒られた。


nとtype(None)を型判定

>>> isinstance(n,type(None))
True

これはTrueらしい。

使い方が間違っているかもしれないが、

isinstance(n,type(None))でNoneかどうかのチェックは出来そう。

CとかJavaで言うところのnullチェック的な。

Alice1017Alice10172012/11/28 16:10PythonでNoneかどうかを判定するなら==演算子を使えばできますよ。

>>> a = None
>>> if a == None:
... print "None"
...
None

oneshotlife_tomoneshotlife_tom2012/12/01 23:50>>Alice1017さん
コメントありがとうございます。
Noneの場合は、isとか==で比較出来るわけですね。

これがstrとかの場合だと、
>>> s = "Hello"
>>> s is str
False
>>> s == str
False

判定出来ないわけで。

この場合は、
>>> isinstance(s,str)
True

で、判定出来る。

Noneの場合と、その他のデータ型の場合で、判定の手段とかが違うのが、ちょっと違和感有りです。Noneだけ特殊だとか、扱いが違うとか、そういうことなんでしょうね。おそらく。

>>> type(str)
<type 'type'>
>>> type(None)
<type 'NoneType'>

type()で型を調べると、
データ型が違いますもんね。

isinstance()はあくまでtype'type'の型判定のためのものだと理解しておきます。

また何かありましたら、ご教授下さい。

oneshotlife_tomoneshotlife_tom2012/12/01 23:51ちょっとテスト。

コメント欄でもはてな記法使えるのかどうかを勝手にテスト。
>|python|
print "Hello,World!"
||<

oneshotlife_tomoneshotlife_tom2012/12/01 23:52↑やっぱ、使えないのか・・・。

XoshnavXoshnav2013/06/18 06:18Thanks for helnipg me to see things in a different light.

ifcxybnvifcxybnv2013/06/19 20:49IfdMVM , [url=http://qbpzpovsazkz.com/]qbpzpovsazkz[/url], [link=http://sulrbigmavnu.com/]sulrbigmavnu[/link], http://isbrpvuyavkk.com/

zmvkwixhzmvkwixh2013/06/19 20:49uhEg9I , [url=http://kzsznztevnvv.com/]kzsznztevnvv[/url], [link=http://oxssicjrifgt.com/]oxssicjrifgt[/link], http://mpqoeqfzxptm.com/

lkzjtblkzjtb2013/06/20 04:461lXH0s <a href="http://fcfxgrurhzcd.com/">fcfxgrurhzcd</a>