Python文法編 if文

2009/10/24 12597hit

前回までGoogleAppEngineで動かすために
プログラム以外の話しばかりだったけど、これからお楽しみ
プログラム文法編

第一回は条件分岐を行うif文、
if文を使って時間帯別に異なる挨拶をするHelloWorldを作る

if文の使い方は


if 条件式A :
条件式AがTrueの時に実行する処理1
条件式AがTrueの時に実行する処理2
elif 条件式B:
条件式AがFalseかつ条件式BがTrueの時に実行する処理1
条件式AがFalseかつ条件式BがTrueの時に実行する処理2
else:
条件式A、BがFalseの時に実行する処理1
条件式A、BがFalseの時に実行する処理2

条件式はCなどに似た式を使うことが出来る。
たとえばA<10なら変数Aが10未満の時のみTrue
B==20なら変数Bが20の時のみTrue
B!=20なら変数Bが20以外のときのみTrue

また、数値の場合は0がFalse 1がTrue
文字列の場合、空白がFalse 空白以外がTrueとなる。
もちろん、真偽値を格納する変数や、関数の戻り値を条件につけることも出来る。

時間帯によって挨拶を変えるためにHelloWorldを元に新しいプロジェクトを作る。
プロジェクト名はTimeWorldとする。

app.yamlを書き換える。
プログラムを変更する前に、既存プログラムと区別するためにapp.yamlを書き換える。
新しいアプリケーションを作っても良いけれど、10個しか作れないのでバージョンで分けることにする。

変更前app.yaml

application: firespeed-kenz
version: 1
runtime: python
api_version: 1

handlers:
- url: .*
script: main.py

のバージョン部分を2に変更する
変更後app.yaml

application: firespeed-kenz
version: 1
runtime: python
api_version: 2

handlers:
- url: .*
script: main.py

プログラム部分の変更
変更前main.py

※コメント部分と空白の一部を省略

#!/usr/bin/env python

import wsgiref.handlers
from google.appengine.ext import webapp

class MainHandler(webapp.RequestHandler):
def get(self):
self.response.out.write('Hello world!')

def main():
application = webapp.WSGIApplication([('/', MainHandler)],
debug=True)
wsgiref.handlers.CGIHandler().run(application)

if __name__ == '__main__':
main()


変更後main.py

#!/usr/bin/env python

import wsgiref.handlers
import datetime

from google.appengine.ext import webapp


class MainHandler(webapp.RequestHandler):

def get(self):
d = getJstTime()

if 6 < d.hour < 12:
self.response.out.write('Good Morning world!')
elif d.hour == 12:
self.response.out.write('Hello world!')
else:
self.response.out.write('Good after noon world!')

def getJstTime():
utc = datetime.datetime.today()
jst = utc + datetime.timedelta(hours=9)
return jst

def main():
application = webapp.WSGIApplication([('/', MainHandler)],
debug=True)
wsgiref.handlers.CGIHandler().run(application)


if __name__ == '__main__':
main()



日付を扱うために
importにdatetimeを追加する。

変更前

import wsgiref.handlers

変更後

import wsgiref.handlers
import datetime


日付によりメッセージを変更するために、MainHandlerクラスの日付を取得しgetメソッドにif文を組み込む
変更前

def get(self):
self.response.out.write('Hello world!')

変更後

def get(self):
d = getJstTime()
if 6 < d.hour < 12:
self.response.out.write('Good Morning world!')
elif d.hour == 12:
self.response.out.write('Hello world!')
else:
self.response.out.write('Good after noon world!')

変更点を細かく見ていく

d = self.getJstTime()

現在時間を取得して、変数dに格納する。
getJstTime関数については後述
datetime型の時刻はhourで取得できる。

if 6 < d.hour < 12:
self.response.out.write('Good Morning world!')

条件1は現在時間が6時以降かつ12時未満だった場合Good Morning world!と表示する。
チョット変わっているのが、d.hourの両側に比較演算子があること
他の言語なら

if 6 < d.hour and d.hour < 12

と必要なところがPythonだと

if 6 < d.hour < 12:

これで、6より大きく12より小さいと言うのが一発で指定できる。

もちろん普通にandやorでつなげることも出来る。
if 6 < d.hour < 12:とif 6 < d.hour and d.hour < 12:
は同じ動きをする

elif d.hour == 12:
self.response.out.write('Hello world!')

条件2は条件1に一致せず、12時の場合のみ、Hello Worldと表示する。

else:
self.response.out.write('Good after noon world!')

条件1、条件2ともに一致しなかった場合はGood after noon world!と表示される。

つまりこのプログラムは
7:00〜11:59 の間Good Morning world!と表示
12:00〜12:59 の間Hello world!と表示
13:00〜6:59の間Good after noon world!と表示される。


def getJstTime():
utc = datetime.datetime.today()
jst = utc + datetime.timedelta(hours=9)
return jst

getJstTimeは日本時間を取得する関数。
GoogleAppEngineは標準時間(イギリスの時間)を返すので日本の時間に合わせるために9時間加算している。

ためしに想定どおりに動くか、ローカルで実行してみよう

コマンドプロンプトを実行し、カレントフォルダをGAEに指定して。

dev_appserver.py timeworld

とタイプする。

http://localhost:8080にアクセスする。
時間帯に応じてメッセージが変更されるか確認してもらいたい。

Google App EngineにアップロードするにはGAEフォルダで
appcfg.py update timeworld
と打つ

GoogleAppEngineにログインし、アプリケーションを選択、
AdministrationのVersionを選択するとバージョンが二つ表示されるのが分かる。

それぞれLive URLには異なるアドレスが表示されていて、それぞれのバージョンをいつでも動かすことが出来る。
Version1へアクセスするとHelloWorldがVersion2へアクセスすると今回作ったTimeWorldが動く

Versionの欄にあるラジオボタンをチェックし、MakeDefaultを押すことで、標準的に実行するバージョンを指定することが出来る。
今はVersion1が標準となっているので
http://アプリケーションID.appspot.com/
アクセスすると、標準のHelloWorldが実行される。

次にGoogleAppEngine上でVersion2のラジオにチェックを入れてMakeDefaultボタンを押下し、
http://アプリケーションID.appspot.com/
をリロードすると挨拶アプリに変更される。

これによって、URLの変更などをすることなく、バージョン管理が可能となる。

実行例は以下
http://2.latest.firespeed-kenz.appspot.com

例題:
プログラムを変更して22:00〜6:59の間Good night world!と表示されるようにしてみよう。

前: GoogleAppEngineでPython 解析編 次:Python文法編 配列

関連キーワード

[Python][IT]

コメントを投稿する