あなたのflip()
関数では(他の関数と同様に)、他の回答で述べたようにpicture
、関数のパラメーターとして渡されたがd()で定義されている画像を返します...
これはscope
変数の問題なので、ここで行った議論をもう一度見てください。
ここでは、2 つの選択肢がありました (2 つの間で融け合いました)。
picture
指定されたパラメーターを直接変更する
- を作成し
newPicture
、変更して、最後に返す
2d オプションの詳細:
ここで重要なことは、picture
変数が関数に属しているd()
ことです (d() がそのスコープです)。その間、newPicture
変数は関数に属しflip()
ます (flip() はそのスコープです)。そのため、newPicture の有効期間は flip() です (つまり、flip() 関数の実行を終了して戻るとすぐに破棄されます)。また、d() は、この newPicture を d() に返さない限り、何も知りません。
つまり、要するに (2 番目のオプションについて話していると仮定して):
1)パラメータとして受け取る関数を作成picture
します (flip())
2) flip() 内で、ローカル変数を作成し、元の変数が変更newPicture
されないように、その変数のみを変更します。picture
3)新しく更新さnewPicture
れた を親に返しscope
ます。ここで d() は flip() を呼び出しているので、それが親スコープです。Flip() によって返されたものを保持するために、3d 変数 (d() スコープに属する) を作成する必要があります。
def flip(picture)
# Create newPicture
# Modify newPicture (using the information from the "picture" parameter)
setColor(newPicture, ...)
...
return newPicture
def d():
file = PickAFile()
original_pic = makePicture(file)
finalNewPicture = flip(original_pic) # {1}
show(finalNewPicture)
{1}: ここでは、flip によって返された値 (つまりnewPicture
) を、より高いスコープfinalNewPicture
(ハンドラー) の変数に割り当てます...
この背後にあるロジックを理解するのに役立つことを願っています。それはロシアの人形のようなものです: newPicture は Flip() 内で使用され、d() 内で使用されます...
編集 :
1番目のオプションについても説明したいと思います...
1)パラメータとして受け取る関数を作成picture
します (flip())
2) flip() 内で、より高いスコープのpicture
変数を直接変更します
3) Flip() から何も返さない
これにより、次のようになります。
def flip(picture)
# Simply modify the variable "picture", given as a parameter
setColor(picture, ...)
...
# Do not return anything
def d():
file = PickAFile()
original_pic = makePicture(file)
flip(original_pic) # {1}
show(original_pic)
{1}: ここで、flip() は入力画像に直接変更を加えたので、変更された元の画像を直接表示できます ( original_pic
)。中間ハンドラー変数は必要ありません。
オプション 1 のコード: (既にオプション 2 で動作しているため)
def flip(picture):
height = getHeight(picture)
width = getWidth(picture)
x2=width-1
for x in range(0, width/2): # Only process the half way
y2=0
for y in range(0, height):
# swap pix and pix2
pxl = getPixel(picture, x, y)
pxl2 = getPixel(picture, x2, y2)
color = getColor(pxl)
color2 = getColor(pxl2)
setColor(pxl2, color)
setColor(pxl, color2)
y2=y2+1
x2=x2-1
def d():
f = pickAFile()
original_picture = makePicture(f)
flip2(original_picture)
show(original_picture)
d()
注:フリップは、次のように大幅に単純化できます。
def flip2(picture):
height = getHeight(picture)
width = getWidth(picture)
for x in range(0, width/2): # Only process the half way
for y in range(0, height):
# swap pix and pix2
pxl = getPixel(picture, x, y)
pxl2 = getPixel(picture, width-1-x, y)
color = getColor(pxl)
color2 = getColor(pxl2)
setColor(pxl2, color)
setColor(pxl, color2)