はじめてのpython
TRANSCRIPT
はじめてのPython
Google App Engineでお気軽Webアプリ開発
本田 克己@GDD九州
こちらのイベント向けの資料ですhttps://www.facebook.com/events/272819922852292/
GDG九州って
GDG九州はGoogle関連の技術が好きな開発者、使っている開発者、使いたい開発者の交流の場です。
Googleが直接運営している訳ではありません。
ちなまにGDGはGoogle Developer Groupsの頭文字らしいです。以前はGTUG(Google Technology User Groups)という名前でした。
福岡の他、九州各地で勉強会を開いています。昨年、大分では温泉合宿を行っています。
Google+やFacebookのグループで情報交換などを行なっています。「GDG九州」で検索して、是非グループに参加してみてください。
はじめに
今日やること
● Pythonのお勉強 : 20分● Google App EngineでWebアプリを作る : 20分● その他の時間 : 5分
と、大丈夫ですか?って感じのスケジュールになっています。
インタラクティブシェルでPythonに触れてみる
Pythonには、インタラクティブシェルというのが用意されています。
インタラクティブシェルを使うと対話的にPythonを使用できます。
Windowsな人 Macな人
スタートメニューからPython(command line)を実行します
ターミナルを開いてpythonと入力してreturnキー
ターミナルは、アプリケーションフォルダのユーティリティに入っています。
Spotlightで検索してもいいかも
スタートメニューからPython(command line)を実行します
インタラクティブシェル
こんな感じのが表示されればOK
Pythonでプログラム書いてみる
インタラクティブシェルで、プログラムを書いてみます。
>>> の後ろに入力して、Enterキーを押します。
>>> 1 + 12>>> print('Hello world!')Hello world!
Python簡単だ�
インタラクティブシェルの終了
Windowsの人
Ctrl + z を押したあと、Returnキーを押します
>>> ^Zとなっている状態でReturnキー
Macの人
Ctrl + d を押します。
Pythonの基本 : 変数
データを保持しておくのに、変数を使うことができます。
変数名の大文字、小文字は区別されます。
変数の最初の文字に数字は使えません
変数に日本語などの文字は使えません(3.xからは使えます)
>>> a = 1>>> b = 2>>> c = 3>>> a + b + c6
>>> first_name = 'katsumi'>>> last_name = 'honda'>>> full_name = first_name + ' ' + last_name>>> print(full_name)katsumi honda
Pythonの基本 : 数値
数値は、割と直感的に使えるので、今のところは細かいことは気にしなくても大丈夫です。
数値の先頭を0から始めると、8進数として扱われるので、ここだけ注意してください。(16進数は0xから始めます)
>>> a = 100 # 10進数>>> b = 0100 # 8進数>>> c = 0x100 # 16進数>>> print(a, b, c)(100, 64, 256)>>>
Pythonの基本 : 数値の演算
加算 : +減算 : -乗算 : *除算 : /余り : %べき乗 : **
>>> a = 10>>> b = 3>>> a + b13>>> a - b7>>> a * b30>>> a / b3>>> a % b1>>> a ** b1000
Pythonの基本 : 文字列
文字列は、' か “ で囲みます。
クォーテーションの前にuをつけるとUnicode文字列になります。
日本語の文字列を扱う時は、Unicode文字列を使うようにしておいたほうが問題が起こりにくいので、uをつけるようにしましょう。
長い文字列はクォーテーションを3つ繋げて囲むと便利です。
>>> fruit = 'apple'>>> fruit = u'りんご'>>> print(fruit)りんご>>> long_text = u'''今日は... はじめてのPythonに... 参加しています'''>>> print(long_text)今日ははじめてのPythonに参加しています
Pythonの基本 : 何もない値
>>> money = None>>> print(money)None
何もないことを表すのに、Noneを使います。
Pythonの基本 : 真偽値
プログラムの条件分岐とかで使うやつです
TrueFalse
と、頭文字が大文字になります
>>> t = True>>> f = False>>> t, f(True, False)
Pythonの基本 : 論理演算
真偽値の組み合わせて判断する時に、論理演算を行います。and or not を使います。
>>> True and TrueTrue>>> True and FalseFalse>>> False and FalseFalse>>> True or TrueTrue>>> True or FalseTrue>>> False or FalseFalse>>> not TrueFalse>>> not FalseTrue
Pythonの基礎 : 文字列の操作
>>> 'hello ' + 'world''hello world'
■連結文字列と文字列を + で繋げられます
>>> 'hello' * 10'hellohellohellohellohellohellohellohellohellohello'
■繰り返し文字列に数字を掛けると、文字列を繰り返します
■フォーマット%sや%d等を含んだフォーマット文字列に、%演算を行うと値を埋め込めます
>>> 'hello %dst %s' % (1, 'python')'hello 1st python'
Pythonの基本 : リスト、タプル、辞書
複数の値を扱うのに、リストやタプル、辞書を使うと便利です
■リスト順序を持った値の集合です。値の追加や削除など、変更が行えます。[ と ]で囲んで、値をカンマで区切ります。
■タプルリストと同じような感じですが、変更が行えません。( と )で囲んで、値をカンマで区切ります。
■辞書キーと値を組み合わせた集合です。連想配列とかいうのと同じです。{ と }で囲んで、キー: 値の組み合わせをカンマで区切ります
Pythonの基本 : リスト
>>> mylist = ['apple', 100]>>> mylist[0]'apple'>>> mylist[1]100>>> mylist[2]Traceback (most recent call last): File "<stdin>", line 1, in <module>IndexError: list index out of range>>> mylist.append(True)>>> mylist['apple', 100, True]
1つのリストに色々な型の値を入れることができます。リストの変数の後に [] で数字を指定すると、その場所の値が得られます(この数字を添字といいます)
appendでリストに追加できます
Pythonの基本 : タプル
>>> mytuple = ('abc', 123)>>> mytuple[0]'abc'>>> mytuple[1]123>>> mytuple[1] = 234Traceback (most recent call last): File "<stdin>", line 1, in <module>TypeError: 'tuple' object does not support item assignment
リストと同じように使えますが、変更だけできません。
Pythonの基本 : 辞書
>>> mydict = {'name': 'apple', 'price': 100, 1: True}>>> mydict{1: True, 'price': 100, 'name': 'apple'}>>> mydict['name']'apple'>>> mydict[1]True
キーには、文字列以外に数値など、使用出来ます。
が、文字列を使うことがほとんどです。タプルもたまにキーに使うことがあります。
リストはキーには使えません。
>>> mydict[(1,1)] = 'red'>>> mydict{1: True, 'price': 100, 'name': 'apple', (1, 1): 'red'}
Pythonの基本 : インデント
Pythonでは、コードブロックを表すのにインデントが使われます。
こんな感じになります。とりあえず入力して実行してみましょう
>>> for i in range(50):... if i > 0 and (i % 3 == 0 or i % 10 == 3):... print i...
インデントをつける前の行末のコロン : を忘れないように気をつけてください。
インデントの数は、同じコードブロックで統一されていれば問題ありません。
一般的にはインデントに半角スペースを4つ使用します。
Pythonの基本 : 条件分岐
変数の内容などによって、プログラムの動作を切り替えたりするのを条件分岐といいます。if else elif を使います。
>>> food = 'karaage'>>> if food == 'toriten':... print 'nice!'... elif food == 'karaage':... print 'so-so'... else:... print 'what?'... so-so
Pythonの基本 : 繰り返し
繰り返して処理を行う時は、forループかwhileループを使います。
■forループ
リスト等の集合を1つずつ取り出して実行します。
range()関数で任意の数の、リストが生成できるので組み合わせて使用することも多いです。
>>> for i in range(10):... print i... 0123456789
Pythonの基本 : whileループ
条件が真(True)の間、繰り返し処理を行います
>>> i = 10>>> while i > 0:... print i... i = i - 1... 10987654321
Pythonの基本 : 繰り返し
>>> for food in ['toriten', 'karaage', 'tatutaage']:... print '%s : %d' % (food, len(food))... toriten : 7karaage : 7tatutaage : 9
任意のリストを順番に処理できます。任意のリストを順番に処理できます。
ここでは、それぞれの文字数を表示しています。
len()関数で、文字の長さや、リストの長さを取得できます。
Pythonの基本 : 関数
何度も行う処理は、コピペしないで関数にまとめます。
def 関数名(パラメータ1, パラメータ2, ...): 関数の処理 return 処理結果
といった感じで関数を定義します。
関数を実行する時は
関数名(パラメータ1, パラメータ2, …)
という感じです。
Pythonの基本 : 関数
>>> def oita_check(food):... if 'toriten' == food:... return 'nice'... elif 'karaage' == food:... return 'so-so'... else:... return 'what?'... >>> oita_check('tatutaage')'what?'>>> oita_check('toriten')'nice'>>>
大分チェック関数を作ってみる
Pythonの基本 : モジュール
様々な機能がモジュールとして提供されています。
モジュールの機能を使う為には、 import で、モジュールをインポートします。
>>> import datetime>>> datetime.datetime.now()datetime.datetime(2013, 4, 18, 15, 45, 32, 263188)
datetimeモジュールをインポートして、現在日時を取得しています。
datetime.datetimeというのが冗長ですが、
from モジュール名 import インポートするものという形式を使用することもできます
>>> from datetime import datetime>>> datetime.now()datetime.datetime(2013, 4, 18, 15, 51, 4, 803230)
Pythonの基本 : クラス
オブジェクト指向とかいうので出てくるクラスです。
class Food(object): def __init__(self, name, price): self.name = name self.price = price def how_match(self, gram): print '%sの値段は%d円です' % (self.name, self.price * gram / 100.0)
toriten = Food(u'とり天', 200)toriten.how_match(150)
こんな感じで使います。
クラスの名前は、大文字で始めるのが一般的です。クラス名(パラメータ...)で、オブジェクトが作られます__init__関数は、オブジェクトが作られる時に呼ばれます
Pythonの基本
他にも、色々と知っておいたほうがいい決まりとか、便利な機能とかがあるのですが、これまでの内容がなんとなくわかれば、なんとなく作り始められます。
全部を理解していなくても大丈夫です。
エディタを使う
インタラクティブシェルは、すぐ実行結果が分かって便利ですが何回も使うコードを毎回入力するのは大変です。
エディタを使って、コードをファイルに保存しましょう。
文字コードの指定
ファイルを保存する時は、UTF-8を指定してください。(UTF-8じゃないとダメって訳じゃないですが、統一しておきます)
ファイルの拡張子は .py にします。
ファイルの1行目か2行目に、
# -*- coding: utf8 -*-
という行を入力します。(これでPythonにファイルの文字コードを教えてあげています)
エディタでコードを書いてみる#!/usr/bin/env python# -*- coding: utf8 -*-class Food(object): def __init__(self, name, price): self.name = name self.price = price def how_match(self, gram): unit = gram / 100.0 print('%s : %d' % (self.name, self.price * unit))
if __name__ == '__main__': karaage = Food('karaage', 200) toriten = Food('toriten', 180) karaage.how_match(200) toriten.how_match(300)
アプリケーションの設定
Application Nameに guest-book
Application Directoryに デスクトップ等を指定して
[Create]ボタンを押します。
Admin Port, Portは、他の開発ツールとバッティングしないように気をつけてください。
起動してみる
guest-bookが選択された状態で、[Run]ボタンを押します。
Webブラウザで http://localhost:8080/ にアクセスします。
Port番号を変更した場合は、8080の部分を合わせてください。
Google App EngineでWebアプリを作る
準備万端なので、いよいよWebアプリを作ります。ゲストブック的なものを作ってみましょう。
まずはGoogleAppEngineLauncherを起動します。メニューから [File] → [New Application] を選択します
Hello world!
Hello world!!
って表示されました?
表示できた人は、周りで困っている人がいたら助けてあげてください
入力フォーム
guest-bookのmain.pyを開いて編集していきます。2行目に # -*- coding: utf8 -*-を追加します。
template という変数名で、HTMLを入力します。
MainHandlerクラスのget関数内の
self.response.write() に templateを渡します
import webapp2
template = u'''<!doctype html><html><head><title>ゲストブック</title></head><body><h1>ゲストブック</h1><form method="post"><label>お名前<input type="text" name="name"></label><br><label>メッセージ<input type="text" name="message"></label><br><input type="submit" value="書き込む"></form></body></html>'''
class MainHandler(webapp2.RequestHandler): def get(self): self.response.write(template)
app = webapp2.WSGIApplication([ ('/', MainHandler)], debug=True)
ブラウザをリロードすると、こんな画面が表示されます。
[書き込み]ボタンを押すと怒られます
MainHandlerクラスに、post関数を追加します。(とりあえず get と同じにしておきます )
class MainHandler(webapp2.RequestHandler): def get(self): self.response.write(template) def post(self): self.response.write(template)
入力内容を表示してみる
postしたときに、フォームの内容を表示するようにしてみます。
postしたフォームの内容は、
self.request.POST['名前']
で取得出来ます。
templateをフォームの内容を表示する前の部分と、後ろの部分に分割
import webapp2
template1 = u'''<!doctype html><html>省略<input type="submit" value="書き込む"></form>'''
template2 = u'''</body></html>'''
class MainHandler(webapp2.RequestHandler): def get(self): self.response.write(template1) self.response.write(template2) def post(self): self.response.write(template1) name = self.request.POST['name'] message = self.request.POST['message'] append = "%s : %s" % (name, message) self.response.write(append) self.response.write(template2)
app = webapp2.WSGIApplication([ ('/', MainHandler)], debug=True)
import webapp2
template1 = u'''<!doctype html><html>省略<input type="submit" value="書き込む"></form>'''
template2 = u'''</body></html>'''
class MainHandler(webapp2.RequestHandler): def get(self): self.response.write(template1) self.response.write(template2) def post(self): self.response.write(template1) name = self.request.POST['name'] message = self.request.POST['message'] append = "%s : %s" % (name, message) self.response.write(append) self.response.write(template2)
app = webapp2.WSGIApplication([ ('/', MainHandler)], debug=True)
保存してみる
データを保存するためのクラスを定義します。
from google.appengine.ext import db
class Greeting(db.Model): author = db.StringProperty() message = db.StringProperty(multiline=True) date = db.DateTimeProperty(auto_now_add=True)
postした時に、Greetingオブジェクトを保存するようにします
greeting = Greeting() greeting.author = name greeting.message = message greeting.put()
管理画面
http://localhost:8000/ にアクセスすると、管理画面が表示されます。
Datastore Viewerを開くと、データの登録状況が確認できます。
保存内容を表示する
def render(self): self.response.write(template1) greetings = db.GqlQuery("SELECT * FROM Greeting") for greeting in greetings: self.response.write( '%s : %s<br>' % (cgi.escape(greeting.author), cgi.escape(greeting.message)) ) self.response.write(template2)
getでもpostでも表示できるように、render関数を追加してみます
データの取得は、db.GqlQueryで行えます
def get(self): self.render() def post(self): name = self.request.POST['name'] message = self.request.POST['message'] greeting = Greeting() greeting.author = name greeting.message = message greeting.put() self.render()
getとpostから、render関数を呼ぶように変更します。
今日はここまで!
おつかれさまでした�