PyQオフィシャルブログ

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

PyQが「Flake8」を学べる課題追加!

こんにちは。かめちゃんです。

今日はご要望の多かったFlake8課題を追加したお知らせです!

実務でのPythonに追加しました。

f:id:kamekokamekame:20171016164302p:plain

f:id:kamekokamekame:20171016164307p:plain

チームで開発する場合など、全員が共通の認識を持ってコーディングするとレビューのコストも節約できますね。この課題はそんな時に利用するコーディング規約に関わるものです。

コーディング規約とは

コーディング規約とは、コードの書き方をまとめたガイドです 。同じプログラミング言語を使った場合も人によってコードの書き方は異なってしまいます。 コーディング規約を導入することで誰が書いても同じスタイルでコードがかけるようになり、様々な問題を解決できます。

  • コードの書き方が統一されていて読みやすいので、理解するまでの時間が少ない
  • コードの書き方が統一されているので、Diffで見たときなど修正箇所を把握しやすい
  • コードの書き方が初めから統一されているので、後から整理しなおす時間がない

チームで コーディング規約を使用することで、最初から誰が書いても同じようなスタイルでコードを書くことができ、 上記の問題により発生する時間が削減されます 。それにより、ソフトウェアの開発は加速し、開発するソフトウェアの品質の向上に繋がります。

課題ではソースコードチェッカーであるFlake8を用いて、ソースコードをチェックします。

下記のようなエラーが出る状態のコードを修正していただきます。

f:id:kamekokamekame:20171016164310p:plain

課題を終えると、「PEP8とは何か?」「Flake8の利用方法」「Flake8に指摘された箇所の修正方法」を習得できます。

ぜひ、チャレンジしてください(*^_^*)ノ

pyq.jp

Djangoの {% ... %} は何ですか?

Djangoを学び始めると、今までPythonの世界だけで学んでいたことから広がった独自の作法などが登場しますね。 モデルについてもそうですし、今回のDjangoテンプレートについても独自の記法が存在します。

PyQ ではDjangoでのWebアプリケーションの作り方も学べます。 PyQのスタンダードプランではもちろん、Djangoについての質問もお答えできます。

今回はそんなDjangoに関する内容でいただいた質問をご紹介します。

質問

{% if ... %} や {% for ... in ... %} など {% ... %} は何ですか?

回答

こちらはDjangoについてのご質問ですね。お答えします。 この {% ... %} で囲まれた部分は「テンプレートタグ」というものです。 Djangoテンプレートの、記法の一つです (プログラミング言語Pythonとしての話ではありません)。

テンプレート | Django documentation | Django

この {% ... %} 「テンプレートタグ」は、「この部分で何かテンプレートの 動作 をさせるよ」という意味になります。

例えば {% for item in items %} の場合は「for でループする」という動作をするテンプレートタグです。

{% for ... %}...{% endfor %} で囲まれた部分が、ループの回数分表示(HTMLなどが描画)されます。 items という変数をループして item を取り出し、 item.name を複数表示するテンプレートは以下になります。

{% for item in items %}
    {{ item.name }}
{% endfor %}

他にも {% if ... %} ... {% endif %}{% url ... %} など、テンプレートタグはいくつかあります。 Djangoではテンプレートを使って、ブラウザーで表示するためのHTMLを動的に作れます。

Djangoについての疑問などあれば、漠然とした質問や「モヤモヤ」でも歓迎ですのでぜひPyQメールサポートにご質問ください。 悩んでいる時間やモヤモヤして集中できない時間を無くして、効率的に学習ができますよ。

pyq.jp

スクレイピングとかクローラーてどうやって作るの? - PyQが「Webスクレイピング」を学べるコンテンツを追加!

こんにちは。PyQ開発チームの照屋和夫です。

今日はPyQでかねてから要望が多かった「Webスクレイピング課題」を追加しましたので紹介します!

f:id:tell-k:20171005183853p:plain

Webスクレイピングって何?

普段みなさんが使っている Google などの検索エンジンが、あれだけの大量のWebページやコンテンツをどうやって集めてるか不思議に思ったことはありませんか? 多くの検索エンジンは、定期的にWebページをダウンロードしたり、ダウンロードしたWebページを解析して情報を抽出しています。

プログラムでWebページを解析して情報を抽出することを「スクレイピング」と呼びます。また大量のWebページを巡回するようなプログラムのことを「クローラー」と呼びます。

PyQでは、そのようなプログラムをどのように作ったら良いか学べるようになりました。

どんな事が学べるの?

スクレイピングやクローラーを作るためには、単純にPythonプログラムの書き方を学ぶだけでは十分ではありません。 例えば、基礎的なWebの仕組みや、他人のWebサイトをスクレイピングするための作法などの周辺知識が必要になります。

PyQでは、最低限の周辺知識を学びながら、Python初心者の方でもスクレイピングを学ぶことができるようになっています!

こんなことにならないように...

実は筆者もプログラミングを学び始めた頃、独学でクローラーのようなものを作っていました。ただ調べる内容は膨大で、どこから作っていいかわからず、試行錯誤を重ねて、実際に動かすところまでがやっとでした。

しかも当時は、相手のWebサイトのことなど全く考えずにクロールしてしまっために、Webサイトを運営する人に大変ご迷惑をかけてお叱りを受けました。。。

そこから初めて、クロールするためには相手のWebサイトに迷惑がかからないように注意するようになりました。

今回の「Webスクレイピング課題」では、そういった苦い経験を踏まえて得たノウハウを詰め込みながら、なるべくプログラムの初心者の方でもステップアップしながら、健全にスクレイピング/クローラーを学べるようなものにしました!

できるようになると楽しいですよ!

この課題で、Googleなどの検索エンジンを作れるようになるわけではありませんが。簡単なクローラーを作るくらいだったらできるようになります。

例えば、自分のために天気予報の情報を収集したり、可愛い猫画像を収集したり、はたまた研究のためのデータを集めたり、あなたがインターネット上で欲しかった情報を、自分の手で集めて活用することができるようなります!

きっとそれは、単純にプログラムを書くだけでは体験できなかった楽しいものになるでしょう。 是非PyQで「Webスクレイピング課題」にチャンレンジしてみてください!

pyq.jp

Pythonエンジニア ファーストブック も一緒にどうぞ!

Webスクレイピング課題」は著者の鈴木たかのりさんにご協力いただき、Pythonエンジニアファーストブックの内容をより初心者でも学びやすくしています!この本はスクレピング以外にもPython言語の基本、チーム開発、pandas、DjangoなどPythonを始めたい人たちにとってとても参考になります。PyQの復習にもとてもオススメです!

Pythonエンジニア ファーストブック

Pythonエンジニア ファーストブック

  • 作者: 鈴木たかのり,清原弘貴,嶋田健志,池内孝啓,関根裕紀
  • 出版社/メーカー: 技術評論社
  • 発売日: 2017/09/09
  • メディア: 単行本(ソフトカバー)
  • この商品を含むブログを見る

Pythonのelifはなぜ必要なのですか?という疑問にPyQサポートがお答えします

id:hirokiky です。

Pythonの elif はなぜ必要?

こんなご質問をいくつかPyQサポートにいただきました。

ifをならべても、elifを使っても同じではないですか? 用途や違いを知りたいです。

たしかにそんな気はしますね。 ですが elif も活躍する場面があります。実際のプログラムと、 elif が無い場合の苦労をご紹介できればと思います。

elifの必要なプログラム

FizzBuzzというゲームをプログラムしてみましょう。

FizzBuzzについて

最初のプレイヤーは「1」と数字を発言する。次のプレイヤーは直前のプレイヤーの次の数字を発言していく。 ただし、3で割り切れる場合は「Fizz」(Bizz Buzzの場合は「Bizz」)、 5で割り切れる場合は「Buzz」、 両者で割り切れる場合(すなわち15で割り切れる場合)は「Fizz Buzz」(Bizz Buzzの場合は「Bizz Buzz」)を 数の代わりに発言しなければならない。

https://ja.wikipedia.org/wiki/Fizz_Buzz

この「数字を判定して適切に発言するプログラム」を書くと以下のようになります。 num に答えが必要な数字を入れて動かしてみてください。

num = 15

if num % 15 == 0:  # 15で割り切れるかどうかを判定しています。
    print("FizzBuzz")
elif num % 5 == 0:
    print("Buzz")
elif num % 3 == 0:
    print("Fizz")
else:
    print(num)

FizzBuzzの判定をする条件を日本語で書くとこうなります。

  • 15で割り切れるか? => FizzBuzz
  • そうでないとき5で割り切れるか? => Buzz
  • そうでないとき3で割り切れるか? => Fizz
  • そうでないとき => 数字

と条件が続いていきます。 「そうでないとき〜」と続くのが elif の特徴です。 elif を使うのは、「前までの条件を引き継いで条件を書きたいとき」です。

elifが無くて条件が複雑になる場合

例えば下に elif を消した if だけのプログラムを書いてみました。 このプログラムは期待した動作をしません。 数字が15の場合などに「FizzBuzz」、「Buzz」、「Fizz」と3つ答えが表示されてしまいます。

num = 15

if num % 15 == 0:  # 15で割り切れるかどうかを判定しています。
    print("FizzBuzz")
if num % 5 == 0:
    print("Buzz")
if num % 3 == 0:
    print("Fizz")

理由は、15という数字が15でも5でも3でも割り切れるからです。なのでFizzBuzz、Buzz、Fizzの3つ表示されてしまいます。 elif の「15で割り切れないとき 、5で割り切れるか?」のような、前の条件を引き継いだ条件が書けないのでこうなっています。

elif なしでも正しく動作するよう頑張って書くとこのように複雑になります (このプログラムで100%あっているかどうか自信がないほどに複雑ですね)。

if num % 15 == 0:  # 15で割り切れるかどうかを判定しています。
    print("FizzBuzz")
if num % 15 != 0 and num % 5 == 0:
    print("Buzz")
if num % 15 != 0 and num % 3 == 0:
    print("Fizz")
if num % 5 != 0 and num % 3 != 0:
    print(num)

elifは前の条件を引き継いだ条件が書ける

このように elif がないと、 前の条件を引き継いだ条件 を続けて書くのが難しくなるので elif はプログラムに必要です。 「elif なければプログラムが成り立たない」というわけではないですが、かなり複雑になってしまいます。

いかがでしょうか。

PyQのメールサポートは、PyQのエキスパートたちにメールで質問ができるサポートです。 Pythonを学んでいてハマってしまったり、腑に落ちないことがあるときに質問できます。

有識者に直接質問することで時間を無駄にすることなく学習できます。 質問の内容は、今回のような「Pythonのこれって何の意味があるの?」のような疑問でも大歓迎です!

ぜひプログラミングやPythonの学習にPyQをお役立てください。

pyq.jp

osモジュールの使用例

こんにちは、かめちゃんです。最近いただく質問に『osモジュールっていつ使うの?』『何の役に立つの?』があります。

PyQの問題ですと実感しづらいかと思いますが、osモジュールは自分のPC内のファイルを操作する時に便利です。

開発環境の構築については、下記の記事をご覧ください。

blog.pyq.jp

とあるディレクトリ(フォルダ)に存在するファイルの一覧が欲しい。(今回は対象のディレクトリ内で動作させています。)

os.listdir(ディレクトリパス) で対象のディレクトリ内のファイル、ディレクトリ一覧を取得し、 os.path.isfile() でファイルかどうか判定します。

import os

path = '.'
for file_name in os.listdir(path):
    if os.path.isfile(os.path.join(path, file_name)):
        print(file_name)

拡張子が txt のファイルだけ(今回は、globは使いません)

import os

path = '.'
for file_name in os.listdir(path):
    file_path = os.path.join(path, file_name)
    if os.path.isfile(file_path):
        root, ext = os.path.splitext(file_path)
        if ext == '.txt':
            print(file_name)

また、ファイル名の先頭に old_ を付けてリネイムしたい場合などは os.rename(元ファイルパス、新しいファイルパス) で変更できます。

os.rename(os.path.join(path, file_name), 
                   os.path.join(path, 'old_' + file_name))

ファイルが数個の場合は手作業でよいのですが、ファイル数が100、1000などの場合に簡単にファイル操作ができ、便利です。

他にも特定の文字列を内部に含むファイルを絞る、とあるディレクトリ(フォルダ)内のファイル(子ディレクトリを含む)を検索するなど、PyQの問題に便利なosモジュールを利用する問題があります。

問題一覧までは誰でも閲覧できますので、のぞいてみてください。(*^_^*)ノ

pyq.jp