eljefeblog 

Any sufficiently advanced technology is indistinguishable from magic

programming python_problems

Pythonの基本を学ぶ【プログラミング練習問題】

Pythonの基本を学ぶプログラミング練習問題




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



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

悩むペン銀

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



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



僕からの回答を言うと、



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

です。


世の中には解決を待っている問題がたくさんあります。
例えば

  • いつ発生するか予測できない地震の問題
  • 海に捨てられた大量のゴミによって動物たちが死んでしまう問題
  • 宅配サービスの急増により、各所で悲鳴をあげる宅配員の過労環境
  • 飲食店で毎日当たり前のように捨てられる残飯。。etc



  • 事の大小はあれど、
    少し考えただけでも身の回りに沢山の問題が溢れていることに気づくでしょう。



    『こんなサービスあったらいいのにな。。』



    プログラミングはこう言った問題解決に貢献できる力を持っています。
    世界中で民泊を一般化する事に成功したAirbnbも、
    こう言った現実問題を解決するためにできた企業の内の1つです。



    現実問題に真剣に取り組み、自分でアイディアを考え、解決していくことが
    プログラミング力飛躍的に向上させる一番の近道です。


    本シリーズでは深く述べませんが、
    例えばデータ分析関連の問題解決の場を提供しているkaggleでは企業が
    お金を出してコンペを開いており、優勝者にはかなりの金額の賞金が授与されます。
    学びを得ながら、お金も支給されるとても良い環境ですよね。



    しかし、kaggleに提示される問題然り、現実問題に然り、
    いきなり解決に取り組むには、初心者にとって難しく感じるでしょう。



    なので、まずはPythonを上手く使いこなせるようになりましょう!
    このステップを乗り越えて現実問題に取り組む事を真の目的にセットすると良いです。



    具体的にこのシリーズではPythonプログラミングの基礎を勉強した初心者の方向けに、
    レベル別に分割した『基礎力を固める練習問題』を提供していきます。



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



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


    本記事の内容

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


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



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



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









    【問題1】複数の型変換 レベル: 普通


    【問】引数で渡されたリスト内の全ての要素を以下の規則に従い、変換する関数を作成せよ。



    ルール


    以下の規則に従った関数convert_elements関数を作成してください。

  • 引数で渡されるリスト内の要素はstring型・int型・boolean型のいずれか
  • string型に関しては英語のみ、日本語は扱わない
  • 全てのint型の偶数値には2を乗算し、奇数値には1を加算する
  • 全てのstring型の文字列末尾に’?’を付け加え、文頭を大文字に変換する
  • 全てのboolean型を反対の値に変換する


  • 具体例


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

  • convert_elements([‘test’,’c’,132,True]) → [‘Test?’,’C?’,264,False]
  • convert_elements([13,’12’,’twelve’]) → [14,’12?’,’Twelve?’]
  • assert convert_elements([False,’False’,’true’]) → [True, ‘False?’,’True?’]



  • 注意事項



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

  • 全ての数値は整数値である
  • Stringとして数値と文字列は別として扱う



  • テスト


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

    # This will get executed each time the exercise gets initialized def convert_elements(arg): #ここにコードを入力してください return your_answer assert convert_elements(['test','c',132,True]) == ['Test?','C?',264,False] assert convert_elements([13,'12','twelve']) == [14,'12?','Twelve?'] assert convert_elements([False,'False','true']) == [True, 'False?','True?'] print("pass!")
    string型に用意されているデータ型関数.capitalizeをうまく使えると簡単かも?




    解答例



    少なくとも10分間は自分の頭で考えて問題を解きましょう。
    10分考えても解法が浮かばない場合は解答例を見て、問題の解き方を学んでください。

    
    def convert_elements(lst):
        result = []
        for i in lst:
            if type(i) is int:
                if i%2 == 0:
                    result.append(i*2)
                else:
                    result.append(i+1)
            elif type(i) is str:
                result.append(i.capitalize()+'?')
            elif type(i) is bool:
                result.append(not i)
        return result
    


    解説付き解答例

    
    def convert_elements(lst):
        result = []
        for i in lst:
            if type(i) is int: # 要素がint型(数値)である場合
                if i%2 == 0: # 要素が偶数である場合(偶数を2で割ると余りが0)
                    result.append(i*2)
                else:
                    result.append(i+1) # 要素が奇数である場合+1
            elif type(i) is str: #要素がstr型(文字)である場合
                result.append(i.capitalize()+'?') # 文字列の先頭を大文字に変換し、末尾に(+?)する
            elif type(i) is bool: # 要素がbool型の場合
                result.append(not i)
        return result
    












    【問題2】辞書操作 レベル:普通


    【問】仕入れた商品の単価と販売した価格、売り上げた個数の情報等を含んだ辞書を受け取り、最終利益を計算する関数を作成せよ



    ルール


    以下の規則に従った関数calculate_profit関数を作成してください。

  • 引数には辞書を受け取り、計算した利益値を小数点以下切り捨てした整数値で返す

  • 辞書の要素の詳細
  • cost_value:仕入れ値
  • sell_value:売値
  • stock_number:仕入れ個数
  • sold_number: 売った個数


  • 具体例


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

    
    calculate_profit({
    'cost_price': 43.12,
    'sell_price': 90.41,
    'stock_number':2300,
    'sold_number': 1900
    }) → 72603
    
    
    calculate_profit({
    'cost_price': 11.99,
    'sell_price': 43.00,
    'stock_number':400,
    'sold_number': 340
    }) → 9824
    
    calculate_profit({
    'cost_price': 1.29,
    'sell_price': 3.12,
    'stock_number':1388,
    'sold_number': 599
    }) → 78
    
    



    注意事項


    利益の計算方法は以下の要点を満たすような設計を行います。

  • 利益 = 売上 – 仕入れ


  • テスト


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

    # This will get executed each time the exercise gets initialized def calculate_profit(info): #ここにコードを入力してください    return your_answer assert calculate_profit({'cost_price': 12.33, 'sell_price': 89.03, 'stock_number':1433,'sold_number': 1200}) == 89167 assert calculate_profit({'cost_price': 3.13, 'sell_price': 8.19, 'stock_number':7433,'sold_number': 300}) == -20808 assert calculate_profit({'cost_price': 233.00, 'sell_price': 423.00, 'stock_number':4203,'sold_number': 3000}) == 289701 assert calculate_profit({'cost_price': 2.20, 'sell_price': 4.40, 'stock_number':1230,'sold_number': 809}) == 854 assert calculate_profit({'cost_price': 33.23, 'sell_price': 53.44, 'stock_number':8388,'sold_number': 3999}) == -65027 assert calculate_profit({'cost_price': 134.21, 'sell_price': 253.44, 'stock_number':438,'sold_number': 300}) == 17248 assert calculate_profit({'cost_price': 3.21, 'sell_price': 13.44, 'stock_number':442,'sold_number': 22}) == -1123 print("pass!")
    利益は商品の仕入れから、商品の売り上げを引いた値になります。



    解答例


    少なくとも10分間は自分の頭で考えて問題を解きましょう。
    10分考えても解法が浮かばない場合は解答例を見て、問題の解き方を学んでください。

    
    def calculate_profit(info):
        cost = info['cost_price']
        sell = info['sell_price']
        stock = info['stock_number']
        sold = info['sold_number']
        profit = sell*sold  - cost*stock
        return round(profit)
          


    解説付き解答例

    
    def calculate_profit(info):
        cost = info['cost_price'] # 仕入れ値を格納
        sell = info['sell_price'] # 売値を格納
        stock = info['stock_number'] # 仕入れ個数を格納
        sold = info['sold_number'] # 売った個数を格納
        profit = sell*sold  - cost*stock # 利益を算出
        return round(profit) 
          









    【問題3】文字列操作による暗号化 レベル: 難しい



    【問】引数として受け取った文字列を以下の手順に従って暗号化せよ


    ルール


    以下の規則に従った関数encrypt_string関数を作成してください。

  • 文字列を引数として受け取る
  • 受け取った文字列を逆転させる (ie. “vegetable” → “elbategev”)
  • 次のように母音を数値に変換する a→0, e→1, o→2, u→3 (ie. “elbategev”→”1lb0t1g1v”)
  • 最後に文末に”text”を追加する (ie.”1lb0t1g1v”→”1lb0t1g1vtext”)



  • 具体例


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

    
    encrypt_string("aaasd") → 'ds000text'
    encrypt_string("blosisoos") → 's22sis2lbtext'
    encrypt_string("eoullso133") → '3312sll321text'
    
    




    注意事項


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

  • 引数として受け取るのは小文字の文字列のみ
  • 全ての出力も文字列のみ



  • テスト


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

    # This will get executed each time the exercise gets initialized def encrypt_string(arg): #ここにコードを入力してください return your_answer assert encrypt_string("karaca") == "0c0r0ktext" assert encrypt_string("burak") == "k0r3btext" assert encrypt_string("banana") == "0n0n0btext" assert encrypt_string("alpaca") == "0c0pl0text" assert encrypt_string("hello") == "2ll1htext" print("pass!")
    リストのデータ型関数であるreversedreplaceを上手に使うと簡単かも。。




    解答例


    少なくとも10分間は自分の頭で考えて問題を解きましょう。
    10分考えても解法が浮かばない場合は解答例を見て、問題の解き方を学んでください。

    
    def encrypt_string(word):
        reversed_list=list(reversed(word))
        reversed_word=''.join(reversed_list)
        replace_a=reversed_word.replace('a','0')
        replace_e=replace_a.replace('e','1')
        replace_o=replace_e.replace('o','2')
        replace_u=replace_o.replace('u','3')
        result = replace_u+'text'
        return result
          


    解説付き解答例

    
    def encrypt_string(word):
        reversed_list=list(reversed(word)) # 要素を逆順に並び替える
        reversed_word=''.join(reversed_list) # つなげる
        replace_a=reversed_word.replace('a','0') # 文字列を数値(文字列)に置き換える
        replace_e=replace_a.replace('e','1')
        replace_o=replace_e.replace('o','2')
        replace_u=replace_o.replace('u','3')
        result = replace_u+'text' #文末に'text'を付加する
        return result
          








    まとめ



    問題を解いていく上で以下のようなプロセスを踏むのが普通です。

  • 自分の頭で問題の解法を考える
  • その解き方に必要な関数やアルゴリズムをネット上から自力で調べる
  • 解けない
  • また調べる→実装する→テストする
  • 解けない
  • また調べる→実装する→テストする


  • このように何度も現れる障壁を、諦めず乗り越え続けることで
    これまで得られなかったかなり実践的な知識を得る機会に出会います。


    裏を返せばこのような経験を避け続けてもプログラミングは上達しません。


    是非、自発的に考え、行動し、積極的に取り組んでいきましょう。




    問題集はこちら↓





    人気記事【初学者必見】効率的なプログラミング勉強方法を紹介します

    人気記事 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.