C言語ならよく分かるが、Python Version 3 をはじめて勉強するひとのために、まとめておく。
自分はまさにそのひとりだからだ。
<演算子>
余り切り捨て除算: //
C言語でいう整数同士の除算「/」。
実数同士の除算にも使える。 3.5//2.1 → 1.0 -3.5//2.1 → -2.0
しかし、負数の除算ではC言語と違う計算結果によるので、要注意!!! 以下は一例。
(Python3) -5//2 → -3
(C言語) -5/2 → -2
べき乗: **
C言語ではサポートされず。
多倍長整数はPython 3ではサポートされているので、3**1000 とか平気で書ける。
平方根なら 2**0.5。C言語のpow()関数は基本的に不要。
インクリメント演算子、デクリメント演算子はない:
C言語の ++, -- 演算子はPythonにない。i+=1, i-=1 で代用。
<データ型>
文字列 (str): a, b, c = '', "", str()
リスト (list): a, b = [], list()
タプル (tuple): a, b = (), tuple()
辞書 (dict): a, b = {}, dict()
複素数(complex): a, b = 2+1j, complex(2,1)
上の5例では、変数 a, b, c はどちらも同じデータ型になる。
文字列はシングルクォーテーション「'」で囲んでも、ダブルクォーテーション「"」で囲んでも全く同じ。
C言語でいう2次元配列のようなもの:
arr = [[0 for c in range(200)] for r in range(100)]
arr[99][199] = 1
Python 3 では以上のようにリストのリストで代用する。
グラフの連結関係を表現するのに必要な空の2次元配列は to = [[] for i in range(MAX)] で宣言する。
リストに対するソート:
競プロではユニークな解答出力を得るために、ソート操作が欠かせない。Python3では、以下のようなコートが使える。ただし、相手が数値か文字列かによって、ソート結果が変わるので、データ型に気をつけること。たとえば、文字列"9"と"10"では、昇順が"10", "9"になるが、数値9と10では、昇順が当然9,10になる。
|
tbl = [[Japan,0,5],[Egypt,1,3],[Canada,2,1],[Spain,3,7]] for i in sorted(tbl, key=lambda x:(-x[2],x[1])): print(i[0], ',', i[2], sep='') |
表示結果:
|
Spain,7 Japan,5 Egypt,3 Canada,1 |
ソートの基準:チーム名と成績を入力し、成績の良い順(勝ち点の多い順)に並べ替える。勝ち点が同点の場合は入力順に出力すること。
<リストの内包表現>
リストを簡潔に、しかも高速に生成する手法のひとつに、内包表現を利用するというものがある。Pythonに慣れないひとにはわかりにくいが。
1. for 文による内包
|
a = [i for i in range(1,10)] |
1から9までの連続した数値のリストが生成される。
2. for と if との組み合わせによる内包
for 繰り返しのなか、特定の要素をピックアップする。
|
a = [i for i in range(10) if i & 1] |
0から9までの連続した数値のうち、奇数だけを抽出してリストをつくる。
3. for と if-else との組み合わせ
|
a = [i**2 if i & 1 else i**3 for i in range(10)] |
0から9までの連続した数値のうち、奇数は自乗、偶数は3乗のリストをつくる(つまり、[0, 1, 8, 9, 64, 25, 216, 49, 512, 81] がつくられる)。
☆ if-else は for のまえに書かないといけないことに留意
4. 上記の if-else と for との間にネスト的に if-else を入れることができる。自己誇示、自己満足に使えそう!
|
print(*["fizzbuzz" if i%15==0 else "fizz" if i%3==0 else "buzz" \ if i%5==0 else i for i in range(1,2**100)], sep='\n') |
C/C++プログラマは驚くしかない。
<その他>
複数変数の同時代入(初期化): a,b,c,d = 1,2,3,4
行数節約のために、変数の初期化は上記の形で書ける。
変数同士のswap操作: a,b = b,a
わかりやすくて便利。
<小数点の四捨五入>
以下の例は、実数 ans を小数点2桁に正確に四捨五入する。
|
from decimal import Decimal, ROUND_HALF_UP ans = 9876543210.123456 print(Decimal(str(ans).quantize(Decimal('0.01'), rounding=ROUND_HALF_UP)) |