1. lethe2211

    Posted

    lethe2211
Changes in title
+Pythonで競技プログラミングする時に知っておきたいtips(制御構造編)
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,145 @@
+
+[Pythonで競技プログラミングする時に知っておきたいtips](http://qiita.com/lethe2211/items/b91cc9e2b355ad32f1e6)の,制御構造についての部分を分割しました.
+
+## 条件分岐
+
+### 条件式に変数を渡す
+
+個人的にはあまり好きではないが,コード量削減のために,
+
+```python
+while 1:
+ a = input()
+ if not a:
+ break
+ # ...
+```
+
+みたいに,if文,while文などの条件に変数を渡すことが多い気がする.
+
+[PythonでIf文に変数を入れたときの結果 - LIFE WITH PYTHON](http://www.lifewithpython.com/2013/02/python-if-statement-data-type.html)
+
+| 型 | 結果 |
+|:---------:|------------|
+| int | 0ならFalse,それ以外ならTrue |
+| float | 0.0ならFalse,それ以外ならTrue |
+| str | ''(空文字)ならFalse,それ以外ならTrue |
+| list | []ならFalse,それ以外ならTrue |
+| tuple | ()ならFalse,それ以外ならTrue |
+| dict | {}ならFalse,それ以外ならTrue |
+| set | set()ならFalse,それ以外ならTrue |
+| None | False |
+
+### 処理を途中で終了したい
+
+入力の終わりを表す記号や,コーナーケースが入力された場合など,途中でスクリプトの実行を終了してしまった方が楽な場合がある.
+このような場合は,`quit()`または`sys.exit()`を使うとよい.
+
+```python
+a = input()
+if a == 0:
+ quit()
+# ...
+```
+
+```python
+import sys
+
+a = input()
+if a == 0:
+ sys.exit()
+# ...
+```
+
+## 繰り返し
+
+### for文での変数の展開
+
+for文で,
+
+```python
+l = [1, 2, 3, 4, 5]
+for e in l:
+ print e
+```
+
+```:output
+1
+2
+3
+4
+5
+```
+
+のように,リストの各要素を展開できるが,これは,
+
+```python
+l = [(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd')]
+for i, e in l:
+ print '#{0}: #{1}'.format(i, e)
+```
+
+```:output
+0: a
+1: b
+2: c
+3: d
+```
+
+のようにもできる.
+
+### enumerate
+
+forループを回す際,リストのインデックスと値が同時に取得できるといい場合がある.
+
+`enumerate()`は,引数のリストに対して,インデックスとその値を持つイテレータを返す.
+
+```python
+l = ['a', 'b', 'c', 'd']
+for elem in enumerate(l):
+ print elem
+# (0, 'a')
+# (1, 'b')
+# (2, 'c')
+# (3, 'd')
+
+# 上のコードは下記のコードと等価
+for i in range(len(l)):
+ print (i, l[i])
+```
+
+### for-else,while-else文
+
+Pythonでは,for文,while文にelse節を加えることができる.
+この際,else節は,ループ終了までに一度も内部でbreakされなかった場合のみ呼び出される.
+
+```python
+a = [1, 2, 3, 4, 5]
+b = [1, 2, 4, 5]
+x = 3
+
+def find_val(l, x):
+ for i in range(len(l)):
+ if l[i] == x:
+ print i
+ break
+ else:
+ print 'Not found...'
+
+# 上のfind_val()と等価なコード
+def find_val2(l, x):
+ flag = False
+ for i in range(len(l)):
+ if l[i] == x:
+ print i
+ flag = True
+ break
+ if not flag:
+ print 'Not found...'
+
+find_val(a, x) # 2
+find_val(b, x) # Not found...
+```
+
+「xを探せ.見つからなかった時は'hoge'を出力しろ」みたいな設問の際,フラグを持つ必要が無いため,非常に書きやすくて便利.
+ただし,ループが多重になる場合はかえって見通しが悪くなるため,使わない方がよい.