我对此感到有点困惑。
我有一个功能。在该功能内部,它会询问一些问题,其中一个问题基于他们拥有的花园数量 - 所以如果他们说他们有2个花园,它会问这个问题两次并且应该将100加两次计算:
gardens = int(input("How many gardens do you have: "))
def gard():
calc = 0
gardener = input("Do you need a gardener? Y or N ")
if gardener == "Y" or gardener == "y":
calc = calc + 100
else:
calc = calc + 0
for i in range(gardens):
gard()
如何在功能之外保持运行总计?当我在函数内部放置print(calc)时,它每次只显示Y时显示100,但不会将它们加在一起。
已修改为包含更新的代码:
eMake部分(IF语句)返回一个值 - 但它只返回计算结束时的第一个值?
因为有很多ws,所以也在努力做区域部分。它只存储变量的最后一个值。
noGard = int(input("Enter number of gards which require cleaning: "))
#Defining variables
Calc = 0
Area = 0
emCalc = 0
#Room information
def GInfo():
global Calc
global Area
gName = input("Enter gard name: ")
noW = int(input("How many w are in the "+gName + "? "))
#Repeats the questions for each W
for i in range(noW):
Height = float(input("What is the w height of in metres? "))
Width = float(input("What is the w width in metres? "))
Area = Height * Width
#Asks if w needs to be removed
w = input("Does w need removing? Y or N ")
if w == "Y" or w == "y":
Calc = Calc + 70
else:
Calc = Calc + 0
print (" ")
#Returns the values
return Calc
return Area
#Calculate Sarea
#Identifying e
def e():
global emCalc
#eMake
eMake = input("What make of e - HH or NN? ")
if eMake == "HH" or "hh":
emCalc = emCalc + 200
elif eType == "NN" or "nn":
emCalc = emCalc + 50
else: print("You have entered an invalid e make")
#Returns the values
return emCalc
#Repeats the g information questions for each g
for i in range(noGard):
GInfo()
# Runs the E function
e()
#Print total without VAT
total = Calc + emCalc
print(total)
print(Area)
答案 0 :(得分:4)
您的函数应返回计算值。
def gard():
...
return calc
total = 0
for _ in range(gardens):
total += gard()
print 'Total: ', total
答案 1 :(得分:2)
功能的全部意义在于它们采用参数和返回值。 (有些语言虽然不是Python,但是指的是不这样做的功能"程序"。)
这就是你需要做的事情:你的gard
函数需要返回calc的值。你可能不想在函数本身内部实际添加,但是如果你这样做了,你还需要接受calc的当前值作为参数,你可以从for循环中传入。
答案 2 :(得分:0)
函数in the strictest sense没有状态。在编写函数式程序时,人们通常的目的是保持它们的函数pure,这意味着函数的结果不依赖于任何东西而是依赖于它的输入,并且不会引起可观察到的副作用。
但Python并不是纯粹的功能语言。它是一种object-oriented过程语言,它将函数建模为对象,对象可以是有状态的。所以,如果你没有太明确地使用“功能”这个词,你可以做你想要做的事。
创建一个为您的数据及其操作建模的类:
>>> class F(object):
... def __init__(self):
... self.x = 0
... def f(self):
... self.x += 1
... return self.x
...
>>> my_f = F()
>>> my_f.f()
1
>>> my_f.f()
2
向函数对象添加状态,利用函数体在调用函数之前不执行的事实:
>>> def f():
... f.x += 1
... return f.x
...
>>> f.x = 0
>>> f()
1
>>> f()
2
如果你想透明地这样做(也就是说,使它不必在定义它之后立即将这个状态添加到函数中),你可以通过让函数创建一个函数来关闭状态: / p>
>>> def g():
... def func():
... func.x += 1
... return func.x
... func.x = 0
... return func
...
>>> f = g()
>>> f()
1
>>> f()
2
为了更进一步,创建一个装饰器,以便在完全定义函数后不必进行任何分配:
>>> def with_x(func):
... func.x = 0
... return func
...
>>> @with_x
... def f():
... f.x += 1
... return f.x
...
>>> f()
1
>>> f()
2
或者您可以使用global
让函数引用其局部范围之外的东西,而不是利用函数是对象的事实:
>>> x = 0
>>> def f():
... global x
... x += 1
... return x
...
>>> f()
1
>>> f()
2
>>> x
2
自从你选择global
后,我首先会向您推荐一个解释global
的好问题。 Using global variables in a function other than the one that created them
现在,至于你的特殊问题:
eMake部分(IF语句)返回一个值 - 但它只返回计算结束时的第一个值?
当然,这里有一些问题,其中一个绝对是初学者的常见问题。 or
的优先级高于==
,因此您的条件会像这样解析:
if (eMake == "HH") or ("hh"):
这让人们总能得到。在Python中,如果值不是布尔值并且您将其放在条件语句中,则使用一系列truthiness规则将其计算为布尔值。在这种情况下,非空字符串被视为True
,因此您基本上是在说if (eMake == "HH") or True
。
要解决此问题,请修复条件的右侧:
if (eMake == "HH") or (eMake == "hh"):
顺便说一句,你可能意味着elif (eMake == "NN") or (eMake == "nn"):
而不是elif eType == "NN" or "nn":
,因为你从未定义eType
(并且由于上面的原因也是如此)。如果你输入nn
那里你会得到一个例外。
因为有很多ws,所以也在努力做区域部分。它只存储变量的最后一个值。
这是因为您使用Area = Height * Width
重复分配给同一个变量。由于Area
为global
,因此每次调用GInfo()
时,它都是相同的变量。如果它不是global
,那么每次调用该函数时它都是一个新变量,但是你需要返回它并将返回值赋给变量以保存该值。否则它会消失,因为它从未被分配给任何东西。
现在,我不知道你要对你正在计算的区域做什么。你想把它们分开或将它们加在一起吗?
如果要将它们分开,则需要使用数据结构。在这种情况下,您肯定想要使用list。使用append()
列表方法,您可以将项目添加到列表中。所以它看起来像这样:
areas = [] # empty list
def GInfo():
global areas
# the stuff before the loop
for i in range(noW):
Height = float(input("What is the w height of in metres? "))
Width = float(input("What is the w width in metres? "))
areas.append(Height * Width)
# the stuff after the loop
如果您想将它们相加,只需确保将每个单独的区域计算添加到上一个结果中,就像使用Calc
一样:
Area += Height * Width
还有一件事:您的GInfo()
功能只返回Calc
而不是Area
。函数只能返回一个值。在数学意义上,函数是两组之间的many-to-one映射。所以在Python中,函数以return
语句结束。之后没有其他事情被执行。
为了从Calc
的返回值中获取Area
的值以及GInfo()
的值,您必须返回data structure。通常这是tuple。
return (Calc, Area)
但是您的代码不会将GInfo()
的返回值分配给任何内容。相反,它使用global
声明来更改全局变量的值。所以这里不应该有问题。