2018年01月07日

言語処理100本ノックでPython入門 #00 - スライス

  
Pythonの勉強をしようと思い立ち、しばらく放置していたブログを再開したいと思います。 TypeScript、PythonとC#以外の話題が続いているので、ブログ名からC#とりました。

題材は、言語処理100本ノックの問題を一つずつ解いていこうというもの。 Visual Studio Codeを使いますが、環境設定方法はいろんな方が説明しているので省略します。

ソースコードは、GitHubで公開するつもりです。

今回チャレンジするのは、第1章: 準備運動の第0問です。
第1章: 準備運動

00. 文字列の逆順
文字列"stressed"の文字を逆に(末尾から先頭に向かって)並べた文字列を得よ.


■書いたコード
s = "stressed"
rev = s[::-1]
print(rev)

■今回学習したこと

Pythonは、クラスやMainメソッドとか書かずにいきなりコードを書けます。
変数を宣言するのに型を指定する必要はありません。varや let も不要でいきなり変数を初期化すればOK。

s = "stressed"

C#と随分と違う感じ。

文字列を逆順にするには、Pythonのスライス機能を使います。

s = "stressed"
rev = s[::-1]

コンソールに出力するにはprint関数。

print(rev)

でも、これで実行しようとすると、pylint から以下のメッセージが出力されます。
C0103:Invalid module name "0"
C0111:Missing module docstring
C0103:Invalid constant name "s"
C0103:Invalid constant name "rev"
最初の1行が意味がよく分からないです。 2行目は、先頭に以下のようなdocstringが必要ということらしい。
"""
ここに説明文
"""
3行目、4行目は、定数は小文字で始めるなということのようです。英大文字で使ってね、ということらしいけど、多くのサイト見てみたけどほとんど小文字です。なので小文字のまま行こうと思います。 ということで、VSCodeの設定で、'C0103' を無視するように設定します。
"python.linting.pylintArgs": [
      "--disable=C0103"
],
以下のように複数指定することもできます。
"python.linting.pylintArgs": [
      "--disable=C0111,C0103"
],
今回は、両方指定しておくことにします。 この設定を入れたので、当たり前だけど、意味不明だった以下の警告も消えました。
C0103:Invalid module name "0"
その後、いろいろ試してみてわかったのは、module nameがファイル名と関係しているらしいということ。 

ファイル名を `p100.0.py` としていたんですよね。`.0` というのが良くなかったようです。 これを`p100.py` とすれば、消えました。 pythonは、ファイル名がモジュール名と密接に結びついているんですね。

でも、今回はこれを無視して、p100.0.py, p100.1.py, p100.2.py とファイル名を付けていこうと思います。 Visual Studio Codeのエクスプローラーでファイルをコピーすると、勝手にこのように連番を振ってくれるので楽なんですよね。

■スライス機能について

スライス機能は、一部分を取り出したり、逆順に取り出したり、一つおきに取り出したりといろんなことができます。
[開始位置:終了位置:ステップ]という指定をするのですが、マイナス値を指定できて、これが面白い動きをしれくれます。

試しにこんなコードを書いて見ました。

s = "0123456789"
print(s[1:4:1])
print(s[2:6])
print(s[2:12])
print(s[:6:])
print(s[0::2])
print(s[-1::1])
print(s[4::-1])
print(s[-3:])
print(s[-4:-1])
print(s[1:-1])
print(s[:-1])
print(s[:100])
print(s[-100:])

結果は、以下の通りです。     
123
2345
23456789
012345
02468
9
43210
789
678
12345678
012345678
0123456789
0123456789