Python とDjango の環境と基礎を勉強してみる

PythonとDjangoの環境と基礎を勉強してみる

海外で大人気のPythonですが、日本もやっぱりサーバサイドはこれからはPythonだ、と思ってしまったのでPythonを勉強してみることにしました。

Python3.6.4をインストールします。ダウンロード

Python とDjango の環境と基礎を勉強してみる

「Install now」をクリックします。

Python とDjango の環境と基礎を勉強してみる

「Close」をクリックします。

コマンドプロンプトで「python -V」とタイプして、以下表示されればOKです。(Vは大文字で)

pipとは

pipとは、Pythonのパッケージ管理ツールです。node.jsでいうnpmのようなものです。

pipのバージョンを確認します。(Vは大文字で)

Django(ジャンゴ)をインストールする

「pip install django」でDjangoをインストールします。

インストールされたかどうかを確認します。

確認は、「python -m pip freeze」です。

Django2.0.1がインストールされていることが確認できます。

Djangoプロジェクトを作成する

Djangoプロジェクトを作成するには、「startproject」コマンドを使用します。

testprojectというプロジェクトを作成してみます。

testprojectの構成は以下のようになります。

各ファイルの説明です。tutorial

manage.py Djangoプロジェクトに対して色々操作できるユーティリティコマンド
settings.py Djangoプロジェクトの設定ファイル
urls.py DjangoプロジェクトのURL宣言
wsgi.py プロジェクトをサーブするためのWSGI互換Webサーバーとのエントリーポイント
__init__.py このディレクトリがPython パッケージであることをPythonに知らせるための空のファイル

Djangoとは

Djangoとはどのような役割をするかについて。

1.Pythonで書かれた軽量なWebサーバである

2.あくまでも開発用Webサーバであり、Apacheのような運用Webサーバではない

3.Webアプリフレームワークである

Webサーバ(runserver)を起動する

Webサーバを起動するには、「python .\testproject\manage.py runserver」と実行します。

終了するには、「Ctrl + c」で終了できます。

http://127.0.0.1:8000/にアクセスします。デフォルトポートは8000です。

Python とDjango の環境と基礎を勉強してみる

上記の画面が表示されればWebサーバは起動成功しています。

ポートを変更して起動する

ポートを変更して起動したい場合は、「python .\testproject\manage.py runserver 8080」と実行します。ポートを8080に変更していますので、http://127.0.0.1:8080/にアクセスします。

runserverのオートリロード機能について

runserverは、pythonのソースが変更されていれば、リクエストしたタイミングでオートリロードしてくれるため、サーバ再起動は必要ありません。

但し、新規作成したファイルなどは、オートリロードしてくれないため、再起動が必要となります。

ネットワーク上の他のマシンから開発用サーバを見れるようにする

http://127.0.0.1:8000/では、同じネットワーク上の他のマシンから開発用サーバを見ることができません。

他のマシンから見れるようにするには、プライベートアドレスを指定するか、http://0.0.0.0:8080/と指定します。

settings.py(設定ファイル)を修正する

設定ファイルのsettings.pyを修正します。

まず言語がen-usとなっており、日本語になっていないので、jaに設定します。

タイムゾーンがUTCとなっており、Asia/Tokyoに設定します。

INSTALLED_APPSについて

デフォルトで、INSTALLED_APPSには、以下アプリケーションが入っています。

django.contrib.admin 管理(admin)サイト
django.contrib.auth 認証システム
django.contrib.contenttypes コンテンツタイプフレームワーク
django.contrib.sessions セッションフレームワーク
django.contrib.messages メッセージフレームワーク
django.contrib.staticfiles 静的ファイルの管理フレームワーク

データベースの設定

次にDBの設定を見てみます。デフォルトではSQLite3が設定されています。

データベースはSQLiteの他、以下が公式にサポートされているので指定できます。

Pollsアプリケーションを作成する

アプリケーションの配置場所はPYTHONPATHのどこにでも置くことが可能です。

Pollsアプリケーションを作成するには、「python manage.py startapp polls」と実行します。

pollsというディレクトリが作成され、以下のような構成となります。

PollsアプリケーションのViewを作成する

PollsアプリケーションのVeiwを作成します。pollsディレクトリ配下のviews.pyというファイルを開き、以下のように記述します。

from パッケージ import モジュールでdjango.httpというパッケージからHttpResponseというモジュールをインポートしています。

インポートすることにより、そのモジュールが使用可能になります。

defは関数を定義しますのでindexという関数を定義しています。

関数書式例です。addという関数を定義しています。Pythonでは文章の終わりはセミコロン(;)ではなく、改行です。

returnでHttpResponseを返していますが、returnを省略した場合は、Noneを返します。

django.httpパッケージで定義されているHttpResponseモジュール(クラス)は、コンストラクタに文字列を渡すのが一般的です。

URLマッピングする

PollsアプリケーションでViewを呼ぶには、URLマッピングしてあげる必要があります。

pollsディレクトリ配下にurls.pyというファイルを作成します。

urls.pyの中身を以下のようにします。

プロジェクトのurls.pyを設定する

testproject配下のurls.pyを編集します。

django.urlsパッケージのincludeモジュールをインポートしています。

URLパターンをインクルードするときは必ずinclude() を使います。

admin.site.urls はこれについての唯一の例外です。

ブラウザで、http://127.0.0.1:8000/polls/にアクセスすると以下のように表示されることが確認できます。

Python とDjango の環境と基礎を勉強してみる

データベースをマイグレーションする

SQLite3(正確にはsettins.pyで設定されているデータベース)をマイグレーションするには、「python manage.py migrate」を実行します。

※この機能は、特定のデータベースの文法に依存せずに全てのテーブルを作成することができます。

Pollsアプリケーションのモデルを作成する

モデルとは、端的に言うと、テーブルと同じ構成になります。

pollsディレクトリ配下にmodels.pyというファイルが存在します。

このファイルを開き、django.dbパッケージのmodelsモジュールをインポートする必要があります。以下、モデル作成例です。

Pythonでクラス定義する

Pythonでクラス定義するには上記のようにclassキーワードを使用します。

慣例として先頭文字は大文字です。

以下、クラス書式例です。

Pythonでは、クラスのインスタンスを生成することができます。但し、Javaのようにnewキーワードは使用しません。

これでインスタンス生成ができていますのでメソッドも使用することができます。

Pythonで変数を定義する

Pollsアプリケーションのモデルを見ると、いきなり「question_text」という変数が表示されています。

Pythonの変数には型指定することがありません。数値か文字列か判断するのは実行時に判断されます。これを動的型付けと言います。

ちなみにPythonの定数もありませんが、慣例として大文字で宣言します。

models.Modelを継承したサブクラス

「class Question(models.Model):」というようにクラス名に()をつけて、中に指定したクラスは親クラスとなります。要するに、Questionクラスは、models.Modelのサブクラスということになります。Pythonではこのように記述することにより継承することができます。

models.CharField()とは

models.CharField()とは、文字のテーブルフィールドを表します。

max_lengthは、フィールドの (文字列の) 最大文字数です。max_length はデータベースレベルと Django のバリデーションで施行されます。

models.DateTimeField()とは

models.DateTimeField()とは、日時のテーブルフィールドを表します。

モデルで定義したクラスの変数名はPythonで使うとともに、データベースの列名にもなります。

models.ForeignKey()とは

models.ForeignKey()とは、第一引数で指定したクラス名(シングルクォーテーションで囲ってもよい)

models.IntegerField()とは

models.IntegerField()とは、後日記述します

Pythonのモデルを有効にする

Pythonのモデルを有効にするには、testprojectプロジェクトのsettings.pyを編集します。

INSTALLED_APPSに「’polls.apps.PollsConfig’,」を追加します。

これで、Djangoがpollsのアプリケーションの存在を知ることができます。

次に「python manage.py makemigrations polls」を実行して、マイグレーションします。

これで、polls\migrations配下に、「0001_initial.py」というマイグレーションファイルが作成されます。

SQLを「python manage.py sqlmigrate polls 0001」コマンドで確認します。

これで、「python manage.py migrate」でマイグレーションします。

モデルを変更するということは、テーブルを変更するということです。マイグレーションはデータベース、テーブルを削除せずに、しかもデータも削除することなくデータベースをアップグレードしてくれる強力な機能です。

手順

1.models.pyを変更する。

2.「python manage.py makemigrations」を実行する。

3.「python manage.py migrate」を実行する。

管理ユーザを作成する

adminサイトにログインできる管理ユーザを作成します。

管理ユーザを作成するには、「python manage.py createsuperuser」を実行します。

「This password is entirely numeric.」と表示されましたので、パスワードは数字のみはNGのようです。英数字ならOKのようです。

管理サイトにアクセスする

管理サイトにアクセスするには、http://127.0.0.1:8000/admin/にアクセスします。

以下の画面が表示されます。

Python とDjango の環境と基礎を勉強してみる

先ほど設定したユーザ名とパスワードでログインします。

Django管理サイトが開きます。

Python とDjango の環境と基礎を勉強してみる

Pollアプリをadmin上で編集できるようにする

Pollアプリをadmin上で編集できるようにするには、、、

※詳細は後日記述します。

Django参考サイト

ここからPythonのお勉強

ではPythonを勉強してみましょう。IDEは、PyCharm(有償)を使いたいのですが、VSCodeで私は勉強しました。PyCharmのほうがインテリセンスが優れているようです。

上記を実行します。

結果は以下になります。

__name__とは

nameとは、スクリプト実行時に自動で生成される変数になります。PythonプリンタでPythonスクリプトを読み込むとnameには、__main__という値が入ります。

なので上記の、if name == ‘__main__‘は、Trueとなり、print関数が実行されます。

Pythonの関数

Pythonの関数は、def 関数名():で定義します。

関数の使い方は関数名()とします。Pythonの関数でも引数を渡すことができます。

また、引数にはデフォルト値を設定することができます。(JSみたいですね)

デフォルト値が指定できるということは、関数を使用する際に引数の数は定義と同じでなくて良いということになります。以下を実行しましょう。

関数を使う時に引数が一つですが、結果は4となります。

returnだけ書いたら何が返ってくるでしょうか。実はNoneが返ってきます。

Pythonの関数スコープについて意識しておく必要があります。

以下のようにコーディングしたとします。

結果は5が返ってくるかと思いますが、実は4が返ってきます。これは関数を定義した時点のスコープが適用されるためです。

関数の引数にリストなどのミュータブルな型を指定する場合は、デフォルト値の動きに注意が必要です。

結果は以下のようになります。

これは、デフォルト値の評価は1回しかされないことを意味します。

Pythonの関数で可変長引数

Python3からJavaと同じく可変長引数を指定することが出来るようになっています。

*変数名というように指定します。

結果は以下のようになります。戻り値はタプル型であることもわかります。

可変長引数の関数を作成する場合、可変長引数が一番最後でないとエラーとなります。

Pythonのキーワード引数

Pythonのキーワード引数とは前述したデフォルト値のことです。

例えば以下のようなtest1,test2というキーワードに値が入っている変数をキーワード引数と言います。

以下のように関数を定義することが出来ます。

関数の引数が多いのはよろしくないので、**変数名と指定することでキーワード引数を一つの変数でまとめることが出来ます。

このキーワード引数にも順序があって、**は最後に記述しないとエラーとなります。

Pythonのラムダ式関数

Pythonにはラムダ式関数というのがあって、無名関数を定義することが出来ます。

無名関数を定義するには、lambdaキーワードを使用します。

上記の書式で記述します。以下、例です。

関数にはdocstringという説明文があります。

関数定義の1行目に”’~’’’を使用して、関数の説明文を記述することが出来ます。

説明文を出力するにはhelp(関数名)とします。以下、例です。

結果は以下のようになります。

__doc__を使用すると、”’~”’で囲んだ部分だけを出力することが出来ます。

結果は以下のようになります。

Pythonの定数

Pythonには定数がありません。なので、慣例として変数名を大文字にしている変数を定数と見なす、といった慣例があります。

Pythonの変数

Pythonの変数は、アンダーバー、または英数字からなる変数名という決まりがあります。また、先頭1文字目はアンダーバーか英字でないといけません。

Pythonの多重代入

多重代入と言って、カンマ区切りで変数を宣言し、初期化することができます。

Pythonの型

Pythonには型がありますが、動的型付けなので、変数名にあらかじめ型を定義することはありません。

以下、例です。

Pythonのコメント

Pythonのコメントはほかの言語と同じく複数行コメントと1行コメントがあります。

“””と”””の間はコメントになります。これは複数行コメントすることが可能です。

#の後ろはコメント行になります。

Pythonの文字列変換と数値変換

Pythonでは、str()で数値を文字列に変換することができます。また、int()で文字列を数値に変換することもできます。

上記は、エラーとなります。文字列と数値の連結はできません。以下のように修正します。

strを使えばint型をstr型に変換することができます。

以下は文字列を数値に変換する例です。

Pythonの変数は宣言時に必ず初期化する

Javaなどの言語では、宣言と初期化は別々に記述できます(普通はしないが)が、Pythonではできませんので注意が必要です。

tkinterモジュールでGUIプログラムを作成する

Pythonにはtkinterモジュールがあり、このモジュールはウィンドウを作成することができます。

以下はウィンドウ作成・表示する基本プログラムです。

ウィンドウが表示されます。×ボタンで終了します。

Python とDjango の環境と基礎を勉強してみる

tkinterモジュールのTk()メソッドでウインドウオブジェクトを変数windowに返します。

window.mainloop()とすることで、ウィンドウを表示します。

※GUIについては詳細は後日記述します。

Pythonのif文

Pythonのif文の書き方は少し変わっています。※直観的でわかりやすい

if~else文を書いてみます。

if文の条件分岐が複数ある場合の記述方法です。

elseはなくても構いません。

if文を入れ子にしてみます。

Pythonは、このようにインデントすることによってブロックを分けて、if文の入れ子を実現させます。眼で見てすぐわかるので直観的でとてもわかりやすい言語仕様になっています。

条件が複数の場合、他の言語と同じく、論理演算子を使います。

Pythonでは、以下があります。

and 条件式 and 条件式 かつ
or 条件式 or 条件式 または
not not 条件式 条件式がTrueの場合、False、Falseの場合、True

Pythonの真偽値

Pythonの真偽値は、TrueとFalseです。先頭1文字が大文字なので気を付けましょう。

また、Trueはintの1です。Falseはintの0です。以下を実行するとわかります。

Pythonの文字列

Pythonの文字列には多くのメソッドがあります。分割するには、splitメソッドを使用します。

splitメソッドは、デフォルトは半角スペースで分割します。以下、例です。

Pythonの文字列で置き換えするにはreplaceメソッドを使用します。JavaでいうreplaceAllと同じ動きをします。

Pythonの文字列で結合するにはjoinメソッドを使用します。文字列型のjoinの使い方が他言語と少し違うのでちょっと戸惑うかもしれません。セパレータ.join(リスト)という形になります。

ちなみにprint()でカンマ区切りで表示すると、半角スペースが入ります。

結果は以下のように、@がセパレーターとなって結合されています。

Pythonの文字列を大文字にする場合はupper()メソッド、小文字にする場合はlower()メソッドが用意されています。

結果は以下のようになります。

このことから、upper(),lower()メソッドは変数自体の値は破壊しないことがわかります。

Pythonの文字列から特定の文字位置をさがすには、findメソッドを使用します。

結果は以下のようになります。

‘t’は2つありますが、最初に見つけた位置を返します。

Pythonのインデクシング

Pythonでは文字列やリストの一部分を簡単に取得することが出来ます。

文字列に[と]で囲んで数値(インデックス)を指定することで、文字列の一部分を取得することが出来ます。また、末尾から取得したい場合はマイナス値を指定したりもできます。また、0と-0は同じ意味を示すようです。

Pythonのスライス

以下のように[と]で開始位置、終了位置を指定することで、取得範囲を指定することもできます。これはスライスという機能です。

ちなみにスライスは後述するリストにも適用可能です。

インデクシングとスライスはよく似ていますが、エラーが若干違うようです。

Pythonの文字列比較

Pythonで文字列を比較するには、is演算子is not演算子を使います。

結果は以下のようになります。

Pythonの文字列はイミュータブル(変更不可)である

文字列をインデクシングしたりできますが、その値を変更することは不可能な言語仕様のようです。

Pythonのリスト型

Pythonにはリスト型という型があります。JSで言う配列のようなイメージです。

[と]で囲み、数値や文字列、変数などをカンマ区切りで指定していきます。

リストはオブジェクトですので変数に格納することが可能です。

リストは文字列型同様インデクシング、スライスが可能です。

リストにおけるインデクシングは要素を返すのに対し、スライスは新たなリストを返します。

Pythonのリストには色々なメソッドがあります。

リストに要素を追加するにはappend()メソッドextend()メソッドを使用します。逆にリストの要素を削除するにはpop()メソッドや、remove()メソッドがあります。

要素番号を取得するindex()メソッドという少し変わったメソッドもあります。

pop()メソッドの引数にはインデックスを指定します。

remove()メソッドの引数には要素の値を指定します。

remove()メソッドは値を指定するわけなので、同じ値が重複している場合はどうなるかと思いました。’test2’という値が重複したリストで、実行してみます。

remove()メソッドの動作としては最初に見つけた要素の値のみを削除するようです。

個人的にはremoveよりもpopを使用したほうが良いように思います。

次に要素を追加するappend()メソッドextend()メソッドを使ってみます。

append()メソッドでintの3を追加しました。結果から末尾に追加されることがわかります。

extend()メソッドは引数にリストを指定します。リストにリストを追加するメソッドです。

ちなみにextend()メソッドは、実は+と一緒です。

文字列同士が連結できるようにリスト同士も連結することが出来ます。

但し、元のリスト変数を破壊するわけではないので、上記のように代入してあげる必要があります。

次にリストのinsert()メソッドの使い方について記述します。

第一引数がインデックスになります。0と指定した場合、0の前に要素がインサートされます。

第二引数に要素値を指定します。以下、記述例です。

結果は以下のようになります。

次にリストのindex()メソッドの使い方について記述します。

index()メソッドの引数には値を指定し、その値のインデックスを返すだけです。

注意しなくてはいけないのは、存在しない要素のindex値を探そうとすると、ValueErrorが発生してしまいますので、エラーハンドリングが必要となります。

エラーハンドリングについては後述します。

次にリストのclear()メソッドの使い方について記述します。

clear()メソッドはリストをクリアします。空のリストにします。以下、例です。

これは、del lst[:]としても同じです。

次にリストのcount()メソッドの使い方について記述します。

count()メソッドの引数に指定した値が、リストにいくつ含まれるかをカウントして返すメソッドになります。ない場合は、0を返します。

リストを昇順、降順にソートする

やっぱりリストは昇順、降順にソートしたい、という場合が出てくると思います。ロジックで書くことも可能ですが、Pythonではsort()メソッドreverse()メソッドが既に用意されています。

意図した結果がか返ってこず、Noneと表示されてしまいました。以下を参照してください。

http://docs.python.jp/3/library/stdtypes.html#list.sort

リストのsort()メソッドもreverse()メソッドも変数を破壊してしまうようです。また、ソートした結果を返すわけではありません。なので、一旦ソートしてからprintする必要があります。

Pythonのfor文

リストをfor文でループする、というのはよくあるコーディングだと思います。これはPythonでももちろん実装することが出来ます。for-in文を使用します。

listの要素を順次iに格納してループし、printしています。結果は以下のようになります。

ちなみにこのin演算子はちょっと違った使い方もできます。

リストに指定した値が入っているかどうかをTrue,Falseで返してくれます。if文と併用して使ったりするんじゃないでしょうか。

in演算子があるということは、not in演算子もあります。これはin演算子の否定形なだけです。

Pythonのリスト型のfor文で推奨されることとして、リストをループする時はスライスコピーにループをかけること、です。リスト型はミュータブル(変更可)な型なので、for文の中でリストを変更する可能性がある場合は危険だったりします。

上記は無限ループになるので、MemoryErrorが発生します。以下のようにスライスコピーに変えておきます。

Pythonのcontinueとbreak

for文が使えるならcontinueとbreakが使えるかが気になりますね。以下、continue文を使用します。

結果は以下のようになります。Javaと同じですね。

次はbreakを使用します。

結果は以下のようになります。これもJavaと同様でわかりやすいです。

Pythonのfor-else文

Pythonのfor文には最後にelse句を付けることができます。

結果は以下のようになります。forループが終わってから最後に実行されていることがわかります。

for-else文でbreakした場合、elseは実行されるのか試してみます。

結果は以下のようになります。breakされるとfor-elseのelse文は実行されないようです。

for-else文でcontinueすると、else句は実行されるので注意です。

結果は以下のようになります。

Pythonのタプル型

Pythonのタプル型はリスト型とそっくりですが、(と)で囲みます。オブジェクトはカンマ区切りで指定します。

単要素のタプルのみ、末尾に,が必要となります。結果は以下の通りです。

実は(と)で囲まなくてもカンマ区切りでタプル型を宣言する事が出来ます。

タプル型はリスト型と非常によく似ており、インデクシングも可能です。

では、違いは何かというとリストがミュータブル(変更可)に対し、タプルはイミュータブル(変更不可)である、ということです。

上記を実行すると、TypeError: ‘tuple’ object does not support item assignmentが発生します。

このイミュータブルという意味ですがちょっとややこしいので、以下を実行してみます。

これはエラーとなりません。なぜかというとtupleという変数に代入しているからであって、タプル型の要素を変更したり追加したりしているわけではないので、正常に動作します。

ついでに、タプル型とタプル型を連結させるとどうなるか見てみましょう。

これは正常に動作します。Pythonのid関数を使えば理由がわかりやすいと思います。

オブジェクトの識別子が違うことがわかりますね。ということは、タプル型とタプル型を連結することによって、新しいタプルオブジェクトが新規作成されている、ということになりますので、正常に動作するわけです。

タプル型のアンパッキング

タプル型はJSでいうデストラクチャリングのようなことが出来ます。タプル要素数と変数の数が一致している必要があります。

結果は以下のようになります。

このアンパッキングはリスト型でも可能で、イテレータブルな型ならアンパッキングすることが出来ます。

Pythonのset型

Pythonにはset型という型があり、リストに似ていますが、順序が保証されない、かつ、重複要素を許さない型になります。

空のsetを作成してみます。

結果は以下のようになります。

次は重複した要素を入れて出力してみます。set型は{と}で要素を囲みます。

結果は以下のようになります。

set型は文字列、リスト、タプル、後述する辞書から作成することが出来ます。

結果は以下のようになります。

set型はインデクシング、スライスができない

set型は順序が保証されていないので、インデクシングが出来ません。

TypeError: ‘set’ object does not support indexing」が表示されます。

またスライスもできません。「TypeError: ‘set’ object is not subscriptable」が表示されます。

set型の計算

set型は和集合や差集合、積集合などを簡単に求めることが出来ます。

結果は以下のようになります。

Pythonの辞書型

Pythonには辞書型という型があり、JSON形式と相性が良いと思います。(似ているので)

以下のように定義します。

{キー1:値1, キー2:値2, …}

辞書型は、順序付けのされていないキーと値のペアの集合である、というのが重要なポイントです。

以下、実行例です。

上記のようにキーを指定して、その値を取得することが出来ます。キーには文字列や数値も指定可能です。その他タプルもキーとして指定できるようです。

辞書型にキーと値を追加することが出来ます。

辞書型のキーと値を削除するにはdel文を使用します。

結果は以下のようになります。

dict()関数を使用して辞書型を作成する

dict()関数の引数にタプルのタプル、または、タプルのリストを与えることによって辞書型を作成することが出来ます。

結果は以下のようになります。

Pythonのfor文テクニック

リスト型はfor文でループすることが出来る事を説明しました。辞書型をfor文でループするにはitems()メソッドを使用してループします。

キーに対する値も同時に取得することが可能です。

結果は以下のようになります。

keys()メソッドでキーだけを取得する

辞書型のキーだけを取得するにはkeys()メソッドlist関数を使用します。

結果は以下のようになります。

順序を保証したい場合はlistではなくsortedを使用します。

結果は以下のようになります。

enumerate()関数を使用すると、リストやタプルをループする際に、インデックス(基底値は0)と値を取得することが出来ます。

結果は以下のようになります。

2つ以上のリストなどを同時に処理したい場合はzip関数を使用してループすると便利です。

結果は以下のようになります。

リストなどをソートされた順序でループしたい場合はsorted関数を使用してループすると便利です。sorted関数は新たな識別子でオブジェクトを返してくれます。

結果は以下のようになります。

リストなどをソートされた逆の順序でループしたい場合はreversed関数を使用してループすると便利です。

結果は以下のようになります。

Pythonのlen関数

文字列とリストの説明をしたので、Pythonのlen関数について記述します。

len関数は文字列やリストの要素数を数値で返す関数です。

Pythonの数値計算

Python3.6.4の数値計算はちょっと独特です。(Python2.x.xとは少し動作が違う様子)

  • int型同士の除算は割り切れてもfloat型で返ってくる
  • 小数点以下を切り捨てたい場合は//で割る
  • **で累乗の計算ができる
  • 文字列型に整数で掛け算ができる

文字列に掛け算ができるのは驚きですね。ここで浮動小数点数(float)を掛けたらどうなるかと思って実行したら、TypeError: can’t multiply sequence by non-int of type ‘float’とエラーとなりました。整数のみの掛け算が可能なようです。

Pythonのdel文

Pythonにはdelというキーワードがあります。これは、オブジェクトを丸ごと削除します。

delキーワードは、リストやタプル、辞書型の要素を削除することもできます。

Pythonのprint文

何気に使っているprint文ですが色々使い方があります。デフォルトは最後に改行コードが付きますが、end=を指定することにより、末尾の改行コードをどうするか指定することができます。end=のデフォルト値は改行コードです。

format関数を使用すると、文字列と変数を整形して表示することができます。

%dと%s

C言語と同じように、数値型は%d、文字列型は%sでprint文を記述することができます。

表示したい引数が複数存在する場合は、タプル型を使用します。

Pythonのrange関数

Python3.6.4のrange関数は、連続した数値を作る関数です。

引数は3つあり、以下の書式となります。

実際に使ってみます。

list関数と併用しないとダメなようです。

第一引数と第三引数は省略可能です。第一引数は省略した場合は0、第三引数は省略した場合は1です。

結果は以下のようになります。

なぜ第一引数省略した場合のみ空リストなのかというと、第一引数を省略した場合と第三引数を省略した場合、判断つきません。なので、動作としては第一引数を省略したつもりでも動きとしては第三引数を省略したことになっています。

上記の例でいうと最初の数値=10,最後の数値=0、ということになってしまいますので、空リストが返ってくることは正しい動作となります。

このことから、range関数は第一引数を省略する場合は第三引数の省略も必須のような気がします。(未確認ですが)

Pythonのlist関数

Pythonのlist関数は文字列やタプル型からlist型を作成する組込関数です。

Pythonのzip関数

Pythonのzip関数は先述しましたfor文のテクニックとして主に使われます。2つ以上のリストを同時に処理するときに便利です。ここで一つ思うことがあります。リストの要素数が異なる2つのリストをfor文でループしたらどうなるのか?です。

結果は以下のようになります。多い要素は無視されてしまいますね。

zipではなくzip_longestを使用する

無視されるので、無視されないようにするにはどうすればよいかを考えてみます。標準ライブラリitertoolsのzip_longestを使用すれば可能なようです。

結果は以下のようになります。

上記のように足りない要素はデフォルトはNoneで埋められます。デフォルト値を変更したい場合は、fillvalueを指定します。

結果は以下のようにNoneが10000に変更されています。

Pythonのid関数

Pythonのid関数はオブジェクトの識別子を返す関数で、これを理解する事は非常に重要です。

これはなぜかと言うと、a,bに2を代入しているわけではなく、aに2というオブジェクトの場所を教える、というイメージです。その為、aとbは同じ識別子になります。

では、ミュータブル(変更可)なリストの場合、どうなるでしょうか。

これは、リスト型がミュータブル(変更可)であることから、別のリストオブジェクトということになるようです。その為識別子が異なります。

Pythonのエラーハンドリングと例外

Pythonのエラーには2種類の例外があります。

  • 文法エラー
  • 実行時エラー

文法エラーはIDEが教えてくれると思います。実行時エラーはその名の通り、実行時に発生する例外のことです。

Pythonには組込例外(ビルトイン例外)があります。いくつか組込例外を列挙します。

  • NameError
  • TypeError
  • MemoryError
  • etc…

エラーハンドリングはJavaと少し似ていて、構文は以下になります。

Pythonのraise文

意図的に例外を発生させたい場合にraise文を使用します。raise文では組込例外もユーザ定義例外も発生させることが可能です。

以下、具体的な例です。

例外が指定されていない場合はどうなるでしょうか。

結果は以下のようになりますので、エラーハンドリングは重要であることがわかります。

raise文で指定する組込例外に引数を指定することができます。

結果は以下のようにエラー表示されます。

Java1.7からは複数のエラー例外を同じロジックにかけるようになっていました。Pythonでもタプル型を使用することによって、同じことが実現できます。

exceptに何も指定しないこともできます。これは全ての例外を受け付けます。

結果は以下の通りです。

Pythonの標準ライブラリ

Pythonの標準ライブラリ(モジュール)はimport文で読み込むことができます。

osというモジュールを読み込む例です。

dir(モジュール)は、モジュールの関数をリスト型で表示してくれます。

本来は1行で返ってきますが、便宜上改行しています。

かなり関数が多いのがわかります。以下はカレントディレクトリの表示と変更するメソッドの使用例です。

shutilライブラリ

shutilライブラリはファイルやディレクトリの操作でよく使うライブラリです。

copyメソッドは、カレントディレクトリのファイルをコピーして、新規にtest002.pyと言うファイルを作成します。

globライブラリ

globライブラリはファイル、フォルダ操作する際に、ワイルドカードや正規表現を使用する事が出来るライブラリになります。以下は、カレントディレクトリの*.pyのファイルをリストで表示しています。

結果は以下のようになります。

sysライブラリ

sysライブラリはコマンドライン引数を使用する時に使用するライブラリです。

sys.argvにリスト型が返り、sys.argv[0]にスクリプト名が入ります。順にコマンドライン引数が入ります。

以下のように実行します。

reライブラリ

reライブラリは高度な正規表現の操作を可能にします。

findall()メソッドは、出現する全てのパターンにマッチします。

結果は以下のようになります。

mathライブラリ

mathライブラリはC言語で定義されている数学関数にアクセスすることが出来ます。

randomライブラリ

randomライブラリは疑似乱数を生成します。

random()メソッドは0.0~1.0の間の浮動小数点をランダムに返します。

choice()メソッドはリストやタプルの要素をランダムに返します。

結果は以下のようになります。実行するたびに結果は異なります。

datetimeライブラリ

datetimeライブラリは日付や時間を簡単に操作するためのモジュールです。

結果は以下のようになります。

Pythonインタープリターの使い方

Windows環境でインタープリターを使ってみます。

>>>は、プライマリプロントと言い、入力待ち状態です。

上記では、1+2をして結果が表示されています。インタープリターを終了するにはquit()、もしくはCtrl + zを押してEnterで終了できます。

複数行記述することもできます。

セカンダリプロンプトと言います。

Python3.6.4 ドキュメント

Python参考サイト

関西で140-170/80~120万から受け付けております^^
得意技はJS(ES6),Java,AWSの大体のリソースです
Python3.6,Djangoを勉強中です,Javaは少し飽きてしまってます–;
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくば、我に七難八苦を与えたまえ」です^^

スポンサーリンク
  • このエントリーをはてなブックマークに追加
スポンサーリンク

コメントをどうぞ

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA