前回の続き。
今回は1-3くらいから。
ifとelseにコロンが付く。それとelif。
if a > b:
return a
return b
一瞬「コロンをつけるのはswitch-case文と整合を取るため?」と思ったけど、switch文は無いらしい。行末のセミコロンが無くて喜んだのに別の記号が増えた
コロンは心の中で「then」と読むことにしました。
NullじゃなくてNone
Nullは存在しないらしい。
type(None)
は「NoneType」と表示されたから、型としてもNone(ふんわりした理解)。
Noneは左辺に代入できる。ただし == で比較しないでisを使う。
VBAでif foobar is Nothing
があったから、あの感じかな(ふんわり)。
文字列のスライスが多機能(ただし初心者には多機能すぎる)
substr()
の機能が[]に取り込まれた、という第一印象。便利。便利だけれど、書けるバリエーションが多すぎる。
digits1='0123456789'
digits1[1:4] #[1]から[4]まで=123
digits1[-4:-1] #後ろから4文字目から後ろから1文字目まで=678
digits1[len(digits1)-4:len(digits1)-1] #こう書きたくなる(添字は正の値にしたい)
digits1[4:1] #これは空文字列(失敗)。
digits1[3:3] #これも空文字列(digits1[3]と同じにはならない)。
digits1[3:-1] #これは345678でOK (ただし文字列短いと失敗するはず)
digits1[-4:] #これは6789
digits1[-4] #これは6 (混同しそう)
digits1[-99] #これはIndexErrorで実行が止まる
digits1[-99:] #これは'0123456789'になる(エラーではない)
うん、完全に理解した(わかってない)。※画像省略
substrの引数というとsubstr(offset,length)
が第一印象だけれど、pythonは[1文字目のインデックス:最後の文字のインデックス]という書き方で、長さを指定しないらしい。正の値はすぐ納得するけど、負の値を指定したときがいまいち慣れない感じ。
…初心者には難しいので、最初のうちは「[]の中はできるだけ正の値にする」というポリシーで頑張ったほうが良さそうだ。
第3引数に「n文字飛び」を指定できるそうだけど、あまりなじみが無い機能。使うとしたら文字列を逆順にしたいときだろうか。
digits1[8:4] # これは空文字になる(引数1のほうが引数2より後ろの文字になる)
digits1[8:4:-1] # これで5678 (混同しそう)
やはり負の数が入ると頭が混乱する。文字列操作のreverse関数とかright関数、left関数とかみたいなものがあるならそっちを使いたいなと思う。
部分文字列取得に失敗しても最悪空文字列で、アドレス違反しないのはいいなと思った。
シングルクォートのなかでダブルクォート使う時はエスケープ要らない(逆も同じ)
Perlと同じ仕組み。とても助かる。
foo_regex = "\\\"abc\\\"\\\n";
が主流にならなくて良かった。
3連クォートはヒアドキュメントみたいな挙動。
文字列.index と文字列.find
引数が数字なのか数字以外なのか分かりにくいメソッド名として(個人的に)有名なindex
。プログラミングを習った当初から配列の添字を「インデックス」と呼んでいたので、「インデックスには数値を指定するものだ」という風に体が覚えてしまっています。
Excelでもindex関数は「行と列の番号」を引数にします。
javaではString.charAt(int)
、List.get(int)
やList.indexOf(Object)
などのメソッド名になっており、配列の添字以外は「ただのインデックス」の名前を避ける傾向が見られました。
はい、先に混乱させることを言ってしまいました。
pythonに戻ります。
index
メソッドにより、指定した 部分文字列B が 文字列A のどこに存在するか調べることができます。具体的には、次のように使用します文字列A.index(部分文字列B)
え?
find
メソッドも index と同様に部分文字列を検索し、最初に出現するインデックスを返します。
index との違いは、部分文字列が含まれない場合エラーとはならず -1 が返されることです。word1 = 'hello' word1.find('a')
ええ?
2種類同時に紹介されてる?
- indexの場合、部分文字列が無いときはエラーになる
- findの場合、部分文字列が無いときは-1を返す
とのこと。
「使い分けがあるの?」と疑問に思ったのでCopilotに質問。
使い分け
エラー処理が必要な場合:部分文字列が見つからない状況を明確にエラーとして扱いたい場合、
index
が適しています。例えば、絶対にその部分文字列が存在することを前提としている場合に使うと、バグを早期に検出できます。try: position = text.index("Python") except ValueError: print("部分文字列が見つかりませんでした")
コードの意図を明確にしたい場合:
index
を使用することで、部分文字列が見つからなければならないという意図を明示できます。コードを読んでいる他の開発者に対して、ここでは部分文字列が存在することが前提であることを伝えることができます。
ふむふむ。…でも、これは「tryは多用すべきか」「どこでcatchすべきか」という、いつもの悩みにぶつかってしまうなあ…
とりあえず「2種類ある」ということだけ覚えておこう。
文字列その他
replace メソッドは、指定した 部分文字列A を、別に指定した 文字列B で置き換えた文字列を作成します。 この操作では、元の文字列は変化しません。
lower, capitalize, upper メソッドを用いると、文字列の中の英文字を小文字に変換したり、大文字に変換したりすることができます。これらの操作では、元の文字列は変化しません。
「元の文字列は変化しません」。大事なことなので復唱。
(どっちだかわからないときは、とりあえず左辺を書くようにしているけど:P)
strip
も「元の文字列は変化しません」タイプ。
…
テキストの2-1終了。本日はここまで。