pythonで作ってみよう!!

pythonを楽しく学ぶために、おみくじ、占い、ジャンケンなど、実際に作りながら勉強してみます!

第5章 シーケンスの扱い

5.1 シーケンスとは

シーケンスとは、複数の値を順序に沿って並べた集合のことです。複数の値をまとめて扱えることで効率的なプログラムを作ることができます。
シーケンスの代表的なものにはリスト、タプルと文字列があります。固有の処理についてはそれぞれの章で解説しますが、まずはシーケンスで共通の処理について見ていきます。

5.2 要素へのアクセス

シーケンスを構成する1つ1つの値を要素といいます。
f:id:inato_gen:20190511100417j:plain

5.2(1) インデックスでのアクセス

シーケンスの要素のひとつを参照または代入するにはシーケンスに角カッコ([ ])を続け、中に順序を表す数値(インデックス)を書きます。インデックスは0から始まります。

# リスト型の変数x
x = [10, -5, 12.3]
y = x[1]
print(y)
 -5

5.2(2) スライス

シーケンスの一部を取り出すにはスライスという記法を用います。インデックスと同じようにシーケンスに角カッコを続けますが、中には「開始インデックス:終了インデックス」を書きます。終了インデックスにはその要素を含まないことに注意してください。

# 文字列型の変数s
s = "abcdefgijk"
t = s[3:6]
# sの4番目から7番目の前まで
print(t)
def

5.3 繰り返し処理

シーケンスを使う大きな理由のひとつに繰り返し処理があります。同じ処理を異なる値に適用したい場合、シーケンスによって効率的に記述できます。
繰り返し処理にはfor文を用います。

for 変数 in シーケンス:
    繰り返す処理(ブロック)①

このように記述すると、シーケンスの要素をひとつずつ変数に代入しながら①の処理が要素の数だけ何度も実行されます。
例えば、購入した商品の税抜き額が与えられたとき、その税込み額を表示するプログラムを作るとします。
繰り返し処理を使わなければこのようになります。

price1 = 100
price2 = 150
price3 = 600
taxed1 = int(price1*1.08)
print(taxed1)
taxed2 = int(price2*1.08)
print(taxed2)
taxed3 = int(price3*1.08)
print(taxed3)
108
162
648

計算と表示の部分は変数名が違うだけで、処理の形は同じですね。これを繰り返し処理で書き直すと次のようになります。

prices = [100, 150, 600]
for price in prices:
    taxed = int(price*1.08)
    print(taxed)
108
162
648

繰り返しが排除されてすっきりしました。

第1回-2 おみくじに、名前を入れてみよう →ユーザが入力した文字を表示しよう!

1. はじめに

先ほどは、決められた文字を表示しました。
次は、おみくじの参加者が、自分の名前を入力し、その名前を付加して「○○さん、おめでとうございます!大吉です」と出すプログラムです。

■要件

・「あなたのお名前は?」と聞いて、名前を入力してもらいます。
・その後、先ほどのおみくじを実行します。(少し簡略化します)

ソースコード

print('あなたのナイスなニックネームを入れてね!')
name=input()
print(name +"さん、おめでとうございます!大吉です")

◼️実行結果

あなたのナイスなニックネームを入れてね!
ichi
ichiさん、おめでとうございます!大吉です

◼️解説

input() にて、ユーザからの入力を受け付けます。
受け付けた文字がnameにセットされます。
以下のようにまとめることもできます。

name=input('あなたのナイスなニックネームを入れてね!')

第1回-2 おみくじに、名前を入れてみよう →ユーザが入力した文字を表示しよう!

1. はじめに

先ほどは、決められた文字を表示しました。
次は、おみくじの参加者が、自分の名前を入力し、その名前を付加して「○○さん、おめでとうございます!大吉です」と出すプログラムです。

■要件

・「あなたのお名前は?」と聞いて、名前を入力してもらいます。
・その後、先ほどのおみくじを実行します。

ソースコード

print('あなたの今日の運勢は・・・')
for i in range(10):
    print('・')
print("おめでとうございます!大吉です")

※メモ 以下を見ると、もっときれいに記載ができそうだ。
https://kurokinomizuiwa.hatenablog.com/entry/2018/11/10/hatena-blog-source-code-paste

◼️実行結果

あなたの今日の運勢は・・・
・
・
・
・
・
・
・
・
・
・
おめでとうございます!大吉です

◼️解説

0.このプログラムを理解するのに必要な知識
  1. プログラムは上から1行ずつ実行される
  2. print(文字列)で文字が表示できる
  3. 固定の文字列は「"」または「'」で囲む
  4. for i in range(10): で10回繰り返す
1. プログラムの実行

プログラムは基本的に1行ずつ上から実行されます。
この例では1行目の

print('あなたの今日の運勢は・・・')

が最初に実行されることになります。
それが終わると(文字が表示されると)、次の

for i in range(10):
    print('・')

が実行されるわけですが、この説明は少し後でします。1行ずつと言ったばかりなのにいきなり2行取り上げた理由も後で説明します。
最後に、

print("おめでとうございます!大吉です")

が実行されてプログラムは終了します。

■コラム Pythonは簡単!!
今回、文字列を表示するプログラムを紹介しました。
Pythonだと、1行ですよね。
でも、C言語だと違うんです。以下みたいに、たくさん書かなければいけないんです。しかも、stdio.hとか、わけのわからない文字もあります。

#include<stdio.h> 
int main()
{ 
 printf("おめでとうございます!大吉です");
 returun 0;
}

Pythonは簡単でいいですね!!

2&3. 文字列の表示

print関数を利用します。

print(表示する文字列)

固定の文字列を表示するときには「"」(ダブルクォーテーション)または「'」(シングルクォーテーション)で囲みます。
javaでは、1文字は''、文字列は""と区別されていましたが、pythonでは区別されていません。

print("こんちくは") 
こんちくは
print('こんちくは') 
こんちくは
数字の場合は、そのままでも表示できます。 引用符で囲んでも表示できます。
print(3) 
実行結果
3
改行を含めて表示するにはダブルクォーテーション3つ「"""」で囲います。
print("""ab
cde
fg""")
ab
cde
fg
特殊な文字、たとえば、「'」を表記する場合には「¥」を付けます。英語のキーボードでは「\」(バックスラッシュ)と表現されることでしょう。これを付けないと、プログラム的な意味なのか、単なる文字列なのかが分からないからです。
print ('こん\'ちくは')
こん'ちくは

それ以外にも、いろいろと試してみるといいですよ。
参考までに、いくつか試した結果が以下です。
print("12") →12
print(12) →12
print(こんにちは) →エラー
print("こんにちは') →エラー

4. 繰り返し処理

もったいつけて説明を保留したfor i in range(10)ですが、ここでは次の処理を10回繰り返すもの、としてください。この構文をfor文と言います。
(2行まとめて取り上げたのは「次の処理」と対になっているからです。)
どこまでを繰り返しの1セットとするかはpythonではインデント(字下げ)によって表現します。for文の次にあるprint('・')の先頭についている半角スペース(ここでは4つ入れています)がインデントです。今回はインデントがついているのがこの1行だけなのでここだけが10回繰り返されて次の処理に進みます。
なので、この2行で「・」を10回表示する、という動作をすることになります。

第3章 変数と代入

3.1 変数とは

変数とは値(計算結果などを含みます)を保存し変数名というラベルで参照する機能です。
f:id:inato_gen:20190410181033j:plain

リテラルでは、プログラムに直接値が記述されているのに対して、変数は「変数名」で記述することになります。

3.2 代入

変数には具体的な値を格納して使います。変数に値を格納する処理を代入といい、ほぼ数学的な代入と同じ意味です。
代入には「=」記号*1を使います。

x = 100

f:id:inato_gen:20190410083727p:plain

3.2(1) 通常の代入

通常は左辺に変数名を、右辺に代入する値を記述します。それによって指定された変数に値が格納されます。値はリテラルの他、後述する演算子で処理されたものや、関数の結果、他の変数の場合があります。

x = 100

3.2(2) 複数の変数への一括代入

代入の「=」は複数続けて書くことができます。以下のコードは

x = y = z = 200

は、

x = 200
y = 200
z = 200

とほぼ等価です。

3.2(3) 変数リストへの代入

複数の値を複数の変数にそれぞれ代入するには以下のように記述します。

x, y, z = 100, 200, 300

この記述では右辺はタプル(tuple)になります。
詳しくはシーケンス型の章で解説します。

3.2(4) 累積代入

後述する二項演算子で変数の値を更新する短い記述があります。

変数 = 変数 ○ 値
#○は二項演算子

変数 ○= 値

と記述できます。

例えば、以下のコード

x += 1

は、

x = x + 1

とほぼ等価*2です。

3.3 変数の参照

変数の中身(値)を取り出すには、変数名を記述します。通常のコードでは変数名を記述すると、実行時に中の値として読み替えられます。
つまり、xに100が入っているとして、

print(x)

は、実行時に

print(100)

と同じものとして扱われます。

ただし、代入文の左辺にかかれた変数名は値に読み替えられません。
x = 200
が、
100 = 200
と扱われてしまったら、代入できないですからね。

*1:演算子と呼べるか自信がないので避けておきます

*2:少なくともこのコードでは同じです

第5章 数値データの扱い

5.1 数値リテラル

5.1(1) 整数リテラル

  • 10進数表記
    値をそのまま記述します。
print(123)
123

5.1(2) 真偽値リテラル

TrueとFalseで記述します。

Trueは整数の1と、Falseは0とほぼ同様に扱われます。また、整数を真偽値として扱う場合には、非0がTrueとして、0がFalseとして扱われます。
print(True)
print(False)
print(int(True))
True
False
1

5.1(3) 小数リテラル浮動小数点数リテラル

  • 10進数表記
    値をそのまま記述します。整数部がない場合は省略できます。
print(3.14)
3.14

5.2 数値を扱う演算子

5.2(1) 算術演算子

数値データは算術演算子によって計算が行えます。それぞれの演算子は計算した結果を返します。

処理 数学記号 演算子 結果
加算 + 1+2 3
減算 - 3-1 1
乗算 × * 2*3 3
除算 ÷ / 10/4 2.5

(切り捨て除算)
÷ // 10//4 2
剰余 x mod y*1 % 10%4 2
べき乗 x^y ** 5**3 125

5.2(2) 比較演算子

2つの(あるいはそれ以上の)データを比較するには以下のような比較演算子を使います。比較演算子は成立する場合(真といいます)に真偽値のTrueを、成立しない場合(偽といいます)にFalseを返します。

比較 真になる場合 演算子 Trueになる例
等しい 左辺と右辺が等しい == 1==1
等しくない 左辺が右辺と異なる != 1!=2
大なり 左辺が右辺より大きい
(同じは含まない)
> 2>1
小なり 左辺が右辺より小さい
(同じは含まない)
< 1<2
以上 左辺が右辺と同じか大きい >= 2>=1
以下 左辺が右辺と同じか小さい <= 1<=2

5.3 条件分岐

それまでのプログラムの処理結果によって続く処理を変えたいケースは良くあります。(というか、それがないとプログラムは毎回同じ結果になってしまいます。)
if文を使うことで、このような条件分岐を実現することができます。

if 条件:
    条件が成立する場合の処理(ブロック)①
else:
    条件が成立しない場合の処理(ブロック)②

「条件」の部分には真偽値として評価されるものを書きます。代表的なものは比較演算子を用いた式ですが、その他にも算術演算子の式や変数や関数の結果など真偽値に見なせるものはなんでも書けます。
条件が成立する場合(評価された真偽値がTrueになる場合)、①の処理ブロックが実行されます。(ブロックの説明は第1章 pythonプログラムの基本構造 - pythonで作ってみよう!!の1.5にて)その場合、②の処理ブロックはスキップされます。反対の場合も同様です。

*1:数学記号として正しいかは自信がありませんが…wikipedia:数学記号の表を参照しました

第4章 データ処理の基本

4.1 演算子

データを加工するための方法に演算子による演算があります。もっとも身近なものは四則演算のような算術二項演算子です。

print(1 + 2)
3

4.1(1) 演算子の種類

演算子には2つの値を使って処理をするものと、1つの値を使って処理をするものがあります。
演算子ごとにどのような書き方をするかは決まっていますが、概ね以下の2通りに分かれます。

a. 2つの値を使うもの
1 + 2
b. 1つの値を使うもの
-x

4.1(2) 演算子の動作

演算子は処理されると(その演算子が処理される番になると)、演算子ごとに決まった動作をして、その結果を返します。演算子と使った値(オペランドといいます)の部分が結果に置き換わると考えてもよいでしょう。
f:id:inato_gen:20190403083249g:plain

累積代入では
変数 ○= 値
#○は二項演算子
が、
変数 = 変数 ○ 値
と同じでした。このときの処理順序は以下の以下のようになります。
  1. 右辺の変数がその内容に展開されます。
  2. 右辺の演算が行われます(その結果に読み替えられます)。
  3. 左辺の変数に結果が代入され、変数の内容が上書きされます。
f:id:inato_gen:20190412203810g:plain

4.2 関数

関数とは、いくつかのパラメータを取り*1、関数ごとに決まった処理をするものです。パラメータを使って処理をするところは演算子と似ている部分がありますが、結果を返す他にさまざまな動作をするものがあります。
代表的な例に画面に文字を表示するprint関数があります。

print("Hello world!")
Hello world!

4.2(1) 関数の呼び出し

関数は関数名に続いて丸カッコ「( )」を書き、中にパラメータを記述します。パラメータ(引数ともいいます)が複数ある場合はカンマ「,」で区切ります。
関数が値を返すとき、演算子と同様に関数呼び出し部分がその結果に置き換わるものと考えることができます。

# xのy乗を返す関数pow
z = pow(5, 3)
# z ... 125

これらは評価される順に行われます。実行される順序(優先度)については別で解説します。
f:id:inato_gen:20190403213844g:plain

4.2(2) パラメータの指定

パラメータを指定する方法には2つあります。

a. 位置引数による指定

前述のpow関数では1つめのパラメータがべき乗の底、2つめの引数が指数となります。このようにパラメータを書いた順序で紐付ける方法を位置引数といいます。

print(pow(3, 4))
81
b. 名前付き引数による指定

関数のパラメータにはそれぞれ名前がつけられているものがあります。

print(3, 4, sep = "/")
3/4

パラメータには位置でしか指定できないもの、名前でしか指定できないもの、どちらでも指定できるものがあります。

4.2(3) 外部モジュールの利用

pythonでは外部モジュールを読み込むことで利用できる関数を拡張することができます(外部モジュールを読み込まないと使えない関数があるとも言えます)。
外部モジュールには、pythonと一緒にインストールされる標準ライブラリのものと、それ以外のものがあります。
標準ライブラリ以外のモジュールは別途pipコマンドなどでインストールが必要です。
(必要であればインストール手順を実行した後、)pythonで外部モジュールを有効にするにはimport文を実行します。

import モジュール名

これによって外部モジュールに含まれる関数が利用可能になり、次のように実行します。

モジュール名.関数名(...)

例えば、2つの値の最大公約数を求めるには以下のように記述します。

import math
print(math.gcd(117, 208))
13

4.3 クラスメソッド/インスタンスメソッド

詳しくはクラスの項で説明しますが、クラスメソッド、インスタンスメソッドと呼ばれる形式の関数もあります。
クラス、オブジェクトが持つ関数のことを特にメソッドといいます(繰り返しますが詳細は別途)。

4.3(1) クラスメソッド

今の時点では、そういう名前の関数がある、程度の理解で構いません。

クラス名.メソッド名(...)

例えば、16進数形式の文字列を数値に変換するには以下のように記述します。

print(float.fromhex("0xff"))
255.0

4.3(2) インスタンスメソッド

クラスメソッドと似た書き方をしますが、クラスメソッドがクラス名(型)を記述するのに対して、インスタンスメソッドでは実際の値(オブジェクト)を記述します。

オブジェクト.メソッド名(...)

例えば、変数の値を書式化するには以下のように記述します。

jp = "リンゴ"
en = "apple"
print("{}は英語で{}".format(jp, en))
リンゴは英語でapple

インスタンスメソッドでは、オブジェクトのところには、変数またはリテラルが記述できます。もちろん、オブジェクトの内容によって結果が変わります。

*1:パラメータを取らないものもあります

第2章 値とリテラル

2-1. 値

値とは、プログラムで扱う具体的なデータのことです。例えば、以下のようなものがあります。

  1. 今日の日付「3/8」
  2. 日本人の平均身長「170.7」cm
  3. このブログのタイトル「pythonで作ってみよう!!」

ここでいう値は本来意味を持ちません。「170」という値は、誰かの身長で170cmかもしれませんし、何かの値段170円かもしれません。意味はプログラマーやユーザーが意図して決めるものだということです。*1

2.2 型

値にはさまざまな種類(型)があります。型ついてはプログラム言語によって異なりますが、pythonでは以下のような体系に分かれています。

  • 数値型
    • 整数
      • 整数
      • 真偽値
    • 実数
  • シーケンス型
    • 変更不可能なシーケンス型
      • 文字列
      • タプル
    • 変更可能なシーケンス型
      • リスト
  • 集合型
  • マッピング
    • 辞書型
  • 呼び出し可能型
  • モジュール
  • カスタムクラス
  • クラスインスタンス
  • 内部型

2.3 リテラル

プログラムで値を扱うもっとも簡単な方法はソースコードに値を記述することです。このソースコードに書いた値をリテラル(即値、直値)といいます。

print(1) #「1」は数値リテラル
x = "text" #「x」は変数、「text」は文字列リテラル

*1:意味を振るまいとして定義することはできますが、ここでは触れません