在宅リーマン勉強日誌

忘れがちな毎日のメモ。

【5日目】KaggleでPythonの勉強してみた【独学】

本日も、KaggleでPythonの勉強をしていきます。 昨日でちょうど折り返ししたのですが、後半がキツイと聞いているので、ここまでも時間がかかってしまっていましたが、もっとかかるかも…。 しっかり進めていきます。

勉強内容

Lesson:Loops and List Comprehensions (Tutorial)

勉強時間:60分

Lesson:Loops and List Comprehensions (Exercise)

勉強時間:60分

TutorialはCourseの和訳(概略)、Tutorialは試行とどう考えていたかを記しています。

Lesson:Loops and List Comprehensions(Tutorial)

Loops

ループは、コードを繰り返し実行する方法です。

ループには、変数とループが可能な値集合をinを使用して実行します。

inのあとの変数は繰り返しをするものであれば何でもいいです。

基本的には、集合体である場合、その分ループを繰り返すことができます。

さらに、リストである場合はその要素数分繰り返すことができるということです。

下記は文章内に含まれている大文字を出すという処理をします。

s = 'steganograpHy is the practicE of conceaLing a file, message, image, or video within another fiLe, message, image, Or video.'
msg = ''
# print all the uppercase letters in s, one at a time
for char in s:
    if char.isupper():
        print(char, end='') 

range()

range()は数字の連続を返す関数です。ループを書く上で非常に使える機能です。 例えば、5回繰り返すときは、 for i in range(5)とかけば、5回繰り返すことになります。

while loops

for文以外のループの方法として、条件を満たすまで繰り返しを続けるwhileがあります。 whileブーリアン文として扱われており、Falseになるまで繰り返します。

List comprehensions

リスト内包はPython独自の特徴です。 いくつかの例を見るのがよいでしょう。

###数の累乗リスト(0~9)
#リスト内包なし
squares = []
for n in range(10):
    squares.append(n**2)

#リスト内包あり
squares = [n**2 for n in range(10)]

また、ifを足すこともできます。

short_planets = [planet for planet in planets if len(planet) < 6]

代入先の変数はループ変数を含む必要はありません。(含まれていないのはかなり珍しいですが。) 究極、代入先がなくてもよいのです。

リスト内包は、minmaxsumと統合でき、これまで長々と書いていた文章を1行にすっきりとまとめることができます。

コードを短くすればするほどいいというわけではないです。 短い方が、よいでしょうが、以下の言葉を覚えておいた方がいいです。

Readability counts. Explicit is better than implicit. (可読性を重視すること。暗黙的なものより明示的な方がよい。)

Lesson:Loops and List Comprehensions (Exercise)

Tutorialはかなりの感動モノでした。

これまであんなに「キチンと」書いていたのに、これほどシンプルでよいのか、という思いと、こういう書き方に慣れていないので、少し時間がかかるかもしれないという印象を受けました。

Q1:次のバグを含んだプログラムに対し、バグを明確にし、直せ

渡されたリストが「ラッキーリスト」であるかを返す関数。「ラッキーリスト」とは7の倍数が少なくとも1つ含まれたリストです。

def has_lucky_number(nums):
    """Return whether the given list of numbers is lucky. A lucky list contains
    at least one number divisible by 7.
    """
    for num in nums:
        if num % 7 == 0:
            return True
        else:
            return False

関数を見ても、これでよくない?と思ってしまいます…。 動作を確認するために、実際にリストを作って入れてみます。

l1 = [1,3,5,8,9,14]
l2 = [2,8,5,3,-7,0]
l3 = [4,6,10]
print(has_lucky_number(l1))
print(has_lucky_number(l2))
print(has_lucky_number(l3))

予想では、l3のみFalseですが、全てFalseになりました。 ループの中身も見てみます。

def has_lucky_number(nums):
    """Return whether the given list of numbers is lucky. A lucky list contains
    at least one number divisible by 7.
    """
    print(nums, len(nums))
    for num in nums:
        print(nums, num, num%7, sep = "\n")
        if num % 7 == 0:
            return True
        else:
            return False

こうすると、ループを一回しか回ってないことがわかりました。 returnがfor文にあるのが原因かも。 7の倍数が一つあればいいので、Trueのみfor文に入れ、Trueになればその時点で関数を抜けますが、最後までならなかった場合、きちんとFalseを返すようにfor文から抜けた個所にreturn Falseを入れました。

愚直にやるとこの方法ですね。 正答例には、一行で書いた場合の例もありました。 anyという方法を知らなかったので、今後活用していくようにします。 もし○○があれば、を書く関数で、そのままTrue/Falseを返してくれるから、らくちんそう。

これ以降は、終わりきらなかったので、次の日へ。

新出単語

iteration:繰り返し comprehensions:包含 subjective:主観の