LoginSignup
6
10

More than 3 years have passed since last update.

Python 入門(最速でクラス理解までの道)

Last updated at Posted at 2020-04-25

初めに

※前提:あくまでこの記事はTutorialを細かくなるべくわかりやすく説明するものです
まだ一度もPythonに触れたことがない方へ
この記事はchainer Tutorialを参考に書いています。まず分からなくても一通り読むことをお勧めします

Pythonってどういう言語なの?どういう特徴もってるの?

他にもたくさんC#やRubyなどの言語がありますが、Pythonはその中でも特に優れている点があります

①データ解析と機械学習に優れている

データ解析というと聞きなじみがあるようでないように思えますが、例えばApple社のiPhonにはSiriというAIアシスタントが付いています
Siriは「Hei Siri!」というと反応してくれます
これにはSiriが受け取った音声が「Hei Siri!」なのかを解析する必要がありますね
これをデータ解析と呼びSiriがPythonでプログラムされてるかは分かりませんがそのようなプログラムを書くのにPythonは優れています

②webアプリケーションの開発にも使われている

webアプリケーションというと何を指すのか分からない人もいると思います
webアプリケーションとはインターネットを介してそのアプリを使ってる人と、そのアプリを動かしているサーバーとのやり取りでアプリを使ってる人の端末(ブラウザー)で動くプログラム、またはサーバーで動くプログラムを指します
分からない人は初めのうちはLINEや掲示板などインターネットにつないでなくては動かないアプリのことを指すという認識で構いません(語弊あり)
そのようなアプリの開発にもPythonは優れているのです!

③初学者でも始めやすい!

読んで字のごとくPythonは「プログラミング自体初めて!」という方にもお勧めできます
実際私もPythonから勉強し始めました(まだ未熟なのでこの記事内で間違いがあったらすいません)
なぜPythonは学びやすいのかはあくまで私の感想ですが英語として理解できるという点がすごく大きいのかなと思います。

以上の点においてPythonは優れているでしょう

これから学ぶべきこと

これはTutorialの2.1.1に沿って書きます。
学ぶべきことは文法アルゴリズムですが
コンピューターで何かを開発して、自動化したい!という方もまずは文法を一番最初に学ぶべきで、これは避けて通れない道です
ここからはTutorialにあるように

  • 変数
  • 制御構文
  • 関数
  • クラス

を細かく説明していくつもりですmm

変数について

変数とは名前の付いた入れ物です
ご指摘ありがとうございます:Pythonにおける変数は名前と値を紐づけて記憶するという概念らしいです

変数に値を一時的に記憶(紐づけ)しておいたり、必要に応じて別の値に記憶(紐づけ)を変更できます。
例えば、食べたいものという変数を作ってそこにリンゴを記憶しておくこともできますし、
リンゴからオレンジに記憶を変更することも可能です

変数に値を記憶する方法

Pythonで変数に値を記憶するには<変数> = <値>といった形で記述しますこれをTutorialでは「左辺の変数に、右辺の値を代入する」といった形で書いていますが、普通に「変数に値を代入する」というだけでいいと思います(自論)
では実際にnumberという変数に1を代入するコードを書きます(サンプル)

number = 1

これだけでnumberという変数を定義する処理と1を代入する処理が可能です
もし本当にこれで代入できてるのか気になる方は

print(number)

このコードをnumber = 1の下に付け足して実行してみてください1と出力されれば完璧です
いま使ったprint()についてTutorialでは解説していますが、今説明すると混乱する人もいると思うのであとで解説します
あ、それと変数名については自由に変えてもらって構いませんがわかりやすい名前にするということとアルファベットを使う(くだものはほんとはだめ)ということを守ってください
(人のこと言えないのですが)

コメントについて

コード書いてるとき「あ、これここにメモしときたい!」となることが多いと思います
そういう時には#をメモしたい文章の前につけておくことで#のあとのコードは完全にスルーされます
例えば

#これより下の文章はコメントとして書きます
#number = 1

これを記述してからその下に先ほどの

print(number)

を記述してみてください
エラーが出るないしは何も表示されないはずです(numberなんて変数ないよ~)みたいな
そのエラーがおこるのは正しいことで(1と出力される場合変数に値を入れる方法で書いたコードを消して再度実行してください)
そのエラーがおこるのはnumber = 1の先頭に#をつけているのでコメントとして認識されています
それがゆえコードとして認識されずエラーが起きます
メモリたい時はこれを参考してください!

値の種類

Pythonで扱う値にはいくつか種類があります(値の種類?って思う人もとりあえず読んでください)
これから絶対に使うだろうものは以下のものです

  • 文字列(string)
  • 整数(integer)
  • 実数(real number)

これらの種類を型(type)と呼びます
なんでわざわざ分ける必要があるの?って思う人もいると思います
Pythonでは値の型を自動的に判断する機能が付いており、
コンピューターではこれらを分けなくては混乱が発生してしまうというのが答えです

まず文字列というのは
りんごfuruitなど数字ではないものを指します(語弊あり)
Pythonでは値を文字列として認識させるために'あるいは"で文字列としたい値を囲う必要があります

fruit = 'りんご'

このようにすることでPythonが値を文字列として認識してくれます

そして整数というのは
意味的には文字通りで、とくに囲ったりする必要はなく普通に

num = 1

と記述するだけで構いません。
文字列型を整数型に変えるには
int('文字列')とすることでできます※整数型にする文字列には数値が必要

int_number = int('21')

このように書くことで文字列型の数字文字列を整数型の整数値に変えることができます

最後に実数について
実数は整数とは違う数値を実数といいます(語弊あり)代表的なものとして小数があります
1.8は無論実数型ですが.2510.など.が含まれる数値は自動的に実数型として認識されます
例を出すと

real_num = 10.

これでも実数として認識されるということです

値の型を確認するには?

結論だけ先に言っちゃうとtype()を使うことで確認できます
それに先ほどのprint()を組み合わせることで出力できます
print()は察しのいい方は気づかれたかもしれませんがコンソール上に値を出力するために使います
出力するものはprint()の()内に書いてください
これは組み込み関数というものであらかじめ定義されているスクリプトだと思ってください
type()も同じく組み込み関数です
では早速型を確認しましょう

print(type(fruit))
print(type(num))
print(type(real_num))

これを先ほどのコードの下に書いて実行してみてください

<class'str'>
<class'int'>
<class'float'>

と出力されたならそれは正しいです
floatというのは実数を指すのできにしなくてOKです!
これが確認出来たら先ほどのint_numberがちゃんとint型になってるかも確認しましょう
(じぶんでやってみよう!)

一気に変数を代入したい!(複数同時の代入)

first_nameスズキsecond_nameタロウを一気に代入してみましょう
一気に代入するには
<変数1>,<変数2> = <値1>,<値2>
と記述することで可能です
実際にやってみましょう

first_name, second_name = 'スズキ','タロウ'

これで代入できたはずです
print()を使って確認してみましょう


print(first_name)
print(second_name)

どうでしょう...

スズキ
タロウ

と出力されましたでしょうか

算数をやってみよう(算術演算子)

算術演算とは足し算や引き算、割り算などを指します

演算 記号
加算(足し算) +
減算(引き算) -
乗算(掛け算) *
除算(割り算) /

具体的にと申しますと

print(1+1)

と入力すると

2

と出ます
また
str+intはできませんが
str+strは可能です実際にやってみましょう

print('Hello'+'World')

これを実行してみてください
HelloWorldと出力されたら成功です!
またint+floatも可能で、答えはfloatになります

累積代入文(what?)

累積代入文は変数を更新する際に便利です
いままでは

score = 1
score = score + 1
print(score)
#出力結果:2

このようになりますがこれを簡略化することができます!

score = 1
score += 1
print(score)

これを実行すると2出力されるはずです
このように+=を使うことで簡略化することが可能です
これを累積代入と呼びます

比較演算子

比較演算子とは演算子の右と左において演算子の指定した条件を満たしているかを確認します
確認するにはboolという型を使いますboolTrue,Falseの二つのみで構成されます
条件を満たしているならTrueが返ってきて
満たしていないならFalseが返ってきます

演算 記号
小なり <
大なり >
以下 <=
以上 >=
等しい  ==
等しくない !=

例えばこれを実行してみてください

print(1 == 2)

これを実行するともちろん1は2と等しくないのでFalseと出力されるはずです
これを使って慣れたら次に進みましょう!

エスケープシーケンス

エスケープシーケンスって何ぞや?となったと思います。
Tutorialにも書いてありますが、これはその表し方以外表現できないので引用しますと

通常の文字列では表せない特殊な文字を、規定された特別な文字の並びにより表したものをエスケープシーケンス (escape sequence) と呼びます。

例えば、改行したいときどーすりゃいいの?その答えはエスケープシーケンスです百聞は一見に如かずということで以下を実行してください

print('Hello\nWorld')

このコードを見て「そりゃHello\nWorldと出力されるに決まってるだろ」
と思った人騙されたと思ってください
結果は

Hello
World

な、なんと改行されているではないか!
それをエスケープシーケンスと呼ぶのです
他には\tはタブを意味します
これは普通に文字列として使うことができます

文字列メソッド

メソッド(method)とは...
メソッドはstrなどの型が持つ関数を指します関数は多少語弊がありますが機能
と捉えてください(最初のうちはそれで大丈夫なはずです👍)
ここでは事前に

name = 'HelloWorld'

と定義してください
今の時点では

print(name)

を実行するとHelloWorldが出力されます
では

print(name.lower())

を実行してください
するとhelloworldと出力されるはずです
lower()全ての文字を小文字にするという機能を持っています
またlower()の部分をupper()に変えて再度実行してみてください
HELLOWORLDと出力されるはずです
upper()lower()の逆ですべての文字を大文字にする機能を持ちます

それ以外にはformat()メソッドがあります
これは
ある文字列の一部分に、あとから別の文字列を埋め込むために使用します。
そして文字を埋め込みたい場所には{}を置いておきます
形としては

word = 'Hello'
print('{}World'.format(word))

これを実行するとHelloWorldが出力されるはずです
wordで定義したHelloがformatで埋め込む文字列として指定され
埋め込む場所に{}を置いたWorldの前が指定されたというわけです
これを使う利点として
format() メソッドを用いると int 型float 型の変数を、str 型へ明示的にキャストすることなく文字列に埋め込むことができます。

浮動小数点数(float)だけが持つメソッド

float型だけが持つメソッドとはas_integer_ratio()というものがあり
これは少し語弊があるかもしれませんが、float型の小数を(分子,分母)の形にすると考えてください
例えば

print(0.5.as_integer_ratio())

(1,2)と出力されたら完璧です👍

複合データ型

今まで扱ってきた変数には一つの値しか代入できませんでしたが
以下のものには複数の値を扱うことができます

  • リスト(list)
  • タプル(tuple)
  • 辞書(dict)

そして、今からこれを一つずつ説明していきます

リスト(list)

list型を定義するには,で区切り、[]で値を囲います

fruits = ['apple','banana','orange','grape']

型を確認してみましょう

print(type(fruits))
#listと出力されるはず

リストの要素数(長さ)を確認しよう!

リストの長さとはリストに入っている値の個数を指します
ex)上で定義したfruitsapple,banana,grape,orangeの4つです
これを取得するにはprint()type()と同じ組み込み関数のlen()を使います
len()は()内に指定したリストの要素数を返します
以下のコードを書いてみましょう

print(len(fruits))

を実行してみてください
4と出力されるはずです

リストを操作しよう!(要素へのアクセス編)

要素へのアクセスに必要なものとして何番目の要素にアクセスするかです。
その何番目のことをインデックスといいます
インデックスは一番初めの要素のインデックス番号を0とし1,2となります
※一番最初は1じゃないよ!
たとえばfuruitsのインデックス番号が2の要素はorangeです
指定したインデックス番号の要素へアクセスするにはlist名[インデックス番号]という風に記述します
それでは指定したインデックス番号の要素を出力してみましょう

print(fruits[2])

orangeと出力されたらそれは正解です!

リストを操作しよう(要素の値を更新しよう編)

リストの要素の値を更新するには
上記の要素へのアクセスを使用します

fruits[2] = 'peach'
print(fruits[2])

これを実行してpeachが出力されたら完璧です!
因みに初めからの要素のアクセスにはインデックス番号を正の数に指定しますが、
末尾からのアクセスには負の数を使います[-1]は末尾を指します
※末尾からのインデックス番号のスタートは-1であって0じゃない!
因みにリストにはstrintも代入できますlist自体も代入できます

リストに値を追加しよう

リストに値を追加するにはappend()のメソッドを使用します

fruits.append('lemon')
print(fruits)

を行ってくださいlemonが出力されたら完璧です

タプル(tuple)

タプルを定義するには()で要素を囲み,で要素を区別します

タプルはリストと違って、値を更新したり代入したりすることができません


foods = (bread,rice,fish)
print(foods)

これを実行すると(bread,rice,fish)と出力されます
値を追加しようとしてもいいですが当然エラーが出ます

辞書(dict)

辞書は上の二つと違いkey:valueの形で記録されます
辞書に関してはチュートリアルが一番わかりやすいと思うので私が説明するよりは参照になります

制御構文

ついにここまで書きました!
制御構文には二種類あります

  • 条件分岐(if)
  • 繰り返し処理(for,while)

条件分岐(if文)

ifは日本語に訳すともしですその言葉通り条件式を満たすか満たさないかで処理を変えます!

if 条件式:
    条件式を満たすときの処理

このように記述します
:を忘れずに!
例を挙げます

a = 1
b = 2
if a == 1:
    print('aは1だよ!')

if b != 1:
    print('bは1じゃないよ')

これを実行してみてください。
二つともTrueなので両方出力されるはずです!

ifで条件を満たさない時の処理は?

その場合elif 条件式:と書いてください
elifにも満たさない場合の処理はelse:を使ってください
これには条件も何もないので条件式をは不要です

a = #好きな値を入れてね
if a == 1:
    print('aは1だよ!')
elif a < 1:
    print('aは1より小さいよ!')
else:
    print('aは1より大きいよ!')

これでaにいろんな値を代入して勉強してください!

for文,while文

これは辞書と同じく画像を使って説明しているチュートリアルが一番わかりやすいです

(決してめんどくさがってるわけじゃないよ!)


関数

ここからは関数を3段階に分けて説明します

step1

Pythonにおける関数とは

結論から言っちゃうと関数を使うことで様々処理を一つにまとめることが可能です!
簡単に例を出し説明させていただきますと

例えば電子ヒーターを考えてみましましょう...私の家で使ってるヒーターの機能には

①起動する時間を指定する
②周りを温める
③指定した時間が経過したら温めるのをやめる

という過程があります
このヒーターのように様々な処理が機能として1つにまとまっているものをPythonでは関数といいます。 (Python以外の言語でもいう場合があるのでこれから重要になります)
関数.png
この関数を使うことで一回一回①...②...③といった感じで書かなくても
ヒーターを使う(用語では関数を呼び出すという)ことで定義した処理を一括で行ってくれる

関数を定義する

関数の意味を理解していただけたかと思います。
それではヒーターの機能を関数にしていきましょう
関数を定義するには
image.png
最初に関数名を決める必要があります
今回はヒーターを定義するのでheat()を定義しましょう

def heat():
    print('空気を温めるを指定しました')
    print('周りを温めています')
    print('時間になったので温めを止めました!')

はい、これで機能を定義できましたが、この状態で実行しても
何も起こらないはずです
いまはあくまで、関数を定義した、つまりヒーターを作っただけで、電源を入れなくては(関数を呼び出さなくては)動きません

関数を呼び出そう!

関数を呼び出す方法は関数名(引数)とする必要がありますが
今回引数は不要です
※引数についてはあとで説明します

heat()

これを実行すると

空気を温めるを指定しました
周りを温めています
時間になったので温めを止めました!

となるはずです!
これでヒーターを動かせました。

step2

モード設定をしよう!(引数について)

今まで使ってきたヒーターでは時間指定をしてきました...
一旦その機能をなくして,,のモードを指定したいということで
引数というものを使っていきます
説明はあとでしますので一旦ソースコードを見ましょう

def heat(mode):
    if mode == '強':
        print('強モードだよ!')
    elif mode == '中':
        print('中モードだよ!')
    elif mode == '弱':
        print('弱モードだよ!')
    else:
        print('モード選択が間違ってるよ!')

#xxの部分に弱、中、強のいずれかまたはそれ以外を入れて実行して(文字列型で)
heat(xx)

結局引数ってなんなん?って思った人もいると思います

引数とは
heatの関数を呼び出す際に渡されたデータをmodeという変数に入れておくことができます!
引数を使うには上記のようにdef 関数名(引数)といったように関数を定義してください

def 関数名(引数1,引数2...)といった感じで引数を複数指定することができます
引数を使うことで関数内でも引数に入っているデータごとに処理を分けることができます

戻り値について

戻り値というのはデータを返してくれるものです
下記のソースコードを例に出していきます

def square(long):
    area = long*long
    return area
#returnされたデータを直接出力することができる
print(square(10))

#returnされたデータを変数に代入することもできる
square_area = square(3)
print(square_area)

今回は(long)に指定された正方形の一辺の長さから正方形の面積を返す関数を書きました
ソースの三行目のreturnは戻すや返すという意味があり、returnの右側に書いたデータを返すことができます。
イメージはこんな感じです
image.png
この戻り値はよく使うので読み返して理解しておいてください

step3

自分で関数を書いてみよう!

円の面積は半径×半径×3.14で求めることができます。
circleという関数を定義し引数にはradiusを指定してください

円は半径が負の数(0以下)になることはあり得ないので、
radiusが0以下の場合'エラーがでちゃった!'を返す

0以上の場合radiusに指定された値が半径となる円の面積を返す
関数外にreturnされた値を出力するコードを記述してください

答えは一番下の項目に記述しておきます

fizzbuzz問題

for文までを使い以下の問題を解いてください!
関数まで理解できた方は出力と処理を分けて書いてみてください!

1から100までの数をプリントするプログラムを書け。ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、3と5両方の倍数の場合には「FizzBuzz」とプリントすること。

これの答えは次回掲示します

いよいよ離陸!クラスについて

最後の関門

関数までコンプリート出来た読者の皆さんなら
最後のボスを倒してくれると思います!
ただ、私自身クラスを理解するまで相当時間がかかりました。
一回で理解できるように私なりに工夫をするので諦めずについてきてほしいと思います

クラスの基本のキ

オブジェクト指向って?

まずクラスを理解するにはオブジェクト指向の考えについて学ぶ必要があります。
プログラミングの種類というのは大きく分けて3つあります
その3つある中の一つにオブジェクト指向プログラミング(以下:oop)があり、それにPythonも含まれます

oopとは...

モノ(object)を組み立てるように表現して、コンピュータに動作をさせる

oopの一番のメリットはわかりやすくプログラムを表現できるということ

つまりPythonにおけるclassや関数は全てオブジェクトであります
今回はオブジェクトという言葉をモノに置き換えてお話しします
文字に素直になって読み進めてくださいモノだから...オブジェクトに置き換えよう!ということはしなくても伝わるように記事を書かさせていただきます

クラスとは・構造

クラスというのはモノを作るために必要な設計図に当たります
ただしここで注意しなくてはいけないのはあくまで設計図であるということです
設計図からモノを作るには別の工程が必要になります。
image.png
今回はHeaterを定義しましょう!
そしてHeaterの機能は
①ヒーターの状態を確認する
②ヒーターの状態を更新する
※状態→power(on,off)/mode(強,中,弱)/timer(number)


class Heater():
    def __init__(self,power=off,mode=None,timer=None):
        self.power = power
        self.mode = mode
        self.timer = timer

    def check(self):
        print(f'ヒーターは{self.power}で、モードは{self.mode}、タイマーは{self.timer}に指定されてます')

    def update(self,power,mode,timer):
        self.power = power
        self.mode = mode
        self.timer = timer

クラスの定義はこんな感じです
checkメソッドはヒーターの状態を確認する
updateメソッドはヒーターの状態を更新する
それでは、このヒーターを作るためのクラス(設計図)について理解しましょう

selfとは?

クラス内のメソッドにおける第一引数には絶対にselfが含まれています
selfとは自身を示すものです
ヒーターは同じ製品が複数あるものの勿論ヒーターそれぞれ状態が違います
ヒーターAはonでモードは弱,タイマーは10であっても
同製品ヒーターBはonでモードは強,タイマーは5である
selfはAからみた自身つまり、Aとpower,mode,timerを紐づけます
BのpowerはオンでもAとは紐づいていないのでAもオンになるということはありません
そしてclass内のメソッドには必ず第一引数にselfを使う必要があります

_init_とはなーに?

Heaterクラスには__init__というメソッドが定義されていますこれは
予め定義されている特別なメソッドの一つで
クラス(設計図)からモノを作るときに自動的に呼び出されるもので初期設定と思ってください
Heaterクラスでは__init__内の引数で渡された順にpower,mode,timer
を先ほど解説したself(製品のモノ(インスタンス))ごとに紐づけるという処理を行っています

クラスの基本のホ

モノを作ろう(インスタンス化)

インスタンス化するには

heater = Heater(on,'弱',100)

という感じにクラス名()とし、()内に引き渡された値を__init__()メソッドに直接引き渡します。これでヒーターの設定は完了ですそれではcheckメソッドを使って上記のコードに渡した値が代入されたか確認しましょう

heater.check()

を実行してみましょう
最初に設定した通り
ヒーターはonで、モードは弱、タイマーは100に指定されてます
という感じで出力されたら完璧です!

因みにselfはインスタンス化する際に呼び出す必要はありません

クラスの基本のン(継承)

(編集中)

アンサー

circle関数

def circle(radius):
    if redius >= 0:
        area = radius*radius*3.14
        return area
    else:
        return 'エラーがでちゃった!'

print(circle(x))
6
10
21

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
10