Home > 研究日誌 > 【python】関数の気持ちになって考える。

【python】関数の気持ちになって考える。

これからはpythonおじさん
これからはpythonだから、覚えておいた方がいいよ。

おじさんが言うように、ラズベリーパイでIoTプログラミングをするにも、Pythonで書かれていたりするし、何といっても「読みやすい」というのが私もpythonを気に入ってるところです。

pythonの入門書は何冊か読みました。

言語の基本自体はさほど難しいとは感じませんでしたが、少し頭がこんがらがる部分がありましたので、二つほど、ご紹介したいと思います。

最初に「??」となったのが、文字列の部分取得。
文字列変数の後ろに[ ]書きをすることにより、文字の一部分を取り出すことができます。この取り出す際の位置指定がわかりづらいんです。

 str = "ABCDEF"
 print(str[1:3]) # "BC"

目的は、”BC”を取り出したい。
“A”が0文字目なので、”B”が1文字目。そこから二文字を取りたいので、

 print(str[1:2])

と書きたいのだが!違うというね。str[1:2]の出力結果は、”B”になります。

コロンの右側の数字は、取り出したい最後の文字の位置+1を指定する、って書いてあったりしますが、「そんな覚え方はしたくない。」と脳が反射的に返事をしてきます。
文字を0から数えはじめる時点で脳みそに無理させてるのに、そのほかにも頭ひねるなんてまっぴらごめんです。笑

で、ストンと脳に収まったのが、下記の考え方。

定規をイメージして、Aの前に0センチメートルがあって、AとBの間に1センチメートルのメモリがある。Cまで取りたいとすれば、CとDの間にある目盛り、3センチメートルを指定して切り取る、という概念みたいです。

|A|B|C|D|E|F|
0 1 2 3 4 5 6

str = "ABCDEF"
print(str[1:3]) #"BC"
print(str[4:6]) #"EF"

スライスっていうみたいですね。基本を覚えろよーってことですね。すみません。

あと頭を抱えたのが、これ。

def counter():
    count = 0

    def inner_counter():
        nonlocal count
        count += 1
        return count

    return inner_counter

cnt = counter()
print(cnt()) #1
print(cnt()) #2
print(cnt()) #3

クロージャー(closure)という説明の中のサンプルコードでして、ここではクロージャーについては説明しませんし、クロージャーはわかるのです。

しかし、

まるたしん
print(cnt())を実行するごとにcount = 0を通るじゃん?
なのに出力結果は、常に1ではなく、なぜ1ずつ上がっているのか。

このサンプルコードを眺め続け、やがて睡魔に襲われてしまう日々。苦笑

よくわからないので、関数の気持ちになって考えてみます。

cnt = counter()

これで、

まるたしん
cntよ。お前はcounterという関数だ。
cnt君
了解!

cnt君は、counter関数というものがどんなものかを理解するため、お散歩に出ます。

def counter():
    count = 0
cnt君
countという名前の変数があって、値は0なんだな。わかった。
    def inner_counter():
        nonlocal count
        count += 1
        return count

    return inner_counter
cnt君
自分が返す値は、inner_counter関数で計算された値なんだな。わかった。

覚えたぞ!

まるたしん
よし、cntよ。それでは君のことを教えてくれ!
print(cnt())
cnt君
お!呼ばれた!!

ドキドキ・・・

自分が返す値は、inner_counter関数の結果だったな。

    def inner_counter():
        nonlocal count
        count += 1
        return count

    return inner_counter
cnt君
countは、0だったので、1足して、・・・

答えは1だよ。

まるたしん
おお!
よし、もういっちょ!
print(cnt())
cnt君
お!また呼ばれた!!
自分が返す値は、inner_counter関数の結果だったな。
    def inner_counter():
        nonlocal count
        count += 1
        return count

    return inner_counter
cnt君
countは、さっき1だったので、1足して、・・・

答えは2だよ。

まるたしん
おお!
よし、もういっちょ!
print(cnt())
cnt君
しつこいよ!
まるたしん
え?(;゚Д゚)

関数の立場に立てば、何となく考え方も、気持ちも、わかったような気がします・・・。

これでいいのか悪いのか。笑

とりあえずこれで理解しときますが、きちんとご説明をしていただけるマルタスフリークの方がもしいらっしゃいましたら、コメントやメールいただけたら幸いです。

では!ノシ

Comments:2

Multashin 18-10-16 (火) 21:09

匿名さん

こんにちは。
設定が保存されない項目は、いくつかの項目でしょうか、それとも全部でしょうか。
当方の環境では再起動しても保存されているように見受けられます。
もう少しおしえていただければ幸いです。

匿名 18-10-14 (日) 16:58

ムヴカソ君ver1.3,1.2 両方とも再起動時に設定が保存されない状況に見舞われております。
ページ違いだとは思いますが、対応策等ありましたら教えていただけると助かります。

win10 homeでの環境です。

Comment Form
Remember personal info

Home > 研究日誌 > 【python】関数の気持ちになって考える。

Search
Feeds
Meta

Return to page top