読者です 読者をやめる 読者になる 読者になる

【Pythonチュートリアル】Pythonの気楽な入門編

はじめに

Pythonチュートリアル第3版を読み進めて、勉強した内容をメモしていこうという試みです

Pythonチュートリアル 第3版

Pythonチュートリアル 第3版


そして読み終えた暁にはこの試験を受けたいと思います

www.pythonic-exam.com


続くといいな、続けばいいな


目次


Pythonを電卓として使う

数値

数値の型

  • 整数はint型を持つ
  • 小数を伴う数はfloat浮動小数点)型を持つ
  • 除算は常にfloat型を返す
>>> 2 + 2
4
>>> 50 - 5 * 6
20
>>> (50 - 5 * 6) / 4
5.0
>>> 8 / 5
1.6
>>> 17 / 3
5.66666666666667


四則演算

  • 切り下げ除算をおこなって整数解を得たい場合は(剰余を捨てたい場合は)//演算子を使う
  • 剰余のみを得たい場合は%演算子を使う
>>> 17 // 3
5
>>> 17 % 5
2
>>> 5 * 3 + 2
17


  • **演算子を使うことで累乗を求めることができる
>>> 5 ** 2
25
>>> 2 ** 7
128


  • 演算対象の型が混合していた場合、整数は浮動小数点数に変換される
>>> 3 * 3.75 / 1.5
7.5
>>> 7.0 / 2
3.5


変数

  • 統合(=)は変数に値を代入するのに使う
>>> width = 20
>>> height = 5 * 9
>>> width * height
900


  • 変数は「定義」(値を代入)しないで使おうとするとエラーが出る
# 未定義の変数にアクセスを試みると変数定義されていないためNameErrorが出る
>>> n
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'n' is not defined


  • 対話モードでは、最後に表示した式を変数「_」(アンダースコア)に代入してある
>>> tax = 12.5 / 100
>>> price = 100.50
>>> price * tax
12.5625
>>> price + _
113.0625
>>> round(_, 2)
113.06


その他の数値型

  • 十進数(Decimal)や有理数(Fraction)など、さまざまな数値型がサポートされている
  • 複素数もサポートされており、その虚部を示すのに接尾辞「j」または「J」を使う(3+5jなどとする)


文字列

引用符

  • 引用符にはシングルクォート('…‘)もダブルクォート("…“)も使えてどちらも同じ結果になる
    • シングルクォートの中ではダブルクォートをエスケープする必要がない
      (シングルクォートは\'のようにエスケープする必要がある)
    • ダブルクォートの中ではシングルクォートをエスケープする必要がない
  • バックスラッシュ(/)でクォート文字のエスケープができる
>>> 'spam eggs' # シングルクォート
'spam eggs'
>>> 'doesn\'t' # シングルクォートは\ でエスケープするか...
"doesn't"
>>> "doesn't" # ... ダブルクォートを使う
"doesn't"
>>> '"Yes," he said.'
'"Yes," he said.'
>>> "\"Yes,\" he said."
'"Yes," he said.'
>>> '"Isn\'t," she said.'
'"Isn\'t," she said.'


  • インタープリタでは、文字列は引用符に囲まれ、特殊文字\エスケープされた状態で出力される
  • 表示の引用符がダブルクォートとなるのは、文字列自体がシングルクォートを含みダブルクォートを含まない場合のみで、それ以外はシングルクォートとなる
>>> '"Isn\'t," she said.'
'"Isn\'t," she said.'
>>> print('"Isn\'t," she said.')
"Isn't," she said.
>>> s = 'First line.\nSecond line.'
>>> s # print() しないで表示すると\n が出力に含まれる
'First line.\nSecond line.'
>>> print(s) # print() を使うと\n で改行が生じる
First line.
Second line.


row文字

  • 「\」を前置した文字が特殊文字に解釈されるのを防ぐにはrow文字列を使う
>>> print('C:\some\name') # \n は改行なので
C:\some
ame
>>> print(r'C:\some\name') # 引用符の前のr に注目
C:\some\name


トリプルクォート

  • 文字列リテラルを複数行にわたり書くこともできる
    • トリプルクォート("“”…“”“または'‘’…‘’‘)を使う
    • 行末文字が自動的に文字列に含有されるのを避けるには行末に\を置く
# 以下のようにすると
print("""\
Usage: thingy [OPTIONS]
-h Display this usage message
-H hostname Hostname to connect to
""")

# 以下のような出力が得られる(最初の改行が含まれていないことに注目)
Usage: thingy [OPTIONS]
-h Display this usage message
-H hostname Hostname to connect to


文字列の連結

# un を3 回繰り返して最後にium を付ける
>>> 3 * 'un' + 'ium'
'unununium'


  • 列挙された文字列リテラル(引用符で囲まれたものたち)は自動的に連結される
  • 長い文字列を分割したい時に便利
    • リテラル同士でのみ有効で、変数や式では無効
>>> 'Py' 'thon'
Python
>>> text = (' カッコの中にながいながいながい文字列を'
' 入れておいて繋げてやろう。')
>>> text
' カッコの中にながいながいながい文字列を入れておいて繋げてやろう。'


  • 変数とリテラルの連結、そして変数同士の連結には+を使う
>>> prefix = 'Py'
>>> prefix + 'thon'
'Python'


インデックス

  • 文字列はインデックス指定(連番による指定)ができる
    • 最初のキャラクタは0
    • ここでいうキャラクタは長さが1の文字列のこと
>>> word = 'Python'
>>> word[0] # 位置0 のキャラクタ
'P'
>>> word[5] # 位置5 のキャラクタ
'n'


  • インデックスには負の数も使え、右から数えることを示す
  • -0は0と同じなので負のインデックスは-1から始まる
>>> word = 'Python'
>>> word[-1] # 最後のキャラクタ
'n'
>>> word[-2] # 最後から2 番目のキャラクタ
'o'
>>> word[-6]
'P'


  • 大きすぎるインデックスを指定するとエラーになる
>>> word[42] # word は6 文字
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: string index out of range


スライシング

  • インデックスを使うと個々の文字が取得できるのに対し、スライシングでは部分文字列が取得できる
>>> word = 'Python'
>>> word[0:2] # 位置0 から(0 を含み)2 まで(2 を含まない)の文字
'Py'
>>> word[2:5] # 位置2 から(2 を含み)5 まで(5 を含まない)の文字
'tho'


  • 始点は常に含まれ、終点は常に除外されることに注目
  • これによりs[:i] + s[i:]は常にsと等価となる
>>> word = 'Python'
>>> word[:2] + word[2:]
'Python'
>>> word[:4] + word[4:]
'Python'


  • 第一文字の省略時デフォルト値が0
  • 第二文字の省略時デフォルト値が文字列のサイズ
>>> word = 'Python'
>>> word[:2] # 最初の文字から位置2(2 を含まない)までの文字
'Py'
>>> word[4:] # 位置4(4 を含む)から最後までの文字
'on'
>>> word[-2:] # 位置-2(含む)から最後までの文字
'on'


  • スライシングの覚え方
    • インデックスとは文字と文字の「間」を指す数字
    • 最初の文字の左端が0になっている
    • n文字からなる文字列の最後の文字の右がインデックスnとなる
    • インデックスiからjまでのスライシング[i:j]は境界iと境界jに挟まれた文字すべてからなる
    • 非負のインデックスにおいて、スライシングの長さは2つのインデックスの差となる(word[1:3]の長さは2)
 +---+---+---+---+---+---+
 | P | y | t | h | o | n |
 +---+---+---+---+---+---+
 0   1   2   3   4   5   6
-6  -5  -4  -3  -2  -1


  • スライシングでは範囲外のインデックスを指定しても、いい具合に処理してくれる
>>> word = 'Python'
>>> word[4:42]
'on'
>>> word[42:]
''


変更不能体(immutable)

  • Pythonの文字列は改変できないため、文字列のインデックス位置に代入を行うとエラーが出る
>>> word = 'Python'
>>> word[0] = 'J'
...
TypeError: 'str' object does not support item assignment
>>> word[2:] = 'py'
...
TypeError: 'str' object does not support item assignment


  • 異なる文字列が必要なときは新しい文字列を生成する必要がある
>>> word = 'Python'
>>> 'J' + word[1:]
'Jython'
>>> word[:2] + 'py'
'Pypy'


リスト

概要

  • Pythonには複合したデータのための型がいくつかあり、他の種類の値をまとめるのに使える
  • もっとも万能なのがリストで、角括弧の中居にカンマ区切りの値(アイテム)を入れる
  • リストには異なる型のアイテムを入れられるが、通常はすべて同じ型を入れる
>>> squares = [1, 4, 9, 16, 25]
>>> squares
[1, 4, 9, 16, 25]


インデックスとスライシング

  • 文字列同様(他のすべてのシーケンス型同様)、リストにはインデックスとスライシングが使える
>>> squares = [1, 4, 9, 16, 25]
>>> squares[0] # インデクシングはアイテムを返す
1
>>> squares[-1]
25
>>> squares[-3:] # スライシングは新たなリストを作って返す
[9, 16, 25]


  • スライシングへの代入も可能
  • リストの長さを変えたり、リストの内容をすべてクリアすることができる
>>> letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
>>> letters
['a', 'b', 'c', 'd', 'e', 'f', 'g']
>>> # いくつかの値を置換
>>> letters[2:5] = ['C', 'D', 'E']
>>> letters
['a', 'b', 'C', 'D', 'E', 'f', 'g']
>>> # これらを削除
>>> letters[2:5] = []
>>> letters
['a', 'b', 'f', 'g']
>>> # リストをクリア。空リストで全部の要素を置換する
>>> letters[:] = []
>>> letters
[]


  • スライシング操作は常に、要求された要素を含んだ新たなリストを返す
  • 以下のスライシングはシャローコピーを新しく作って返す動きとなる
>>> squares = [1, 4, 9, 16, 25]
>>> squares[:]
[1, 4, 9, 16, 25]


リストの連結

  • リストは連結などの操作もサポートしている
>>> squares = [1, 4, 9, 16, 25]
>>> squares + [36, 49, 64, 81, 100]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]


変更可能体(mutable)

  • 文字列は変更不能体(immutable)だったが、リストは変更可能体(mutable)、すなわち内容を入替えることができる
>>> cubes = [1, 8, 27, 65, 125] # どこかおかしい
>>> 4 ** 3 # 4 の3 乗は64 だ。65 じゃない!
64
>>> cubes[3] = 64 # まちがった値を入れかえる
>>> cubes
[1, 8, 27, 64, 125]

アイテムの追加

  • append()メソッドを使うことでリストの末尾にアイテムを追加できる
>>> cubes = [1, 8, 27, 64, 125]
>>> cubes.append(216) # 6 の3 乗を追加
>>> cubes.append(7 ** 3) # 7 の3 乗を追加
>>> cubes
[1, 8, 27, 64, 125, 216, 343]


リストの入れ子

  • リストは入れ子にすることができる
>>> a = ['a', 'b', 'c']
>>> n = [1, 2, 3]
>>> x = [a, n]
>>> x
[['a', 'b', 'c'], [1, 2, 3]]
>>> x[0]
['a', 'b', 'c']
>>> x[0][1]
'b'


用語

リテラル

  • 定数などのように数値や文字列の実際の値が単に記述されているもののこと

シーケンス型

  • 複数の要素から構成されるもので、要素が順番に並んでいるもの(リスト等)

シャローコピー

  • オブジェクトの複製を伴わないポインタのコピーのこと

【仮想通貨】いまRipple(リップル)投資がアツイ!!

リップルがあつい

リップルとはなんぞや?という方もとりあえずCoincheckで登録して色々みてみるとよいですよ


いまはいろいろと情報が手に入りやすいのでいろいろ調べてみてください


まぁ、とにかく現在はひとことでいえばバブル状態なわけですよ

こちら御覧ください

f:id:tocguitar1:20170517122123p:plain

みてのとおり5月にはいってからリップルの価格が高騰しまくっております!!


本日はすでに50円という領域へ足を突っ込んでおります

3ヶ月ぐらいまえに100万円分購入してる人は1億円とかですからね

まじハンパない


投資する場合はよく考えてくださいね

あたりまえですが大損する可能性も全然あるのでリップル及び仮想通貨というものをよく勉強してから始めていただくことをオススメいたします


さまざまな情報が錯綜しており、どうすればよいかわかりにくいのですがその中で自分で判断をしないといけないわけなので


こういった情報もあれば


こういった情報もあります

gtgox.com


リップルのCEOは1XRPを800円にしたいとか言っているそうです


直近のリップル材料

三菱東京UFJリップル使うようですね

www.nikkei.com


そして、本日ロックアップが発表されましたね


そして5/22~24でNYで開催されるブロックチェーン関連の世界最大のカンファレンスが開かれるようです

Consensus 2017 - CoinDesk


さらに6~7月にSBIが仮想通貨取引所に参入予定


さらにさらに7~8月にはSBIでリップルの取引きが開始されるようです


さらにさらにさらに8月に各国でリップルを使った国際送金開始の予定


そんなこんなでしばらくはリップル祭りが終わる気配はありませんが、まだ祭りに参加できていない方は是非参加してみてください^^


祭りへの参加はこちらから

日本で一番簡単にビットコインが買える取引所 coincheck bitcoin

【言語処理100本ノック】05. n-gram

はじめに

最近Pythonを使い始めたので、勉強がてらこいつをやってみようとおもいまっす

www.cl.ecei.tohoku.ac.jp


どこまで続くかわからないですが、がんばりますよ~!


05. n-gram

要件

与えられたシーケンス(文字列やリストなど)からn-gramを作る関数を作成せよ.この関数を用い,"I am an NLPer"という文から単語bi-gram,文字bi-gramを得よ

できたコード

解説

n-gramってなに?って感じだったのでn-gramについて調べました

任意の文字列や文書を連続したn個の文字で分割するテキスト分割方法.特に,nが1の場合をユニグラム(uni-gram),2の場合をバイグラム(bi-gram),3の場合をトライグラム(tri-gram)と呼ぶ

kotobank.jp

となんだかよくわかりませんが、ようするにこういうことらしい

例えば,「図書館情報学」をバイグラムで分割すると,「図書」「書館」「館情」「情報」「報学」となる.

なので今回の場合は以下のような結果になれば良いということですね

# 単語bi-gram
[['I', 'am'], ['am', 'an'], ['an', 'NLPer']]

# 文字bi-gram
['I ', ' a', 'am', 'm ', ' a', 'an', 'n ', ' N', 'NL', 'LP', 'Pe', 'er']


おわりに

一応、Githubにもリポジトリ作ったのでここにあげていくスタイルで!

github.com


その他のノックについてはこちら!

tocyuki.hatenablog.com

【言語処理100本ノック】04. 元素記号

はじめに

最近Pythonを使い始めたので、勉強がてらこいつをやってみようとおもいまっす

www.cl.ecei.tohoku.ac.jp


どこまで続くかわからないですが、がんばりますよ~!


04. 元素記号

要件

“Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can."という文を単語に分解し,1, 5, 6, 7, 8, 9, 15, 16, 19番目の単語は先頭の1文字,それ以外の単語は先頭に2文字を取り出し,取り出した文字列から単語の位置(先頭から何番目の単語か)への連想配列(辞書型もしくはマップ型)を作成せよ.

できたコード

解説

enumerate関数が活躍しております

開始番号も指定できるので便利!

例の如くsplit関数でスペース区切りのリストを作成し、インデックスが指定番号と同じだった場合、単語をスライスで加工したものをキーにインデックス番号を値としてresultディクショナリに格納していくという処理となります


おわりに

一応、Githubにもリポジトリ作ったのでここにあげていくスタイルで!

github.com


その他のノックについてはこちら!

tocyuki.hatenablog.com

【言語処理100本ノック】03. 円周率

はじめに

最近Pythonを使い始めたので、勉強がてらこいつをやってみようとおもいまっす

www.cl.ecei.tohoku.ac.jp


どこまで続くかわからないですが、がんばりますよ~!


03. 円周率

要件

“Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics."という文を単語に分解し,各単語の(アルファベットの)文字数を先頭から出現順に並べたリストを作成せよ.

できたコード

解説

文字列strsplit関数でスペース区切りで分割し、リストword_listを作成

for文で作成したword_listから各要素毎にwordという変数に格納

文字数を格納するcount変数を初期化し、さらに要素を文字毎に分割するfor文を作り、isalpha関数でアルファベット以外の文字列をカウントしないようアルファベットだった場合のみにcountがカウントアップするようにする

各単語の文字数をresultリストにappend関数で追加していく


おわりに

一応、Githubにもリポジトリ作ったのでここにあげていくスタイルで!

github.com


その他のノックについてはこちら!

tocyuki.hatenablog.com

【言語処理100本ノック】02. 「パトカー」+「タクシー」=「パタトクカシーー」

はじめに

最近Pythonを使い始めたので、勉強がてらこいつをやってみようとおもいまっす

www.cl.ecei.tohoku.ac.jp


どこまで続くかわからないですが、がんばりますよ~!


02. 「パトカー」+「タクシー」=「パタトクカシーー」

要件

「パトカー」+「タクシー」の文字を先頭から交互に連結して文字列「パタトクカシーー」を得よ.

できたコード

解説

処理としてはzip関数で2つの変数に格納された文字列をfor文で文字毎に分割し、別の変数に繋げて格納するというものになります

zip関数に関しても別記事書こうと思いますので出来次第リンク貼ります^^


おわりに

一応、Githubにもリポジトリ作ったのでここにあげていくスタイルで!

github.com


その他のノックについてはこちら!

tocyuki.hatenablog.com

【言語処理100本ノック】01. 「パタトクカシーー」

はじめに

最近Pythonを使い始めたので、勉強がてらこいつをやってみようとおもいまっす

www.cl.ecei.tohoku.ac.jp


どこまで続くかわからないですが、がんばりますよ~!


01. 「パタトクカシーー」

要件

「パタトクカシーー」という文字列の1,3,5,7文字目を取り出して連結した文字列を得よ.

できたコード

解説

これもスライスの使い方に関する問題ですね

スライスに関しては別記事としてまとめようと思いますのであとでリンク追加します^^


おわりに

一応、Githubにもリポジトリ作ったのでここにあげていくスタイルで!

github.com


その他のノックについてはこちら!

tocyuki.hatenablog.com