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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

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

Q&A

解決済

5回答

241閲覧

Pythonでのスコープの教え方

itohkun55

総合スコア8

Python 3.x

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

0グッド

0クリップ

投稿2018/04/19 06:08

編集2018/04/19 06:09

質問内容

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

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

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

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

該当のソースコード

Python

1#しりとりプログラム 2import tkinter as tk 3import time 4 5window=tk.Tk() 6 7 8lab=tk.Label(text="最初の文字は「しりとり」",fg="black") 9lab.pack() 10 11tex=tk.Text(width=15,height=1) 12tex.pack() 13 14 15targetWord="しりとり" 16 17def bAction(): 18 19 sLast=targetWord[-1] 20 21 textInput=tex.get('1.0','end-1c') 22 23 #入力したことばの最初の文字を取る 24 sFirst=textInput[0] 25 26 #今の文字を取り出す 関数の外の変数にため、globalを使う **ここをどう説明しよう?** 27 global targetWord 28 29 if(sFirst==sLast): 30 targetWord=textInput 31 lab.configure(text=targetWord) 32 33 else: 34 #間違えをしたら2秒だけ表示を変える 35 lab.configure(text="文字が違うよ!") 36 window.update() 37 time.sleep(2) 38 lab.configure(text=targetWord) 39 window.update() 40 41button=tk.Button(text="押す",command=bAction) 42button.pack() 43 44

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

ベストアンサー

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

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

投稿2018/04/19 06:16

Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

itohkun55

2018/04/19 06:37

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

2018/04/19 06:42

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

2018/04/19 07:13 編集

学校で先生と言えば教師だけど病院で先生と言えば医者のことです。 場所が変わると同じ呼び方でも意味が変わります。 関数の中で名づけられたものはその中でしか通用しません。 家で時計と言えば壁にかかった鳩時計のことであっても、外に出て時計と言っても鳩時計が通じるとは限りません。 腕時計であったり目覚まし時計であったり、みんなそれぞれ自分の時計をイメージします。 逆に家族に時計の話をしたければ「学校の時計」のように「~の」が必要かもしれません。 関数の中でつけられた名前が外で通じないことを「スコープが違う」と言います。 スコープというのはその名前が通じる範囲のことです。 global というのは英語で「世界」という意味、もっと言えば外世界のことを指します。 つまり global targetWord というのは「外の世界の targetWord」という意味です。 これだけ説明すると、わかる人には「わかりやすい」と言ってもらえますし、わからない人にはわかりません。
itohkun55

2018/04/19 07:20

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

0

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

Python

1targetWord=textInput

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

Python

1# -*- coding: utf-8 -*- 2#しりとりプログラム 3import tkinter as tk 4import time 5 6window = tk.Tk() 7 8lab = tk.Label(text="最初の文字は「しりとり」",fg="black") 9lab.pack() 10tex = tk.Text(width=15, height=1) 11tex.pack() 12targetWord = tk.StringVar(value='しりとり') 13 14def bAction(): 15 sLast = targetWord.get()[-1] 16 textInput = tex.get('1.0', 'end-1c') 17 sFirst = textInput[0] 18 if(sFirst == sLast): 19 targetWord.set(textInput) 20 lab.configure(text=textInput) 21 else: 22 #間違えをしたら2秒だけ表示を変える 23 lab.configure(text="文字が違うよ!") 24 window.update() 25 time.sleep(2) 26 lab.configure(text=targetWord.get()) 27 window.update() 28 29 30button = tk.Button(text="押す", command=bAction) 31button.pack() 32 33window.mainloop() 34

投稿2018/04/19 07:31

umyu

総合スコア5846

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

itohkun55

2018/04/19 07:44

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

0

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

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

投稿2018/04/19 06:23

Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

itohkun55

2018/04/19 07:00

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

2018/04/19 07:00

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

0

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

投稿2018/04/19 06:14

hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

itohkun55

2018/04/19 06:47

そうですね、難しすぎるかという懸念はいつも持っているのですが、 「ボタンイベントの関数の内と外で変数の意味が違う」という問題は簡単に出会う割には難易度が高いなあと思い、知恵を借りるため質問しました。 上記サンプルを見ていただいて分かる通り、わかりにくいのはスコープについてだけなので、Pyhonで詰まりやすいところではと思います。 そこでするっとわかる理解方法があれば、他の方にも有益ではと考えています。
hayataka2049

2018/04/19 06: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を書き換えられるようになる
guest

0

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

スコープ

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

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

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

何が嬉しいの?

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


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

投稿2018/04/19 08:15

manzyun

総合スコア2244

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問