質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.74%

  • Python 3.x

    5277questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Pythonでのスコープの教え方

解決済

回答 5

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 206

itohkun55

score 1

 質問内容

子どもにプログラミングを教えており、題材としてPythonを利用しています。
現在スコープの説明をどうするかで悩んでおり、自分自身の理解の不足にも恥じ入るばかりです。

例えば、以下のようなプログラムがあった場合、
・なぜ「global targetWord」と書かなければいけないのか
・そもそもスコープとは何なのか
こどもにも納得がいく説明の仕方はないでしょうか?

大人だと「そうしないとエラーになってしまうのでそう書いてくださいね」で終わるので苦労はないのですが、、、

以上お知恵拝借、よろしくお願いいたします。

 該当のソースコード

#しりとりプログラム
import tkinter as tk
import time

window=tk.Tk()


lab=tk.Label(text="最初の文字は「しりとり」",fg="black")
lab.pack()

tex=tk.Text(width=15,height=1)
tex.pack()


targetWord="しりとり"

def bAction():

    sLast=targetWord[-1]

    textInput=tex.get('1.0','end-1c')

    #入力したことばの最初の文字を取る
    sFirst=textInput[0]

    #今の文字を取り出す 関数の外の変数にため、globalを使う **ここをどう説明しよう?**
    global targetWord

    if(sFirst==sLast):
        targetWord=textInput    
        lab.configure(text=targetWord)

    else:
        #間違えをしたら2秒だけ表示を変える
        lab.configure(text="文字が違うよ!")
        window.update()
        time.sleep(2)
        lab.configure(text=targetWord)
        window.update()

button=tk.Button(text="押す",command=bAction)
button.pack()
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 5

checkベストアンサー

+4

実際教えてみて子供の反応を見ていろいろ考えてください。
子供は親の想像を超えて理解が早かったり遅かったりします。

あと質問するときは年齢と、周囲の子供と比べて理解力がどうなのか、何に興味があるかくらいは書いておいた方がいいんじゃないでしょうか。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/19 15:37

    早々の回答ありがとうございます。
    この質問では、「スコープというものを子供が理解するための分かりやすい説明方法」のアイデアを募集いたしました。
    特定の子どもに対する内容ではないので、子ども自身の情報は省きました。

    キャンセル

  • 2018/04/19 15:42

    では少し一般化します。
    相手が大人であろうと子供であろうと自分がわかっていないものは教えらえません。
    自分が理解することこそが先決です。
    相手を見ずに「こう教えれば理解できるはず」というのは幻想です。
    相手に合わせてください。

    キャンセル

  • 2018/04/19 16:11 編集

    学校で先生と言えば教師だけど病院で先生と言えば医者のことです。
    場所が変わると同じ呼び方でも意味が変わります。

    関数の中で名づけられたものはその中でしか通用しません。
    家で時計と言えば壁にかかった鳩時計のことであっても、外に出て時計と言っても鳩時計が通じるとは限りません。
    腕時計であったり目覚まし時計であったり、みんなそれぞれ自分の時計をイメージします。
    逆に家族に時計の話をしたければ「学校の時計」のように「~の」が必要かもしれません。

    関数の中でつけられた名前が外で通じないことを「スコープが違う」と言います。
    スコープというのはその名前が通じる範囲のことです。
    global というのは英語で「世界」という意味、もっと言えば外世界のことを指します。
    つまり global targetWord というのは「外の世界の targetWord」という意味です。

    これだけ説明すると、わかる人には「わかりやすい」と言ってもらえますし、わからない人にはわかりません。

    キャンセル

  • 2018/04/19 16:20

    大変わかりやすい説明だと思います。
    現在教えているのは6年生の男の子と、中学生の女の子ですが、この説明をもとにして解説しようと思います。

    ありがとうございました。

    キャンセル

+3

ローカル変数、グローバル変数などの概念から一つずつ教えていき、簡単なプログラムなどで挙動を実感させて、最終的にスコープまで理解させるしかないと思いますが・・・
それが難しいくらいの年齢の子供たちに教えるのであれば、扱っている題材が難しすぎるのではないかと感じます。tkで何か作るのだと思いますが、それだと「教えられた通り書いたら動いた」以上の深い理解には至らないのでは。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/19 15:47

    そうですね、難しすぎるかという懸念はいつも持っているのですが、
    「ボタンイベントの関数の内と外で変数の意味が違う」という問題は簡単に出会う割には難易度が高いなあと思い、知恵を借りるため質問しました。

    上記サンプルを見ていただいて分かる通り、わかりにくいのはスコープについてだけなので、Pyhonで詰まりやすいところではと思います。
    そこでするっとわかる理解方法があれば、他の方にも有益ではと考えています。

    キャンセル

  • 2018/04/19 15:56

    論理的には簡単なことですから、単純化した実例を幾つか動かさせて教えれば、意外とあっさり理解してくれそうな気もするものですけど。たとえばこんなのでどうですか。以下インデントを_で代用

    def f0():
    ____x = 10
    ____print(x)

    f0() # これは動く
    print(x) # 関数の外ではxは見えない(エラー)

    x = 10
    def f1():
    ____print(x)
    f1() #外のxが見える

    def f2():
    ____x = 20
    ____print(x)
    f2() # xは20
    print(x) # 書き換えたxは違うものになったので、外のxには影響しない

    def f3():
    ____global x
    ____x = 20
    ____print(x)

    f3()
    print(x) # globalを付けると外のxを書き換えられるようになる

    キャンセル

+3

以前、あるお客様のシステム部門の教育をやった時、この世界では
この机が全体のブロックとして、
その上に乗っているノートがその配下のブロックで、
ノートは机の上でしか使えない。
そのノートの乗っているボールペンがあるとして、
ボールペンはそのノートの上でしか使えない、

などと教えて理解してもらいました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/19 16:00

    分かりやすいたとえありがとうございます。参考にさせていただきます。

    キャンセル

  • 2018/04/19 16:00

    分かりやすいたとえありがとうございます。参考にさせていただきます。

    キャンセル

+3

質問文のプログラムでGlobal宣言が必要なのは以下の行で変数:targetWordに対して関数内で代入を行うからであって、

targetWord=textInput  


listを使ったりして再代入を伴わないように記述すれば、Global宣言は必要ありません。
tk.StringVarを使ったサンプルです。

# -*- coding: utf-8 -*-
#しりとりプログラム
import tkinter as tk
import time

window = tk.Tk()

lab = tk.Label(text="最初の文字は「しりとり」",fg="black")
lab.pack()
tex = tk.Text(width=15, height=1)
tex.pack()
targetWord = tk.StringVar(value='しりとり')

def bAction():
    sLast = targetWord.get()[-1]
    textInput = tex.get('1.0', 'end-1c')
    sFirst = textInput[0]
    if(sFirst == sLast):
        targetWord.set(textInput)
        lab.configure(text=textInput)
    else:
        #間違えをしたら2秒だけ表示を変える
        lab.configure(text="文字が違うよ!")
        window.update()
        time.sleep(2)
        lab.configure(text=targetWord.get())
        window.update()


button = tk.Button(text="押す", command=bAction)
button.pack()

window.mainloop()

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/19 16:44

    なるほど、そういう書き方もあるのですか。
    うーん、ここでスコープを教えるか、とりあえずこの書き方で教えて後に回すか、、、考えどころですね。

    ありがとうございました。

    キャンセル

0

もうすでに解決済みですが。自分が所属しているCoderDojoというプログラミングクラブで似たようなことを聞かれたらの練習と思って回答させていただきます。

 スコープ

○○君(さん)が算数や数学の問題を解いてる途中で、
知らない間に他の人に問題の数字を変えられたら、
また問題を解き直さないといけないよね。

プログラミングではそういうことが起こらないように、
Pythonでは同じ高さで繋がった列の変数(データ)しか、基本は扱えないようにしてる。
これをスコープって言うんだ。

なので……
(この後はソースコードをマウスカーソルで追っていって、
「この変数はここの段落からは見えるけど、ここからは見えない」
と、ソースコードの解説します)

 何が嬉しいの?

何が嬉しいのかと言うと、一人でプログラミングしてるとそんなに意識しなくて大丈夫かもしれないけど、
他の人と一緒にプログラムを作る時にすっごく助かるし、3ヶ月後の自分はプログラムの内容を忘れてることの
方が多いから、そう言う時にも、うっかり書き換えなくていい変数を書き換えると言うミスが減らせるんだ。


と言う具合でしょうか。逆に抽象的ですかね……。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.74%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Python 3.x

    5277questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。