1. ホーム
  2. パイソン

断片的なpythonの学習メモ(I) - 20121202

2022-02-28 13:49:52

今日からpythonの勉強を始めたんだ・・・。ずっと前から学びたかったんだけど、時間がなかったんだ

OKスタート...


トリプルクォートで複数行の文字列を定義する。

では、3つの引用符(''または"")を連続して表示したい場合、エスケープ文字はどのように使えばよいのでしょうか。

をテストします。すでに3つの引用符で始まっている複数行の文字列では、エスケープ文字+3つの引用符を使えばいいのです。

a = '''a'''b'''
を印刷する

出力します。

a'''b

しかし、上記の例でbがない場合、インタプリタは次のように解釈します。

''' + a + \' + ''' + ' + '

つまり、複数行の文字列 a' と空の文字列がマージされ、次のような結果になります。

a'

文字列が一重引用符で定義されている場合、文字列内の二重引用符は特別な意味を持たず、エスケープする必要はない。

その逆も同様です。

トリプルクォートも同様です。


r+ 文字列を使用して自然な文字列を定義する。

a = r'\ntr'

u+ 文字列を使用して Unicode 文字列を定義すること。

# coding=GBK

...

a = u've started with'

Unicodeで自然な文字列を定義するのはどうでしょうか?

テストの結果、ur+の文字列を使用する必要があります。

ru+の文字列はエラーが報告されます。

a = ur 'has \n to'


<スパン オブジェクト指向プログラミングをご利用の方へのコメント
Pythonは、数値や文字列、関数まで含めてすべてがオブジェクトであるという意味で、極めて完全なオブジェクト指向である。

つまり、これはjavaとは違うということです


チュートリアルに「++」演算子が記載されていません。

テストの結果、以下のことが判明しました。

i++が動作しない:エラーが報告される

++iはエラーを報告しませんが、何もしていないようで、iの値は変わりません。

だから......残念ながら、++はない -- 本当に不愉快だ、やってみよう。

** は電源用です。

// 割り算と同じだが、商を丸める。

>>と<<のビットシフト左右が残っています。よかったー。

&&, || and !はandに、or and notはnotに、まあその方が読みやすいかもしれませんね。


改行する。

Pythonでは、セミコロンを行の区切りとして使うことができます......また、複数の文を1行に書かない場合は、セミコロンなしでも使うことができます。


変数の命名にはまだ自由度があります。テストが書ける。

真=偽
がTrueの場合。
    print 'xxxx'

解釈が通る、つまり新しい変数Trueは偽の値(False)で定義される

入力結果 print 'xxxx' は実行されませんでした。

と書くこともできる。

偽=真
真=偽
がTrueの場合。
    print 'xxxx'

出力は xxxx と表示される

さて......このようなコードに出くわさないことを祈ります。

では、上記の例のようにグローバル定義が上書きされた場合はどうでしょうか?

を使えばいいと思います。

真=1==1
偽=1!=1

元に戻す。でも、他にもっといい方法はないのでしょうか?

そこで、stackoverflowに質問を投稿しました。誰かが答えてくれるといいのですが・・・・・・。 リンクはこちら .

To Be Continued ... じっくりとお読みください


-更新:stackoverflowは本当に効率的で、誰かがすでに回答しています。

方法1、直接

del 真

デルファルス

元の値に戻すだけ。

方法2、__buildin__.True/Falseを使用する場合

学習した。


Pythonはまだこのようなことが絡み合っているので、言語を学ぶ際には、最初からこのような絡みを解消しておくといいと思います。

いくつかの拡張リファレンス。

とは、==である。

== 値が等しいかどうかを比較する

は、同じオブジェクトを指しているかどうかを比較します。

これらは、Javaの == や object.equals()/compareTo() メソッドのようなものです(では、Pythonのクラスで同様のメソッドを定義することは可能なのでしょうか?調査中)

Pythonの定義済み型(例えばjavaのプリミティブ型を意味する)に対して、以下のことがテストされています。 であるようです。 は文字列と同じように扱われます。つまり、リテラルは実際には読み取り専用で、同じ値を持つすべての変数は実際には同じオブジェクトを指し、変数の値を変更すると実際にはそれが指すアドレスが変更されます(おそらく?)。(深く研究していない)。このことは、次のような事実によって証明される。

a = 3
b = 3
print a == b

print a is b

結果

同じオブジェクトを指しているように見えることを示す。

ただし、その場合は

a = 3

b = 3.0

print a == b

print a is b

結果

型が違うのですから、当然指されたオブジェクトも違います。

(より正確な記述を探すために Pythonのすべての組み込みオブジェクト(文字列、リスト、ディクショ ン、関数など)に対して、xがyならx==yも真です。 )


そうすると、Pythonの定義では、0でない、NULLでないすべての変数は、次のようになります。 が決定されます。 を真とする

ここでtrueと判断しても、trueとイコールになるわけではありません。

if 'aaa':

   何かする

do somethingのコードが実行されます。

しかし

if 'aaa'==True: (または'aaa'がTrueの場合)

  何かする

それはないでしょう。


うーん、うーん。

もうひとつ、もつれの原因になる可能性があるのが、演算子の優先順位の問題です。チュートリアルによると

演算子は通常、左から右に結合されます。つまり、同じ優先順位を持つ演算子は、左から右の順に評価されます。たとえば 2 + 3 + 4 は次のように計算されます。 (2 + 3) + 4 <スパン . 代入演算子のように、右から左へ組み合わせる演算子もあります。 a = b = c として処理されます。 a = (b = c) .

これを書いている間にお腹が空いてきた......本当にお腹が空いた。


まあ、switch文はないんですけどね・・・・。


うーん、whileループの後にelseをつけることができる......これは不思議で、とても楽しく遊べそうです。チュートリアルによると else ブロックは、中の文を同じブロックに入れることができるので、実は冗長なのです (as the while (同じ)に続いて while 文の後に

更新:ここに誤謬がある。公式チュートリアルによると: ループの  <スパン さもなければ  がない場合に実行されます。  ブレーク  が発生します。

教科書はやはりオリジナルでないとダメみたいですね・・・。

はは

do... ...whileは?見てませんでしたね。

while True ... if ... :break

を実装する。


for ... in ... ループ: これは matlab の for ループに非常によく似ています。しかし、C++ほど柔軟ではない?C++やjavaの柔軟なforループは、慣れるとやはりとても便利です。


忘れかけていた、重要かつ根本的な問題:インプットとアウトプット

s = 
raw_input
(
'Enter something : '

)

または

guess = 
int
(
raw_input
(
'Enter an integer : '
))



出力は直接印刷されます

ファイルの入出力については、後述します。


関数内でグローバル変数を宣言する - これは本当に使い心地が悪いです。宣言と同等であるべきで、変数の定義は宣言の後でも前でもいい。


キーパラメータ - これは本当にすごい。たくさんのオーバーロードされた関数を書く必要はありません。

手抜きで、チュートリアルの例を使ってみましょう。

def 
func
(a, b=
5
, c=
10
):



    print 
'a is'
, a, 
'and b is'
, b, 
'and c is'
, c






func(
3
, 
7
)



func(
25
, c=
24
)



func(c=
50
, a=
100
)



重要な警告です。  デフォルト値は一度だけ評価されます。これは、デフォルトがリスト、ディクショナリ、またはmostのインスタンスのような変更可能なオブジェクトである場合に違いが生じます。 例えば、次の関数は、その後の呼び出しで渡された引数を蓄積していきます。

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

print f(1)
print f(2)
print f(3)


これは、次のように印刷されます。

[1]
[1, 2]
[1, 2, 3]


もしデフォルトを以降の呼び出しで共有したくない場合は、代わりにこのような関数を書くことができます。

def f(a, L=None):
    if L is None:
        L = []
    L.append(a)
    return L

関数を呼び出すには  キーワード引数  形式の  kwarg=value . 例えば、次のような関数です。

def parrot(voltage, state='a stiff', action='voom', type='Norwegian Blue'):
    print "-- This parrot wouldn't", action,
    print "if you put", voltage, "volts through it."
    print "-- Lovely plumage, the", type
    print "-- It's", state, "! "


は、1つの必須引数 ( <スパン 電圧 ) と3つのオプション引数 ( 状態 アクション であり、かつ  タイプ ). この関数は、以下のいずれかの方法で呼び出すことができます。

parrot(1000) # 1 positional argument
parrot(voltage=1000) # 1 keyword argument
parrot(voltage=1000000, action='VOOOOOM') # 2 keyword arguments
parrot(action='VOOOOOM', voltage=1000000) # 2 keyword arguments
parrot('a million', 'bereft of life', 'jump') # 3 positional arguments
parrot('a thousand', state='pushing up the daisies') # 1 positional, 1 keyword


が、以下の呼び出しはすべて無効となる。

parrot() # required argument missing
parrot(voltage=5.0, 'dead') # non-keyword argument after a keyword argument
parrot(110, voltage=220) # duplicate value for the same argument
parrot(actor='John Cleese') # unknown keyword argument


関数呼び出しでは、キーワード引数は位置引数の後に続かなければなりません。渡されたすべてのキーワード引数は、関数が受け入れる引数のひとつと一致しなければなりません(たとえば  俳優  は有効な引数ではありません。  オウム  関数) であり、その順序は重要ではありません。また、オプションでない引数(例えば  parrot(voltage=1000)  も有効です)。どの引数も2回以上値を受け取ってはならない。

def cheeseshop(kind, *arguments, **keywords):
    print "-- Do you have any", kind, "? "
    print "-- I'm sorry, we're all out of", kind
    for arg in arguments:
        print arg
    print "-" * 40
    keys = sorted(keywords.keys())
    for kw in keys:
        print kw, "": ", keywords[kw]


このように呼ぶことができる。

cheeseshop("Limburger", "It's very runny, sir.",
           "It's really very, VERY runny, sir.",
           shopkeeper='Michael Palin',
           client="John Cleese",
           sketch="Cheese Shop Sketch")

なお、ここでの引数リストのdict, keyの部分は引用符で囲まれていませんが、pythonが自動的に文字列に変換してくれているようです。キーは確かに関数内に文字列として格納されています。

その代わり、引用符を付けるとエラーになります。

>> チーズショップ("Limburger", "It's very runny, sir."),
           本当にとても、とても水っぽいです。
           'shopkeeper'='Michael Palin',
           'client'="John Cleese"。
           'sketch'="Cheese Shop Sketch")
SyntaxError: キーワードは式にはできません。

キーワードにスペースが含まれています。

>> チーズショップ("Limburger", "水気が多いですねぇ。
           本当にとても、とても水っぽいです。
           shop keeper='Michael Palin'です。
           client="ジョン・クリーズ"。
           sketch="Cheese Shop Sketch")
SyntaxError: 構文が無効です。

また、dict定義の構文を使用してもエラーが発生しました。

>> cheeseshop("Limburger", "It's very runny, sir."),
           本当にとても、とても水っぽいです。
           'shop keeper':'Michael Palin',
           'クライアント':"ジョン・クリーズ",
           'sketch':"Cheese Shop Sketch")
SyntaxError: 構文が無効です。

ふむふむ。これは本当にキーワード引数変数 input の実装に過ぎず、入力が dict であることは理解されないはずです。

文書の文字列。

文書文字列の規約は、複数行の文字列で、1行目は大文字で始まり、ピリオドで終わります。2行目は空白行、3行目以降は詳細説明となる。 

javadocとほぼ同様ですが、全く同じではありません。


うーん、ちょっと疲れた、とりあえずここまで。