【Python】checkioの使い方

#1.目的

Pythonのスキル向上のためにcheckioというサイトを使って学習を始めました。
https://checkio.org/

ただ、学習のための丁寧な説明があるわけではないので、
そもそも学習開始時点で「これ、何をすればいいの？」となることが多く、
非常に困ったのでcheckioの使い方を紹介することが目的です。

シンプルですが、じっくり考えながら学習すると非常に勉強になるので、
利用をお勧めします。

#2.checkioの使い方
##(1)checkioとは
レベル別に小さな課題がたくさん用意されていて、クリアを重ねると
レベルアップ（別の島に移動）していける、というゲーム感覚でPythonを学ぶことができるツールです。
※Python以外にも学習できるコンテンツはあるので、詳しくはサイトをご覧ください。

##(2)課題の画面の見方
まずはElementary島から始まります。
（私はまだElementaryのレベル55です）

<img width="802" alt="キャプチャ1.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/465870/7484fa65-f624-6a3a-02d6-6187d9333f11.png">

各島には複数の課題が用意されていて、上から順に攻略していきます。
1つ課題を選択すると、下記のような画面が表示されます。

<img width="676" alt="キャプチャ2.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/465870/ba90383a-34aa-650d-a6cb-549571e840ed.png">

課題の内容について、冒頭で説明されています。
上記の「First Word(simplified)」を例に見てみましょう。
1行目の「You are given a string where you have to find its first word.」から、
最初の単語を見つけよ！的な内容だなと分かります。

ただこの英語だけだと私にはわかりづらいので、Exampleの枠を見ると、
"Hello world"と入れると、"Hello"と返す関数を作れ、と言いたいんだなと分かり、
**課題の内容を、この具体例でイメージをつけます**。

###補足1
私が無知すぎるあまり、一番初めにExampleを見た際に、
「first_word("Hello world") == "Hello"」が何のことかさっぱりわかりませんでした。普通、Pythonでコードを書くときはこんな書き方しないし、どういうこと？と、？がいっぱいでした。

これは**「何を入れたら」「どんな結果を返してほしいか」を設定しており**、ここでは「"Hello world"　と入力したら"Hello"を返すような、first_wordという名前を付けた関数を作ってください」という意味です。

###補足2
画面右上にEnglishの他にJAがある場合は課題を日本語で読むことができますが、
今のところ、JAがある課題の方が少ないです。

ただ、具体例を見れば何をしないといけないかは何となくわかるので、英語が苦手でもそこまで問題はないと思います。

##(3)コーディングの画面の見方

(2)の画面下部に「solve it」というボタンがあるので、押下するといよいよコーディングのページです。
<img width="509" alt="キャプチャ3.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/465870/e5dceb72-a291-d90d-feeb-78f69cdb98c4.png">

私はこの画面で大混乱しました。
**「何をすればいいのか・・？」「"your code here"と5行目に書いてる割に、6行目で"return text[0:2]"と書いてあるぞ・・」「13行目以下は何・・？」**と、本題に行く前に心が折れかけました。

1つずつ説明していきます。

###(ⅰ)私たちがコーディングする部分
・関数の設定は事前にしてくれている（ここでいう1行目）ので、私たちはコメントアウトされている、「#your code here」の下にコードを書けばOK
・デフォルトで入っている「return 〇〇」は、一旦コメントアウトしておけばOK

じゃあ、デフォルトで書かれている「return 〇〇」な何なの？！という疑問がわきますが、これは(ⅲ)で説明します。

###(ⅱ)冒頭のdefについて
各課題、冒頭で関数を設定してくれています（私はまだElementaryの途中なのでもしかすると途中で変わるかもしれません）。

今回で言うと、```def first_word(text: str) -> str:```と冒頭で設定されています。
これは、**「first_word」という関数名で、引数はtextで、そのtextはstr（文字列）です、という設定です**。

最初、「 -> str:」が何のことかわからなかったのですが、これは、**その関数が最終的に返してほしい（＝returnしてほしい）型を指定しています**。

開発するときに、気づいたらやりたかったことから外れたコードを書いてしまっていることはあるようで、そのために最終的にこの関数は何の型を返すのか？を定義しているようです。

※私は最初、本気で「-> str:」は私たちを惑わせるための課題側の罠だと思っていました。

###(ⅲ)デフォルトで記載されている「return 〇〇」について
これは(ⅱ)と密接に結びついています。
この話自体は初心者の方にはやや理解しづらいので（私も最初全然わかりませんでした）、**「デフォルトで入っているreturn 〇〇　の〇〇は課題に関係ない(=使わないといけないことはない）ので、消してOK」程度に思っていただければ大丈夫です**。

ーーーーー一応、ここから説明ーーーーーー
冒頭の関数設定で、「この関数はstr（文字列）で返す」と設定しているので、デバッグした際にstr型を返さないとエラーになってしまいます。
そのため、**str型を返すような内容がデフォルトで入っている**ようです。

→今回で言うとtext[0:2]と書かれていて、これ自体は今回の課題とは全く関係ないのですが（だからややこしい）、とりあえずこれを書いておけばreturnされるのはstr型になるので、デフォルトでコーディングされているのです。

とはいえ本来の課題には不要なので、課題を開始するタイミングではコメントアウトするか、text[0:2]を消して、正しいコードを書けばOKです。
ーーーーーーーーーーーーーーーーーーーー

###(ⅳ)if __ name __ == '__ main __':について
これが何を指しているのかもさっぱりわかりませんでした。

ただ、これについてはGoogle検索すれば解説しているサイトが多数ありますのでそちらも参考にしてください。

ざっくり言うと、**この関数をimportした際に、importと同時に関数が実行されないようにするためです**（今回のコードではあまり恩恵がないので不要に思われるかもしれません）。

###(ⅴ)assert文について
私はこの14行目からのassert文の羅列で、心が完全に折れました。
が、気を取り直して調べていきます。

assert文は、ざっくり言うと**「これを入れたらこの結果を返す」という設定を事前にしておき、自分が書いたコードがその通りに動くか、都度確認してくれる**ものです。

冒頭の課題説明のExampleも、このassert文の中身を指しています。

今回で言うと、「"Hello world"」と入れたら「"Hello"」、「"a word"」と入れたら「"a"」、「"hi"」入れたら「"hi"」と返すということです。

なぜassert文を設定するかというと、開発時に気づいたら自分が作りたいこととは異なるコードを書いていることがあるようで、そのエラーに気づくために、先にassert文を設定しておくようです。

ですので私は、**冒頭の課題説明のExampleではちょっとわかりづらいなと思ったら、このassert文の中身を見て、よりイメージを付けるようにしています**。

##(4)実行してみる
そもそも課題に着手するまでに分からないことが多すぎましたが、無事に課題のコードを書いたとします。
※下記が、この課題に対して私が書いたコード（6行目）です。

<img width="512" alt="キャプチャ4.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/465870/18dece1c-1f36-ffec-e8e1-4e5a2d8a5948.png">

まずは画面上部の「Run」をクリックします。
無事に動くと、画面下部に下記赤枠のように表示されます。

<img width="494" alt="キャプチャ5.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/465870/c7d9873e-b8a7-5022-aa57-8a44f19aaef4.png">


・「Example:」は11行目のコードの実行結果（ただのprint文）
・「Hello」は12行目のコードの実行結果（今回の課題はこれでしたので、無事にHelloと表示されています）
・「Coding complete? Click 'Check' to earn cool rewards!」は18行目のコードの実行結果（ただのprint文）

ここでエラーが起きなかったということは、assert文の3つ全てがきちんと動いているということです！

逆に、赤字でエラーが出た場合は内容に従ってコードを修正しましょう。

##(5)課題を提出する
画面上部の「check」をクリックします。
無事に動くと、このような画面（Task solved）が表示され、課題はクリアです！

<img width="604" alt="キャプチャ6.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/465870/ee1a3df6-6754-ed4f-9ad9-1733424eb224.png">

##(6)他の人のコードを見る
他の人のコードも見たい場合、冒頭の画面で「Best Soludions」で見ることができます。
※但し、これは課題をクリアしないと見れないのでご注意を。

<img width="584" alt="キャプチャ7.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/465870/fc4f77e5-8d0e-d957-266b-beddcfae3cfa.png">


#3.結び
いかがでしたでしょうか。
checkio自体はそこまでメジャーではないですが、「自力で答えを出さないといけない」というスパルタさから、きちんと取り組めば実力はかなり上がると思い、お勧めです。

但し、やってみておもいましたが、本題の課題の前段で初学者を阻むわかりにくさをしているため、この記事が少しでもPython初心者の方の学習の一助になりますと幸いです。