Python/整理中のソースを表示
←
Python/整理中
ナビゲーションに移動
検索に移動
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループに属する利用者のみが実行できます:
登録利用者
。
このページのソースの閲覧やコピーができます。
== 複素数 == Pythonには複素数型が組み込まれており、複素数を操作するための組み込み関数や演算子が提供されています。Pythonでは、<code>j</code>または<code>J</code>を使って虚数単位を表します<ref>虚数単位は数学では一般的に <math>i</math> を用いますが、Pythonでは {{code|j}} を用います。これは電気工学・電子工学の慣習で電流('''i'''ntensity of electricity)の i(または I)との混同を避けるためです。また変数 {{code|j}} と区別するため {{code|1j}} のように必ず係数を付けます。 </ref>。 例えば、次のようにして複素数を定義できます: :<syntaxhighlight lang=python3> # 実数部が3で虚数部が4の複素数 z = 3 + 4j print(f"{z=}, {z.real=}, {z.imag=}, {abs(z)=}, {type(z)=}") </syntaxhighlight> ;実行結果:<syntaxhighlight lang=text> z=(3+4j), z.real=3.0, z.imag=4.0, abs(z)=5.0, type(z)=<class 'complex'> </syntaxhighlight> また、複素数同士の演算もサポートされています: :<syntaxhighlight lang=python3> print(f"{(3 + 4j) + (2 - 1j)=}") print(f"{(3 + 4j) * (2 - 1j)=}") </syntaxhighlight> ;実行結果:<syntaxhighlight lang=text> (3 + 4j) + (2 - 1j)=(5+3j) (3 + 4j) * (2 - 1j)=(10+5j) </syntaxhighlight> Pythonの<code>cmath</code>モジュールには、複素数に対するさまざまな数学関数(三角関数、指数関数、対数関数など)が提供されています。これを使って複素数に対する操作や計算を行うことができます。 :<syntaxhighlight lang=python3> import cmath # 複素数の絶対値を取得 print(f"{abs(3 + 4j)=}") # 複素数の偏角を取得 print(f"{cmath.phase(3 + 4j)=}") </syntaxhighlight> ;実行結果:<syntaxhighlight lang=text> abs(3 + 4j)=5.0 cmath.phase(3 + 4j)=0.9272952180016122 </syntaxhighlight> これらの関数や演算子を使うことで、Pythonで簡単に複素数を操作できます。 == 正規表現 == Pythonの [[正規表現]](regular expression)は組込みではなくモジュールreをインポートし使用します。 正規表現とは、検索のような機能です。詳しくは上記リンク『正規表現』のリンク先を読んでください。 === 検索 search === pythonで文字列中の検索をしたい場合、search という関数を re.search() という形式で使います。 なお、Perl など他の言語では、似たような演算を match という場合もありますが、しかし python では、matchという関数が別の意味で使われているので(後述)、混同しないように気をつけてください。 ;コード例:<syntaxhighlight lang=python3> import re string = 'books' m = re.search('oo', string) if m: print("あった") else: print("なかった") </syntaxhighlight> ;実行結果:<syntaxhighlight lang=text> あった </syntaxhighlight> ;解説 Pythonでは、正規表現を使うには、まずreをインポートする必要があります。 文字列中の文字を検索するには re.serach 関数を使って re.search("検索したい文字列", 検索対象の文字列または文字列変数) のように記述します。 検索する文字列を「oo」から、たとえば「goo」に返ると、とうぜん「book」には「goo」という文字の並びは無いので、検索しなくなります。 ;コード例:<syntaxhighlight lang=python3> import re string = 'books' m = re.search('goo', string) if m: print("あった") else: print("なかった") </syntaxhighlight> ;結果 なかった 下記のように、 re.search 関数中でひとまとめに検索しても可能です。 ;コード例 :<syntaxhighlight lang=python3> import re string = 'books' m = re.search('oo', 'books') if m: print("あったよ") else: print("なかったよ") </syntaxhighlight> ;結果 あったよ === 先頭 match === 正規表現の関数 re.match は、対象の文字が、文字列の先頭にないと検索にヒットしません。 下記の2種類のコードとその結果を見比べてください。 「book」の文字列中に「oo」があるにもかかわらず、先頭は「oo」からは始まらないので、 re.match の場合には「oo」ではヒットせず、「boo」にしないとヒットしないのです。 ;コード例1 :<syntaxhighlight lang=python3> import re string = 'books' m = re.search('boo', string) if m: print("あった") else: print("なかった") </syntaxhighlight> ;結果 あった ;コード例2 :<syntaxhighlight lang=python3> import re string = 'books' m = re.search('oo', string) if m: print("あったぜ") else: print("なかったぜ") </syntaxhighlight> ;結果 なかったぜ === split関数 === Pythonに限らず、PerlやC#などでもsplit関数というのがあり、1個の文字列を、区切り文字でくぎってリスト(配列)に代入し、リストのいくつもの個数の要素に代入していく機能が、モダンなプログラム言語にはあります。 このうち Python の split関数は、正規表現のreモジュールで扱われますので、python では関数 re.split を使うことになります。(他のプログラム言語では、正規表現とは無関係なのが一般的。) :<syntaxhighlight lang=python3> import re string = 'きみとぼく' m = re.split('と', string) print ("1個目は" , m[0]) print ("2個目は" , m[1]) </syntaxhighlight> ;結果:<pre> 1個目は きみ 2個目は ぼく </pre> === 対話モード === 対話モードでも、正規表現は使えます。 ;対話例:<syntaxhighlight lang=python3> >>> import re >>> m = re.match(r'<title>(.*?)</title>', '<TITLE>Example Web Page</TITLE>', re.I) >>> m.group(0) '<title>Example Web Page</title>' >>> m.group(1) 'Example Web Page' </syntaxhighlight> <code>r<nowiki>''</nowiki></code>や<code>r""</code>のようなraw文字列はエスケープ文字を解釈しないので、<code>\d</code>や<code>\s</code>などのメタ文字を書くのに重宝します。matchメソッドは第一引数に正規表現パターン、第二引数にマッチ対象文字列、第三引数に<code>re.I</code>や<code>re.IGNORECASE</code>や<code>re.M</code>や<code>re.MULTILINE</code>や<code>re.S</code>や<code>re.DOTALL</code>などのフラグを指定します。Pythonに正規表現リテラルというものは存在しません。 matchメソッドはマッチオブジェクトを返します。マッチオブジェクトのgroupメソッドを使用して一致部分を抽出します。<code>group(0)</code>はマッチ全体、<code>group(1), group(2), ..., group(N)</code>は後方参照です。matchメソッドで対象文字列にマッチしなかった場合はマッチオブジェクトではなくNoneを返します。マッチに失敗する可能性がある場合は必ず<code>if m == None:</code>あるいは<code>if not m:</code>(<code>None</code>は<code>False</code>)で確認してください。 == HTTPクライアント == Python 2ではurllibまたはurllib2、Python 3以降はurllib.requestのurlopenメソッドを使用してHTTPクライアントを作成することができます。 :<syntaxhighlight lang=python3> # -*- coding: utf-8 -*- try: from urllib.request import urlopen except: from urllib2 import urlopen print( urlopen('http://www.example.com/').read().decode() ) </syntaxhighlight> レスポンスはbytesで返ってくるので、decodeメソッドを使用してstrに変換しています。 == JSON == [[JSON]]を扱うには<code>import json</code>します。 :<syntaxhighlight lang=python3> >>> import json >>> json.dumps({'key': 'value'}) '{"key": "value"}' >>> json.loads(json.dumps({'key': 'value'})) {'key': 'value'} >>> </syntaxhighlight> このコードから、オブジェクトのコピー(特にディープコピー)にJSONを利用できることに気がつくと思いますが、その用途にはモジュール copy の copy() や deepcopy() を使います。 == インクリメントとデクリメント == Pythonには''C/C++''や''Java''にあるインクリメント演算子とデクリメント演算子はないので、加算・減算と再代入で実現します。 :<syntaxhighlight lang=python3> >>> a=50 >>> a=a+1 >>> print(a) 51 >>> a=50 >>> a=a-1 >>> print(a) 49 </syntaxhighlight> === 累算代入文 === Pythonにインクリメント演算子とデクリメント演算子はありませんが、累算代入文( ''augmented assignment statement'' )<ref>[https://docs.python.org/ja/3/reference/simple_stmts.html#augmented-assignment-statements 3.10.4 Documentation » Python 言語リファレンス » 7. 単純文 (simple statement)]</ref>の加算代入文・減算代入文はあります。 :<syntaxhighlight lang=python3> >>> a=50 >>> a+=1 >>> print(a) 51 >>> a=50 >>> a-=1 >>> print(a) 49 </syntaxhighlight> == pass == passは''「文法上必ず処理を書かなくてはならないが何も処理を書きたくない」''というときに使います。 >>> def p(): ... pass ... >>> p() == ラムダ式 == 無名関数を定義するには<code>lambda</code>文を使用します。 >>> (lambda x: x * x)(2) 4 == ヒアドキュメント == ヒアドキュメントは複数に渡る文字列リテラルで、文字列を<code>""" """</code>あるいは<code><nowiki>'''</nowiki> <nowiki>'''</nowiki></code>で囲みます。 == docstring == モジュール・クラス・関数の冒頭の文字列リテラルは docstring と呼ばれドキュメントを記すために使われ、 オブジェクト.__doc__ で参照できます。 また、doctestではドキュメントの中の用例を使ってテストを行うときに使われます。 ;[https://paiza.io/projects/i-s0zhGesjSGutQn2pRT5w?language=python3 docstringの例]:<syntaxhighlight lang=python3> """モジュールのdocstring""" class MyClass: """クラスのdocstring""" def method(self): """メソッドのdocstring""" def function(): """関数のdocstring""" print(f'''\ {__doc__=} {MyClass.__doc__=} {MyClass.method.__doc__=} {function.__doc__=} ''') </syntaxhighlight> ;実行結果:<syntaxhighlight lang=text> __doc__='モジュールのdocstring' MyClass.__doc__='クラスのdocstring' MyClass.method.__doc__='メソッドのdocstring' function.__doc__='関数のdocstring' </syntaxhighlight> == ジェネレーター == Pythonではジェネレーターを簡単に書くことができます。ジェネレーターを用いると、最初のフィボナッチ数を求めるプログラムは次のように書くことができます。 ;[https://paiza.io/projects/CgKF1OgMkMAg1qBQDkyL3g?language=python3 ジェネレーターの例]:<syntaxhighlight lang=python3> def fibgen(n): a, b = 0, 1 for _ in range(n) : yield a a, b = a + b, a for i in fibgen(8) : print(i, end=' ') print() print(tuple(fibgen(8))) </syntaxhighlight> ;実行結果:<syntaxhighlight lang=text> 0 1 1 2 3 5 8 13 (0, 1, 1, 2, 3, 5, 8, 13) </syntaxhighlight> : Pythonでは特に指定のない変数は自動的にローカル変数(レキシカルスコープ)になります。 : <code>a, b = 0, 1</code>というのは分割代入(''Destructuring assignment'')で、<code>a = 0; b = 1</code>と同じ意味です。 : <code>a, b = a + b, a</code>も同様ですが、代入は一気に行われるため、<code>t = a; a = a + b; b = t</code>と同義です(''a''と''b''の値が入れ替わります)。 : Pythonでは<code>while True:</code>のように制御構文の条件式をかっこで囲む必要がありません。定義済みキーワードとして、真を表すTrue、偽を表すFalse、そしてNoneが存在します。 : yield文はreturn文と似ていますが、サブルーチンの戻り値を処理の「途中で」返すことができるところが違います。 : nextメソッドを呼ぶと、「途中から」処理が継続されます(for文では暗黙に next メソッドが呼出されます)。このような関数をジェネレーターといいます。 === 内包表記とジェネレータ式 === Pythonには、シーケンスの内包表記とジェネレータ式があります。 ;[https://paiza.io/projects/zcGKAf9f-uN9V7KQrpv4SQ?language=python3 内包表記とジェネレータ式]:<syntaxhighlight lang=python3> 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}: {expr} ⇒ {eval(expr)} : {type(eval(expr))}''') </syntaxhighlight> ;実行結果:<syntaxhighlight lang=text> 加算: 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'> </syntaxhighlight> : Pythonの式を表す文字列(Ex. "1 + 1")を要素としたタプルをループ変数exprで回しています。 : <code> print(f'{label}:\n {expr}\n ⇒ {eval(expr)} : {type(eval(expr))}')</code>は、 ::<syntaxhighlight lang=text> ラベル: 式 ⇒ 式の評価結果 : 式の評価結果の型 </syntaxhighlight>を表示します。 : <code>(2 ** x for x in range(5))</code>は、タプル内包表記…ではなく、'''ジェネレータ式'''で未評価のシーケンス(generator)を返します(組込み関数のrange同様、この時点ではメモリーオブジェクトではありません)。 : タプルのコンストラクターにジェネレータ式を渡すと、タプルが返ります(タプルはイミュータブルですがメモリーオブジェクトです)。 === 代入演算子 === if文やwhile文の条件には式が要求されるので代入文 <code>=</code> は使えませんでした。 しかし、条件式の中で代入を行うのがふさわしいケースもあります。 このため Python 3.8で、条件式中でもつかえる代入演算子(''Assignment Expressions'') <code>:=</code> (俗称:セイウチ演算子;''Walrus operator'')が導入されました<ref>{{Cite web |title=PEP 572 -- Assignment Expressions |url=https://www.python.org/dev/peps/pep-0572/ |date=2018/02/28 |accessdate=2021/11/12 }}</ref>。 ;[https://paiza.io/projects/WZAGYZS0LP5H1o3XpD4vnw?language=python3 代入演算子の使用例]:<syntaxhighlight lang=python3> a = "1234567" # 7文字 if (n := len(a)) > 5: print("文字が5文字より多いです" , n - 5, "文字オーバー") print(f"あなたは{n} 文字を入力しました") </syntaxhighlight> ;実行結果:<syntaxhighlight lang=text> 文字が5文字より多いです 2 文字オーバー あなたは7 文字を入力しました </syntaxhighlight> 代入演算子を使った条件式を含む文のブロックの外に出ても、そのまま代入した効果は残ります。 なお、<code>f"あなたは{n} 文字を入力しました"</code>はテンプレート・リテラルです。 {{See|[[/数値入力と文字入力と出力表示#テンプレート・リテラル]]}} === エスケープシーケンス === たとえばprint()関数で、「こんにちは」と表示させたい場合なら :<syntaxhighlight lang=python3> print("こんにちは") </syntaxhighlight> と書きました。 では、'''"''' を含んだ文字列を表示するにはどうしたら良いでしょう? やり方は、いくつかあります。 ; " を含んだ文字列を表示する方法:<syntaxhighlight lang=python3 line> print('"') print("\"") print("\42") print("\x22") </syntaxhighlight> # クオート文字を ' に変えました。素朴ですがパワフルな方法です。 #: しかし、この方法では " と ' は1つの文字列の中で共存できません。 # " の前に \ を前置すると文字列を閉じる " を打消すことができます。 #: \ は、¥(円記号)の半角で表示されるかもしれませんが、文字コードと機能は同じです。 # \ に続けて " の文字コードを8進数で表記します。 #: 10進数ではないので注意してください。 # \ に続けて x それに続けて文字コードを16進数で表記します。 2. から 4. の様に、 \ を前置して文字列中に所望に文字を書く方法を'''エスケープシーケンス'''( ''escape sequence'' )といい、エスケープシーケンスに前置する文字 ' をエスケープ文字( ''escape character'' )といいます。 === エスケープシーケンスの一覧 === :{| class="wikitable" |+ エスケープシーケンスの一覧 ! エスケープシーケンス !! 意味 |- ! \<改行> |バックスラッシュと改行を無視 |- ! \\ |バックスラッシュ自身 (<code>\</code>) |- ! \' |シングルクォーテーション (<code>'</code>) |- ! \" |ダブルクオーテーション (<code>"</code>) |- ! \a |ASCII ベル(アラート) (BEL) |- ! \b |ASCII バックスペース (BS) |- ! \f |ASCII フォームフィード (FF) |- ! \n |ASCII ラインフィード (LF) |- ! \r |ASCII キャリッジリターン (CR) |- ! \t |ASCII 水平タブ (TAB) |- ! \v |ASCII 垂直タブ (VT) |- ! \ooo | 8進数キャラクタコードによる文字指定 ''ooo'' |- ! \xhh | 16進数キャラクタコードによる文字指定 ''hh'' |- ! \uxxxx | 16ビットの16進数値xxxxを持つUnicode文字 |- ! \Uxxxxxxxx | 32ビットの16進数値xxxxxxxxを持つUnicode文字 |} === print関数 === <syntaxhighlight lang=python3> # 「ようこそ」 と出力 print("ようこそ") </syntaxhighlight> <nowiki>#</nowiki>から行末まではコメントです。文字列の出力は<code>print()</code>を使います。Python 2までは<code>print</code>は文でしたが、Python 3では[[Python/組込み関数#print|組込み関数print]]となったため、かっこが必須となります。 文字列は<code>" "</code>で囲んでも<code><nowiki>' '</nowiki></code>で囲んでも同じ意味であり、エスケープ文字の取り扱いに違いはありません。 === 備考 === * インデントについて Pythonのブロックはスペース4つのインデントによって表されます(オフサイドルールといいます)。 * pythonについて pythonは、Googleなどの企業のみならず、MITの初年度のプログラミングの授業でも採用されています。英語圏では[[Ruby]]や[[Perl]]よりも普及しています。 Pythonは1990年にグイド・ヴァンロッサムによって作られました。誰が書いても同じソースコードになるように(違う目的のコードは違う見た目になるように)設計されており、常に読みやすいプログラムを書くことができます。教育用プログラミング言語としても秀逸です。 == 文字列の書式化 == Pythonには、いくつかの異なる文字列の書式化の方法があります。 === 書式化付き文字列化 === C言語の<code>sprintf()</code>に相当する書式付き文字列化は、Pythonでは文字列の % 演算子を使います。 また、書式化文字列に % によるフィールドが複数ある場合は、下のようにタプルを使います。 >>> print("%d.%d.%d" % (2, 6, 4)) 2.6.4 === 文字列の format メソッド === 文字列の format メソッドを使う方法<ref>[https://peps.python.org/pep-3101/ PEP-3101]</ref>。 >>> print("{} {} {}".format(2, 6, 4)) 2.6.4 === f文字列 === PEP 498で新しく f文字列 が追加されました<ref>[https://peps.python.org/pep-498/ PEP-498]</ref>。 >>> print(f"{4} {9} {8}") 4 9 8 ;文字列の書式化:<syntaxhighlight lang=python3> print("%d %d %d" % (0!=0, 0==0, 999)) print("{} {} {}".format(0!=0, 0==0, 999)) print(f"{0!=0} {0==0} {999}") print(f"{abs(-123)} {2**10} {999}") </syntaxhighlight> ;実行結果:<syntaxhighlight lang=text> 0 1 999 False True 999 False True 999 123 1024 999 </syntaxhighlight> == pip == pipはPythonのパッケージインストーラーです<ref>{{Cite web |url=https://pip.pypa.io/en/stable/ |title=pip documentation v21.3.1 |date=2021/12/20 accessdate=2021/12/20 }} </ref>。Python Package Index<ref>{{Cite web |url=https://pypi.org/ |title=The Python Package Index (PyPI) is a repository of software for the Python programming language. |date=2021/12/20 accessdate=2021/12/20 }} </ref> などのインデックスからパッケージをインストールするのに使用します。 pipがインストールされているかは、(インターラクティブ・モードではなく)コマンドラインから確認します。 ;FreeBSD:<syntaxhighlight lang=csh> % uname -a FreeBSD localhost 14.0-STABLE FreeBSD 14.0-STABLE #0 adc61137f: Wed Mar 27 08:16:08 JST 2024 user1@localhost:/usr/obj/usr/src/amd64.amd64/sys/GRIFFON amd64 % pip -V pip 23.3.2 from /usr/local/lib/python3.11/site-packages/pip (python 3.11) </syntaxhighlight> ;Windows 11:<syntaxhighlight lang=powershell> PS C:\Users\user1> pip.exe -V pip 23.2.1 from C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.12_3.12.240.0_x64__qbz5n2kfra8p0\Lib\site-packages\pip (python 3.12) </syntaxhighlight> ;GNU/Linux:<syntaxhighlight lang=bash> $ uname -a Linux asus-2 6.6.25-01713-g2f237acc8e50 #1 SMP PREEMPT_DYNAMIC Fri, 19 Apr 2024 14:53:12 +0000 x86_64 GNU/Linux $ pip -V pip 23.0.1 from /usr/lib/python3/dist-packages/pip (python 3.11) </syntaxhighlight> == YAML == [[W:YAML|YAML]]は、構造化データやオブジェクトを文字列にシリアライズするためのデータ形式の一種です。 Pythonは、初期状態ではYAMLを利用できませんが、pyYaml <ref>https://github.com/yaml/pyyaml</ref>をインストールすることで、pythonでYAMLを処理できるようになります。 pipがインストール済みならば、 ;コマンドライン:<syntaxhighlight lang="shell"> % sudo pip install pyyaml </syntaxhighlight> で pyYaml をインストールできます。 YAMLとPythonは別個の出自なのですが、YAMLはデータ構造をインデントで表し<ref>インデントでデータ構造を表すスタイルをブロックスタイルと呼びます。YAMLには他にフロースタイルと言う形式があり、これはYAML1.2からはJSONそのものです。[https://yaml.org/spec/1.2.2/ YAML Ain’t Markup Language (YAML™) version 1.2]</ref>、Pythonはプログラム構造をインデントをあらわすので似通った外観になります。 === YAMLファイルの読出し === ;test.yaml <syntaxhighlight lang="yaml"> 名前: 姓: 山田 名: 太郎 国籍: 日本 性別: 男 部活: 野球部 </syntaxhighlight> ;[https://paiza.io/projects/2WBoOy3Bw4tO5T22GxBPgA?language=python3 test-yaml.py]:<syntaxhighlight lang=python3> import yaml with open('/workspace/test.yaml') as f: obj = yaml.safe_load(f) print(f"""\ {obj=} {obj["国籍"]=} {obj["名前"]["姓"]=} """) </syntaxhighlight> ;実行結果:<syntaxhighlight lang=python3> obj={'名前': {'姓': '山田', '名': '太郎'}, '国籍': '日本', '性別': '男', '部活': '野球部'} obj["国籍"]='日本' obj["名前"]["姓"]='山田' </syntaxhighlight> : 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() を使いましょう。 {{See also|Python/ファイルの書き込みと読み込み#ファイルからの読込み}} === オブジェクトのYAMLへの変換 === ;[https://paiza.io/projects/FXG1RvgSwy6InZ5_9su_RQ?language=python3 コード例]:<syntaxhighlight lang=python3> 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); </syntaxhighlight> ;実行結果:<syntaxhighlight lang=python3> *** 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} </syntaxhighlight> === YAMLファイルの書込み === ;[https://paiza.io/projects/8h3tTkDUlddNCW87LwvHIg?language=python3 コード例]:<syntaxhighlight lang=python3> 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)) </syntaxhighlight> ;実行結果:<syntaxhighlight lang=python3> a: - 2 - 3 - 5 - 7 b: 3.14 c: test test ---------------------------------------- {'a': [2, 3, 5, 7], 'b': 3.14, 'c': 'test test'} </syntaxhighlight> {{See also|Python/ファイルの書き込みと読み込み}} == pickle と marshal == pickleモジュールは、Pythonのオブジェクト構造をシリアル化およびデシリアル化するためのバイナリプロトコルを実装しています<ref>{{Cite web |url=https://docs.python.org/3/library/pickle.html |title= 3.10.0 Documentation » The Python Standard Library » Data Persistence » pickle — Python object serialization |date=2021/12/02 |accessdate=2021/12/02 }}</ref>。 marshalモジュールも、Pythonのオブジェクト構造をシリアル化およびデシリアル化するためのバイナリプロトコルの実装ですが、将来に渡ってフォーマットを変えないことは保証されていないので、その用途にはpickleモジュールあるいはshelveモジュールを使ってください<ref>{{Cite web |url=https://docs.python.org/3/library/marshal.html |title= 3.10.0 Documentation » The Python Standard Library » Data Persistence » marshal — Internal Python object serialization |date=2021/12/02 |accessdate=2021/12/02 }}</ref>。 marshalモジュールは、主に.pycファイルのPythonモジュールの "擬似コンパイル "コードの読み書きをサポートするために存在します。 ;[https://paiza.io/projects/wg95etA69kFU0hJovyQm8Q?language=python3 コード例]:<syntaxhighlight lang=python3> 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)=}') </syntaxhighlight> ;実行結果:<syntaxhighlight lang=python3> 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, [...]] </syntaxhighlight> == shelve == shelveモジュールは、永続的な辞書の実装です<ref>{{Cite web |url=https://docs.python.org/3/library/shelve.html |title= 3.10.0 Documentation » The Python Standard Library » Data Persistence » shelve — Python object persistence |date=2021/12/02 |accessdate=2021/12/02 }}</ref>。 ;[https://paiza.io/projects/wg95etA69kFU0hJovyQm8Q?language=python3 コード例]:<syntaxhighlight lang=python3> 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()}=}') </syntaxhighlight> ;実行結果:<syntaxhighlight lang=python3> sh["z"]=[0, 1, 2] {k:v for k,v in sh.items()}={'z': [0, 1, 2], 'x': 1, 'y': 'abc'} </syntaxhighlight> == 脚註 == <references /> [[Category:Python|せいりちゆう]]
このページで使用されているテンプレート:
テンプレート:Cite web
(
ソースを閲覧
)
テンプレート:Code
(
ソースを閲覧
)
テンプレート:See
(
ソースを閲覧
)
テンプレート:See also
(
ソースを閲覧
)
Python/整理中
に戻る。
ナビゲーション メニュー
個人用ツール
ログイン
名前空間
ページ
議論
日本語
表示
閲覧
ソースを閲覧
履歴表示
その他
検索
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
特別ページ
ツール
リンク元
関連ページの更新状況
ページ情報