「自作Python100本ノック」3日目（11本〜15本目）

「自作Python100本ノック」3日目です。

「自作Python100本ノック」とは何ぞや？
どの程度のレベル感なのか？
どのように進めて行くのか？
など詳しくは[こちら](https://qiita.com/ahpjop/items/373f807d68044cda1c9b#%E8%87%AA%E4%BD%9Cpython100%E6%9C%AC%E3%83%8E%E3%83%83%E3%82%AF1%E6%9C%AC5%E6%9C%AC%E7%9B%AE)に整理してありますのでまずはそちらを確認するようお願いします。
それでは始めていきます！

##Q11: テキストファイル内の文字をアルファベット順に表示せよ。
テキストファイルの読み込み方と、最も簡単なソートのやり方となります。
　　　

```q11.py
a = open("alpha.txt").read().split()
a.sort()
a
````

↓のように関数を作ろうとすると、`None`となってしまいます。
~~（原因はわかりません。。どなたかわかる人いましたら教えてくださいm(._.)m）~~
 -> 解決しました。（コメント欄参照）

```notq11.py
def sort_text(text):
    text = open(text).read().split()
    aws = text.sort()
    print(aws)

sort_text("number.txt")
```
[参考][Pythonのお勉強　問題集](http://python.rdy.jp/wiki.cgi?page=%CC%E4%C2%EA%BD%B8#p12)

##Q12: テキストファイル内で指定した文字がいくつ含まれているか数える
問題：テキストファイルの中に、調べたい文字がいくつ含まれているか自動で数えさせるプログラムを書きなさい。

自然言語系の処理をやる際には使えそうですよね
　　　　　　


```q12.py
print(open("python.txt").read().count("by"))
```

↓関数を作る場合

```notq12.py
def count_lite(text,target):
    print(open(text).read().count(target))

count_lite("python.txt","by"）
```
[出典][Pythonのお勉強　問題集](http://python.rdy.jp/wiki.cgi?page=%CC%E4%C2%EA%BD%B8#p12)

##Q13: 摂氏と華氏を自動変換
問題：摂氏（℃）を入力すると華氏（°F）に変換し表示し、
　　　華氏を入力すると摂氏に変換表示してくれる関数を作成せよ。
条件：摂氏の場合は"26C"のように入力し、華氏の場合は"67F"のように入力する。

文字列（リスト）の最後の文字をどう取ってくるか。最後以外をどう取ってくるかの練習になりますね。
　　　

```q13.py
def convert(text):
    if text[-1] == "C":
        cel = int(text[:-1])#文字列の最後の文字を取り出す
        aws = cel * (9/5) + 32
    elif text[-1] == "F":
        fah = int(text[:-1])#文字列の最後以外の文字を取り出す
        aws = (fah -32) / (9/5)
    else:
        aws = "正しく入力してください"
    return aws

convert("45C") 
```
[参考][Pythonのお勉強　問題集](http://python.rdy.jp/wiki.cgi?page=%CC%E4%C2%EA%BD%B8#p12)
##Q14入れ子のリストを平らにする
問題：[[1,2],3,4,5,[6,[7,[8,9]]]]のように入れ子になっているリストを、
　　　[1, 2, 3, 4, 5, 6, 7, 8, 9]のように平らに入れ直したい。

`appen`と`extend`の違いの勉強になります。
（詳しくは[こちら](https://www.pythonweb.jp/tutorial/list/index6.html)を参考）
　　　
　　　

```q14.py
def flatten(ls):
    r = []
    for i in ls:
        if type(i) is list:
            r.extend(flatten(i))#appendではない。
        else:
            r.append(i)
    return r

lis_a = [[1,2],3,4,5,[6,[7,[8,9]]]]
print(flatten(lis_a))
```
[出典][cozeのページ　Python練習問題](http://coze.s201.xrea.com/python/prac.html)

##Q15: 対話型残業代自動算出システム
問題：「現在の時刻」「定時」「1時間あたりの残業代」を対話式に入力すると、
　　　　残業代が自動で表示されるシステムを作れ。
条件：時刻の入力は”17:00”のように入力される。

対話型の練習です。`float`に変換しないといけないのも練習になります。
　　　

```q15.py
print("現在の時刻を「18:45」のように入力してください")
current_time = input(">>")
print("定時を「17:00」のように入力してください")
out_time = input(">>")
print("1時間あたりの残業代（円）を「1500」のように入力してください")
hour_money = float(input(">>"))
current_h = float(current_time[0:2])
current_m = float(current_time[3:5])
current_time_min = (60 * current_h) + current_m　#分単位に統一
out_h = float(out_time[0:2])
out_m = float(out_time[3:5])
out_time_min = 60 * out_h + out_m
leave_time_min = current_time_min - out_time_min
leave_time_h = round((leave_time_min/60),2)
cal_money = leave_time_h * hour_money
print("あなたの残業時間は{0}時間です。残業代金は{1}円になります。".format(leave_time_h,cal_money))
```
[参考][python自習テキスト](http://giraffe.topaz.ne.jp/wiki/doku.php/py:python_curriculum)

##感想
基本的な文法を使って、問題を解くのは初期に比べてかなり慣れて来ました。
ただ、今回はテキストファイルの処理を関数でやろうとすると、うまくいかない問題が出て来てしまい、自分でも原因がわからなかったのが少し残念です。
どなたかわかる方いましたら、コメント、修正等で教えてもらえると助かります。
よろしくお願いします。

さて基本的な文法は少し飽きて来たので、
次回は、モジュールなんかも使った問題をたくさん解いて行きたいと思います。

見ての通り初心者なので、何か修正、アドバイス、感想等あればなんでも良いのでコメントもらえると助かります。よろしくお願いします。

→ [４日目](https://qiita.com/ahpjop/items/c036a9dbc2f8b4a23c62)