Pythonの基礎の基礎の基礎

#前書き

筆者は、Python初心者です。覚書程度に書いているので、ご了承ください。

間違いがあれば、コメント欄にてご指摘お願いします。

#自己紹介

Twitter [@konojunya](http://twitter.com/konojunya)

じゅんじゅんというニックネームで、関西を拠点に活動しているフロントエンドエンジニアです。

HAL大阪の新2回生です👍 (2016.4.24現在)

よくstart up系イベントに行くので、大阪らへんの方は会いましょう！

では、早速。

#初めてのPython

順番に進めていきます！

##環境

僕はMacなので、元からPythonは入っていましたが、インストールしなおしました。

Pythonには、2系。3系などありますが、僕は`v2.7.11`なので、2系の書き方になります。

少し3とは、違うようなので、記事のまま動かしたい場合は、Python 2.xをインストールしてください。

[Pythonインストール（Mac編）](http://qiita.com/ms-rock/items/6e4498a5963f3d9c4a67)

僕はこのhomebrewを使ったインストール方法でインストールしました。

[windows環境へのpythonインストール](http://qiita.com/maisuto/items/404e5803372a44419d60)

pythonの拡張子は、複数ありそれぞれ、意味がありますが今回は`.py`だけで学習を進めたいと思います。

なお、一番最初にutf-8で書くぜ！と宣言しているほうがいいので、

```index.py
# coding: UTF-8

#insert code...
```

Pythonはインストールすると、会話的に実行することも可能です。

コマンドラインで、`python`と打つと、そこに式などを書いてすぐに実行結果を試すことができます。

終えるときは`exit()`とすると、その状態から抜けることができます。

##変数

pythonでは、変数を作ることができます。

C言語やJavaのような、intとかstringとか、

javascriptやPHPのように、varも$も必要ありません。

```index.py
msg = "Hello World"
print msg # Hello World
```

このように変数を使うことができます。

`print`というのは、そのものをコンソール上に展開して表示してくれるものです。

ここで登場したのが、**代入演算子**です。

ここでは`=`が登場していますが、数学的なイコールではないことに注意してください。

プログラミングにおいて、`=`は、*「変数名と値を紐付ける、対応付ける」*というものです。

では、代入演算子はどのようなものがあるのでしょうか。

```index.py
a = b         # a に b を代入する
a += b        # a = a + b に同じ
a -= b        # a = a - b に同じ
a *= b        # a = a * b に同じ
a /= b        # a = a / b に同じ
a %= b        # a = a % b に同じ
a **= b       # a = a ** b に同じ
a //= b       # a = a // b に同じ
a &= b        # a = a & b に同じ
a |= b        # a = a | b に同じ
a ^= b        # a = a ^ b に同じ
a <<= b       # a = a << b に同じ
a >>= b       # a = a >> b に同じ
```

Pythonでは、単項演算子がありません。

なので、C言語やJavaの`i++`は`i+=1`に置き換えてください。

簡単な計算もしてみましょう。

```index.py
plus = 5 + 3
print plus # 8
```

このようなときに使う足し算や、引き算などの演算子を、**代数演算子**と言います。

代数演算子は以下のようなものがあります。

```index.py
+a            # 正数
-a            # 負数
a + b         # 加算
a - b         # 減算
a * b         # 乗算
a / b         # 除算
a % b         # a を b で割った余り
a ** b        # a の b 乗
a // b        # 切り捨て除算
```

その他に、**ビット演算子**などもあります。

```index.py
~a            # ビット反転
a & b         # AND:論理積(aもbも1のビットが1)
a | b         # OR:論理和(aまたはbが1のビットが1)
a ^ b         # XOR:排他的論理和(aまたはbが1のビットが1)
a << b        # b ビット左シフト
a >> b        # b ビット右シフト
```

などですね。

では、少数を交えた計算をしてみましょう

```index.py
plus = 5 + 3.0
print plus # 8.0
```

今回は同じ5+3なのに、答えが8.0です。

これは、3を3.0と表記することで、少数になるので、

答えもその少数に合わした形になります。

では、日本語をprintしてみましょう

```index.py
useless = u"無駄だ。"
print useless # 無駄だ。
```

日本語を扱うときの注意点で、日本語を扱うときは先頭に`u`をつけてください。

unicodeのuなんですが、これがないと後々、文字列の長さなどを上手く測れなくなってくるので、絶対につけるようにしてください。

##文字列

さて、もう既にわかる人にはわかりますが、文字列です。

`"ダブルクォーテーション"`か`'シングルクォーテーション'`で囲みます。

代入は上記の通りなんですが、エスケープについて覚えておきたいと思います。

```index.py
print "Hello\nworld"
```

このように、`\n`をつけると改行してくれます

```index.py
print """<html>
\t<body>
\t</body>
</html>"""
```

ダブルクォーテーション3つかシングルクォーテーション3つで囲って、改行しながら複数行の文字列を打つこともできます。
改行した個所に`\n`の改行文字があるものとして処理されます。

では、文字列に扱える便利なメソッドを見ていきます。

```index.py
s = "abcdefg"
print len(s) # 7
print s.find("c") # 2
```

このように、文字列には便利なものが複数あります。

`len()`は、その文字列の長さを返します。`find`はその文字が何番目にあるかを返すので、

０から始まり、2となります。

##文字列 <> 数値

文字列と数値を変えたい時が少々あったりします。

```index.py
s = "123"
print s # "123"
print int(s) # 123
```

数値にするなら`int`文字列にするなら`str`を使います。

##リスト

似たようなデータを一つの変数で管理するリストについて勉強しましょう

リストは、つまり配列です。

```index.py
colors = ["red","blue","green"]

print colors[0] # "red"
```

このように色を管理する`colors`というものを作りました。

中身を取り出すには`colors[x]`として、xには**添字**というものを入れてあげます。

配列の添字は１からではなく0からなので、`colors[0]`とすると、先頭の`"red"`を取得できます。

では、リストが扱える便利なメソッドを幾つか紹介したいと思います。

```index.py
colors = ["red","blue","green"]

colors.reverse() 
print colors # ["green","blue","red"]

colors.sort()
print colors # ["blue", "green", "red"]
```

このように、ソートや逆順などはメソッドを使って簡単にできました！

##タプル

タプルも配列ですが、リストとの大きな差は、**後から変更できない**という点です。

タプルは、定数の配列と思えばいいと思います。

定義の仕方ですが、

```index.py
tp = ("kono","junya")
```

のように、`()`で表現しますが、

（4/26追記）

本来タプルは、

```index.py
tp = "kono","junya"
```

とも、記述できます。

これは、`,`によって判別しているからです。

(end)

要素が１個のタプルは、優先演算の括弧と区別するために最後にカンマを指定します。

```index.py
tp1 = ("kono",)
```

タプルは後から変更できないので、読み込みが少し高速になっていたりします。

では、どうしてもリストに変えたい時や、一時的にリストに変えたい時はどうすればいいのでしょうか。

その場合は

```index.py
a = list(tp)
print a # ["kono","junya"]
```

`list`というもので囲めばいいです。では、あ〜〜やっぱりタプルっすわぁ〜〜となった時にどうするか。

```index.py
b = tuple(a)
print b # ("kono","junya")
```

リストにするなら`list`、タプルなら`tuple`ただそれだけ。

##辞書

先ほどのリストに似ていますが、リストの構成上、値を取り出しにくい点がありました。

そこで、先人たちは名前をつけるべく*辞書*というものを作ってくれました。

まぁ連想配列です。

```index.py
#sales = {key:value}
sales = {"junya":100,"kono":40}
```

このように定義します。

では、辞書で使える便利なメソッドについても勉強していきましょう。

```index.py
print sales.keys()     #['junya', 'kono']
print sales.values()   #[100, 40]
print sales.items()    #[('junya', 100), ('kono', 40)]
```

`.keys()`で、その辞書の全部のkeyを取得してくれます。

`.values()`で、全部の値を取得できます。

`.items()`で、その辞書自体を取得できます。

##繰り返し処理

何回も処理を繰り返すためのループ文について、見ていきましょう。

よく使うのはfor文だと思います。

配列の要素分だけループしてくれます。

こんな感じ。

```index.py
colors = ["red","blue","yellow"]

for color in colors:
  print color
```

colorには、colorsから順番に要素が代入されていきます。

では、100回ループするのを作りたい時は、100個の要素の配列を書かないといけないんでしょうか。。


いいえ。そんなことはありません。

`range`というものを使います。

これは、指定分の数字のリストを返してきてくれるものなんですが、いいように使ってやりましょう！

```index.py
for i in range(100):
  print i
```

これで、100ループ間違いなし！！！！

次に、辞書の中身をループさせたいと思います。

書き方はこんな感じ

```index.py
user = {"kono":100,"junya":40}

for key,value in user.iteritems():
  print key
for key in user.keys():
  print key
```

user.iteritemsでは、その辞書の中身がそれぞれkeyとvalueに入っています。

user.keys()を使うとkeyだけの取得もできます。

##条件分岐

条件分岐は、ある特定の時にはこちらの処理など、分岐を与えるものです。

```index.py
score = 60

if score < 40:
  print "OUT!"
elif score < 65:
  print "SOSO..."
else:
  print "Good!"
```

このように書けます。

他にも、条件を幾つか組み合わせたい時があると思います。

そんな時は

```index.py
if score > 10 and score < 20:
  print "oh..."
```

のように、`and`で組み合わせることができます。

C言語やJavaの演算子が `&& => and`,`|| => or`,`! => not`

になると思ってください。

なお、pythonでは、

```index.py
if 10 < score < 20:
  print "oh..."
```

のように、書くこともできます！

また真偽のみならば、

```index.py
score = 50

print "Good!" if score >= 60 else "NG!"
```

このように一行でスッキリ書くこともできます。

##関数

では、処理をひとまとめにしておける関数について、勉強していきたいと思います。

関数の定義は

```index.py
def hello():
  print "Hello"

hello() # Hello
```

`def`というキーワードを使って、関数を定義することが可能です。

では、引数についても見ていきましょう

```index.py
def hello(name):
  print "hello %s"%name

hello("junya") #hello junya
```

%sなど見かけないものが出てきましたが、STRINGのsで、

%nameで指定したnameを%sに代入してくれます。

返り値についても見ていきましょう

```index.py
def hello(name):
  return "Hello %s"%name

print hello("junya") #Hello junya
```

簡単ですね。

関数の最後に`map`について勉強したいと思います。

mapとは、リストにその関数を当て込んでいくもので、

```index.py
def double(x):
  return x * x

print map(double,[2,5,8]) # [4, 25, 64]
```

このように便利に使えます。

この関数の部分ですが、この程度ならわざわざdoubleを作るのもめんどくさいので、

mapの中に書き込みたいと思います。

```index.py
print map(lambda x:x*x,[2,5,8])
```

`lambda`というキーワードを使い、xという名前をつけて、`x*x`をリストに当てていきます。

では、最後にクラスについて見ていきたいと思います。

##クラス

クラス自体の説明としては、よく設計図などと言われたりします。

そのクラスを自作する時なんですが、

```index.py
class User(object):
  def __init__(self,name):
    self.name = name
  def hello(self):
    print "hello %s"%self.name
```

ざっと書きました。

Userというclassを作り、括弧の中に親クラス(スーパークラス)を指定します。この例ではobjectクラスを親にしています。

コンストラクタは`__init__`という名前でメソッドを作ればできます。

引数に自分自身を表す`self`を入れて、`self.name = name`のように初期化します。

helloというメソッドも作ったので、見ていきましょう。

インスタンスする時は

```index.py
bob = User("bob")
print bob.name    #bob
bob.hello()       #hello bob
```

**newなどはつけないことに注意してください！**

あとはそのままですね。

#あとがき

今回はPythonの基礎の基礎の基礎を抑えてみました。

[PHPの基礎の基礎の基礎](http://qiita.com/konojunya/items/492e8114e6bd55344731#%E3%81%82%E3%81%A8%E3%81%8C%E3%81%8D)も書いているので、良ければ見てちょ！

間違いなどのご指摘は、コメント欄でお願いします。

また、急な変更をしないといけない場合は、[@konojunya](http://twitter.com/konojunya)へよろしくお願いします！

次回はたぶんpythonを使ったTwitterAPIとかしてると思いますので、また見てください！

See you!