计算 - 使用函数

时间:2015-12-31 21:32:18

标签: python python-3.x

我对此感到有点困惑。

我有一个功能。在该功能内部,它会询问一些问题,其中一个问题基于他们拥有的花园数量 - 所以如果他们说他们有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)

3 个答案:

答案 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过程语言,它将函数建模为对象,对象可以是有状态的。所以,如果你没有太明确地使用“功能”这个词,你可以做你想要做的事。

The Right Thing™

创建一个为您的数据及其操作建模的类:

>>> 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重复分配给同一个变量。由于Areaglobal,因此每次调用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声明来更改全局变量的值。所以这里不应该有问题。