Create  Edit  Diff  FrontPage  Index  Search  Changes  Login

PythonSucks

基本的な入出力

print のクソっぷりは 3000 で解決するらしい。

print が文

>>> map(str, [1,2])
['1', '2']
>>> map(print, [1,2])
  File "<stdin>", line 1
    map(print, [1,2])
            ^
SyntaxError: invalid syntax

print とコンマ

print "abc",
print "def",

は "abc def" と出力した後でインタプリタ終了時に改行が足されるって感じか。

print "abc\n",
print "def\n",

は "abc\ndef\n" なのである。

raw_input("hoge") とかで出力もできる

まともな標準入出力は

import sys
sys.stdout.write("Hello, world!\n")

めんどくさいなぁ。

input

一行入力して「evalして」かえす関数

sys.exit('foo')

foo と出力してから exit(1)

一つのことは一つの方法で

リスト内包表記と map

>>> [x+1 for x in [1,2]]
[2, 3]
>>> map(lambda x: x+1, [1,2])
[2, 3]

もちろん普通にループを書いても良い

引数

>>> len("hoge")
4
>>> len("hoge",)
4

クォート

"hoge\n" と 'hoge\n' は同じ意味。

not in 演算子

>>> 2 not in [1,2]
False
>>> not 2 in [1,2]
False

is not 演算子

>>> type("") is not str
False
>>> not type("") is str
False
>>> type("") not is str
  File "<stdin>", line 1
    type("") not is str
                  ^
SyntaxError: invalid syntax

デフォルト引数

一度しか初期化されない。

def f(a=[]):
    a.append(1)
    return a

print f()
print f()  # [1, 1]

タプル

1要素タプル

空タプルは () 。 2要素タプルは (1, 2) 。 1要素は (1,)

タプルと % 演算子

ごく稀にびっくりする

>>> "%s" % [1,2]
'[1, 2]'
>>> "%s" % (1,2)
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
TypeError: not all arguments converted during string formatting

assert

Warning 出してくれるから被害は起きにくい

>>> assert(False, 'message!')
<stdin>:1: SyntaxWarning: assertion is always true, perhaps remove parentheses?

標準ライブラリ

スーパー便利関数 str#title()

>>> "abc def".title()
'Abc Def'
>>> "wendy's".title()
"Wendy'S"

どのモジュールに?

os.chdir, os.path.dirname, sys.stdout, __builtin__.open

悪くもないんだけど、覚えられない。

os.removedirs vs rm -rf

 removedirs(name)
       removedirs(path)

       Super-rmdir; remove a leaf directory and all empty intermediate
       ones.  Works like rmdir except that, if the leaf directory is
       successfully removed, directories corresponding to rightmost path
       segments will be pruned away until either the whole path is
       consumed or an error occurs.  Errors during this latter phase are
       ignored -- they generally mean that a directory was not empty.

定番

self

self 多い。

class C:
    def f(self):
        print 'hoge'
    def g(self):
        f()   # NameError: global name 'f' is not defined
C().g()

個人的には下記のケースの方がエラーメッセージで混乱する。

class C:
    def f():
        print 'hoge'
    def g(self):
        self.f()  # TypeError: f() takes no arguments (1 given)
C().g()

del と len

これらが obj.del や obj.len で無いという文句も定番。 del 予約語は 3000 で消えるらしい。

list comprehension と lambda

>>> fs = [ lambda: i for i in range( 8 ) ]
>>> fs[0]()
7
>>> i = 3
>>> fs[0]()
3

文字列リテラル

>>> 'r'=='r'
True
>>> 'r'==''r''
False
>>> 'r'=='''r'''
True
>>> 'r'==''''r''''
  File "<stdin>", line 1
    'r'==''''r''''
                 ^
SyntaxError: EOL while scanning string literal
>>> 'r'=='''''r'''''
False
>>> 'r'==''''''r''''''
False
>>> 'r'=='''''''r'''''''
True
>>> 'r'==''''''''r''''''''
False
>>> 'r'=='''''''''r'''''''''
True
Last modified:2016/09/09 01:53:33
Keyword(s):
References:[FrontPage]