ProgateやPythonチュートリアルで、あらかた勉強したのですが、HackerRankで解けない・理解できない問題がいくつかありました。
そのため、基礎をこの本で固めます。
#文字列・リスト・タプル・辞書
##文字列
###複数行の文字列を作る
クォート文字を3つ連続して書けば、複数行の文字を書けます。
エスケープもできて便利。
>>> string = ''' He said, "I want to learn python very hard."
... However, he gave up studying it for only 2 months. '''
>>> print(string)
He said, "I want to learn python very hard."
However, he gave up studying it for only 2 months.
エスケープはこちらでも可能。
>>> escape_string = "He said, \"I don\'t have time to study.\" "
>>> print(escape_string)
He said, "I don't have time to study."
上の方が分かりやすいですかね。
###データを文字列に埋め込む
こうやって書くことが多いと思いますが、
>>> myscore = 100
>>> message = "Your score is"
>>> print(message + str(myscore))
Your score is100
こんな風にも書けます。
>>> myscore = 100
>>> message = "Your score is %i."
>>> print(message % myscore)
Your score is 100.
>>> spaces = ' ' * 25
>>> print("%s March 19th ,2019" % spaces)
March 19th ,2019
ここで、i
はint,s
はstringです。
引数が複数あったらこんな感じ。
>>> m = "%s like %s."
>>> print(m % ("John", "Alis"))
John likes Alis.
##リスト
###リストをいじる
>>> colors = ["red","green","blue"]
>>> colors.append("black") #append:添える,付加する
>>> print(colors)
['red', 'green', 'blue', 'black']
>>> del colors[1]
>>> print(colors)
['red', 'blue', 'black']
>>> favorite_colors = ["emerald", "silver"]
>>> print(colors + favorite_colors) #リスト同士しか繋げないので注意
['red', 'blue', 'black', 'emerald', 'silver']
>>> print(colors * 3)
['red', 'blue', 'black', 'red', 'blue', 'black', 'red', 'blue', 'black']
ちなみに、リストの割り算や引き算はエラーになります。
分割する場所によって、複数の解釈が生まれるからです。
プログラミングの世界では、命令はいつも同じように解釈なければいけないわけですね。
##タプル
タプルは、別名「定数リスト」と呼ばれており、基本的には要素を追加削除できません。
また、()
でくくります。
>>> numbers = (1,2,3)
>>> numbers[1] = 4
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
こんな風にエラーが出ます。
タプルは、
要素の順番を変えられたくない時
データ型が固定の場合
などに有効です。
##辞書
辞書は検索機能を持ったものではなく、「探しやすくデータをしまっておくもの」というイメージですかね。
キーと値のペアでデータを格納します。
>>> club_activities = {"naruto" : "Baseball",
... "sasuke" : "Soccer",
... "sakura" : "karate",
... "itachi" : "tennis"}
>>> print(club_activities["sasuke"])
Soccer
キーから値を引っ張ってきます。
リストと同じく、書き換えや追加、削除は可能です。
しかし、辞書を足し合わせることはできません。
##まとめ
文字列は""
,リストは[]
,タプルは()
,辞書は{}
でくくります。
#関数とモジュールを使って月面体重計算プログラムを作る
自分で関数を定義する・モジュールをimportする・オブジェクトを使いこなす・うまく条件分岐させる...など、大事なことはたくさんです。
そんな大事なことを詰め込んだプログラムがこちら。
「年が経過するごとに、月面での体重はどうなるか」を計算します。
import sys #I want to use "sys.stdin.readline()"
>>>def moon_weight():
print("Please your current weight.")
weight = float(sys.stdin.readline())
print("Please enter the amount your weight might increase each year.")
increase = float(sys.stdin.readline())
print("Please enter the number of years.")
year = int(sys.stdin.readline())
for y in range(0,year+1):
mw = round(weight * 0.165, 3)
print("Year %s is %s" % (y, mw))
weight += increase
>>> moon_weight()
Please your current weight.
76
Please enter the amount your weight might increase each year.
1.1
Please enter the number of years.
9
Year 0 is 12.54
Year 1 is 12.721
Year 2 is 12.903
Year 3 is 13.084
Year 4 is 13.266
Year 5 is 13.447
Year 6 is 13.629
Year 7 is 13.81
Year 8 is 13.992
Year 9 is 14.173
#クラスとオブジェクトの概念
Python初心者で最初に難しいのはクラスとオブジェクト(インスタンスとも呼ぶ)ではないでしょうか。
なんとなーくで使っていると、まじで訳わからんくなります(自分もその1人)。
ここでは、「キリン」で例えて分かりやすくします。
まず、キリンは基をたどると「物体」です。
この「物体」がすべてのものの親クラスとなります。
そして、親クラスから子クラスにたどっていって、「キリン」クラスまでたどり着きます。
その「キリン」クラスの中に「jackson」という名前のキリンがいたとします。
ここに来て初めて、名前がついたので、jacksonは「オブジェクト」となるのです。
つまり、
・クラスは「もの(オブジェクト)」をまとめる分類
・オブジェクトは名前がついたもの
となります。
さらに、それぞれのクラス(分類)には、機能があります。
例えば、「動物」クラスなら、
・呼吸する
・食べる
といった機能があり、
「哺乳類」なら、
・赤ちゃんをお腹の中で育てる
といった機能があり、
「キリン」なら、
・長い首を使って木から葉っぱを食べる
といった機能があります。
この機能は「関数(Method)」で表します。
コード例はこんな感じ。
>>> class Things:
... pass #今は関数を定義しない
...
>>> class Animate(Things): #子クラス(親クラス)
... pass
...
>>> class Animals(Animate):
... def breathe(self): #selfには自分自身、つまり決めたキリンの名前(オブジェクト)が入る。
... print("bufooooo") #キリンに呼吸させる
...
>>> class Mammals(Animals):
... def bring_up_babies(self):
... print("ogyaaaa")
...
>>> class Giraffes(Mammals):
... def eat_leaves(self):
... print("mosyamosyamosya")
...
>>> jackson = Giraffes() #キリンの名前を決める
>>> jackson.breathe()
bufooooo
>>> jackson.bring_up_babies()
ogyaaaa
>>> jackson.eat_leaves()
mosyamosyamosya
親クラスから子クラスに機能は継承されていくので、Giraffesクラスのjackson君はThings〜Goraffesクラスまでの機能をすべて持っています。
###便利な__init__
関数
この関数にはこんなメリットがあります。
①オブジェクト(もの)を定義すると同時に関数を実行できる
②コードがシンプルになる
どういうことかと言うと、、、
動物園のキリンに名前をつける&体重を測る&体長を測る 例で見ていきます。
#__init__無しの場合
giraffes1 = Giraffes()
giraffes.name = jackson
giraffes.weight = 350
giraffes.height = 6.8
giraffes2 = Giraffes()
giraffes.name = malia
giraffes.weight = 290
giraffes.height = 5.6
#__init__ありの場合
#Giraffesクラスを編集
class Giraffes(Mammals):
def __init__(self,name,weight,height):
self.name = name
self.weight = weight
self.height = height
def eat_leaves(self):
print("mosyamosyamosya")
giraffes1 = Giraffes("jackson",350,6.8)
giraffes2 = Giraffes("malia",290,5.6)
1度定義してしまえばOKなので、楽チンですね。
キリンの数が増えるほど、効果を発揮します。
Giraffesクラスが呼び出されるごとに、オブジェクトを「初期化」して、新しいキリンの名前・体重・体長を決められます。