Python

出典: フリー教科書『ウィキブックス(Wikibooks)』
ナビゲーションに移動 検索に移動
Wikipedia
ウィキペディアPythonの記事があります。
Python

Python(パイソン)はプログラミング言語のひとつです。オブジェクト指向でスクリプト的に記述できるプログラミング言語です。 また、コンパイルの必要がないインタプリタです。

また、ほとんどのUNIX/LINUXに搭載されているので、それらのOSでは特別なインストール作業をしなくても、すぐに使用することができます。


目次[編集]

初心者むけの単元[編集]

中級者むけの単元[編集]

webフレームワーク[編集]

その他[編集]

整理作業中[編集]

  • Python/整理中 (複素数、正規表現、HTTPクライアント、JSON、pass)

実行ファイル化[編集]

Windowsの場合[編集]

pythonには、実行ファイルを作る機能はあるが、しかし現状(2020年に本文を記述)では、あまり性能が良くない。

方法は下記のとおり。

まず、python 初期設定のままで入っているダウンローダーの pip を使って、pyinstaller という実行ファイル作成ソフトをダウンロードしてくる。


しかし、まずこの pip の環境変数を通さないといけない。


初期設定のままでは、環境変数が通ってないので、再インストールのため、インストーラー(「python-3.8.2-amd64.exe」 みたいな実行ファイル)を再起動し、セットアップ画面で「Modify」を選び、

「Optional Feature」はそのままで(初期設定では「pip」にチェックが入ってるハズなので)画面下にある「Next」を押して

「Add Python to environment variables」にチェックを入れる。

すると、あとは自動で環境変数を設定してくれる。


なお pythonはインストーラーの初期設定でのインストール先については、 隠しファイルの AppData\Local\Programs\Python あたりにインストールされるので、なので手動でパス設定するのは、かなり面倒くさい。


さて、まだパスを通しただけである。


この後、

pip install pyinstaller

によって、pyinstaller をインストールする。


さて、pyinstaller をインスト-ルできたとしよう。

基本的に、pyinstaller はホームファイルを基準にしたアドレスで、ファイルを読み込む。(そもそもWindwosのコマンドプロンプト(Dosプロンプト)が、そういう仕組みである。)


なので、実行ファイル化をしたい .py ファイルを、まずコピーしてホームフォルダに持ってくる。


さて、pyinstaller を実行したあとに関連ファイルと関連フォルダがいくつも作られるので、

もし、いきなり実行してしまうと、ホームフォルダ内にいくつものフォルダが作成されてしまい、とても、みづらい。


その関連ファイルをひとつのフォルダにまとめないと、みづらい。な

なので、まず先に、マウス操作によるのフォルダ新規作成で、まとめ用のフォルダを作っておこう。


たとえば「matome」みたいな名前でいい。


さて、コマンドプロンプトで

cd matome

で、先ほど作成した、まとめ用フォルダに移動する。


そして、その後

pyinstaller ファイル名.py --onefile --clean

で実行すると、まとめ用ドルダの中に「dist」フォルダというフォルダがあるので、その中を見ると、.exe形式の実行ファイルがある。

これが、目的の実行ファイルである。

なお、--onefile オプションをつけないと、実行する際に、関連ファイルがいくつも必要になる形式のexeファイルを作成してしまうが、これは目的に合わない。

なので、--onefile をつけよう。


また、 --clean は、もし.exefile 作成時に、前の設定ファイルなどが残って居たら、いったん設定を消去して作り直す、という意味。

初心者は、まず実行ファイル作成に何度か失敗するので、なるべく--clean をつけよう。


注意事項

【画像は実行ファイルと同じフォルダに】
画像ファイルなどを読み込むpythonコードを.exe化したい場合、けっして、標準設定では実行ファイルに組み込んでくれない。(つまり、リソース埋め込みを、標準設定では、pyinstaller は してくれない、。)

なので、画像ファイル・画像フォルダは、実行ファイルのあるフォルダと同じフォルダに必要がある。

pythonによるリソース埋め込みのための簡便な方法が無く、specファイルというものを編集しなくてはならない。


【日本語アプリのexe化は難しい。日本語はコードから除去しておく。】
日本など非英語のサポート状況が、pyinstaller はあまりよくなく、コードに日本語などがあると、.exe作成の作業時にエラーを起こす場合があり、作成できない場合がよくある。


【外部ライブラリの使用が困難】
また、外部ライブラリを読むこむ場合も、あまり性能が良くなく、エラーしやすい。

Linuxの場合[編集]

python対応のオブジェクトファイル(機械語)を作る簡便な方法は無いか、あったとしてもマイナー。

Linux版の pyinstaller を実行しても、作成されるのは Windows用の実行ファイル(.exeファイル)である。

また、 pythonのコンパイルのコマンド py_compile などを実行しても、作成されるのは python 用の中間コード(.pyc 形式)である。


GCC は python には対応していない。

エスケープシーケンス[編集]

たとえばprint()関数で、「こんにちは」と表示させたい場合なら

print("こんにちは")

と書きました。

でも、もし「"」そのものを表示したい場合、いったい、どうすれば良いのでしょうか?

答えを先にいうと、

print("\"")

と記述します。

つまり「"」の直前に「\」(バックスラッシュ)を追加して「\"」と記述すると、文字列としての「"」になります。

このような方法をエスケープシーケンスといいます。


ほかにも、「\n」とすることにより、改行を指定できます。

また、バックスラッシュ自身を表示したい場合には「\\」にします。

よく使うエスケープシーケンス
関数 内容
\" ダブルクオート 「"」
\n 改行
\\ バックスラッシュ自身 「\」

>>> print("\"")
"
>>> print("\\")
\
>>> print("あ\nいうえ")
あ
いうえ
エスケープシーケンス
関数 内容
\' シングルクオート 「'
\r キャリッジリターン
\t 水平タブ
>>> print("あ\tいうえ")
あ	いうえ


print文[編集]

# 「ようこそ」 と出力
print("ようこそ")

#から行末まではコメントです。文字列の出力はprint()を使います。Python 2まではprintは文でしたが、Python 3以降は演算子となったため、かっこが必須となります。なお、Pythonでは文末に;を付ける必要はありません。

文字列は""で囲んでも''で囲んでも同じ意味であり、エスケープ文字の取り扱いに違いはありません。


備考[編集]

  • インデントについて

Pythonのブロックはスペース4つのインデントによって表されます(オフサイドルールといいます)。

  • pythonについて

pythonは、Googleなどの企業のみならず、MITの初年度のプログラミングの授業でも採用されています。英語圏ではRubyPerlよりも普及しています。

Pythonは1990年にグイド・ヴァンロッサムによって作られました。誰が書いても同じソースコードになるように(違う目的のコードは違う見た目になるように)設計されており、常に読みやすいプログラムを書くことができます。教育用プログラミング言語としても秀逸です。


中級者むけの内容[編集]

テキストファイルの読み込みについて[編集]

テキストファイルの読み込みは、「readline()」のほかにもある。「read()」で、ファイル全体を読みこめる。 また、「readlines()」で、各行ごとをリストにして、読みこめる。

ただし、「read()」や「readlines()」を実行すると、ファイルの行数が多い場合には、メモリを大量に使用することになるので、あまり使用しないほうが安全である。


  • readlines()

語尾が複数形になっている readlines() を使うと、テキスト全部を読み込むことができる。なお、readlines()では、テキストはリストとして読み込まれる。

ire = open("tukuru.txt", "r")

print("1回目: ", ire.readlines())
print("2回目: ", ire.readlines())
print("3回目: ", ire.readlines())
print("4回目: ", ire.readlines())

ire.close()

上記のコードを実行すると、

1回目:  ['あいうえお\n', 'かきくけこ\n', 'さしすせそ\n']
2回目:  []
3回目:  []
4回目:  []

のように表示される。

上級者むけの内容[編集]

他の文法[編集]

コマンド端末によるインタラクティブモードでも、関数を使用できます。

>>> def fib(n):
        if n <= 1:
            return n
        else:
            return fib(n - 1) + fib(n - 2)
... 
>>> fib(10)
55


配列[編集]

配列はarray = ['A', 'B', 'C']のように表しarray[0]array[1]array[2]のようにアクセスしますが、PythonではJavaScriptにも輸出された配列の内包表記をサポートしています。これは配列の中にfor-in文とイテレータを書くことができ、mapの役割を果たすものです。

>>> [ i for i in range(10) ]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

配列の内包表記は非常に強力です。これを使ってAからZまでの文字を要素に含む配列を作るには次のようにします。chr()は文字コードを文字に、ord()は文字を文字コードに変換します。なお、十六進法の整数リテラルは0xdeadbeefのように "0x" から始まります。3735928559Lのように末尾にLの付く整数リテラルはlong型です。

>>> [ chr(i) for i in range( ord('A'), ord('Z') + 1 ) ]
['A', 'B', 'C', 'D', 'E', 'F', 'G',
 'H', 'I', 'J', 'K', 'L', 'M', 'N',
 'O', 'P', 'Q', 'R', 'S', 'T', 'U',
 'V', 'W', 'X', 'Y', 'Z']

内包表記はジェネレータと同じくPythonの個性的な言語機能の一つです。これらの習得には感覚的な部分、すなわち慣れもあるので、たくさんのコードを書いては動かし、動かしては書いて覚えてください。

printf()[編集]

printf()print(format % (arg0, arg1, ..., argN))という書式です。

>>> print("%d.%d.%d" % (2, 6, 4))
2.6.4

なお、Python2.x系のバージョンならばprint content という書式も使用可能です。

>>> print "python"
python
>>> a=50
>>> print a
50


YAML[編集]

データ構造の一種で、YAMLというのがあります。

pythonは、初期設定ではYAMLを利用できませんが、pyYaml をインストールすることで、pythonでYAMLを処理できるようになります。

Linux の場合、すでにpipがインストール済みなら、

コマンド

sudo pip install pyyaml

で pyYaml が入ります。


YAMLとpythonはまったく別々の概念なのですが、YAMLはデータ構造を表す際にインデントを使いますので、YAML形式のデータが見た目がpythonっぽくなります。

そのためかどうか分かりませんが、ともかく近年(2020年に記述)、よくpythonとYAMLがセットで使われます。


下記のようにセミコロンでYAMLを記述すると、python側では辞書型として扱われます。

test.yaml
name: 
  myouji: yamada
  sitanona: taro
kokuseki: nihon
seibetu: otoko


のように、記述します。


これを表示するには、python側のコードで

python側 コード例
import yaml

f = open('test.yaml') 
obj = yaml.safe_load(f)
print(obj)

f.close()

と実行すれば、

実行結果
{'name': {'myouji': 'yamada', 'sitanona': 'taro'}, 'kokuseki': 'nihon', 'seibetu': 'otoko'}

と表示されます。

import で yaml をインポートする必要があります。

pythonでYAMLのセミコロンのデータを読み取った場合の正体は辞書型です。


なお、上記コード中の open や close は、単に python のファイル入出力命令の組み込み関数です。(詳しくは『Python/ファイルの書き込みと読み込み』)


python側 コード例
import yaml

f = open('test.yaml') 
obj = yaml.safe_load(f)
print(obj["kokuseki"])

f.close()
実行結果
nihon


読取りには、safe_load()を使うことが推奨されています。これとは別に load() 関数があるのですが、YAMLの読取りでは、load関数は非推奨とされています。


高階の場所にあるデータの読取

name キーの、さらに myouji キーの値(yamada)にアクセスしたい場合のように、高階になっている場所にアクセスするには、下記のように段階的に処理する必要があります。

python側 コード例
import yaml

f = open('test.yaml') 
obj = yaml.safe_load(f)
obj2 = obj["name"]
print(obj2["myouji"])

f.close()
実行結果
yamada


このページ「Python」は、まだ書きかけです。加筆・訂正など、協力いただける皆様の編集を心からお待ちしております。また、ご意見などがありましたら、お気軽にトークページへどうぞ。