Python学習ノート(1):常用テクニック
7761 ワード
コンセプト:プロセス向け:命令を中心として、命令処理データによってどのように月にコードを組織して問題を解決するか オブジェクト向け:データを中心として、すべての処理コードがデータの周りに展開するデータ構造の組織データをどのように設計するか、およびそのようなデータに対して許容される操作 を提供する. Pythonはプロセスにもオブジェクトにもプログラミングにも向いている.Pythonでは、すべてが対象 Pycharmショートカットキーおよび操作コマンド注釈(注釈解除):CTRL+/ 一括インデント:TAB 一括インデント解除:shift+TAB 回復動作:CTRL+Z クエリー参照ライブラリに組み込まれたメソッド(関数):dir(ライブラリ名) クエリー変数のデータ型:type(変数名) 文字列、リスト、メタグループ、集合、辞書の長さ(要素の個数):len(文字列名など) を求めます
商を求めて整頓する.
(商は小数を切り捨てて整数だけを取る)、二重スラッシュ、すなわち二重//、対比:
9//2=4 9/2=4.5
/除外した結果浮動小数点
10/5=2.0
%を除いた結果を剰余とする
10%3=1 10%5=0
乗算/べき乗
2*3=6 2**3=8
エスケープ記号反スラッシュはエスケープ記号で、print(「I'm a sexy man!」)のように、その後の記号を出力させます.結果は:I'm a sexy man! アルファベットrの文字列引用符の前には、print(r「待ってくれ...転がれ!」など、文字列内のすべての記号を出力することができます.結果は:あなた、待っていてください...出て行け!対照的にprint(「お前、待ってくれ...出て行け!」)結果:
四捨五入
整数関数ROUND(パラメータ1、パラメータ2)は、次のようになります.
round(1.23,1)=1.2 ROUND(1.23)=1
すなわち、この関数に第2のパラメータがないのは四捨五入である
print用法の詳細説明文書 def print(*args, **kwargs): # known special case of print """print(value, ..., sep=' ', end='', file=sys.stdout) Prints the values to a stream, or to sys.stdout by default. Optional keyword arguments: file: a file-like object (stream); defaults to the current sys.stdout. sep: string inserted between values, default a space. end: string appended after the last value, default a newline. 「printはパラメータを持つことができる.パラメータend:末尾文字、デフォルトはリターン:
結果:パラメータ:sepの各値間のコネクタ、デフォルトはスペース:""
結果:パラメータ:file fileパラメータはprintの結果をどこに出力するかの役割です.デフォルトはシステム標準出力で、インタラクティブshellで出力されます.
文字列とエンコーディング:リンクの抜粋
コンピュータは数字しか処理できないので、テキストを処理するには、まずテキストを数字に変換してから処理しなければなりません.最初のコンピュータは設計時に8ビット(bit)を1バイト(byte)として採用したので、1バイトで表すことができる最大の整数は255(バイナリ11111111=10進255)であり、より大きな整数を表すにはより多くのバイトが必要である.例えば、2バイトで表すことができる最大整数は65535であり、4バイトで表すことができる最大整数は4294967295である.
コンピュータはアメリカ人が発明したので、最初は127文字しかコンピュータに符号化されていませんでした.つまり、大文字、数字、いくつかの記号です.この符号表はASCII符号化と呼ばれています.例えば、大文字Aの符号化は65で、小文字zの符号化は122です.
しかし、中国語を処理するには明らかに1バイトでは足りず、少なくとも2バイトが必要であり、ASCII符号化と衝突することはできないため、中国はGB 2312符号化を制定し、中国語を編入するために使用している.
あなたが考えることができるのは、世界中に百種類以上の言語があり、日本は日本語をShiftに編んでいます.JISでは、韓国が韓国語をEuc-krに編み込むと、各国の基準があり、衝突が避けられない結果、多言語混在のテキストに文字化けして表示される.
そのため、Unicodeは運に応じて生まれた.Unicodeはすべての言語を1つのコードに統一し、文字化けの問題はなくなります.
Unicode規格も発展していますが、最も一般的なのは2バイトで1文字を表すことです(非常に辺鄙な文字を使うには4バイトが必要です).現代のオペレーティングシステムとほとんどのプログラミング言語はUnicodeを直接サポートしています.
現在、ASCII符号化とUnicode符号化の違いを撫でると、ASCII符号化は1バイトであり、Unicode符号化は通常2バイトである.
アルファベットAはASCII符号化で10進数の65、バイナリの01000001である.
文字0はASCIIで符号化され、10進数の48、2進数の0011000であり、文字'0'と整数0が異なることに注意する.
漢字はすでにASCII符号化の範囲を超えており、Unicode符号化は10進数の20013、バイナリの01001110 00101101である.
ASCII符号化されたAをUnicodeで符号化すれば、前に0を補うだけで済むと推測できますので、AのUnicode符号化は00000000 01000001です.
新しい問題がまた現れた:Unicode符号化に統一すれば、乱符号化の問題はそれから消えた.しかし、あなたが書いたテキストが基本的にすべて英語であれば、Unicode符号化でASCII符号化よりも倍以上の記憶空間が必要で、記憶と伝送では非常にお得ではありません.
そこで、節約の精神に基づいて、Unicode符号化を「可変長符号化」に変換するUTF-8符号化が登場した.UTF-8符号化は1つのUnicode文字を異なる数字の大きさによって1-6バイトに符号化し、よく使われる英語のアルファベットは1バイトに符号化され、漢字は通常3バイトで、辺鄙な文字だけが4-6バイトに符号化される.転送するテキストに英語の文字がたくさん含まれている場合は、UTF-8でエンコードするとスペースが節約されます.
|文字|ASCII|Unicode|UTF-8|:----:|:----:----:|:----:||A|01000001|00000001|00010100001|00010100001|中|x|01001110 00101101|11100100101110001011101101|上の表から、UTF-8符号化には額外のメリットがあり、ASCII符号化が実際にUTF-8符号化の一部と見なすことができるため、ASCII符号化のみをサポートする履歴レガシーソフトウェアの多くは、UTF-8符号化の下で動作を継続することができる.
ASCII、Unicode、UTF-8の関係を明らかにし、現在のコンピュータシステムで通用する文字符号化の働き方をまとめることができます.
コンピュータメモリではUnicode符号化を統一し、ハードディスクに保存する必要がある場合や転送する必要がある場合はUTF-8符号化に変換する.
メモ帳で編集する場合、ファイルから読み取ったUTF-8文字がUnicode文字に変換されてメモリに格納され、編集が完了した後、保存するときにUnicodeがUTF-8に変換されてファイルに保存されます.
Webページを閲覧すると、サーバは動的に生成されたUnicodeコンテンツをUTF-8に変換してブラウザに転送します.
そのため、多くのページのソースコードに似たような情報があり、そのページがUTF-8符号化されていることを示しています.
Pythonの文字列符号化変換
頭の痛い文字コードの問題を明らかにした後、Pythonの文字列を研究します.
最新のPython 3バージョンでは、文字列はUnicodeで符号化されています.つまり、Pythonの文字列は多言語をサポートしています.たとえば、次のようになります.
print('中国語を含むstr')中国語を含むstr
個々の文字の符号化に対して、Pythonはord()関数を提供して文字の整数表現を取得し、chr()関数は符号化を対応する文字に変換する.
文字の整数符号化が分かれば、strを16進数で書くこともできます.
二つの書き方は完全に等価である.
Pythonの文字列タイプはstrであるため、メモリにはUnicodeで表され、1文字は数バイトに対応する.ネットワーク上で転送したり、ディスクに保存したりするには、strをバイト単位のbytesに変更する必要があります.
Pythonはbytesタイプのデータに対してb接頭辞付きの一重引用符または二重引用符で表す.
「ABC」とb「ABC」を区別することに注意してください.前者はstrで、後者は前者と同じ内容を表示しますが、bytesの各文字は1バイトしか占めません.
Unicodeで表されるstrは、encode()メソッドによって指定されたbytesとして符号化され得る.例えば、
純粋な英語のstrはASCIIでbytesと符号化することができ、内容は同じで、中国語を含むstrはUTF-8でbytesと符号化することができる.中国語を含むstrはASCIIで符号化できません.中国語の符号化の範囲がASCIIの符号化の範囲を超えているため、Pythonはエラーを報告します.
bytesではASCII文字のバイトとして表示できず、x##で表示されます.
逆に、ネットワークまたはディスクからバイトストリームを読み込んだ場合、読み込まれたデータはbytesです.bytesをstrにするにはdecode()メソッドが必要です.
strに何文字が含まれているかを計算するには、len()関数を使用します.
len()関数はstrの文字数を計算し、bytesに置き換えるとlen()関数はバイト数を計算します.
このように、1つの中国語文字はUTF-8で符号化された後、通常3バイトを占有し、1つの英語文字は1バイトしか占有しない.
文字列を操作するとき、strとbytesの相互変換によく遭遇します.文字化けしの問題を避けるためには、strとbytesをUTF-8符号化で変換することを常に堅持しなければならない.
Pythonソースコードもテキストファイルなので、ソースコードに中国語が含まれている場合、ソースコードを保存する場合は、必ずUTF-8コードとして保存するように指定する必要があります.Pythonインタプリタがソースコードを読み込む場合、UTF-8コードで読み込むために、通常、ファイルの先頭にこの2行を書きます.
最初の行の注釈はLinux/OS Xシステムに伝えるためで、これはPython実行可能なプログラムで、Windowsシステムはこの注釈を無視します;
2行目のコメントは、Python解釈器にUTF-8コードに従ってソースコードを読み取るように伝えるためです.そうしないと、ソースコードに書かれた中国語の出力が文字化けしてしまう可能性があります.
UTF-8コードがあなたのものではないことを明らかにしました.pyファイルはUTF-8でエンコードされ、テキストエディタが
抜粋:リンク
商を求めて整頓する.
(商は小数を切り捨てて整数だけを取る)、二重スラッシュ、すなわち二重//、対比:
9//2=4 9/2=4.5
/除外した結果浮動小数点
10/5=2.0
%を除いた結果を剰余とする
10%3=1 10%5=0
乗算/べき乗
2*3=6 2**3=8
エスケープ記号
,
...
!
四捨五入
整数関数ROUND(パラメータ1、パラメータ2)は、次のようになります.
round(1.23,1)=1.2 ROUND(1.23)=1
すなわち、この関数に第2のパラメータがないのは四捨五入である
print用法の詳細
print('hello1')
print('hello2', end="
")
print('hello3')
print('hello4', end="") #
print('hello5')
print('hello6', end=" ") #
print('hello7')
結果:
hello1
hello2
hello3
hello4hello5
hello6 hello7
print('hello', 'hello', 'hello')
print('hello', 'hello', 'hello', sep=" ") #
print('hello', 'hello', 'hello', sep=" ") #
print('hello', 'hello', 'hello', sep="+")
print('hello', 'hello', 'hello', sep="-")
print('hello', 'hello', 'hello', sep="+-*/")
結果:
hello hello hello
hello hello hello
hello hello hello
hello+hello+hello
hello-hello-hello
hello+-*/hello+-*/hello
with open('print_output.txt','w') as f:
print('hello', 'hello', 'hello', sep="+-*/", file=f)
文字列とエンコーディング:リンクの抜粋
コンピュータは数字しか処理できないので、テキストを処理するには、まずテキストを数字に変換してから処理しなければなりません.最初のコンピュータは設計時に8ビット(bit)を1バイト(byte)として採用したので、1バイトで表すことができる最大の整数は255(バイナリ11111111=10進255)であり、より大きな整数を表すにはより多くのバイトが必要である.例えば、2バイトで表すことができる最大整数は65535であり、4バイトで表すことができる最大整数は4294967295である.
コンピュータはアメリカ人が発明したので、最初は127文字しかコンピュータに符号化されていませんでした.つまり、大文字、数字、いくつかの記号です.この符号表はASCII符号化と呼ばれています.例えば、大文字Aの符号化は65で、小文字zの符号化は122です.
しかし、中国語を処理するには明らかに1バイトでは足りず、少なくとも2バイトが必要であり、ASCII符号化と衝突することはできないため、中国はGB 2312符号化を制定し、中国語を編入するために使用している.
あなたが考えることができるのは、世界中に百種類以上の言語があり、日本は日本語をShiftに編んでいます.JISでは、韓国が韓国語をEuc-krに編み込むと、各国の基準があり、衝突が避けられない結果、多言語混在のテキストに文字化けして表示される.
そのため、Unicodeは運に応じて生まれた.Unicodeはすべての言語を1つのコードに統一し、文字化けの問題はなくなります.
Unicode規格も発展していますが、最も一般的なのは2バイトで1文字を表すことです(非常に辺鄙な文字を使うには4バイトが必要です).現代のオペレーティングシステムとほとんどのプログラミング言語はUnicodeを直接サポートしています.
現在、ASCII符号化とUnicode符号化の違いを撫でると、ASCII符号化は1バイトであり、Unicode符号化は通常2バイトである.
アルファベットAはASCII符号化で10進数の65、バイナリの01000001である.
文字0はASCIIで符号化され、10進数の48、2進数の0011000であり、文字'0'と整数0が異なることに注意する.
漢字はすでにASCII符号化の範囲を超えており、Unicode符号化は10進数の20013、バイナリの01001110 00101101である.
ASCII符号化されたAをUnicodeで符号化すれば、前に0を補うだけで済むと推測できますので、AのUnicode符号化は00000000 01000001です.
新しい問題がまた現れた:Unicode符号化に統一すれば、乱符号化の問題はそれから消えた.しかし、あなたが書いたテキストが基本的にすべて英語であれば、Unicode符号化でASCII符号化よりも倍以上の記憶空間が必要で、記憶と伝送では非常にお得ではありません.
そこで、節約の精神に基づいて、Unicode符号化を「可変長符号化」に変換するUTF-8符号化が登場した.UTF-8符号化は1つのUnicode文字を異なる数字の大きさによって1-6バイトに符号化し、よく使われる英語のアルファベットは1バイトに符号化され、漢字は通常3バイトで、辺鄙な文字だけが4-6バイトに符号化される.転送するテキストに英語の文字がたくさん含まれている場合は、UTF-8でエンコードするとスペースが節約されます.
|文字|ASCII|Unicode|UTF-8|:----:|:----:----:|:----:||A|01000001|00000001|00010100001|00010100001|中|x|01001110 00101101|11100100101110001011101101|上の表から、UTF-8符号化には額外のメリットがあり、ASCII符号化が実際にUTF-8符号化の一部と見なすことができるため、ASCII符号化のみをサポートする履歴レガシーソフトウェアの多くは、UTF-8符号化の下で動作を継続することができる.
ASCII、Unicode、UTF-8の関係を明らかにし、現在のコンピュータシステムで通用する文字符号化の働き方をまとめることができます.
コンピュータメモリではUnicode符号化を統一し、ハードディスクに保存する必要がある場合や転送する必要がある場合はUTF-8符号化に変換する.
メモ帳で編集する場合、ファイルから読み取ったUTF-8文字がUnicode文字に変換されてメモリに格納され、編集が完了した後、保存するときにUnicodeがUTF-8に変換されてファイルに保存されます.
Webページを閲覧すると、サーバは動的に生成されたUnicodeコンテンツをUTF-8に変換してブラウザに転送します.
そのため、多くのページのソースコードに似たような情報があり、そのページがUTF-8符号化されていることを示しています.
Pythonの文字列符号化変換
頭の痛い文字コードの問題を明らかにした後、Pythonの文字列を研究します.
最新のPython 3バージョンでは、文字列はUnicodeで符号化されています.つまり、Pythonの文字列は多言語をサポートしています.たとえば、次のようになります.
print('中国語を含むstr')中国語を含むstr
個々の文字の符号化に対して、Pythonはord()関数を提供して文字の整数表現を取得し、chr()関数は符号化を対応する文字に変換する.
ord('A')
65
ord(' ')
20013
chr(66)
'B'
chr(25991)
' '
文字の整数符号化が分かれば、strを16進数で書くこともできます.
'\u4e2d\u6587'
' '
二つの書き方は完全に等価である.
Pythonの文字列タイプはstrであるため、メモリにはUnicodeで表され、1文字は数バイトに対応する.ネットワーク上で転送したり、ディスクに保存したりするには、strをバイト単位のbytesに変更する必要があります.
Pythonはbytesタイプのデータに対してb接頭辞付きの一重引用符または二重引用符で表す.
x = b'ABC'
「ABC」とb「ABC」を区別することに注意してください.前者はstrで、後者は前者と同じ内容を表示しますが、bytesの各文字は1バイトしか占めません.
Unicodeで表されるstrは、encode()メソッドによって指定されたbytesとして符号化され得る.例えば、
'ABC'.encode('ascii')
b'ABC'
' '.encode('utf-8')
b'\xe4\xb8\xad\xe6\x96\x87'
' '.encode('ascii')
Traceback (most recent call last):
File "", line 1, in
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
純粋な英語のstrはASCIIでbytesと符号化することができ、内容は同じで、中国語を含むstrはUTF-8でbytesと符号化することができる.中国語を含むstrはASCIIで符号化できません.中国語の符号化の範囲がASCIIの符号化の範囲を超えているため、Pythonはエラーを報告します.
bytesではASCII文字のバイトとして表示できず、x##で表示されます.
逆に、ネットワークまたはディスクからバイトストリームを読み込んだ場合、読み込まれたデータはbytesです.bytesをstrにするにはdecode()メソッドが必要です.
b'ABC'.decode('ascii')
'ABC'
b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')
' '
strに何文字が含まれているかを計算するには、len()関数を使用します.
len('ABC')
3
len(' ')
2
len()関数はstrの文字数を計算し、bytesに置き換えるとlen()関数はバイト数を計算します.
len(b'ABC')
3
len(b'\xe4\xb8\xad\xe6\x96\x87')
6
len(' '.encode('utf-8'))
6
このように、1つの中国語文字はUTF-8で符号化された後、通常3バイトを占有し、1つの英語文字は1バイトしか占有しない.
文字列を操作するとき、strとbytesの相互変換によく遭遇します.文字化けしの問題を避けるためには、strとbytesをUTF-8符号化で変換することを常に堅持しなければならない.
Pythonソースコードもテキストファイルなので、ソースコードに中国語が含まれている場合、ソースコードを保存する場合は、必ずUTF-8コードとして保存するように指定する必要があります.Pythonインタプリタがソースコードを読み込む場合、UTF-8コードで読み込むために、通常、ファイルの先頭にこの2行を書きます.
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
最初の行の注釈はLinux/OS Xシステムに伝えるためで、これはPython実行可能なプログラムで、Windowsシステムはこの注釈を無視します;
2行目のコメントは、Python解釈器にUTF-8コードに従ってソースコードを読み取るように伝えるためです.そうしないと、ソースコードに書かれた中国語の出力が文字化けしてしまう可能性があります.
UTF-8コードがあなたのものではないことを明らかにしました.pyファイルはUTF-8でエンコードされ、テキストエディタが
UTF-8 without BOM
でエンコードされていることを確認する必要があります.抜粋:リンク