※【無料】独学用 実践演習問題・解答(サンプル・プログラム)付き!
よく使う関数等に「絞って」まとめていますので、ムダ無く効率的に「最速」で独習頂けます。
[toc heading_levels=”2,3″]1. Python(パイソン)とは?
本章の内容
Python(パイソン)の特徴や、よく使われているシーンの解説
1-1. Pythonの3つの特徴
特徴1. シンプル
Python(パイソン)は、プログラム言語の1つで、文法がシンプルで読みやすく、初心者でも開発しやすい
特徴2. Pythonはライブラリが豊富
数値計算、統計処理、自然言語処理、機械学習等のライブラリ
特徴3. 実績が豊富
Google、NASA、Microsoft、youtube、dropboxなどで使われている。
1-2. Pythonの使い方、できること
AI
- 機械学習
- 自然言語処理
- 画像処理
- 音声処理
データサイエンス
- 数値計算
- 統計解析
- 信号処理
1-3. Python環境を手軽に構築できる、Jupyter Notebook
ブラウザ上でpythonの実行・結果の確認、共有が可能なツール。
PandasのデータフレームやMatplotlibのグラフも視覚的に表示可能。
2. Pythonの基本
本章の内容
Pythonの書き方、基本構文や、コメントやインデント等の基礎を解説
2-1. 文字列を画面に出力(print関数)
2-1-1. 解説
文字列を画面に出力したい時に、print関数を使う。
print関数の基本的な構文は下記:
print("Hello World!")
※出力時、末尾に改行が入る
※ダブルクォーテーションもシングルクォーテーションも使用可能
2-1-2. 実践演習
print関数を使用して下記を出力せよ(目標10分)
Hello! How are you?
2-1-3. 解答(Python コード サンプル/プログラム例)
以下の解答を見る前に、まずはご自身で実装してみましょう。
print("Hello")
print('How are you?')
2-2. コメント
2-2-1. 解説
コメントとはソースコードのメモである。
自分の書いたプログラムを他人が見る時や、後々自分のコードを見る時に使う。
Pythonでは「#」がコメント記号であり、「#」以降のものは実行対象外となる。
コメントの構文は下記:
# この1行は実行されない
Pythonに複数行のコメントアウトはないが、文字列を表す「ダブルクォーテーション」もしくは「シングルコーテーション3つ」でコメントアウトしたい部分を囲むと、複数行のコメントとして使う事が可能。
複数行のコメントアウトの構文は下記のように「”’」で文章をくくる。
''' 複数行コメントアウト コメントとして扱われる '''
2-2-2. 実践演習
1)実践演習2-1-2で作成したprint文を「#」でコメントアウトして実行せよ
2)実践演習2-1-2で作成したprint文を「クォーテーション(’)」でコメントアウトして実行せよ
(目標10分)
2-2-3. 解答(Python コード サンプル/プログラム例)
以下の解答を見る前に、まずはご自身で実装してみましょう。
#1) #print("Hello") #print('How are you?') #2) ''' print("Hello") print('How are you?' ) '''
2-3. 変数
2-3-1. 解説
変数はプログラムのコードで扱われるデータを記憶するものである。
変数は箱によく例えられたりする。
一度箱に入れたものを別のところで取り出して使ったり、どこかのタイミングで別のものに入れ替えたりして再利用することができる。
変数の構文は下記:
my_var = 100
3. 演算子・制御フロー
本章の内容
Pythonで使える型の種類やif文、ループの方法を解説
- 3-1. 数型(int)と浮動小数点数(float)
- 3-2. 文字列(str)と論理値(bool)
- 3-3. 代数演算子(+,-,*,/)
- 3-4. ブール演算子(and・ or ・not)
- 3-5. 条件分岐(if文)
- 3-6. 指定回数を繰り返す処理(for文)
- 3-7. 条件が正しい時に繰り返す処理(while文)
- 3-8. 条件分岐内、ループ内の処理(break, continue, pass)
3-1. 数型(int)と浮動小数点数(float)
3-1-1. 解説
数値型(int)
構文は下記:
my_var = 16
浮動小数点数型(float)
構文は下記:
my_var = 12.16 my_var = 1.216E1
3-1-2. 実践演習
1)変数xに300を入れ、その変数を出力せよ
2)変数xに3.14を入れて、その変数を出力せよ
(目標15分)
3-1-3. 解答(Python コード サンプル/プログラム例)
以下の解答を見る前に、まずはご自身で実装してみましょう。
#1)
x = 300
print(x)
#2)
x=3.14
print(x)
3-2. 文字列(str)と論理値(bool)
3-2-1. 解説
文字列(str)
文字を「ダブルクォーテーション」もしくは「シングルクォーテーション」で括る
構文は下記:
my_var = ‘hello’
論理値(bool)
「True」または「False」の二値で表現される、フラグのようなもの
構文は下記:
my_var = True
※最初のT、Fは大文字
3-2-2. 実践演習
1)変数xに「こんにちは」という文字入れ、その変数を出力せよ
2)変数xにTrueを入れ、その変数を出力せよ
(目標10分)
3-2-3. 解答(Python コード サンプル/プログラム例)
以下の解答を見る前に、まずはご自身で実装してみましょう。
#1)
x = 'こんにちは'
print(x)
#2)
x=True
print(x)
3-3. 代数演算子(+,-,*,/)
3-3-1. 解説
- 加算 (5+2 #7)
- x – y : 引き算 (5-2 #3)
- x * y : 乗算 (5*2 #10)
- x / y : 除算 (5/2 #2.5)
- x % y : xをyで割った残余 (5%2 #1)
- x ** y : xのy乗 (5**2 #25)
- x // y : 切り捨て除算 (5//2 #2)
3-3-2. 実践演習
変数xに30,変数yに20を入れ、下記結果をそれぞれ出力せよ(目標20分)
x + y
x – y
x * y
x / y
x % y
x ** y
x // y
3-3-3. 解答(Python コード サンプル/プログラム例)
以下の解答を見る前に、まずはご自身で実装してみましょう。
x = 30,y=20
print(x + y )
print(x - y )
print(x * y )
print(x / y)
print(x % y)
print(x ** y)
print(x // y)
3-4. ブール演算子(and・ or ・not)
3-4-1. 解説
and
andは左右に条件とって、両方の条件が正しい場合のみTRUEを返す。
論理積とも呼ばれる
構文は下記:
条件1 and 条件2
例:
x = 10 if x > 0 and x < 11: print(x)
or
orは左右に条件とって、どっちかの条件が正しい場合TRUEを返す。
論理和とも呼ばれる。
構文は下記:
条件1 or 条件2
例:
x = 10 if x > 0 or x == 100: print(x)
not
notは条件式がTRUEの場合のみ、FALSEを返す。
否定とも呼ばれる。
構文は下記:
not 条件1
例:
x = 10 if not x == 100: print(x)
3-4-2. 実践演習
#ランダムな0~100の数値を作成 import random rand_int = random.randint(0, 100) #0 ~ 100
1)数型の変数をランダムに生成し、その変数を2で割った余りが0の場合、「偶数です」を出力し、残余が0じゃない場合は「偶数ではありません」を出力せよ
2)数型の変数をランダムに生成し、その変数が0以上49以下の場合変数の値を出力せよ
(目標30分)
3-4-3. 解答(Python コード サンプル/プログラム例)
以下の解答を見る前に、まずはご自身で実装してみましょう。
#1)
import random
rand_int = random.randint(0, 100)
if rand_int%2==0:
print('偶数です')
else:
print('奇数です')
#2)
if rand_int <50:
print(rand_int)
3-5. 条件分岐(if文)
3-5-1. 解説
プログラムの中でいくつかの条件によって行いたい処理が違う時に条件分岐(if文)を使って行うことができる。
if文を記述後に条件を記述しその条件がTrueの場合のみ実行される。
if文の構文は下記:
if 条件式_1: #行いたい処理 elif 条件式_2: #行いたい処理 else: #どの条件にも当てはまらなかった時の処理
Pythonには他の言語のように中括弧もブロック終端を示すend的な記述は一切ない。
Pythonはブロックを全てインデントで表現する。
コロンで始まる行が複合文の始まり(ヘッダー)で複合文の中に含まれている同じインデントの文は一個のブロックになる。
ブロックの構文は下記:
x=0 if x==0 : #ヘッダー print(“x is 0”) x=1 print(x) #常に実行される
my_var = 5 if my_var > 0: print('正の整数です。') elif my_var < 0: print('負の整数です。') else: print('0です。')
※上の条件から順番にチェックされる。
- 最初にmy_varの中にランダムな0~100の数値を入れる。
- my_varが0より大きい場合、「正の整数です」を出力
- my_varが0より小さい場合、「負の整数です」を出力
- my_varが2,3の条件に当てはまらない場合、elseブロックの中が実行され「0です。」が出力される。
3-5-2. 実践演習
- my_varの中にランダムな0~100の数値を入れる。
- my_varが80以上の場合、2倍した値を出力
- my_varが50未満の場合、1/2倍した値を出力
- my_varが2,3の条件に当てはまらない場合、「0」を出力
(目標20分)
3-5-3. 解答(Python コード サンプル/プログラム例)
以下の解答を見る前に、まずはご自身で実装してみましょう。
import random
my_var = random.randint(0, 100)
if my_var >= 80:
print(my_var*2)
elif my_var<50:
print(my_var/2)
else:
print(0)
3-6. 指定回数を繰り返す処理(for文)
3-6-1. 解説
for文を使うと指定回数を繰り返して処理を行うことが可能
for文の構文は下記:
for 変数 in range([始まりの数値=0,] 最後の数値[, 増加する量=1]): #ループ処理
シンプルな例:
for x in range(3): print(x) #0 #1 #2
始まりの数値と増加する量を指定した例:
for x in range(4,10,2): print(x) #4 #6 #8
3-6-2. 実践演習
2,4,6,8,10の値を、それぞれを2乗した値を出力せよ(目標10分)
3-6-3. 解答(Python コード サンプル/プログラム例)
以下の解答を見る前に、まずはご自身で実装してみましょう。
for i in range(2,12,2):
print(i**2)
3-7. 条件が正しい時に繰り返す処理(while文)
3-7-1. 解説
whileは条件が正しい(Trueの)時だけ、whileブロック中の繰り返し処理を行う。
while文の構文:
while 条件:
条件が正しい時に行う処理
※実行禁止
my_var = 1 while my_var < 4: print(my_var)
- my_varに1を代入
- whileの条件が4より小さいかどうかをチェック
- my_varの値を表示する
- 2に戻る
※上のプログラムではmy_varの値が永久に4より少さいので無限ループが発生する
my_var = 1 while my_var < 4: print(my_var) my_var += 1 print('while文終わり')
- my_varに1を代入
- whileの条件が4より小さいかどうかをチェック
- my_varの値を表示
- my_varの値を表示後、1を加算
- my_varの値が2に変化し、whileの条件を満たしているためmy_varが出力される
- またmy_varの値を表示後、1を加算
- my_varの値が3に変化し、whileの条件を満たしているためmy_varが出力される
- またmy_varの値を表示後、1を加算
- my_varの値が4に変化し、4は4よりは少さくなくなり、while文の条件がfalseになり、繰り返し処理が終了する
- 「while文終わり」が出力される
3-7-2. 実践演習
while文を利用して10から50までの間の偶数のみを出力せよ(目標15分)
3-7-3. 解答(Python コード サンプル/プログラム例)
以下の解答を見る前に、まずはご自身で実装してみましょう。
num = 0
while num<=50:
print(num)
num+=2
3-8. 条件分岐内、ループ内の処理(break, continue, pass)
3-8-1. 解説
break
ループ処理を途中で終了したい場合、if文とよく一緒にbreakを使う。
for number in range(10): if number == 5: break print(number)
※breakはwhile文にも使用することができる
continue
ループ処理の中のある特定の処理をスキップする
for number in range(10): if number == 5: continue print(number)
pass
何も処理を行いたくない時に使う。
関数名だけが決まっていて中の実装がまだ決まってない時、条件分岐で何も処理を行わない時等。
break,pass
for number in range(10): if number == 5: pass else: print(number) #numberが出力される
上記のプログラムだと実行結果が「0 1 2 3 4 6 7 8 9」になる。numberが5の場合のみ出力されない
3-8-2. 実践演習
1)0~9の値をfor文を使用してを一つずつ表示。ただし7になったらループを終了させよ
2)0~9の値を一つずつ表示せよ。ただし4の場合は表示しない。(continueを使用)
3)passを使って0~9の値を一つずつ表示せよ。ただし4の場合は表示しない(passを使用)
(目標20分)
3-8-3. 解答(Python コード サンプル/プログラム例)
以下の解答を見る前に、まずはご自身で実装してみましょう。
#1)
for i in range(9):
if i==7:
break
#2)
for i in range(9):
if i==4:
continue
#3)
for i in range(9):
if i==4:
pass
else:
print(i)
4. 配列
本章の内容
list, dictionary, tupleの使い方を解説
- 4-1. 他のプログラム言語でいう配列(list)
- 4-2. 辞書構造(dictionary)
- 4-3. 変更を許可しない変数等に使う配列(tuple)
- 4-4. 集合演算等に使う配列(set)
- 4-5. 配列等を処理する関数(map, filter, reduce)
- 4-6. リストの内包表記
- 4-7. 文字列に対する結合・分割
4-1. 他のプログラム言語でいう配列(list)
4-1-1. 解説
リストとは他の言語でいう配列。Pythonではリストと呼ばれる。要素を何個か持っているもの。
リストの構文は下記:
my_list = [1,2,3,4]
my_list = []
リストの中身をループで回す:
my_list = [1,2,3,4] for value in my_list: print(value)
4-1-2. 実践演習
1〜10までをリストに格納し、それぞれの値を2乗した値を出力せよ(目標10分)
4-1-3. 解答(Python コード サンプル/プログラム例)
以下の解答を見る前に、まずはご自身で実装してみましょう。
my_list = [i for i in range(1,11)]
for i in my_list:
print(i**2)
4-2. 辞書構造(dictionary)
4-2-1. 解説
dictionaryとはkeyとvalueの組み合わせが含まれている辞書構造のこと。
dictionaryの構文は下記:
my_dict = { key1:value1, key2:value2, key3:value3 }
- 上記に書いてある通り辞書型のオブジェクトの中の要素にはkeyとvalueペアで作られている。
- dictionaryのkeyは重複を許さない(同じkeyの場合、値が上書きされる)
dictionaryからデータ取得する方法
- dictionaryのkeyを指定して値を取得.[key]:keyに対応する値を取得
- dictionaryオブジェクト.keys() : dictionaryオブジェクトに含まれている全てのキーをリスト型で返す。
- dictionaryオブジェクト.values() : dictionaryオブジェクトに含まれている全てのvaluesをリスト型で返す。
- dictionaryオブジェクト.items() : dictionaryオブジェクトに含まれている全てのkey,valueセットをリスト型で返す。
my_dict = { 'computer': 2 , 'phone': 3, 'desk': 3} my_dict['computer'] # 2 my_dict.keys() # dict_keys(['computer', 'desk', 'phone']) my_dict.values() # dict_values([2, 3, 3]) my_dict.items() # dict_items([('computer', 2), ('desk', 3), ('phone', 3)])
forループでdictionaryオブジェクトのキーと値を取得する
my_dict = { 'computer': 2 , 'phone': 3, 'desk': 3} for key, value in my_dict.items(): print (key, value)
4-2-2. 実践演習
下記のdictionaryオブジェクトを使用してそれぞれのkeyとvalueを取得し、valueが20以上の場合{keyの中身}:hotと出力し、超えていない場合は{keyの中身}:coldと出力せよ(目標20分)
temperatures = { 'x': 24 , 'y': 18, 'x': 30} 出力: x:hot y:cold z:hot
4-2-3. 解答(Python コード サンプル/プログラム例)
以下の解答を見る前に、まずはご自身で実装してみましょう。
for key,value in temperatures.items():
if value>=20:
print(key+”:hot”)
else:
print(key+”:cold”)
4-3. 変更を許可しない変数等に使う配列(tuple)
4-3-1. 解説
タプルはリストとほぼ同じだが、リストは要素を消したり追加したり編集したりできるのに対し、タプルはできない。
タプルの構文は下記:
my_tuple = (1,2,3,4,5)
※タプルはリストとよく似ているがリストは[]でタプルは()で作成する。
ただしタプルは()がなくても構わない
タプルはリストと違いがあり要素の編集、追加、削除はできないが一旦リストに変換し編集を行ってからまたタプルに変換するか別タプルに作り直すなどの方法を使う。
タプルへの要素の追加:
tuple_1 = (1,2,3)
上記のタプルに(4,5,6)データを追加したいとき、tuple_1.append(4)とかくと
「AttributeError: ‘tuple’ object has no attribute ‘append’」とエラーがでてしまう。
なので下記のように既存のタプル自体に追加したのを+して新しいタプルとして作り直すことはできる。
tuple_2 = tuple_1 + (2,3,4)
中身を左の変数に格納することが可能
x,y = (1,2)
タプル同士は結合可能
tuple = (1,2) + (3,4)
1つの要素のタプル
(1,)
4-3-2. 実践演習
(1,2,3)のタプルの値をx,y,zの変数にそれぞれ格納せよ(目標5分)
4-3-3. 解答(Python コード サンプル/プログラム例)
以下の解答を見る前に、まずはご自身で実装してみましょう。
x,y,z = (1,2,3)
4-4. 集合演算等に使う配列(set)
4-4-1. 解説
セット型はリスト型と同じく複数の値を格納可能。
ただ、下記の点でリスト型が異なる。
- 要素が重複できない(同じ値は格納できない)
- 順序の保証がない
セットの構文は下記:
my_set = set([ 1,2,3,4,5 ])
セットに要素を追加したい時はadd関数を使う。
構文は下記:
my_set.add(6) #{1, 2, 3, 4, 5, 6}
セットから要素を削除したい時はremove関数を使う。
構文は下記:
my_set.remove(6) #{1, 2, 3, 4, 5}
既にある要素を追加しても何も起こらない
my_set.add(5) #{1, 2, 3, 4, 5, 6}
4-4-2. 実践演習
ランダムに1~100の値を100個生成し、生成された数値を1度ずつ表示せよ。(目標15分)
my_set = set([ 1,2,3,4,5 ]) for i in my_set: print(i)
4-4-3. 解答(Python コード サンプル/プログラム例)
以下の解答を見る前に、まずはご自身で実装してみましょう。
import random
my_set = set([])
for i in range(100):
my_set.add(random.randint(0, 100))
for i in my_set:
print(i)
4-5. 配列等を処理する関数(map, filter, reduce)
4-5-1. 解説
map
map関数はリストのようなオブジェクト(シーケンス)と関数を引数として受け取る関数。
受け取ったシーケンスの各要素に対して受け取った関数を実施して、その結果を返しす。
mapの構文は下記:
map(関数,シーケンス)
my_list = [ 1,2,3,4,5 ] new_list= list(map(lambda x: x*2 , my_list)) print(new_list) #[2, 4, 6, 8, 10]
上のようにmy_listの各要素を2にかけてmapオブジェクトを返す。
返したmapオブジェクトをそのまま出力すると「<map object at 0x7f363c007828>」のように表示されるため、リスト化「list()」後変数に入れる。
filter
filterはリストやタプルの要素の中で関数を通用した結果がTrueになる要素だけを返す。
filterの構文は下記:
filter(関数,シーケンス)
my_list = [ 1,2,3,4,5 ] new_list= list(filter(lambda x: x>3 , my_list)) print(new_list) #[4,5]
上のプログラムではxの値が3より大きいものだけを返す。
filter関数もfilterオブジェクト「<filter object at 0x7f363c007dd8>」を返すので出力する前にはリスト化「list()」する必要がある
reduce
reduce関数はリストやタプルの要素を足し合わせたり、かけ合わせたりする関数。
reduceの構文は下記:
reduce(関数,シーケンス)
from functools import reduce from operator import add my_list = [ 1,2,3,4,5 ] print(reduce(add, my_list)) #15
add関数は+と同じ処理をする関数
※python3ではreduceを使う前に、functoolsをimportする必要がある
4-5-2. 実践演習
1)ランダムな0~100の数値を20個生成しリストに格納せよ
2)リストの中身を2乗せよ(map)
3)リストから2000以下の数値を取り出して表示せよ(filter)
4)取り出した数値を全て合計して表示せよ(reduce)
my_list = [] for i in range(5): my_list.append(i) print(my_list) #[0,1,2,3,4]
(目標30分)
4-5-3. 解答(Python コード サンプル/プログラム例)
以下の解答を見る前に、まずはご自身で実装してみましょう。
import random
my_list = []
for i in range(100):
my_list.append(random.randint(0,100))
#1)
my_list = list(map(lambda x:x**2,my_list))
#2)
my_list = list(filter(lambda x:x<=2000,my_list))
print(my_list)
#3)
from functools import reduce
from operator import add
#4)
print(reduce(add, my_list))
4-6. リストの内包表記
4-6-1. 解説
内包表記とはリストのようなシーケンスオブジェクトの各要素に対して処理を行いたい時に便利。
forループで行う処理を一行で処理できる
例として1から10までの数字に2をかけたリストを生成して見る。
my_list = [1,2,3,4,5] my_list = [x*2 for x in my_list if x > 3] print(my_list) #[8, 10]
4-6-2. 実践演習
1)ランダムな0~100の数値を10個生成しリストに格納せよ
2)それぞれの数値を2乗し、出力せよ
(目標15分)
4-6-3. 解答(Python コード サンプル/プログラム例)
以下の解答を見る前に、まずはご自身で実装してみましょう。
#1)
import random
my_list= [random.randint(0,100) for i in range(10)]
#2)
print([x**2 for x in my_list])
4-7. 文字列に対する結合・分割
4-7-1. 解説
結合
文字列を結合したい時には下記の様にfor文を使い+=で結合可能
my_list = ['Hello ', 'How ', 'are ','you ','? '] my_str = '' for value in my_list: my_str += value #my_str = my_str + value と同じ print(my_str) #Hello How are you ?
Pythonではjoin関数を使うと簡単で綺麗に文字列を結合することができる。
join関数の構文は下記:
文字列 = ‘区切り文字’.join(結合したい文字列)
例:
my_list = ['Hello', 'How', 'are','you','?'] my_str = ' '.join(my_list) print(my_str) #Hello How are you ?
分割
文字列を、特定の区切り文字でリストに変換したい時はsplit関数を使う。
split関数の構文は下記:
文字列.split(‘区切り文字’)
例:
my_str = 'Hello How are you ?' my_list = my_str.split(' ') print(my_list) #['Hello', 'How', 'are', 'you', '?']
4-7-2. 実践演習
下記のリスト中の文字列をカンマ(,)で結合し結果を表示せよ
2)上記の文字列の結果を利用し、文字列リストに戻して出力せよ
(目標15分)
4-7-3. 解答(Python コード サンプル/プログラム例)
以下の解答を見る前に、まずはご自身で実装してみましょう。
#1)
my_list = ['computer', 'tv', 'sofa','desk']
join_str = ‘,’.join(my_list)
print(join_str)
#2)
print(join_str.split(‘,’))
5. 関数・例外処理
本章の内容
関数の定義方法、使い方、例外処理の使い方を解説
5-1. 関数
5-1-1. 解説
ある機能をまとめているものを関数と呼ぶ。
これまでの中でも既に関数を使用してきた。
例えば画面上に何かを出力したい時はprint()関数をリスト化した時などにはlist()関数。
関数の構文は下記:
def 関数名():関数の中で行いたい処理
def show(): print('こんにちは')
上の関数「こんにちは」を画面上に出力してくれる。
5-1-2. 実践演習
addという関数を定義し、関数内で5と10を足した結果を出力するようにせよ。
(ただし実行はしなくてよい。)
(目標10分)
5-1-3. 解答(Python コード サンプル/プログラム例)
以下の解答を見る前に、まずはご自身で実装してみましょう。
def add():
print(5+10)
5-2. 呼び出し方
5-2-1. 解説
ただし、関数はそのまま書いてるだけでは実行されないため、使いたい箇所から呼び出す必要がある。
呼び出し方の構文は下記:
関数名()
例えば前のページに定義したshow関数を呼び出したい時は show()と書く
5-2-2. 実践演習
5-1-2の関数(def)で定義したadd関数を呼び出せ(目標10分)
5-2-3. 解答(Python コード サンプル/プログラム例)
以下の解答を見る前に、まずはご自身で実装してみましょう。
def add():
print(5+10)
add()
5-3. 引数
5-3-1. 解説
前定義したshow関数は呼び出すたびに「こんにちは」を出力するが、呼び出すたびに別の文字列を出力したい場合もある。
そのような場合、関数に引数(呼び出し元から関数に渡されるもの)を定義し、引数で受け取った値を関数内で処理する。
引数の構文は下記:
関数名(引数・・)
※ 引数は複数渡すこともできる
def show(sentence): print(sentence) show('こんばんは') #こんばんは
5-3-2. 実践演習
1)5-1-2の関数(def)で定義したadd関数でnum_1とnum_2という数型の引数を受け取り、渡したnum_1とnum_2を足すように変更せよ
2)add関数に10,20を渡し、30が出力されることを確認せよ
(目標20分)
5-3-3. 解答(Python コード サンプル/プログラム例)
以下の解答を見る前に、まずはご自身で実装してみましょう。
def add(num_1,num_2):
print(num_1+num_2)
add(10,20)
5-4. 戻り値
5-4-1. 解説
前回のshow関数では、文字列を出力するだけであったが、呼び出し元で文字列を受け取りたい場合がある。
そのような場合、関数の戻り値を使用する
戻り値を返す関数の構文は下記:
関数名(引数・・): return 戻り値
def show(name): return name + “さんこんばんは” text = show('タロウ') print(text) #タロウさんこんばんは text = show('次郎') print(text) #次郎さんこんばんは
5-4-2. 実践演習
1)5-3-2の関数(def)で定義したadd関数でnum_1とnum_2を足した値を返すように変更せよ
2)add関数に10,20を渡して戻り値を受け取り、出力せよ
(目標20分)
5-4-3. 解答(Python コード サンプル/プログラム例)
以下の解答を見る前に、まずはご自身で実装してみましょう。
def add(num_1,num_2):
return num_1+num_2
print(add(10,20))
5-5. 無名関数(lambda)
5-5-1. 解説
myfunc = lambda x: x += 2
上記は、下記と同じ意味となる。
def myfunc(x): return x += 2 myfunc(23) # 25 myfunc(34) # 36
5-6. 例外処理
5-6-1. 解説
プログラムのコードが構文的に間違っている場合は構文エラーが発生するが、プログラムのコードや式が構文的に全て正しい場合でもプログラムを実行する時にエラーが発生する場合がある。
プログラム実行中に発生したエラーは例外(exception)と呼ばれ、常に致命的(プログラムが停止してしまう)とは限らない。
例外が発生するかもしれないソースコードのところで、もしこの例外が発生したらこうしますというソースコードを書いて置くことができ、それを例外処理と呼ぶ。
全ての例外がプログラムを停止させることはできないが、プログラムが停止してしまうと困るので場合によって例外処理をすることが必要。
例外処理はtry,exceptで行うことができる。
例外は:
- 数値型と文字列型を+で結合する時
- リスト内に存在しない要素を削除する時
- 数値を0で割る時
等で発生する。
num = 1 print (num/0)
上のプログラムではZeroDivisionErrorという例外が発生する。
例外が起きた場合、通常処理が中断され、その後の処理は行われない。
例外が起きた場合に特定の処理を施し、処理を続けたい場合には例外処理を書く。
try, exceptの構文は下記:
try:
例外が発生する可能性のある処理
except 発生しうる例外_1:
例外1が起きた場合に行いたい処理
except 発生しうる例外_2:
例外2が起きた場合に行いたい処理
except:
上のexceptに記載していない例外が発生した時に行いたい処理
finally:
例外が起きても起きなくても行いたい処理
def divide(num_1,num_2): print num_1/num_2
上のdivide()関数をdivide(3,0)として呼び出す時には例外が発生してしまいプログラムが停止してしまう。
それを防ぐ為にZeroDivisionError例外が発生する時にを処理してくれるソースコードをかく。
def divide(num_1,num_2): try: print(num_1/num_2) print(‘success’) except ZeroDivisionError: print('ZeroDivisionError発生') except: print('何らかの例外発生')
上のプログラムではdivide(3,0)と呼ぶとプログラムは停止せずに「ZeroDivisionError発生」というエラーメッセージが表示される。
divide(3,0)
その他の例外が発生する時は「何らかの例外発生」のメッセージが表示される。
divide(3,'test')
5-6-2. 実践演習
実践演習5-3-2で作成したadd関数は引数が数値でなかった場合に例外を発生する可能性があるため、その場合は0を返すようにせよ(目標10分)
5-6.3. 解答(Python コード サンプル/プログラム例)
以下の解答を見る前に、まずはご自身で実装してみましょう。
def add(num_1,num_2):
try:
return num_1+num_2
except:
return 0
6. 各種データを扱うモジュール
本章の内容
データサイエンスや機械学習でよく使われるpandas,numpyの使い方を解説
- 6-1. 数学でよく扱う関数が扱える(math)
- 6-2. 配列の高速処理が可能(numpy)
- 6-3. 行列データの集計・抽出(pandas)
- 6-4. APIを使う場合等に有用(requests)
- 6-5. よく使うデータフォーマット1(json)
- 6-6. よく使うデータフォーマット2(xml)
- 6-7. 形態素解析(mecab)
6-1. 数学でよく扱う関数が扱える(math)
6-1-1. 解説
数学でよく扱う関数が扱えるモジュール。
構文は下記:
import math #切り上げ math.ceil(1.2) #2 #切り捨て math.floor(1.2)#1 #絶対値 math.fabs(-5) #5 #累乗 math.pow(3,2) #9 #余弦 math.cos(math.pi) #-1
6-2. 配列の高速処理が可能(numpy)
6-2-1. 解説
Pythonは他のコンパイラ言語と比べると処理が遅いが、numpyの配列オブジェクト「ndarray」を使用することで配列に関しては高速なデータ処理をすることが可能。
ndarrayとは一定の大きさをもつ、同じサイズや型で構成された複数の要素の多次元の配列である。
numpyはインストールして使用できる前にインポートすることが必要。
import numpy as np #numpyをnpとしてインポート
一次元配列の作成
numpyで配列を作成する時はasarray関数を使用する。asarrayには3つの引数を渡すことができる。
asarrayの構文は下記:
np.asarray(配列したいデータ・必須,データタイプ・任意,順位・任意)
listから配列を作成する時は
np.asarray([1,2,3]) #[1 2 3]
データタイプを渡すことで作成される配列の型を指定することができる。
例えばnp.int32,np.float32,np.float64などがある。
構文は下記:
my_arr = np.asarray([1,2,3],np.int32) #[1 2 3]
各要素が数値型の配列が作成される。
既存の配列のタイプを変えたい時はastype関数を使用する。
構文は下記:
既存の配列.astype(変更したいデータタイプ)
行列(多次元配列)の作成
行列を作成する時もasarray()関数を使用する
例えば[[1,2,3],[4,5,6]]の行列を作成したい時は
np.asarray([[1,2,3],[4,5,6]])
と書く。
numpyを使って配列の計算を簡単にできる。
my_arr = np.asarray([1,2,3],np.int32) print(my_arr * 3)#[3 6 9] print(my_arr+ 3)#[4 5 6]
と書くことで配列の各要素に対して演算処理がいっぺんに可能
dot関数を使って行列の積を求める
my_arr1 = np.asarray([[1,2,3],[4,5,6]]) my_arr2 = np.asarray([[7,8],[9,10],[11,12]]) my_arr3 = my_arr1.dot(my_arr2) print(my_arr3)# [[ 58 64] [139 154]]
numpyでは様々な関数を配列に適用することができる。その関数は各要素に対して処理される。
my_arr = np.asarray([1,2,3,4]) np.exp(my_arr)# array([ 2.71828183, 7.3890561 , 20.08553692, 54.59815003]) np.log(my_arr) #array([ 0. , 0.69314718, 1.09861229, 1.38629436]) np.sqrt(my_arr) #array([ 1., 1.41421356, 1.73205081, 2.])
6-2-2. 実践演習
1から10を順に格納したnumpyの配列を作成し、各要素を10倍して表示せよ(目標15分)
6-2-3. 解答(Python コード サンプル/プログラム例)
以下の解答を見る前に、まずはご自身で実装してみましょう。
import numpy as np
my_ary = np.asarray([i for i in range(1,11)])
print(my_ary*10)
6-3. 行列データの集計・抽出(pandas)
6-3-1. 解説
行列データを扱いやすくし、集計・抽出に使用するためのライブラリ。
pandasには主に2個のデータ形式がある。
- DataFrame : 行列型
- Series : DataFrameの中の1行
importが必要
import pandas as pd
DataFrameの作成
pd.DataFrameでDataFrameを作成することができる。
構文は下記:
pd.DataFrame({ 'カラム_1':[データリスト], 'カラム_2' : [データリスト], }) my_df = pd.DataFrame({ 'A' : [1, 2, 2, 3, ], 'B' : [1, 1, 2, 2, ] })
データ抽出
1.カラム名を指定し、そのカラムのデータを抽出する。
構文は下記:
my_df.‘コラム名'
例:
my_df.A #[1, 2, 2, 3, ]
例:
my_df[‘A’] #[1, 2, 2, 3, ]
2.条件を指定してその条件と当てはまる行を抽出する
構文は下記:
my_df.コラム名 == '比較したい値'
例:
my_df.A == [2] # [False,True,True,False]
Series
1.1行のデータからSeriesを作成する。
構文は下記:
from pandas import Series, DataFrame Series(data=[2,3])
2.カラム名
my_series = Series(data=[2,3], index=['x', 'y'])print(my_series[0]) print(my_series[1]) print(my_series['x']) print(my_series['y'])
CSV
データをカンマ区切りで表したテキストファイル
- 犬,dog
- 猫,cat
csvからデータ読み込み
pandasを使うと簡単にcsvからDataFrameに変換可能
df = pd.read_csv(“test.csv”, encoding="utf-8") df.columns = ['text', 'category']
6-3-2. 実践演習
Python チュートリアル用 csv をダウンロードし、pandasで読み込み、中身を出力せよ。
(目標20分)
6-3-3. 解答(Python コード サンプル/プログラム例)
以下の解答を見る前に、まずはご自身で実装してみましょう。
df = pd.read_csv(“spj.csv”, encoding="utf-8")
df
6-4. APIを使う場合等に有用(requests)
6-4-1. 解説
GetやPostリクエストを投げて結果を取得できる。APIを使う場合に有用なライブラリ。
構文は下記:
import requests r = requests.get('URL') print(r.text)
6-4-2. 実践演習
下記のcsvをrequestsで取得し、中身をそのまま表示せよ。
(目標10分)
6-4-3. 解答(Python コード サンプル/プログラム例)
以下の解答を見る前に、まずはご自身で実装してみましょう。
import requests
res = requests.get('https://spjai.com/wp-content/uploads/2018/07/spj.csv')
res.encoding = res.apparent_encoding
print(res.text)
6-5. よく使うデータフォーマット1(json)
6-5-1. 解説
JavaScript Object Notationの略で、データのフォーマットとしてよく用いられる。
下記のようなフォーマット。
[{“key”:”value”},{“key2”:”value2”}]
pythonでこのフォーマットを読み込むにはjsonモジュールを使う。
import json mydict = {‘price’:100,’name’:’apple’} print(json.dumps(mydict))
json_str = '[{"name":"apple"},{"name":"orange"}]' my_var = json.loads(json_str) print(my_var) #listとdictionaryで表現される print(my_var[0]) #{"name":"apple"} print(my_var[0][‘name’]) #apple
6-5-2. 実践演習
Python チュートリアル用 json
には果物の種類と値段のデータが入っている。
全ての果物の値段を合計した値を出力せよ
(目標15分)
6-5-3. 解答(Python コード サンプル/プログラム例)
以下の解答を見る前に、まずはご自身で実装してみましょう。
import requests,json
res = requests.get('https://training.spjservice.com/python/level1/fluits.json')
data = json.loads(res.text)
print(sum([int(x['price']) for x in data]))
6-6. よく使うデータフォーマット2(xml)
6-6-1. 解説
JSONと同じく、データのフォーマットとしてよく用いられる。
下記のようなフォーマット。
<?xml version=”1.0″ encoding=”utf-8″?> <data> <item>item1</item> <item>item2</item> </data>
pythonでこのフォーマットを読み込むには ElementTree モジュールを使う。
import xml.etree.ElementTree as etree tree = etree.parse(‘XMLのパス’) root = tree.getroot() print(root.tag) for book in root: for c in book: print(c.tag+”:”+c.text)
6-6-2. 実践演習
Python チュートリアル用 xmlには果物の種類と値段のデータが入っている。
全ての果物の値段を合計した値を出力せよ
(目標15分)
6-6-3. 解答(Python コード サンプル/プログラム例)
以下の解答を見る前に、まずはご自身で実装してみましょう。
import xml.etree.ElementTree as etree
res = requests.get('https://training.spjservice.com/python/level1/fluits.xml')
root = etree.fromstring(res.text)
price_sum = 0
for book in root:
for c in book:
if c.tag=='price':
price_sum+=int(c.text)
print(price_sum)
6-7. 形態素解析(mecab)
6-7-1. 解説
日本語の文章を形態素(意味をもつ表現要素の最小単位)に切るソフトウェアとしてmecabというものがある。
これを使うと、例えば
【SPJの住所が知りたい】
という文章をmecabを使って形態素解析した場合、
【株式会社|SPJ|の|住所|が|知り|たい】
のように形態素で切られたデータが得られる。
python上では下記のように使用可能。
import MeCab m = MeCab.Tagger ("-Ochasen") print(m.parse ("今日は眠いです"))
結果:
今日 キョウ 今日 名詞-副詞可能 は ハ は 助詞-係助詞 眠い ネムイ 眠い 形容詞-自立 形容詞・アウオ段 基本形 です デス です 助動詞 特殊・デス 基本形 EOS
形態素を1つずつ取得する方法は下記。
node.surface には形態素が、node.feature には品詞情報等が入ってくる
import MeCab m = MeCab.Tagger ("-Ochasen") #おまじない m.parse('') node = m.parseToNode("今日は眠いです") while node: print(node.surface) print(node.feature) node = node.nextMeCab(形態素解析)をPythonから2分で使えるようにする方法
6-7-2. 実践演習
1)“すもももももももものうち”という文章を形態素解析し、結果を確認せよ。
2)“今日はお台場に行く予定だったが雨なので寝た” という文章中の名詞を抽出せよ。
(目標15分)
3)“渋谷駅の場所を教えて下さい”と”渋谷駅はどこにあるのか教えて欲しい”を比較し、同じ形態素を抽出し、リストに入れよ。
4)“明日遊びませんか”と”よかったら明日遊ぼう!”を比較し、同じ形態素を抽出し、リストに入れよ。(原型で比較)
5)python上でmecabを使用して、引数として文章を受取り、形態素のリストを返す関数を作成せよ
6)第二引数で、品詞のリストを受け取り、その品詞に合致する形態素のみ返す様に変更せよ
7)mecabでは、もともと備わっている辞書をベースに形態素解析が行われているため、最新の語には対応していないことがある。その例を見つけよ。
(目標15分)
6-7-3. 解答(Python コード サンプル/プログラム例)
以下の解答を見る前に、まずはご自身で実装してみましょう。
#1)
import MeCab
m = MeCab.Tagger ("-Ochasen")
#おまじない
m.parse('')
node = m.parseToNode("すもももももももものうち")
while node:
print(node.surface)
print(node.feature)
node = node.next
#2)import MeCab
m = MeCab.Tagger ("-Ochasen")
#おまじない
m.parse('')
node = m.parseToNode("今日はお台場に行く予定だったが雨なので寝た")
surface_a = []
while node:
feature_a = node.feature.split(",")
if feature_a[0]=='名詞':
surface_a.append(node.surface)
node = node.next
print(surface_a)
#3)import MeCab
m = MeCab.Tagger ("-Ochasen")
#おまじない
m.parse('')
node = m.parseToNode("渋谷駅の場所を教えて下さい")
surface1_a = []
while node:
if node.surface!="":
surface1_a.append(node.surface)
node = node.next
node = m.parseToNode("渋谷駅はどこにあるのか教えて欲しい")
surface2_a = []
while node:
if node.surface!="":
surface2_a.append(node.surface)
node = node.next
intersection = set(surface1_a) & set(surface2_a)
print(intersection)
#4)import MeCab
m = MeCab.Tagger ("-Ochasen")
#おまじない
m.parse('')
node = m.parseToNode("明日遊びませんか")
surface1_a = []
while node:
feature_a = node.feature.split(',')
if node.surface!="":
if feature_a[6] != "*":
surface1_a.append(feature_a[6])
else:
surface1_a.append(node.surface)
node = node.next
node = m.parseToNode("よかったら明日遊ぼう!")
surface2_a = []
while node:
feature_a = node.feature.split(',')
if node.surface!="":
if feature_a[6] != "*":
surface2_a.append(feature_a[6])
else:
surface2_a.append(node.surface)
node = node.next
intersection = set(surface1_a) & set(surface2_a)
print(intersection)
#5)def get_tokens(text):
node = m.parseToNode(text)
surface_a = []
while node:
if node.surface!="":
surface_a.append(node.surface)
node = node.next
return surface_a
#6)def get_tokens(text,hinshi_a = []):
node = m.parseToNode(text)
surface_a = []
while node:
feature_a = node.feature.split(',')
if node.surface!="" and feature_a[0] in hinshi_a:
surface_a.append(node.surface)
node = node.next
return surface_a
#7)
パイナッポーアッポーペン
恋ダンス
等
7. 総合演習
本章の内容
- 7-1. 総合演習1|倍数
- 7-2. 総合演習2|統計分析
- 7-3. 総合演習3|最大公約数、最小公倍数
- 7-4. 総合演習4|素数
- 7-5. 総合演習5|フィボナッチ数列
- 7-6. 総合演習6|乱数、近似値
7-1. 総合演習1|倍数
7-1-1. 演習問題
1から100までの数を出力するプログラムを書け。ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」と出力し、3と5両方の倍数の場合には「FizzBuzz」と出力せよ。
(目標120分)
7-1-2. 解答(Python コード サンプル/プログラム例)
以下の解答を見る前に、まずはご自身で実装してみましょう。
for i in range(1,101):
if i%15==0:
print('FizzBuzz')
elif i%5==0:
print("Buzz")
elif i%3==0:
print('Fizz')
else:
print(i)
7-2. 総合演習2|統計分析
7-2-1. 演習問題
kaggleというサイトでは、様々な分析用データがダウンロード出来る。
kaggleに登録を行い、下記の国勢調査結果データ(年齢・性別・収入等のデータ)をダウンロードする。
kaggle dataset
その上で、下記を実装せよ。ただしfor文,while文は使ってはならない。
1)データセットの年齢の平均値を出力
2)データセットの年齢の合計値を出力
3)データセットの中で男性の割合(%)を出力
4)女性、30代で、50k以上の収入がある人を全て出力
5)3)のデータを別名でcsvファイルとして書き出す
6)レコードからランダムに3つ取り出してレコード内容を表示せよ
7) 性別・年齢の項目以外を消去したデータにし、csvに書き出せ
8)上記のファイルをさらにjsonとしてファイルに書き出せ
9)ageとhours-per-weekの関係について散布図を表示せよ
10)ageを10代毎に区切り、ヒストグラムを表示せよ
(目標120分)
7-2-2. 解答(Python コード サンプル/プログラム例)
以下の解答を見る前に、まずはご自身で実装してみましょう。
import pandas as pd
df = pd.read_csv('adult.csv')
#1)
print(df['age'].mean())
#2)
print(df['age'].sum())
#3)
print(len(df[df.gender == 'Male'])*100 / len(df))
#4)
print(df[(df.gender == 'Female') & (df.age >= 30) &(df.age < 40) & (df.income == '>50K')])
#5)
df[(df.gender == 'Female') & (df.age >= 30) &(df.age < 40) & (df.income == '>50K')].to_csv('out.csv')
#6)
df.sample(3)
#7)
df[['age','gender']].to_csv('out.csv', index=False)
#8)
df[['age','gender']].to_json('out.json')
#9)
df.plot(kind='scatter',x='age',y='hours-per-week')
#10)
ax= df.plot( y=['age'], bins=8,range=(0,80), kind='hist')
7-3. 総合演習3|最大公約数、最小公倍数
7-3-1. 演習問題
1)2つの整数を引数に受け取り、その2つの数の最大公約数を返すプログラムを書け(目標60分)
2)2つの整数を引数に受け取り、その2つの数の最小公倍数を返すプログラムを書け(目標60分)
7-3-2. 解答(Python コード サンプル/プログラム例)
以下の解答を見る前に、まずはご自身で実装してみましょう。
#1)
def gcd(a, b):
while b:
a, b = b, a % b
return a
#2)
def lcm(a, b):
return a * b // gcd (a, b)
7-4. 総合演習4|素数
7-4-1. 演習問題
1000までの素数を全て表示せよ(目標60分)
7-4-2. 解答(Python コード サンプル/プログラム例)
以下の解答を見る前に、まずはご自身で実装してみましょう。
prime_list = []
print(1)
for i in range(2,1000):
is_prime = True
for prime in prime_list:
if i % prime==0:
is_prime=False
if is_prime:
print(i)
prime_list.append(i)
7-5. 総合演習5|フィボナッチ数列
7-5-1. 演習問題
以下のように前の2つの数を足した数の列をフィボナッチ数列という。
1 1 2 3 5 8 13 21 34 55 89 144 …
この数列を100番目まで表示せよ。
(目標60分)
7-5-2. 解答(Python コード サンプル/プログラム例)
以下の解答を見る前に、まずはご自身で実装してみましょう。
def fib(n):
a, b = 0, 1
for i in range(n):
a, b = b, a + b
return b
print([fib(i) for i in range(100)])
7-6. 総合演習6|乱数、近似値
7-6-1. 演習問題
円周率の近似値を求める方法として、乱数を使う方法がある。
今回は下記のように1×1の四角のなかにランダムに点を打ち、その点を大量に打つことで円周率を求める。
(0,0)の座標からの距離が1よりも小さい点の数と1よりも大きい点の数を比較することで、下記のように円周率を求めることが出来る。
そのプログラムを書け。
円周率 = 4 *(距離が1よりも小さい点の数) / (全ての点の数)
#0~1.0の範囲の擬似乱数の生成
import random
random.random()
(目標120分)
7-6-2. 解答(Python コード サンプル/プログラム例)
以下の解答を見る前に、まずはご自身で実装してみましょう。
import random
inner = 0
for i in range(10000):
x, y = random.random(), random.random()
if x**2 + y**2 < 1:
inner += 1
print(inner *4 / 10000)