Wikipedia
ウィキペディアPythonの記事があります。
ウィキバーシティ
ウィキバーシティPythonの学習教材があります。

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

Python

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


目次編集

リファレンス編集

整理作業中編集

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

内包表記とジェネレータ式編集

Pythonには、シーケンスの内包表記とジェネレータ式があります。

内包表記とジェネレータ式
for label, expr in {"加算":"1 + 1",
    "リスト内包表記":"[2 ** x for x in range(5)]",
    "集合内包表記":"{2 ** x for x in range(5)}",
    "辞書内包表記":"{x: 2 ** x for x in range(5)}",
    "ジェネレータ式":"(2 ** x for x in range(5))",
    "タプルコンストラクターにジェネレータ式を適用":"tuple(2 ** x for x in range(5))",
    }.items() :
  print(f'{label}\n  {expr}\n{eval(expr)} : {type(eval(expr))}')
実行結果
加算:
  1 + 1
  ⇒ 2 : <class 'int'>
リスト内包表記:
  [2 ** x for x in range(5)]
  ⇒ [1, 2, 4, 8, 16] : <class 'list'>
集合内包表記:
  {2 ** x for x in range(5)}
  ⇒ {1, 2, 4, 8, 16} : <class 'set'>
辞書内包表記:
  {x: 2 ** x for x in range(5)}
  ⇒ {0: 1, 1: 2, 2: 4, 3: 8, 4: 16} : <class 'dict'>
ジェネレータ式:
  (2 ** x for x in range(5))
  ⇒ <generator object <genexpr> at 0x14ac1a9e56d0> : <class 'generator'>
タプルコンストラクターにジェネレータ式を適用:
  tuple(2 ** x for x in range(5))
  ⇒ (1, 2, 4, 8, 16) : <class 'tuple'>
Pythonの式を表す文字列(Ex. "1 + 1")を要素としたタプルをループ変数exprで回しています。
print(f'{label}:\n {expr}\n ⇒ {eval(expr)} : {type(eval(expr))}')は、
ラベル:
  式
  ⇒ 式の評価結果 : 式の評価結果の型
を表示します。
(2 ** x for x in range(5))は、タプル内包表記…ではなく、ジェネレータ式で未評価のシーケンス(generator)を返します(組込み関数のrange同様、この時点ではメモリーオブジェクトではありません)。
タプルのコンストラクターにジェネレータ式を渡すと、タプルが返ります(タプルはイミュータブルですがメモリーオブジェクトです)。

代入演算子編集

if文やwhile文の条件には式が要求されるので代入文 = は使えませんでした。 しかし、条件式の中で代入を行うのがふさわしいケースもあります。 このため Python 3.8で、条件式中でもつかえる代入演算子(Assignment Expressions) := (俗称:セイウチ演算子;Walrus operator)が導入されました[1]

代入演算子の使用例
a = "1234567" # 7文字
if (n := len(a)) > 5:
    print("文字が5文字より多いです" , n - 5, "文字オーバー")
    
print(f"あなたは{n} 文字を入力しました")
実行結果
文字が5文字より多いです 2 文字オーバー
あなたは7 文字を入力しました

代入演算子を使った条件式を含む文のブロックの外に出ても、そのまま代入した効果は残ります。

なお、f"あなたは{n} 文字を入力しました"はテンプレート・リテラルです。

実行ファイル化編集

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 はカレントディレクトリーを基準にしたアドレスで、ファイルを読み込む。

なので、実行ファイル化をしたい .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では組込み関数printとなったため、かっこが必須となります。

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

備考編集

  • インデントについて

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

  • pythonについて

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

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

中級者むけの内容編集

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

上級者むけの内容編集

インタラクティブモードでも関数を定義・実行できます編集

インタラクティブモードでも関数を定義・実行できます
>>> def fib(n):
        if n <= 1:
            return n
        else:
            return fib(n - 1) + fib(n - 2)
... 
>>> fib(10)
55

リストとリスト内包表記編集

リストはlist = ['A', 'B', 'C']のように表しlist[0]list[1]list[2]のようにアクセスしますが、PythonではECMAScriptでも一時採用が検討されたリスト内包表記をサポートしています[2]。これはリストの中に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の個性的な言語機能の一つです。これらの習得には感覚的な部分、すなわち慣れもあるので、たくさんのコードを書いては動かし、動かしては書いて覚えてください。

書式化付き文字列化編集

C言語のsprintf()に相当する書式付き文字列化は、Pythonでは文字列の % 演算子を使います。 また、書式化文字列に % によるフィールドが複数ある場合は、下のようにタプルを使います。

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

YAML編集

YAMLは、構造化データやオブジェクトを文字列にシリアライズするためのデータ形式の一種です。 Pythonは、初期状態ではYAMLを利用できませんが、pyYaml [3]をインストールすることで、pythonでYAMLを処理できるようになります。

pipがインストール済みならば、

コマンドライン
% sudo pip install pyyaml

で pyYaml をインストールできます。 YAMLとPythonは別個の出自なのですが、YAMLはデータ構造をインデントで表し[4]、Pythonはプログラム構造をインデントをあらわすので似通った外観になります。

YAMLファイルの読出し編集

test.yaml
名前: 
  : 山田
  : 太郎
国籍: 日本
性別: 
部活: 野球部
test-yaml.py
import yaml

with open('/workspace/test.yaml') as f:
    obj = yaml.safe_load(f)
print(f"""\
{obj=}
{obj["国籍"]=}
{obj["名前"]["姓"]=}
""")
実行結果
obj={'名前': {'姓': '山田', '名': '太郎'}, '国籍': '日本', '性別': '男', '部活': '野球部'}
obj["国籍"]='日本'
obj["名前"]["姓"]='山田'
import で yaml をインポートする必要があります。
pythonでYAMLのセミコロンのデータを読取った場合の辞書型のオブジェクトを返します

かつてYAMLの読取りには、yaml.load()が使われていましたが、セキュリティ上の懸念から deprecated となり、yaml.load() を使うと

Main.py:4: YAMLLoadWarning: calling yaml.load() without Loader=... is deprecated, as the default Loader is unsafe. Please read https://msg.pyyaml.org/load for full details.

と警告されます。yaml.safe_load() を使いましょう。

オブジェクトのYAMLへの変換編集

コード例
import yaml
obj = {
    "a": [2,3,5,7],
    "b": 3.14,
    "c": "test test",
    }

s = yaml.dump(obj)
print("*** Block style ***")
print(s);
print("*** Load ***")
print(yaml.safe_load(s))
s = yaml.dump(obj, default_flow_style=True)
print("*** Flow style ***")
print(s);
実行結果
*** Block style ***
a:
- 2
- 3
- 5
- 7
b: 3.14
c: test test

*** Load ***
{'a': [2, 3, 5, 7], 'b': 3.14, 'c': 'test test'}
*** Flow style ***
{a: [2, 3, 5, 7], b: 3.14, c: test test}

YAMLファイルの書込み編集

コード例
import yaml

obj = {
    "a": [2,3,5,7],
    "b": 3.14,
    "c": "test test",
    }
with open('/workspace/test.yaml', "w") as f:
    yaml.dump(obj, f)

with open('/workspace/test.yaml') as f:
    for s in f: 
        print(s, end='')
print("-"*40)
with open('/workspace/test.yaml') as f:
    print(yaml.safe_load(f))
実行結果
a:
- 2
- 3
- 5
- 7
b: 3.14
c: test test
----------------------------------------
{'a': [2, 3, 5, 7], 'b': 3.14, 'c': 'test test'}

pickle と marshal編集

pickleモジュールは、Pythonのオブジェクト構造をシリアル化およびデシリアル化するためのバイナリプロトコルを実装しています[5]。 marshalモジュールも、Pythonのオブジェクト構造をシリアル化およびデシリアル化するためのバイナリプロトコルの実装ですが、将来に渡ってフォーマットを変えないことは保証されていないので、その用途にはpickleモジュールあるいはshelveモジュールを使ってください[6]。 marshalモジュールは、主に.pycファイルのPythonモジュールの "擬似コンパイル "コードの読み書きをサポートするために存在します。

コード例
import pickle

obj = [1,3,5,7]
obj.append(obj)
print(f'{obj=}')

pkl = pickle.dumps(obj)
print(f'{pkl=}')
print(f'{pickle.loads(pkl)=}')

import marshal

msl = marshal.dumps(obj)
print(f'{msl=}')
print(f'{marshal.loads(msl)=}')
実行結果
obj=[1, 3, 5, 7, [...]]
pkl=b'\x80\x04\x95\x0f\x00\x00\x00\x00\x00\x00\x00]\x94(K\x01K\x03K\x05K\x07h\x00e.'
pickle.loads(pkl)=[1, 3, 5, 7, [...]]
msl=b'\xdb\x05\x00\x00\x00\xe9\x01\x00\x00\x00\xe9\x03\x00\x00\x00\xe9\x05\x00\x00\x00\xe9\x07\x00\x00\x00r\x00\x00\x00\x00'
marshal.loads(msl)=[1, 3, 5, 7, [...]]

shelve編集

shelveモジュールは、永続的な辞書の実装です[7]

コード例
import shelve

filename = "/workspace/temp.shelve"
with shelve.open(filename) as sh:
    sh['x'] = 1
    sh['y'] = "abc"
    sh['z'] = [0, 1, 2]
    print(f'{sh["z"]=}')

with shelve.open(filename) as sh:
    print(f'{ {k:v for k,v in sh.items()}=}')
実行結果
sh["z"]=[0, 1, 2]
 {k:v for k,v in sh.items()}={'z': [0, 1, 2], 'x': 1, 'y': 'abc'}

脚註編集

  1. ^ PEP 572 -- Assignment Expressions” (2018年2月28日). 2021年11月12日閲覧。
  2. ^ ECMAScriptで内包表記のプロポーザルが検討されGeckoで先行実装されましたが、レビューの結果mapを始めとするArrayのメソッドのメソッドチェインやスプレッド構文でより簡素に記述できるため不採用となり、Geckoからも内包表記のサポートは削除されました。
    ECMAScriptに提出された内包表記の使用例
    const ary1 = [for (x of ['A','B','C']) for (y of ['X','Y','Z']) x + '' + y]; // [ 'AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ' ]
    const ary2 = [for (i of [0,1,2,3,4,5]) if (i > 2) i] // [3, 4, 5]
    
    Arrayのメソッドとスプレッド構文で同じロジックを記述した例
    const ary1 = [..."ABC"].map( x => [..."XYZ"].map(y => x + '' + y)).join()
    const ary2 = [0,1,2,3,4,5].filter(x => x > 2)
    
  3. ^ https://github.com/yaml/pyyaml
  4. ^ インデントでデータ構造を表すスタイルをブロックスタイルと呼びます。YAMLには他にフロースタイルと言う形式があり、これはYAML1.2からはJSONそのものです。YAML Ain’t Markup Language (YAML™) version 1.2
  5. ^ 3.10.0 Documentation » The Python Standard Library » Data Persistence » pickle — Python object serialization” (2021年12月2日). 2021年12月2日閲覧。
  6. ^ 3.10.0 Documentation » The Python Standard Library » Data Persistence » marshal — Internal Python object serialization” (2021年12月2日). 2021年12月2日閲覧。
  7. ^ 3.10.0 Documentation » The Python Standard Library » Data Persistence » shelve — Python object persistence” (2021年12月2日). 2021年12月2日閲覧。
このページ「Python」は、まだ書きかけです。加筆・訂正など、協力いただける皆様の編集を心からお待ちしております。また、ご意見などがありましたら、お気軽にトークページへどうぞ。