Python とDjango の環境と基礎入門と使い方

Python とDjango の環境と基礎入門と使い方

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

Pythonインストール(exe)

Pythonをインストールします。ダウンロード

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

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

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

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

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

C:\> python -V
Python 3.6.4

Pythonインストール(exe)

wingetでインストールします。ここでは3.11をインストールします。

C:¥>winget install -e --id Python.Python.3.11
C:¥>python -V
Python 3.11.4
Download and install Python 3.11 with winget
Python is a programming language that lets you work more quickly and integrate your systems more effectively.
Download and install packages by Python Software Foundation with winget
View packages by Python Software Foundation on winget.run

WSL2(Ubuntu22.04)にPythonインストール

もともとPythonがインストールされています。システムとは別のPythonをインストールするにはpyenvを利用したほうが良いです。

$ which python3
/usr/bin/python3
$ python3 -V
Python 3.10.6

pipとは

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

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

C:\> pip -V
pip 9.0.1 from c:\users\xxxxx\appdata\local\programs\python\python36-32\lib\
site-packages (python 3.6

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

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

PS C:\Users\xxxxx\python>
pip install django
Collecting django
Downloading Django-2.0.1-py3-none-any.whl (7.1MB)
100% |████████████████████████████████| 7.1MB 78kB/s
Collecting pytz (from django)
Downloading pytz-2017.3-py2.py3-none-any.whl (511kB)
100% |████████████████████████████████| 512kB 901kB/s
Installing collected packages: pytz, django
Successfully installed django-2.0.1 pytz-2017.3

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

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

PS C:\Users\xxxxx\python> python -m pip freeze
Django==2.0.1
pytz==2017.3

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

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

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

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

PS C:\Users\xxxxx\python> django-admin.exe startproject testproject

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

testproject
│ manage.py
│
└─testproject
       settings.py
       urls.py
       wsgi.py
       __init__.py

各ファイルの説明です。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」と実行します。

PS C:\Users\xxxxx\python\testproject> python manage.py runserver
Performing system checks...

System check identified no issues (0 silenced).

You have 14 unapplied migration(s). Your project may not work properly until you
apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
January 11, 2018 - 23:09:32
Django version 2.0.1, using settings 'testproject.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.

終了するには、「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に設定します。

LANGUAGE_CODE = 'ja'

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

TIME_ZONE = 'UTC'

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が設定されています。

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

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

django.db.backends.postgresql
django.db.backends.mysql
django.db.backends.oracle

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

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

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

PS C:\Users\xxxxx\python\testproject> python manage.py startapp polls

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

│ admin.py
│ apps.py
│ models.py
│ tests.py
│ views.py
│ __init__.py
│
└─migrations
   __init__.py

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

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

from django.http import HttpResponse

def index(request):
    return HttpResponse("Hello, world. You're at the polls index.")

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

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

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

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

def add(x, y):
    print x + y

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

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

URLマッピングする

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

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

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

from django.urls import path

from . import views

urlpatterns = [
    path('', views.index, name='index'),
]

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

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

from django.contrib import admin
from django.urls import include, path

urlpatterns = [
    path('polls/', include('polls.urls')),
    path('admin/', admin.site.urls),
]

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

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

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

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

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

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

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

PS C:\Users\xxxxx\python\testproject> python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying auth.0009_alter_user_last_name_max_length... OK
Applying sessions.0001_initial... OK

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

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

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

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

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

from django.db import models

class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')

class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)

Pythonでクラス定義する

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

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

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

class Myclass:
    """コメント"""
    def __init__(self):          #コンストラクタ
        self.name = ""
    def getName():               #メソッド
        return self.name
    def setName(self, name):     #メソッド
        self.name = name

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

a = Myclass()             #インスタンス生成
a.setName("takahashi")
print a.getName()

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

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 = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'polls.apps.PollsConfig',
]

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

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

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

PS C:\Users\xxxxx\python\testproject> python manage.py makemigrations polls
Migrations for 'polls':
polls\migrations\0001_initial.py
- Create model Choice
- Create model Question
- Add field question to choice

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

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

PS C:\Users\xxxxx\python\testproject> python manage.py sqlmigrate polls 0001

BEGIN;
--
-- Create model Choice
--
CREATE TABLE "polls_choice" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "c
hoice_text" varchar(200) NOT NULL, "votes" integer NOT NULL);
--
-- Create model Question
--
CREATE TABLE "polls_question" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT,
"question_text" varchar(200) NOT NULL, "pub_date" datetime NOT NULL);
--
-- Add field question to choice
--
ALTER TABLE "polls_choice" RENAME TO "polls_choice__old";
CREATE TABLE "polls_choice" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "c
hoice_text" varchar(200) NOT NULL, "votes" integer NOT NULL, "question_id" integ
er NOT NULL REFERENCES "polls_question" ("id") DEFERRABLE INITIALLY DEFERRED);
INSERT INTO "polls_choice" ("id", "choice_text", "votes", "question_id") SELECT
"id", "choice_text", "votes", NULL FROM "polls_choice__old";
DROP TABLE "polls_choice__old";
CREATE INDEX "polls_choice_question_id_c5b4b260" ON "polls_choice" ("question_id
");
COMMIT;

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

PS C:\Users\xxxxx\python\testproject> python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, polls, sessions
Running migrations:
Applying polls.0001_initial... OK

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

手順

1.models.pyを変更する。

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

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

管理ユーザを作成する

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

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

PS C:\Users\xxxxx\python\testproject> python manage.py createsuperuser
Username (leave blank to use 'xxxxx'): admin
Email address: admin@example.com
Password:
Password (again):
This password is entirely numeric.
Password:
Password (again):
Superuser created successfully.

「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のほうがインテリセンスが優れているようです。

def func(a, b):
    return a + b

if __name__ == '__main__':
    print(func(1,2))

上記を実行します。

PS C:\Users\xxxxx\python\python_test> python sample0001.py

結果は以下になります。

3

__name__とは

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

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

Pythonの関数

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

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

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

def func(a, b=3):
    return a + b

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

def func(a, b=3):
    return a + b

if __name__ == '__main__':
    print(func(1))   # 結果は4となる

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

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

def func(a, b=3):
    return
print(func(1, 2)) # Noneが返ってくる

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

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

a = 1
def func(a, b=3):
    return a + b
a = 2
print(func(a,2)) # 4が表示される

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

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

def func(a,lst=[1]):
    lst.append(a)
    return lst

print(func(1))
print(func(1))

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

[1, 1]
[1, 1, 1]

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

Pythonの関数で可変長引数

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

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

def func (*a) :
    return a

print(func('1', '2', '3')) # 引数が可変長で指定できる
print(type(func('1', '2', '3')))

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

('1', '2', '3')
<class 'tuple'>

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

def func (b,*a) : ○
def func (*a,b) : × エラーとなる

Pythonのキーワード引数

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

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

func(test1=3, test2=4)

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

def func (test1,test2) :
    print(test1,test2)

func(test1=3, test2=4) # 3 4と表示される

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

def func (**a) :
    print(a['test1'],a['test2'])

func(test1=3, test2=4) # 3 4と表示される

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

def func (b,**a) : ○
def func (**a,b) : ×
def func (*b,**a) : ○
def func (**a,*b) : ×

Pythonのラムダ式関数

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

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

lambda 引数 : 処理

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

func = (lambda x: x + 2)
print(func(10)) # 12 と表示される
func = (lambda x,y: x + y) # 複数引数
print(func(1,2)) # 3 と表示される
print((lambda y: y + 2)(5)) # 7 と表示される

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

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

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

def func(a) :
    '''説明文'''
    print(a)

help(func) # help関数でdocstringを表示する

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

Help on function func in module __main__:

func(a)
説明文

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

def func(a) :
    '''説明文'''
    print(a)

print(func.__doc__)

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

説明文

Pythonの定数

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

PI = 3.14

Pythonの変数

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

a = 1
b = "test"

Pythonの多重代入

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

a,b = [],[]

Pythonの型

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

以下、例です。

i = 1        #int型(long型はPython3では廃止されました)
f = 1.2      #float型
bool = True
bool = False #先頭1文字は大文字
str = '文字列'
str = "文字列" #シングルクォート、または、ダブルクォートで囲む
str = 'aaa\naaa' #\nは改行と見なす
str = 'aaa\\naaa' #\でエスケープしているので、\nは\nと見なす

Pythonのコメント

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

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

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

"""
サンプルプログラム
作成者:高橋
"""
print('シングルクォートでもよいです') # print文で標準出力をする

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

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

i = 1
print("test" + i)

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

i = 1
print("test" + str(i)) # 結果はtest1となる

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

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

i = "1"
print(1 + int(i)) # 結果は計算されて2となる

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

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

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

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

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

import tkinter

window = tkinter.Tk()
window.mainloop()

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

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

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

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

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

Pythonのif文

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

a = True
if a == True :
    print('test')

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

a = True
if a == False :
    print('true')
else :
    print('false')

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

name = 'Taro'
if name == 'Taro' :
    print('Tanaka ' + name)
elif name == 'Jiro' :
    print('Takahashi' + name)
else :
    print('名前がありません')

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

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

a = 0,b =0
if a == 0 :
    print(a)
    if b == 0:
        print(b)

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

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

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

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

Pythonの真偽値

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

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

print(True + 1) # 結果は2となる
print(False + 1) # 結果は1となる

Pythonの文字列

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

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

str = 'test1 test2'
ret = str.split()
print(ret) # 結果は、['test1', 'test2']

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

str = 'test1 test2'
ret = str.replace('test', 'aaaa')
print(ret) # 結果は、aaaa1 aaaa2

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

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

list = ['test1','test2']
ret = '@'.join(list)
print(ret)
print('test','test')

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

test1@test2
test test

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

str1 = 'test'
print(str1.upper())
print(str1)

str2 = 'TEST'
print(str2.lower())
print(str2)

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

TEST
test
test
TEST

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

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

str1 = 'test'
print(str1.find('t'))
print(str1.find('e'))

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

0
1

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

Pythonのインデクシング

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

print("test"[0]) # tと表示される
print("test"[-0]) # tと表示される
print("test"[1]) # eと表示される
print("test"[-2]) # sと表示される

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

Pythonのスライス

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

文字列[開始位置:終了位置]

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

str = "test"
print(str[0:2]) # teと表示される
print(str[0:]) # 終了位置を省略することができる test
print(str[:4]) # 開始位置を省略することができる test

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

str = 'test'
print (str[0:10]) # うまい具合に処理してくれる
print (str[5:10]) # うまい具合に処理してくれる
print (str[4]) # IndexError: string index out of rangeエラーがでてしまう

Pythonの文字列比較

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

str1 = 'ab'
str2 = 'AB'
if str1 is str2 :
    print ('true')
elif str1 is not str2 :
    print ('false')

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

false

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

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

str = 'test'
str[0] = 'a' # こんなことは不可能
print (str) # ここまで到達しない

Pythonのリスト型

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

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

[1,2,3,4]

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

list = ['test1','test2','test3']

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

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

list = ['test1','test2','test3']
print(list[0]) # test1と表示される
print(list[0:2]) # ['test1'', 'test2']と表示される
print(type(list[0])) # <class 'str'>と表示される
print(type(list[0:2])) # <class 'list'>と表示される

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

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

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

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

list = ['test1','test2','test3']
list.pop(0) #0個目の要素を削除する
print(list) # ['test2', 'test3']と表示される

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

list = ['test1','test2','test3']
list.remove('test2')
print(list) # ['test1', 'test3']と表示される

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

list = ['test1','test2','test3','test2']
list.remove('test2')
print(list) # ['test1', 'test3', 'test2']と表示される

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

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

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

list = ['test1','test2']
list.append(3)
print(list) # ['test1', 'test2', 3]と表示される

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

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

list = ['test1','test2']
list.extend([1,2])
print(list) # ['test1', 'test2', 1, 2]と表示される

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

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

list = ['test1','test2']
list = list + [1,2]
print(list) # ['test1', 'test2', 1, 2]と表示される

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

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

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

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

lst = ['test1','test2']
lst.insert(0,'test0')
print(lst)

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

['test0', 'test1', 'test2']

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

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

list = ['test1','test2','test3']
print(list.index('test3')) # 2と表示される
print(list.index('test4')) # ValueError: 'test4' is not in list

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

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

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

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

lst = ['a', 'b']
lst.clear()
print(lst) # [] と表示される

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

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

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

list = ['test1','test2','test3','test2']
print(list.count('test2')) # 2と表示される
print(list.count('test4')) # 0と表示される

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

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

list = ['test1','test3','test2']
print(list.sort()) # Noneと表示される
print(list.reverse()) # Noneと表示される
print(list) # ['test3', 'test2', 'test1']と表示される

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

組み込み型
以下のセクションでは、インタプリタに組み込まれている標準型について記述します。 主要な組み込み型は、数値、シーケンス、マッピング、クラス、インスタンス、および例外です。 コレクションクラスには、ミュータブルなものがあります。コレクションのメ...

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

list = ['test1','test3','test2']
list.sort()
print(list) # ['test1', 'test2', 'test3']と表示される
list.reverse()
print(list) # ['test3', 'test2', 'test1']と表示される

Pythonのfor文

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

list = ['test1','test2','test3']
for i in list:
    print(i)

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

test1
test2
test3

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

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

list = ['test1','test2','test3']
print('test1' in list) # Trueが表示される
print('test4' in list) # Falseが表示される
if 'test1' in list :
    print('含まれてます') # 「含まれてます」と表示される

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

list = ['test1','test2','test3']
print('test1' not in list) # Falseが表示される

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

list = ['test1','test2']
for i in list: # リストでループ
    list.append('a') # for文の中でリスト要素を追加していく

print(list) # ここには一生到達しない

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

list = ['test1','test2']
for i in list[:]: # スライスコピーにしておく
    list.append('a')

print(list) # ['test1', 'test2', 'a', 'a']と表示される

Pythonのcontinueとbreak

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

list = [1,2,3,4,5]
for i in list[:]:
    if i < 3:
        continue
    print(i)

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

1
2
3

次はbreakを使用します。

list = [1,2,3,4,5]
for i in list[:]:
    if i > 2:
        break
    print(i)

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

1
2

Pythonのfor-else文

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

for i in range(2):
    print(i)
else:
    print('end')

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

0
1
end

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

for i in range(2) :
    if i == 1:
        break
    else :
        print(i)
else :
    print('end')

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

0

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

for i in range(3) :
    if i == 1:
        continue
    else :
        print(i)
else :
    print('end')

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

0
2
end

Pythonのタプル型

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

tuple1 = ()
tuple2 = (1234,) #単要素のタプル
tuple3 = (1,2,3)

print(tuple1)
print(tuple2)
print(tuple3)

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

()
(1234,)
(1, 2, 3)

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

t = 'a', 'b', 'c' # これもタプル型の宣言となる
print(t) # ('a', 'b', 'c') と表示される
print(type(t)) # <class 'tuple'>と表示される

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

tuple = (1,2,3)
print(tuple[0:2]) # (1, 2)と表示される

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

tuple = (1,2,3)
tuple[1] = 5 # タプルは代入不可
print(tuple) # ここには到達しない

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

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

tuple = (1,2,3)
tuple = 5
print(tuple) # エラーとならず、5と表示される

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

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

tuple1 = (1,2,3)
tuple2 = (4,5,6)
print(tuple1 + tuple2) # (1, 2, 3, 4, 5, 6)と表示される

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

tuple1 = (1,2,3)
tuple2 = (4,5,6)
tuple3 = tuple1 + tuple2
print(id(tuple1)) #識別子は6307928
print(id(tuple2)) #識別子は6308088
print(id(tuple3)) #識別子は6341888

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

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

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

tuple = 1,2,3
print(tuple)
a,b,c = tuple
print(a)
print(b)
print(c)

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

(1, 2, 3)
1
2
3

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

Pythonのset型

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

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

a = set()
print(a)
print(type(a))

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

set()
<class 'set'>

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

a = set({1,1,1,2,2,3})
print(a)
print(type(a))

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

{1, 2, 3} # 重複要素が取り除かれています
<class 'set'>

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

a = set('abc')
print(a)
a = set(['aa','bb','cc'])
print(a)
a = set(('aaa','bbb'))
print(a)
a = set({1:'a',2:'b'})
print(a)

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

{'c', 'b', 'a'}
{'aa', 'bb', 'cc'}
{'bbb', 'aaa'}
{1, 2}

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

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

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

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

set型の計算

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

a = set('abc')
b = set('cde')
print(a | b) # 和集合
print(a - b) # 差集合
print(a & b) # 積集合

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

{'a', 'e', 'd', 'c', 'b'}
{'a', 'b'}
{'c'}

Pythonの辞書型

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

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

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

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

以下、実行例です。

dict = {"id":1,"name":"takahashi"}
print(dict) # {'id': 1, 'name': 'takahashi'}と表示される
print(dict["id"]) # 1と表示される

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

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

dict = {"id":1,"name":"takahashi"}
dict['age'] = 20 # dict{'age'}ではないので注意
print(dict) # {'id': 1, 'name': 'takahashi', 'age': 20} と表示される

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

dict = {"id":1,"name":"takahashi"}
dict['age'] = 20 # dict{'age'}ではないので注意
print(dict)
del dict['id']
print(dict)

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

{'id': 1, 'name': 'takahashi', 'age': 20}
{'name': 'takahashi', 'age': 20}

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

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

dct = dict((('a', 1),('b', 2)))
print(dct)
dct = dict([('c', 3),('d', 4)])
print(dct)

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

{'a': 1, 'b': 2}
{'c': 3, 'd': 4}

Pythonのfor文テクニック

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

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

dict = {"id":1,"name":"takahashi"}
for k, v in dict.items() :
    print(k, v)

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

id 1
name takahashi

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

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

dict = {"id":1,"name":"takahashi","age":20}
print(dict.keys())
print(list(dict.keys())) # 順序は保障されない

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

dict_keys(['id', 'name', 'age'])
['id', 'name', 'age']

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

dict = {"id":1,"name":"takahashi","age":20}
print(sorted(dict.keys()))

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

['age', 'id', 'name'] # アルファベット順でソートされている

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

lst = ['a','b','c']
for i, v in enumerate(lst[:]):
    print(i, v)

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

0 a
1 b
2 c

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

lst1 = ['a','b','c']
lst2 = [1,2,3]
for l1, l2 in zip(lst1[:],lst2[:]):
    print(l1, l2)

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

a 1
b 2
c 3

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

lst1 = [3,2,4,1]
for l1 in sorted(lst1): # 新たなオブジェクトを返すのでスライスコピーする必要はなし
    print(l1)

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

1
2
3
4

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

lst1 = (1,2,3,4)
for l1 in reversed(lst1):
    print(l1)

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

4
3
2
1

Pythonのlen関数

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

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

list = [1,2,3,4]
print(len(list)) # 4と表示される
str = "aa"
print(len(str)) # 2と表示される
tuple = (1,2)
print(len(tuple)) # 2と表示される

Pythonの数値計算

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

  • int型同士の除算は割り切れてもfloat型で返ってくる
  • 小数点以下を切り捨てたい場合は//で割る
  • **で累乗の計算ができる
  • 文字列型に整数で掛け算ができる
i = 8/8
print(type(i)) # <class 'float'>と表示される
i = 8//7
print(i) # 1と表示される
i = 2 ** 3
print(i) # 8と表示される
i = 's' * 2
print(i) # ssと表示される

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

Pythonのdel文

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

i = 8
del i # iを削除
print(i) # ここでエラーが発生する

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

list = ['test1', 'test2']
del list[1]
print(list) # ['test1']と表示される

Pythonのprint文

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

str = 'test'
print(str,end='')
print(str) # testtestと表示される

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

str = 'test'
print('strの中身は{0}です'.format(str)) # strの中身はtestです と表示される

%dと%s

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

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

str = 'test'
i = 100
print('%s=%d点です' % (str, i)) # test=100点です

 

Pythonのrange関数

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

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

range(最初の数値, 最後の数値,ステップ数)

実際に使ってみます。

print(range(0, 10, 1)) # range(0, 10) と表示される
print(list(range(0, 10, 1))) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] と表示される

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

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

print(list(range(10,1))) # 第一引数省略
print(list(range(0,10))) # 第三引数省略
print(list(range(10))) # 第一引数、第三引数省略

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

[]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

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

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

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

Pythonのlist関数

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

list1 = list('abc')
print(list1) # ['a', 'b', 'c'] と表示される
tuple = (1, 2)
list2 = list(tuple)
print(list2) # [1, 2] と表示される

Pythonのzip関数

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

lst1 = ['a','b','c','d']
lst2 = [1,2,3]
for l1, l2 in zip(lst1[:],lst2[:]):
    print(l1, l2)

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

a 1
b 2
c 3

zipではなくzip_longestを使用する

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

from itertools import zip_longest

lst1 = ['a','b','c','d']
lst2 = [1,2,3]
for l1, l2 in zip_longest(lst1[:],lst2[:]):
    print(l1, l2)

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

a 1
b 2
c 3
d None

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

from itertools import zip_longest

lst1 = ['a','b','c','d']
lst2 = [1,2,3]
for l1, l2 in zip_longest(lst1[:],lst2[:], fillvalue=10000):
print(l1, l2)

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

a 1
b 2
c 3
d 10000

Pythonのid関数

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

a = 2
b = 2
print(id(a)) # 494326848と同じ値が表示される
print(id(b)) # 494326848と同じ値が表示される

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

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

a = []
b = []
print(id(a)) # 24386856と表示され、異なる
print(id(b)) # 24386896と表示され、異なる

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

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

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

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

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

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

  • NameError
  • TypeError
  • MemoryError
  • etc…

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

try :
    # なんらかの処理
except 例外名:
    # 例外処理

Pythonのraise文

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

raise(例外名)
raise # 単にraiseと記述することも可能

以下、具体的な例です。

try:
    raise(NameError) # 組込例外を意図的に発生させる
except NameError:
    print('名前が定義されていません') # 名前が定義されていません と表示される

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

try:
    raise(NameError)
except TypeError:
    print('名前が定義されていません')

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

Traceback (most recent call last):
  File "test001.py", line 6, in <module>
    raise(NameError)
NameError

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

try:
    raise(NameError('oh my god'))
except TypeError:
    print('名前が定義されていません')

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

Traceback (most recent call last):
  File "test001.py", line 6, in <module>
    raise(NameError('oh my god'))
NameError: oh my god

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

try:
    raise(NameError)
except (NameError, TypeError): # タプル型で例外を指定する
    print('名前が定義されていません')

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

try:
    raise(NameError)
except (TypeError, ):
    print('TypeError発生すればこのロジックを通る')
except:
    print('その他例外はこのロジックを通る')

結果は以下の通りです。

その他例外はこのロジックを通る

 

Pythonの標準ライブラリ

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

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

import os
print(dir(os))

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

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

['DirEntry', 'F_OK', 'MutableMapping', 'O_APPEND', 'O_BINARY', 'O_CREAT', 'O_EXCL',
 'O_NOINHERIT', 'O_RANDOM', 'O_RDONLY', 'O_RDWR', 'O_SEQUENTIAL', 'O_SHORT_LIVED',
 'O_TEMPORARY', 'O_TEXT', 'O_TRUNC', 'O_WRONLY', 'P_DETACH', 'P_NOWAIT',
 'P_NOWAITO', 'P_OVERLAY', 'P_WAIT', 'PathLike', 'R_OK', 'SEEK_CUR', 'SEEK_END',
 'SEEK_SET', 'TMP_MAX', 'W_OK', 'X_OK', '_Environ', '__all__', '__builtins__',
 '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__',
 '__spec__', '_execvpe', '_exists', '_exit', '_fspath', '_get_exports_list',
 '_putenv', '_unsetenv', '_wrap_close', 'abc', 'abort', 'access', 'altsep',
 'chdir', 'chmod', 'close', 'closerange', 'cpu_count', 'curdir', 'defpath',
 'device_encoding', 'devnull', 'dup', 'dup2', 'environ', 'errno', 'error',
 'execl', 'execle', 'execlp', 'execlpe', 'execv', 'execve', 'execvp', 'execvpe',
 'extsep', 'fdopen', 'fsdecode', 'fsencode', 'fspath', 'fstat', 'fsync',
 'ftruncate', 'get_exec_path', 'get_handle_inheritable', 'get_inheritable',
 'get_terminal_size', 'getcwd', 'getcwdb', 'getenv', 'getlogin', 'getpid',
 'getppid', 'isatty', 'kill', 'linesep', 'link', 'listdir', 'lseek', 'lstat',
 'makedirs', 'mkdir', 'name', 'open', 'pardir', 'path', 'pathsep', 'pipe', 'popen',
 'putenv', 'read', 'readlink', 'remove', 'removedirs', 'rename', 'renames',
 'replace', 'rmdir', 'scandir', 'sep', 'set_handle_inheritable', 'set_inheritable',
 'spawnl', 'spawnle', 'spawnv', 'spawnve', 'st', 'startfile', 'stat',
 'stat_float_times', 'stat_result', 'statvfs_result', 'strerror',
 'supports_bytes_environ', 'supports_dir_fd', 'supports_effective_ids',
 'supports_fd', 'supports_follow_symlinks', 'symlink', 'sys', 'system',
 'terminal_size', 'times', 'times_result', 'truncate', 'umask', 'uname_result',
 'unlink', 'urandom', 'utime', 'waitpid', 'walk', 'write']

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

import os
print(os.getcwd()) # カレントディレクトリを表示する
os.chdir('c:\\') # カレントディレクトリを変更する
print(os.getcwd())

shutilライブラリ

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

import shutil
shutil.copy('test001.py', 'test002.py')

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

globライブラリ

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

import glob
path_list = glob.glob('*.py')
print(path_list)

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

['test001.py']

sysライブラリ

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

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

import sys

print(sys.argv)

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

C:\Users\xxxxx\python>python test001.py 1 'a'
['test001.py', '1', "'a'"] # コマンドライン引数がリストに格納される

reライブラリ

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

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

import re

text = "He was carefully disguised but captured quickly by police."
print(re.findall(r"\w+ly", text))

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

['carefully', 'quickly']

mathライブラリ

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

import math

print(math.pi) # 3.141592653589793
print(math.pow(2,3)) # 2**3の結果が浮動小数点数型で返る 8.0

randomライブラリ

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

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

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

import random

print(random.random())
print(random.choice(['a','b','c']))

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

0.9593894210258641
b

datetimeライブラリ

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

from datetime import date

print(date.today())
print(date(2018,1,23).weekday()) # 月(0)~日(6)

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

2018-01-23
1

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

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

C:\Users\xxxxx>python
Python 3.6.4 (v3.6.4:d48eceb, Dec 19 2017, 06:04:45) [MSC v.1900 32 bit (Intel)]
on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> 1 + 2
3
>>>quit()

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

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

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

C:\Users\xxxxx>python
Python 3.6.4 (v3.6.4:d48eceb, Dec 19 2017, 06:04:45) [MSC v.1900 32 bit (Intel)]
on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> if True :
... print('test')
...
test

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

Python3.6.4 ドキュメント

Python参考サイト

コメント

タイトルとURLをコピーしました