PyQオフィシャルブログ

Pythonのオンライン学習プラットフォームPyQのオフィシャルブログです

モジュール・オブジェクト・メソッドとはどのような概念なのでしょうか?への回答

はじめまして。nao_yです。

Web開発をする傍ら、質問メールへの回答を通してPyQユーザの皆さんのPython学習をサポートしています。よろしくおねがいします。

「モジュール・オブジェクト・メソッドとはどのような概念なのでしょうか?」という質問をいただきました。これらは「クエスト 10-2: 現在の日付、時刻の表示」から導入される概念です。新しい概念が一度に3つも登場するので、戸惑う方もいるでしょう。今回はこれら3つの考え方と関係を解説します。

モジュール

まずは公式ドキュメントの解説を見てみましょう。

公式ドキュメント-Pythonチュートリアル-モジュール

また、いくつかのプログラムで書いてきた便利な関数について、
その定義をコピーすることなく個々のプログラムで使いたいと思うかもしれません。
こういった要求をサポートするために、Python では定義をファイルに書いておき、
スクリプトの中やインタプリタの対話インスタンス上で使う方法があります。
(中略)
モジュールは Python の定義や文が入ったファイルです。
ファイル名はモジュール名に接尾語 .py がついたものになります。

モジュールとは、便利な関数の塊を複数のプログラムから利用できるようにまとめたPythonファイルです。例えば、datetimeモジュールには日付や時間を扱う関数の定義がまとめられています。 関数の塊はこの後で説明するオブジェクトのことを指します。

Pythonらしく言うと役割毎にまとめられたオブジェクトの塊となります。

オブジェクト

オブジェクト「データ」と「データを扱う関数」の塊です。

文字列やリスト、日付などのデータとそれらを処理する便利な関数がまとめられています。

例えばdatetimeモジュールのdatetimeオブジェクトには「2018年」や「2月」のようなデータと、日付や時間を処理する関数がまとめられています。

datetimeモジュールには他にも、二つの日付や時刻の差を扱うtimedeltaオブジェクトなどがあります。

参考: 公式ドキュメント-Python標準 ライブラリ-datetime

モジュールとオブジェクトの関係をまとめてみましょう。

  • モジュール: 便利なオブジェクトをまとめたファイル(例: datetime)
    • オブジェクト: 便利な関数の塊
      • datetime
      • timedelta

メソッド

メソッドとはオブジェクト内で定義されている関数を指します。オブジェクトを便利な関数の塊と表現しましたが、メソッドが便利な関数です。 例えばdatetimeオブジェクトであれば、日時データを指定したフォーマットの文字列に変換するstrftime()がメソッドにあたります。

strftimeメソッドで使う日時のフォーマットは以下が参考になります。

公式ドキュメント-datetime-strftime() と strptime() の振る舞い

まとめ

モジュール、オブジェクト、メソッドの関係をまとめてみましょう。

  • モジュール: 便利なオブジェクトをまとめたファイル(例: datetime)
    • オブジェクト: 便利な関数の塊
      • datetime
      • メソッド: 便利な関数
        • strftime()

実際に使ってみましょう。

# datetimeモジュールのdatetimeオブジェクトをインポートする
from datetime import datetime

dt = datetime(2018, 2, 20)
dt.year # 2018というデータ

dt.strftime('%Y-%m') # メソッド。'2018-02’という文字列を返す。

標準ライブラリ

Pythonには「battery included(電池が付属しています)」という思想があり、便利な機能がモジュールとしてたくさん提供されています(これらを標準ライブラリと呼びます)。datetimeモジュールもこの標準ライブラリに含まれています。

日時の処理やデータベース接続、ファイル操作などプログラムで使われることの多い機能が提供されているので、プログラマが本当に書きたい処理に集中しやすくなっています。

様々な標準ライブラリがありますので興味があったら調べてみてください。Pythonでできることの幅広さが見えてきます。難しい内容もありますが、眺めるだけで標準ライブラリで実現できることがたくさんあると実感できると思います。

公式ドキュメント-Python 標準ライブラリ

Pythonのif __name__ == "__main__" とは何ですか?への回答

こんにちは。 id:hirokiky です。

今日も皆さまからPyQメールサポートにご質問いただいた内容で多かった質問と回答をご紹介します。 この質問はとくに疑問になりやすい点なのではないでしょうか。

pyq.jp

質問と回答。

Pythonの if __name__ == '__main__': は何のためにあるものですか?

はい。こちらはよくPythonプログラムに書かれていますね。 書かれることは多い割には、不思議の多いif文ですね。「これは『おまじない』なので気にしないでください」と言って回答を終わらせてしまうのは簡単ですが、それでは悲しいので、少し長くなりますが回答いたします。

一言で言うと、 if __name__=='__main__': はこのPythonファイルが「python ファイル名.py というふうに実行されているかどうか」を判定するif文です。

まず、以下の hello.py という if __name__ == '__main__'のないPythonファイル を先に見ていきましょう。

def main():
    print("Hello")

main()

この hello.py のように if __name__ == "__main__" 無しでも、 python hello.py とすることで「Hello」と表示するPythonファイルは作れます。

$ python hello.py
Hello

ですがこの hello.py の場合、外部から import hellohello.py をインポートした際にも 「Hello」と表示されてしまいます

>>> import hello  # この時点で「Hello」が表示されてしまう
Hello
>>>

Pythonでは、インポートされたファイルの中身は実行されます。 ですので単にインポートしただけなのに main() => print("Hello") と処理が実行されてしまいます。

単にPythonファイルをインポートして、main関数を再利用しようとしただけなのに実行まで勝手にされてしまうのは困ります。 import refrom datetime import datetime とするだけで自動でプログラムが動いたり表示されたりすると少し迷惑ですよね。

インポートされた際にプログラムが動かないようにするために、以下のように if __name__ == "__main__": というif文を書きます。

def main():
    print("Hello")

if __name__ == "__main__":
    main()

このif文の内部は import された際には実行されません。

>>> import hello
>>>

インポートで実行されない理由

Pythonには __name__ という特殊な変数があります。

この変数には、このPythonファイルのモジュール名が文字列で入っています。 import hello とされた場合、 hello.py 内部での __name__"hello" になります。 (Pythonにより自動的にこの変数は入れられます)。

python hello.py のようにプログラムを実行した場合、 hello.py の内部の __name__ 変数は "__main__" という文字列になります。 この "__main__" という文字列はPythonファイルをスクリプトとして直接実行した場合に自動で設定されます。

  • import hello した:hello.py 内部で __name__"hello" という文字列になる
  • python hello.py した:hello.py 内部で __name__"__main__" という文字列になる

ですので、 if __name__ == "__main__" という if文を使うことで、「この hello.pypython hello.py のように実行された(== importされたことで動作したのではない)」と判定できます。

if __name__ == '__main__':
    ...

PyQ の関数のクエストでもimportなどについて学習できますので参考にしてください。

pyq.jp

おわりに

以上です。 PyQメールサポートではこのようなPythonの不思議についてやプログラム、設計の意図や勘所についてもお答えしております。 プログラミング・Python学習を集中して無駄なく行なうためにお手伝いいたします。

pyq.jp

PyQのお客様満足度

皆さんこんにちは、PyQのスタッフnanaです。

PyQでは、プログラミング学習をより効率的に進められるよう ユーザーの学習情報をデータとして集計してコンテンツ開発に活用しています。 その中で、退会時の利用者アンケートより、PyQの満足度 をグラフ化しましたので紹介します。

pyq.jp

PyQの満足度グラフ

PyQお客様満足度 グラフを見ると、「とても満足・満足」の合計が68%、 「普通・期待どおり」が26%と概ねサービスに満足して退会されているようです。

これらの解答を頂けた受講者の退会時の理由としては、 「学習したいコースを終わらせた」 「忙しく利用できなくなりそうなので」 というものが多く、また学習を始める際には再開したいという声も多く頂いています。

また、「不満・とても不満」と解答された受講者からも 「月額課金のため、ほとんど学習しなくても課金される事が不満」 という意見が課題としてあがっています。

これらのことから、 ある程度の期間集中して学習したいとお考えの方 には PyQをおすすめ出来そうだと読み取れます。 反対に、学習する日の期間が空いてしまう 場合には割高になるのがデメリットといえるでしょう。

PyQの課金システム

グラフと寄せられた声から読み取れる 学習日数が少ない時の割高感 というデメリットに対して、PyQの有料プランは、中止・再開し易いシステムを提供しています。

  • 途中解約の場合は日割りで返金
  • 有料購読を停止しても学習履歴は残しておける

時間がとれないなどの理由で一度退会しても、これまでの学習の積み重ねはそのままに再開できるので、 現在受講中のユーザーの皆さんにも、検討中の方にも、自分のペースに合わせてPyQを活用してもらえれば嬉しいです。

PyQではこのようにデータの解析・受講者の声の抽出から見えた課題に取り組む開発を進めています。 課金システムの使い勝手を始め、 継続的な学習を促進する仕組み使い勝手・復習のしやすさの観点から機能を追加 していくことで PyQを濃密に使いこなし、理解を深め、定着させていって頂けるようなサービス提供に努めます。

他にもPyQでのPython学習をより良くする為のご意見等ありましたら、是非 アンケートフォームよりフィードバックを頂ければ幸いです。

どうぞ、これからもPyQを宜しくお願いします。

pyq.jp

復習に関する機能について

皆さんこんにちは!PyQのスタッフnanaです。

担当となってからしばらくの間、サービス向上の為フィードバックや 質問とにらめっこしていたのですが、 復習に関わる機能 についてお問い合わせが多くあることに気づきました。

問題の追加以外にも、使い勝手を良くする機能が日々実装されているPyQ。そんなことができるようになっていた事に気づいていなかった…!ということもきっとある!ということで、今回はPyQの復習に役立つ機能をピックアップしてご紹介したいと思います。

pyq.jp

学習履歴のリセット機能

まずとっても多いのが、「復習のために一度やったクエストをやり直したい」 というお問い合わせです。実はこれ、全問題をリセットしてもう一度最初から学習する事ができます。

blog.pyq.jp

また、ひとつのクエストだけリセットしたい時 は、クエスト内、PyQ入力フィールドの左上にリセットボタンがあります。

f:id:nana_yu:20180122180316j:plain

こちらを押すと、ダイアログが表示されてクエスト内の問題の編集状態と クリア状況をリセットすることができますよ。

f:id:nana_yu:20180122173749p:plain
クエストのリセットボタンを押すと、ダイアログが表示されます

理解度の記録機能

PyQのクエスト完了画面にこんな表示があるのにお気づきですか?

f:id:nana_yu:20180122180353j:plain
理解度 という項目に★を設定できます。

クエスト終了時にこの理解度を設定しておくと、後で理解度の低い問題だけを検索する事ができます。詳しい内容は下記の記事もご覧ください。

blog.pyq.jp

関連クエスト機能

PyQでの学習は、写経したプログラムを動かし、一つ一つの項目を理解してゆき、演習で自分で使ってみることで実際に使えるようになる…という構成です。その学習の流れの中で、『関連するクエストをもう一度見直したい …あれでもどこで学習したっけ…?』という事はよくありますよね。

そんな時にスムーズに復習ができるよう、問題の解説画面から関連クエストを参照できるようになっています。先程ご紹介したクエストリセットを使って、もう一度やり直す事もできますよ。

blog.pyq.jp

もっと学習しやすく、もっと定着するために。ご意見ご要望をお寄せ下さい

というわけで、復習に役立つPyQの機能をご紹介させていただきました。何度も反復で学習し、自学自習の習慣を自然につけていくこと は、PyQのコンセプトの中でも、重要視している事柄です。

今後ともよりスムーズに自学自習して行けるような機能を実装すべく開発スタッフも奮闘しています。そのためにも、是非受講者の皆さんのご意見を聞かせて頂きたいです。 『こんな機能があったらもっと復習し易くなるのでは?』 というアイディアがあれば、どんどんお寄せ下さい。受講者の方へのアンケートフォームでもご意見を収集していますので、宜しければご協力をお願いします。

Pythonエンジニア列伝の内容が紹介されました

はじめまして!nanaです。主にPR担当としてPyQスタッフに仲間入りしました。

大学でプログラミングの授業を受けたことはあるものの、PyQでプログラミングをちゃんと勉強はじめました…というPython超初心者です。 ので、学習者目線でPyQやPythonの興味深いと感じたお話をご紹介したり、スタッフに「ここ全然解らない!」と主張したりして、PyQとユーザーの皆さんを繋いでいけたらいいなと思います。よろしくお願いします。

pyq.jp

今回は、以前「石本敦夫氏に聞く、Pythonの歴史とこれから〜Pythonエンジニア列伝 Vol.3」でお招きした石本敦夫氏のブログで、対談内容に触れられていましたのでご紹介します。

続きを読む