eljefeblog 

Any sufficiently advanced technology is indistinguishable from magic

programming python_problems

独学でPythonを学ぶのは無理じゃない【プログラミング練習問題】

独学でPythonを学ぶのは無理じゃない【プログラミング練習問題】




(Pythonの基本を初めからしっかり学びたい方はこちら↓↓)



プログラミングの基本を学んだ方からよくこのような質問を頂きます。

悩むペン銀

Pythonの基本構文を学んで、プログラミングに対する基礎知識もある程度勉強したんだけど、次に何をすればいいのか分からない。次に何をすればより成長できるか教えて欲しい



こう言った『次に何すればいいか分からない』と言う疑問に対し、



僕からの回答を言うと、



『問題を沢山解きましょう』

です。




これこそプログラミング力飛躍的に向上させる一番の近道です。




このシリーズを最後まで学習することで、これまで学んできた基礎知識を定着させ、
最終的に様々な問題をPythonを駆使して解決できるようになるはずです。



本シリーズを習得した後、
得ることができる主な知識・内容は以下4点です。


本記事の内容

  • Pythonプログラミングの基礎を身に付けることができる
  • 実際に問題を解くことで、より具体的な組み込み関数などの知識を得ることができる
  • プログラミング的思考を養うことができる
  • 世に蔓延る様々な実践問題に立ち向かう準備ができる


  • この記事を書いている僕は国立大学にてCSの学位を保有しており
    エンジニアとしての仕事では現実問題を解き続けています。



    実際に問題を解いていくと今まで知らなかった便利な組み込み関数や
    新しい思考プロセスを学ぶことができます。



    それではやっていきましょう。







    (注) 問題のレベルについて



    以下に示す問題のレベルは五段階に分割しています。
    あくまでも目安なので、自分が解いてみたい問題から手をつけてみてください。

  • very easy
  • easy
  • normal
  • difficult
  • very difficult






  • 【問題1】二次方程式 レベル: normal


    【問】二次方程式を解く関数を作成せよ



    ルール


    以下の規則に従った関数solve_equation関数を作成してください。
    パッケージの利用は認めます。

  • nx^2+mx+b=0の時、xを計算する関数
  • 引数はn,m,bの3つ
  • nはx^2の係数
  • mはxの係数
  • bは定数値


  • 具体例


    作成したsolve_equation関数に引数を与えた時、
    結果は以下のようになります。

  • solve_equation([1,4,3]) → -1, -3
  • solve_equation([1,-2,-8]) → 4, -2
  • solve_equation([2,-2,8]) → No solution



  • 注意事項



    以下の要点を満たすような設計を行います。

  • 全ての数値は整数値である事
  • 戻り値について、解がある場合、setで返す事
  • 解がない場合、’No solution’の文字列を返す事



  • テスト


    以下のテストコードをエラー無く通過できれば正解です。
    あなたの回答を書き込んで関数を完成させ、確認してみましょう。

    # 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'
    数値計算ライブラリのNumpyを知っていますか?




    解答例



    少なくとも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関数を作成してください。

  • 引数として文章一つ、単語2つの計3つ文字列を受け取る
  • 文章中において、単語の1つ目が2つ目のどの単語と比較しても文頭に近い場合、Trueを、そうでない場合はFalseを返す



  • 具体例


    作成した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




    注意事項


    以下の要点を満たすような設計を行います。

  • 引数として受け取るのは小文字の文字列のみ
  • 2つ単語は文章中に必ず1つ出現するとする



  • テスト


    以下のテストコードをエラー無く通過できれば正解です。
    あなたの回答を書き込んで関数を完成させ、確認してみましょう。

    # 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学位取得者がプログラミングスクールを調査してみた件【おすすめのスクール】







    このエントリーをはてなブックマークに追加
    data-ad-format="rectangle" data-ad-format="rectangle"

    返信する

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

    某国立大学大学院(理系)に所属しています。 最近の趣味は人工知能関連の論文を読む事で 研究ではComputer Vision周りを中心に活動しており、 サイドワークとしてデータ分析の業務に関わっています。 本ブログはこれまで筆者が学んできた様々な知識の中から 有益だと思えた情報のみをまとめたものです。 内容は個人の見解であり、所属する機関と関係するものではありません。 Research: is related to Computer Vision Hobby: is to study Artificial Intelligence / Machine Learning.