1
我想弄清楚如何在多個其他函數中使用Python 3函數(使用非局部變量),而無需再次定義它。這裏是我的意思非常簡單的例子:在Python中重用內部函數
def inner(airplane):
nonlocal var
if airplane == "Alpha":
var = a
elif airplane == "Beta":
var = b
def outer1(airplane):
inner(airplane)
do stuff with var
def outer2(airplane)
inner(airplane)
do other stuff with var
outer1("FirstAirplane")
outer2("SecondAirplane")
我得到一個錯誤(SyntaxError: No binding for nonlocal 'var' found
),但我懷疑我是非常錯誤的事情了。我不打算自行運行inner()
。我如何重用inner()
正確的方法?我不能在outer1()
裏面定義它,然後在outer2()
中重新使用它,我可以嗎?
好吧,由呃......大衆的需求...這裏是我的代碼中的相關部分...
def planeandoffset(airplane):
if airplane == "Zulu":
linename = "\\[\\INOV"
charoffset = 14
elif airplane == "Lima":
linename = "\\[\\ILIM"
charoffset = 10
elif airplane == "Mike":
linename = "\\[\\IMIK"
charoffset = 10
else:
print("There is no airplane by that name.")
latstart = charoffset
latend = 7 + charoffset
lonstart = 9 + charoffset
lonend = 17 + charoffset
return airplane, linename, latstart, latend, lonstart, lonend
def latlongen(workingline, latstart, latend, lonstart, lonend):
# Determine Latitude and Longitude in decimal format
latraw = workingline[latstart:latend]
if latraw[0:1] == "S":
pm = "-"
else:
pm = ""
hours = float(latraw[3:5] + "." + latraw[5:])
decimal = hours/60
latitude = float(latraw[1:3]) + decimal
latitude = float(pm + str(latitude))
lonraw = workingline[lonstart:lonend]
if lonraw[0:1] == "W":
pm = "-"
else:
pm = ""
hours = float(lonraw[4:6] + "." + lonraw[6:])
decimal = hours/60
longitude = float(lonraw[1:4]) + decimal
longitude = float(pm + str(longitude))
return latitude, longitude
def kmlplanegen(airplane):
planeandoffset(airplane)
global afffilename, iconurl, kmlwrite
affread = open(afffilename)
while True:
line = affread.readline()
# Choose appropriate line
if line.startswith(linename):
workingline = line
elif len(line) == 0: # Zero length indicates EOF (Always)
break
else:
pass
try:
latlongen(workingline, latstart, latend, lonstart, lonend)
# Generate kml for Airplane
print(''' <Placemark>
<Style>
<IconStyle>
<Icon>
<href>{0}</href>
</Icon>
</IconStyle>
</Style>
<name>{1}</name>
<description>Latitude: {2} Longitude: {3}</description>
<Point>
<coordinates>{3},{2},0</coordinates>
</Point>
</Placemark>'''.format(iconurl,airplane,latitude,longitude), file=kmlwrite)
except Exception:
exit(1, "There was an error. This message is kind of worthless. Stopping Program")
def kmlpathgen(airplane):
planeandoffset(airplane)
global afffilename, kmlwrite
# Generate kml for Airplane Path
print(''' <Style id="yellowLineGreenPoly">
<LineStyle>
<color>7f00ffff</color>
<width>4</width>
</LineStyle>
<PolyStyle>
<color>7f00ff00</color>
</PolyStyle>
</Style>
<Placemark>
<name>{0} Path</name>
<description>Transparent green wall with yellow outlines</description>
<styleUrl>#yellowLineGreenPoly</styleUrl>
<LineString>
<extrude>1</extrude>
<tessellate>1</tessellate>
<altitudeMode>relativeToGround</altitudeMode>
<coordinates>'''.format(airplane), file=kmlwrite)
try:
affread = open(afffilename)
while True:
line = affread.readline()
if len(line) == 0: # Zero length indicates EOF (Always)
break
elif line.startswith(linename):
workingline = line
latlongen(workingline, latstart, latend, lonstart, lonend)
print(" {0},{1},0".format(longitude,latitude), file=kmlwrite)
else:
pass
except NameError:
pass
finally:
print(''' </coordinates>
</LineString>
</Placemark>''', file=kmlwrite)
你需要一個類:)查看:http://docs.python.org/tutorial/classes.html – Crisfole 2011-12-13 20:57:16
[非本地`真正做什麼的描述](http://stackoverflow.com/a/ 832391分之1261961)。 – 2011-12-13 21:07:50