独学でPythonを学ぶのは無理じゃない【プログラミング練習問題】
(Pythonの基本を初めからしっかり学びたい方はこちら↓↓)
プログラミングの基本を学んだ方からよくこのような質問を頂きます。
悩むペン銀
Pythonの基本構文を学んで、プログラミングに対する基礎知識もある程度勉強したんだけど、次に何をすればいいのか分からない。次に何をすればより成長できるか教えて欲しい
こう言った『次に何すればいいか分からない』と言う疑問に対し、
僕からの回答を言うと、
『問題を沢山解きましょう』
です。
これこそプログラミング力飛躍的に向上させる一番の近道です。
このシリーズを最後まで学習することで、これまで学んできた基礎知識を定着させ、
最終的に様々な問題をPythonを駆使して解決できるようになるはずです。
本シリーズを習得した後、
得ることができる主な知識・内容は以下4点です。
本記事の内容
この記事を書いている僕は国立大学にてCSの学位を保有しており
エンジニアとしての仕事では現実問題を解き続けています。
実際に問題を解いていくと今まで知らなかった便利な組み込み関数や
新しい思考プロセスを学ぶことができます。
それではやっていきましょう。
目次
(注) 問題のレベルについて
以下に示す問題のレベルは五段階に分割しています。
あくまでも目安なので、自分が解いてみたい問題から手をつけてみてください。
【問題1】二次方程式 レベル: normal
【問】二次方程式を解く関数を作成せよ
ルール
以下の規則に従った関数solve_equation関数を作成してください。
パッケージの利用は認めます。
具体例
作成したsolve_equation関数に引数を与えた時、
結果は以下のようになります。
注意事項
以下の要点を満たすような設計を行います。
テスト
以下のテストコードをエラー無く通過できれば正解です。
あなたの回答を書き込んで関数を完成させ、確認してみましょう。
# This will get executed each time the exercise gets initialized
def calculate_result(n,m,b):
#ここにコードを入力してください
return your_answer
assert calculate_result([20,22,2]) == {-1.0,-0.1}
assert calculate_result([1,7,12]) == {-4.0,-3.0}
assert calculate_result([3,12,12]) == {-2.0}
assert calculate_result([3,-8,-1]) == 'No solution'
解答例
少なくとも10分間は自分の頭で考えて問題を解きましょう。
10分考えても解法が浮かばない場合は解答例を見て、問題の解き方を学んでください。コードを読んでもどうしても理解でき無ければ、最後のボタンを押してください。より詳細な解説を載せています。
また、予め頭に入れて欲しいのですが
プログラミングにおいて解決方法はほぼ無限にあります。
なので、よっぽど長ったらしいコードや
変数の命名規則から外れたものなどで無い限り
上記のテストが通るコードを書けたのであれば
現時点では問題ありません。
『あ、こういう解き方もあるんだな』
くらいの認識を持って先に進みましょう。
たくさん問題を解いて、余裕が出てきたら
同じ問題を特にしても様々な解き方があることを知り
さらに短く、効率的に実装できる方法は無いか
模索していくと良いでしょう。
import numpy as np
def calculate_result(args):
a, b, c = args
results=[]
for i in range(1,10):
for x in np.arange(-100,100,0.1):
x = round(x,i)
result=a*(x**2)+b*x+c
if result ==0:
results.append(x)
if len(results) != 0:
return set(results)
else:
return 'No solution'
詳細解説
#'numpy'のインポート
import numpy as np
def calculate_result(args):
"""引数としてa,b,cの3つを受け取る """
a,b,c = args
results=[]
for i in range(1,10):
for x in np.arange(-100,100,0.1):
x = round(x,i) # 浮動小数点数を段階的に切り捨てる
result=a*(x**2)+b*x+c
if result ==0: # 二次方程式に解が存在すればresultに格納する
results.append(x)
if len(results) != 0:
return set(results) #リスト内の重複を消すためset型にする
else:
return 'No solution'
Numpyとは
Pythonには学術計算をする時のためにnumpyというライブラリが用意されています。 行列の計算によく利用されます。 すでにPythonには、数学的な計算をする時のため組み込みで様々な関数が存在しますが、numpyを利用することで、コンピュータの演算速度速度が高速化したり、より手軽に計算をコードで記述できるようになります。 現在Pythonでコードを書くデータサイエンスの現場では使っていない人がいない程 ポピュラーなライブラリですので、学んでおく価値は大いにあるでしょう。例えば今回の問題では
np.arange()
という関数をnumpyのライブラリからインポートしてきて利用しています。この関数は連番や等差数列を簡単に生成することができ、 第一引数に数列の初期値、第二引数に数列の最終値、第三引数にstepすなわち生成する数列の1つ1つの要素の差を指定します。解答例では
np.arange(-100,100,0.1)
と引数を渡しているため、-100から99(100未満)までの数列を0.1刻みで生成し、for分で値を取り出しています。
【問題2】リスト操作 レベル: easy
【問】リストより最小値を見つけ排除せよ
ルール
以下の規則に従った関数remove_min関数を作成してください。
具体例
作成したremove_min関数に引数を与えた時、
結果は以下のようになります。
remove_min([2,3,4,2,4,2,3])→[3, 4, 2, 4, 2, 3] remove_min([323,23,23,232])→[323, 23, 232] remove_min([4,1,3,5,63,4,5])→[4, 3, 5, 63, 4, 5] remove_min([7,2,35,3,6,4,7])→[7, 35, 3, 6, 4, 7]
注意事項
以下の要件にしたがって関数を設計してください
テスト
以下のテストコードをエラー無く通過できれば正解です。
あなたの回答を書き込んで関数を完成させ、確認してみましょう。
# This will get executed each time the exercise gets initialized
def remove_min(lis):
#ここにコードを入力してください
return your_answer
assert remove_min([7,2,35,3,6,4,7]) == [7, 35, 3, 6, 4, 7]
assert remove_min([2,4,5,2,4,5,35,2]) == [4, 5, 2, 4, 5, 35, 2]
assert remove_min([3,6,8,4,6,43,5,6]) == [6, 8, 4, 6, 43, 5, 6]
assert remove_min([7,2,4,73,5,6,2,423]) == [7, 4, 73, 5, 6, 2, 423]
assert remove_min([22,3,42,3,2,3,7,9]) == [22, 3, 42, 3, 3, 7, 9]
assert remove_min([2,4,63,5,7,57,5,4]) == [4, 63, 5, 7, 57, 5, 4]
remove()
やmin()
を上手につかうと簡単かも。。解答例
少なくとも10分間は自分の頭で考えて問題を解きましょう。
10分考えても解法が浮かばない場合は解答例を見て、問題の解き方を学んでください。
def remove_min(lis):
target = min(lis)
lis.remove(target)
return lis
詳細解説
def remove_min(lis):
target = min(lis) # 引数のリストの中より最小値を見つける
lis.remove(target) # 引数のリスト中より見つけた最小値を左より1つ削除する
return lis
【問題3】文字列操作 レベル: difficult
【問】ある1つの文章と文字が2つ与えられる. 2つの内どちらの文字が文頭に近いか見つけ出せ
ルール
以下の規則に従った関数find_beginning関数を作成してください。
具体例
作成したfind_beginning関数に引数を与えた時、
結果は以下のようになります。
find_beginning("get a phone call from a cousin", "e",'g')→False find_beginning("get a phone call from a cousin", "c",'a')→False find_beginning("get a phone call from a cousin", "w",'i')→True
注意事項
以下の要点を満たすような設計を行います。
テスト
以下のテストコードをエラー無く通過できれば正解です。
あなたの回答を書き込んで関数を完成させ、確認してみましょう。
# This will get executed each time the exercise gets initialized
def find_beginning(arg):
#ここにコードを入力してください
return your_answer
assert find_beginning("it was nice and worm", "i",'n') == False
assert find_beginning("it was nice and worm", "t",'a') == True
assert find_beginning("it was nice and worm", "w",'n') == False
assert find_beginning("keep your room nice and clean", "e",'l') == False
assert find_beginning("keep your room nice and clean", "n",'k') == False
assert find_beginning("you will have to speak up", "w",'i') == True
解答例
少なくとも10分間は自分の頭で考えて問題を解きましょう。
10分考えても解法が浮かばない場合は解答例を見て、問題の解き方を学んでください。
def find_beginning(sentence,a,b):
index_a=[]
index_b=[]
sentence=list(sentence.strip(' '))
for i in range(len(sentence)):
if sentence[i] == a:
index_a.append(i)
elif sentence[i] == b:
index_b.append(i)
flag=0
for n in range(len(index_a)):
for z in range(len(index_b)):
if index_a[n] < index_b[z]:
pass
else:
flag+=1
if flag == 0:
return True
else:
return False
詳細解説
def find_beginning(sentence,a,b):
index_a=[] # 引数sentenceにおいて、引数aがどの位置にあるのかインデックスを格納するリスト
index_b=[] # 引数sentenceにおいて、引数bがどの位置にあるのかインデックスを格納するリスト
sentence=list(sentence.strip(' ')) # sentenceの文字列を単語に分割し、リストに格納する
for i in range(len(sentence)):
if sentence[i] == a:
index_a.append(i) # aの位置を格納する
elif sentence[i] == b:
index_b.append(i) # bの位置を格納する
flag=0 # sentence中に含まれる全てのaがbよりも文頭に近い場合0、そうで無い場合フラグを立てる
for n in range(len(index_a)): #事前に記録しておいたaとbの位置を1つ1つ比較し、全てのaがbより文頭に近いか否かを検証する
for z in range(len(index_b)):
if index_a[n] < index_b[z]:
pass # aがbより文頭に近い場合、何もしない
else:
flag+=1 # aがbより後ろにあった場合フラグを立てる
if flag == 0:
return True
else:
return False
人気記事 CS学位取得者がプログラミングスクールを調査してみた件【おすすめのスクール】