Help us understand the problem. What is going on with this article?

初心者向けPython3勉強会:拡張スライス操作・制御フロー文

More than 1 year has passed since last update.

初心者向けPython3勉強会:拡張スライス操作・制御フロー文

諸注意

コンテナオブジェクト

前稿ではコンテナオブジェクトについて以下のような説明をしました

str,list,tuple,dictは、コンテナオブジェクトと呼ばれ、複数のオブジェクトをまとめることができます
Javaでいう配列やリストがこれにあたります。ただし、Javaの配列と違い、動的確保をすることができます
list[]tuple()dict{}、でそれぞれ定義できます

動的確保 :配列などを宣言する際に、変数などを用いて宣言する方法です
     変数の値に応じて配列の大きさを設定できます

本稿では上記で説明されている動的確保に加え、拡張スライス操作制御フロー文について説明をしていきます

拡張スライス操作

前稿でスライス操作について説明しましたが、それを復習しつつ拡張スライス操作について学んでいきましょう
まずおさらいです

list型であるlineという変数に対し、line[i:j]と書くとlinei番目からj-1番目の要素を取り出すことができます

拡張スライス操作ではこれに加え、ステップ数を設定できます
変数が増えてきてijではわかりづらいので、istartjgoal,ステップ数をstepとします

先ほどの説明を拡張スライス操作を加味して言い換えると、

list型であるlineという変数に対しline[start:goal:step]と書くと
linestart番目からgoal-1番目の要素をstep-1段飛ばしで取り出すことができます

このようになります。ちょっと何言ってるのかよくわかんない
手を動かしましょう!

line = list(range(10))

print(line[1:8])
# > [1,2,3,4,5,6,7]

print(line[1:8:2])
# > [1,3,5,7]

print(line[1:8:3])
# > [1,4,7]

stepを定義することによって、listの値が飛び飛びになっていますよね
ちなみに、startgoalstepも省略することができます
省略した場合、それぞれ0,-1,1をとります

line = [0,1,2,3,4,5,6,7,8,9]

print(line[1::2])
# > [1,3,5,7,9]

print(line[:7:3])
# > [0,3,6]

print(line[2:6:]) # line[2:6] と同じ
# > [2,3,4,5]

print(line[::3])
# > [0,3,6,9]

print(line[4::]) # line[4:] と同じ
# > [4,5,6,7,8,9]

print(line[:5:]) # line[:5] と同じ
# > [0,1,2,3,4]

print(line[::]) # line[:]と同じ
# > [0,1,2,3,4,5,6,7,8,9] 

stepが省略されている場合は、普通のスライス操作と同じなので2つ目の:は省略できますね
また、値が減っていくような数列はstepで負の値を指定すれば実装できます
startgoalだけでは実装できないことに注意してください)

制御フロー文

制御フロー文とは、条件式を基にプログラムの処理の流れを変えることができる文型です
Pythonではifwhile,forなどが挙げられます。他言語を経験されている方は、switch,do-whileなどもご存知なのではないでしょうか

if文

if文は、条件式によって処理の分岐を行う制御フロー文です
前稿で学んだブール演算、比較演算を利用して分岐命令が記述できます

x = 10

if x > 5 :
    print('xは5より大きい')
# > xは5より大きい

ここで前稿で触れたオフサイドルールがでてきます

ブロックの記述方法

Javaなどでは、if文やfor文といったブロックを、中括弧{}で囲んで記述していたかと思います
Pythonでは中括弧は使わず、インデントを使用してブロックを記述します
このように、インデントが構文規則定められている規則を オフサイドルール と言います

Pythonではインデントを使って、制御フロー文を記述します
上記のコードでは、printの前に半角スペース4文字分のインデントがあります
また、if文の最後尾にある:も忘れないでください。「ここから分岐しますよ」という意味になるので、忘れてしまうとエラーになります

次に、初めの条件式がFalseだった場合の処理を追加してみましょう

x = 3

if x > 5 :
    print('xは5より大きい')
elif x > 0:
    print('xは0より大きく5以下である')
else :
    print('xは0以下である')
# > xは0より大きく5以下である

elif :で追加の条件を付け加えることができます。前の条件式がFalseだった場合、実行されます
else :elifを含めた全ての条件式がFalsだった場合の処理を記述できます

elif部は何個でも記述できますが、else部は最大で1個だけです
どちらも前述されているように、省略することができます
これらは他言語におけるswitch文やcase文と同じ記述ができます

while文

while文は、条件式によって繰り返し処理を行う制御フロー文です
条件式がTrueの間、記述した処理を繰り返します

x = 0
while(x < 10) :
    print(x)
    x = x + 1
# > 0
# > 1
# > 2
# > 3
# > 4
# > 5
# > 6
# > 7
# > 8
# > 9

上記の処理ではx < 10より、xが10未満の間while文の処理が実行されるようになります

for文

for文は、コンテナオブジェクトを利用する制御フロー文です
指定したコンテナオブジェクトから1つずつ要素を取り出して処理を行います

for i in range(10) :
    print(i)
# > 0
# > 1
# > 2
# > 3
# > 4
# > 5
# > 6
# > 7
# > 8
# > 9

おわりに

拡張スライス操作、制御フロー文、いかがでしたでしょうか?
前稿と本稿を理解いただければ、Pythonの基礎の基礎は修了です、お疲れ様でした!
次稿から他の言語には(ほぼ)ないPython独自の記法について説明していきたいと思います
ご興味あれば、ぜひ一読よろしくお願いします!

また、本稿について不明点・修正点などございましたら、是非コメントの方によろしくお願いいたします

人生苦短我用Python!!

m_rafa0110
マルチエンジニアを目指す人。 ※このサイトの掲載内容は私個人の見解であり、 必ずしも私が所属する会社、組織、団体の立場、戦略、意見を代表するものではありません。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away