Skip to content

Instantly share code, notes, and snippets.

@Rokt33r
Last active August 29, 2015 14:02
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Rokt33r/6712d15b85b7ce34eebd to your computer and use it in GitHub Desktop.
Save Rokt33r/6712d15b85b7ce34eebd to your computer and use it in GitHub Desktop.
Python 2nd week

Control statement(制御文)

制御とは?

今回は実際にPythonを制御する制御門を学んでみる。

Conditional(条件文 : if)

PythonはCとは違って括弧で囲まずに、インデント(タブ)を入れて、statementの範囲を表す。

つまり、書き方において強制的にタブをしっかり入れなきゃならないようになっている。

少しの文法的な差はあるが、概念はすぐ理解できると思う。

>>> X = -30
>>> if X > 0 :
...     print('positive num')
... elif X < 0 :
...     print('negative num')
... else :
...     print('I don\'tknow what to do')
...
negative num

条件分と命令の分けは:インデントで分けるようになっている。 そして、elいf

インデントに気をつけること!そして、CLIでタブを入れることができない場合はspaceを入れればいい。

そして、Pythonではswitch文がない。

Logical Operators(論理演算子)

複数の条件を比較する時使う。

Operator 説明
and AND Operator
or OR Operator
not NOT Operator

C言語で使ってた&|などはBit演算子として使われるので注意!!

Iteration(繰り返し文 : for, while)

while文

whileif文のような書き方になっている。
それ以外の特徴はない。

>>> count = 0
>>> while count < 10 :
...     count = count + 1
...     print(str(count) + '番目です。')
...
1番目です2番目です3番目です4番目です5番目です6番目です7番目です8番目です9番目です10番目です

for文

for文の場合少し書き方が独特である。 主に、ListTupleあるいは文字列に入っているデータ(文字)を一つずつ出す時使う。

>>> students = ['Fujii', 'Watanabe', 'Tomo']
>>> for student in students :
...     print('今、'+ student + 'は学校にいます')
...
Fujiiは学校にいます
Watanabeは学校にいます
Tomoは学校にいます

もちろん、単純なIteratorをおいて繰り返すこともできる。

>>> for i in range(1,11) :
...     print(str(i) + '番目です。')
...
1番目です2番目です3番目です4番目です5番目です6番目です7番目です8番目です9番目です10番目です

rangeが11までになっていることに注意!!

無限ループの処理

while文を使う時、条件が相変わらずTrueであれば、無限に繰り返すようになる。

実際にパソコンには大きい負担がないので、やってみようww

>>> count = 0
>>> while count < 10 :
... 	print('これは終わる気がしない...')
これは終わる気がしない...
これは終わる気がしない...
これは終わる気がしない...
これは終わる気がしない...
これは終わる気がしない...
これは終わる気がしない...
これは終わる気がしない...
これは終わる気がしない...
これは終わる気がしない...
これは終わる気がしない...
これは終わる気がしない...
これは終わる気がしない...
これは終わる気がしない...
これは終わる気がしない...
これは終わる気がしない...
これは終わる気がしない...
......

出る方法は二つがある

  • Pythonを終了する。ctrl+d
  • Exception(エラー)を出して止める。ctrl+c

Pythonを終了したくない場合にはctrl+cを使えばいい。

Exceptionとは、

辞書的な意味は例外である。 つまり、Pythonから見て正常じゃない時のことである。 今回使ったctrl+cKeyboardInterrupt Exceptionという例外を作ってくれる。 それで、この例外を読み取ったPythonはこのループに何か問題があると思って今やっていることを止めてくれる。

これは終わる^CTraceback (most recent call last):
  File "<stdin>", line 2, in <module>
KeyboardInterrupt

つまり、今回は意図してエラーを作ったのだ。 だから、間違った命令によりプログラムが暴れないようにするため、エラーは必修不可欠な要素である。

Exception = guard rail
問題が発生したが、まだ落ちてはいない...

Input/Output (IO : 入出力)

IO処理からはCLIだけでは制限があるので、実際にプログラムを書いてみる。

Editor

これから実際にコードをFileとして書く。一応、書くときは別にメモ帳などで書いても構わない。 けど、メモ帳だけで作業するのはかなり生産性がおちる。

それで、だいたいのプログラマはコーディング専用のeditorやIDE(統合開発環境)を使ってプログラミングをする。

ここでは、Sublime textやAtomなどの軽いEditorをお勧めする。

Input / Output

出力は今までずっと使っているprint()でいいとおもう。 入力はinput()という関数を使ったら、プログラムを使っているユーザから入力をしてもらうことができる。

input.py

x = input('value x : ')
y = input('value y : ')

print(int(x) + int(y))

inputで入力してもらうと値が文字列になるので、IntとしてCastingした。

とりあえず、実行は次のようにする

$ python3 input.py
value x : 3
value y : 5

File I/O

今回は外部のFileの入力/出力をやってみる。 ###基本的にFileは3のモードの一つで呼ぶようになっている

mode 説明
r read mode : Fileを呼んでくれる。
r+ reading/writing mode : Fileを呼んでくれて、編集もできる。
w write mode : Fileを書いてくれる。(同じ名前の既存のFileはなくなる)
a Append mode : Fileに内容を追加する。

Fileを読む

readme.md

#Fly-by-wire

Fly-by-wire (FBW) is a system that replaces the conventional manual flight controls of an aircraft with an electronic interface.
The movements of flight controls are converted to electronic signals transmitted by wires (hence the fly-by-wire term), and flight control computers determine how to move the actuators at each control surface to provide the ordered response.
The fly-by-wire system also allows automatic signals sent by the aircraft's computers to perform functions without the pilot's input, as in systems that automatically help stabilize the aircraft.

fileInput.py

f = open("readme.md", "r")

while 1 :
    line = f.readline()
    if not line : break
    print(line)

f.close()

これ以外のやり方もある。(全部有用なので、紹介しておく)

f = open("readme.md", "r")
lines = f.readlines()

for line in lines:
    print(line)

f.close()

readlines()はFileの一行ずつListに入れてくれる関数である。後ろにsが着いていることに注意!!

f = open("readme.md", "r")
data = f.read()

print(data)

f.close()

Fileに書き込む

Fileにでーたを書くためにはwrite()を使う。

f = open("readme.md", "r+")

while 1 :
    line = f.readline()
    if not line : break
    print(line)

f.write('Dick Choiさんが読みました')

f.close()

r+で呼んでいることに注意!

これで、入れた文字列はFileの最後に書かれるようになる。

readme.md(結果物)

#Fly-by-wire

Fly-by-wire (FBW) is a system that replaces the conventional manual flight controls of an aircraft with an electronic interface.
The movements of flight controls are converted to electronic signals transmitted by wires (hence the fly-by-wire term), and flight control computers determine how to move the actuators at each control surface to provide the ordered response.
The fly-by-wire system also allows automatic signals sent by the aircraft's computers to perform functions without the pilot's input, as in systems that automatically help stabilize the aircraft.
Dick Choiさんが読みました

####Encoding problem Fileに日本語を書いたときにうまく呼んでくれない場合がある。これは、文字列を読む方法(Encoding)をPythonの基本的なopen()関数が対応しないだけであって、 codecsというModuleを使えばいい。

import codecs
f = codecs.open("readme.md", "r", "utf-8")

既存のopen()関数の代わりにcodecs.open()を使えばいい。

System Parameterを使った入力

プログラムを実行する時からまっすぐ入力をすることもできる。

$ python3 fileInput.py {{読むFileの名前}}

これを利用して、先作ったプログラムが他のfileも読めるようにしてみよう。

import sys

fileName = sys.argv[1]

f = open(fileName, "r+")

f.write('Dick Choiさんが読みました')
while 1 :
    line = f.readline()
    if not line : break
    print(line)

f.close()

importModuleを呼ぶ命令で、今回はParameterを呼ぶため、sysというModuleが必要である。

そして、Parameterは複数である場合も考えてList型になっているので、読むFileの名前はindex 1で呼んだらいい。

sys.argv[0]はPythonがもらう一番目のParameterであるので、実行したFileの名前である。

数値演算

今までやってきたことで、Pythonのだいたいの基本的な機能が使えるようになった。

もちろん、私たちは情報学科ではないので、省略された部分もある。 でも、それは必要である時から勉強してもいいと思うので、難しく考えないようにしよう。

では、今回はプログラムでも課題ができるように基本的な数値解析をする方法を学んでみる。

IMPORT MATH!!!

まず、データ型を説明するとき言った基本的な演算子をまた見よう。

Operator 説明
+ 足し算
- 減り算
* 掛け算
/ 割り算
% 剰余
** べき乗
// 割り算(小数点数以下は全部捨てる)

一応、これらを使って頑張ったら何でもできる。 だが、実際にSin関数log関数などを自分で作ろうとしたすごく大変だろう。

それで、だいたいのプログラミング言語のようにPythonも基本的な難しい算術演算をしてくれる。 使い方はすごく簡単である。

import math

val1 = math.pi
val2 = math.sin(math.pi/3)
print("π : "+str(val1))
print("sin(π/3) : " + str(val2))

結果

π : 3.141592653589793
sin(π/3) : 0.8660254037844386

Mathが持っている機能

では、Mathでどういうことができるのかを軽く確認しよう。

まず、よく使われる定数であるπeが簡単に呼べるようになる。

定数名
pi 3.141592653589793
e 2.718281828459045

そして、次のような関数も提供している。

Method 説明
ceil(x) 小数点数以下を切り上げする
floor(x) 小数点数以下を切り捨てする
log(x[, base]) log xを求めてくれる。(baseはlogの底であって、基本値はeである)
exp(x) eのx乗
sin(x) sin関数
cos(x) cos関数
tan(x) tan関数
asin(x) arcsin関数
acos(x) arccos関数
atan(x) arctan関数
sinh(x) hyperbolic sin関数
... Hyperbolic関数も普通の三角関数のように揃えられている。

これ以外も、もっと詳しい計算をするためいろんな関数を提供している。

前、花田先生が言ったatan2(x,y)も提供されている。 元のtanの値であるy/xでは符号が打ち消される場合があるので、正確な角度が求められない。
だが、atan2(x,y)yxを別々としてもらって、正しい角度が求められる。

from math import *

だが、いつもmath.cos(x)のようにmath.を付けるのはかなり大変だと思う。
これはPythonの哲学と会わない。なので、関数自体をまっすぐ呼ぶ方法がある。

from math import *

これはmathというModuleからすべてを持ってくるという意味である。

もちろん、*の代わりに関数名を入れたらその関数だけ呼ぶこともできる。

複素数はどうする?!

知っているようにPythonでは複素数まで使えるようになっている。

>>> sin(1+2j)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can't convert complex to float

はああ?!

実は、Pythonでは完全に使い分けをしていて、複素数演算のときはcmathを使う。

つまり、複素数演算が必要であるときはcmathを呼べばいい。

from cmath import *

cmathmathが提供しているだいたいの演算を複素数で処理してくれる。

つまり、asin(3)のように実数では表現できない値もcmathasin()は求めてくれる。

>>> from cmath import *
>>> asin(3)
(1.5707963267948966+1.762747174039086j)

そして、複素数演算のための関数も提供している。

Method 説明
polar(x) 複素数を極座標で変えてtuple型で返してくれる。ex : (絶対値, 位相)
phase(x) 極座標に変えたときの位相を返してくれる。

絶対値は基本的に提供してくれる関数abs(x)を使えばいい。

これでほとんどの演算がPythonでできるようになった。

Almighty!!

このように必要な機能があったら、その機能を提供するModuleがあれば、何でもできる。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment