如何在多次使用的函数内声明变量?

时间:2016-11-03 16:56:33

标签: python python-3.x

我第一次开始使用函数,而我遇到的问题是在一个多次使用的函数中声明一个变量。我在尝试添加函数之前使这个程序工作,所以唯一不正确的(我假设)是我尝试使用函数。

print ("Welcome to August's binary arithemetic caclulator.")
firstvalue = input("What is the first binary value?")
secondvalue = input("What is the second binary value?")
operation = input("What operation would you like to carry out? + or - or * or ^")

def bintoint():
    prod, ans, power = 0, 0, 0
    for i in range (-1,-len(firstvalue) - 1,-1):
        try:
            prod = ((int(firstvalue[i])) * ((2**power)))
        except ValueError:
            continue
        ans += prod
        prod = 0
        power += 1
    global ans

firstvalueans = ans

bintoint()
bintoint(firstvalue="secondvalue")

secondvalueans = ans

#prod, ans, power = 0, 0, 0
#for i in range (-1,-len(secondvalue) - 1,-1):
#    try:
#        prod = ((int(secondvalue[i])) * ((2**power)))
#    except ValueError:
#        continue
#    ans += prod
#    prod = 0
#    power += 1
# global secondvalueans
# secondvalueans = ans

if operation == "+":
    totalans = (firstvalueans + secondvalueans)
if operation == ("-"):
    totalans = (firstvalueans - secondvalueans)
if operation == ("*"):
    totalans = (firstvalueans * secondvalueans)
if operation == ("^"):
    totalans = (firstvalueans ** secondvalueans)
try:
    totalans = int(totalans)
except NameError:
    print ("Please enter a valid operator.")
    import sys
    sys.exit()

invertedbinary = []
while totalans >= 1:
    totalans = (totalans/2)
    invertedbinary.append(totalans)
    totalans = int(totalans)
for n,i in enumerate(invertedbinary):
    if (round(i) == i):
        invertedbinary[n]=0
    else:
        invertedbinary[n]=1
if (firstvalue[0] == "-") ^ (secondvalue[0] == "-"):
    invertedbinary.append("-")

invertedbinary.reverse()
result = ''.join(str(e) for e in invertedbinary)
print ( firstvalue , operation , secondvalue , "=" ,result)

注意唯一声明的函数和注释代码块。除了单个变量之外,代码是相同的。所以我试图通过改变变量的唯一区别来执行两次函数。我想要更改的变量可以在firstvalue中看作def bintoint()。第二次调用该函数时,我希望将firstvalue替换为`secondvalue,就像注释代码一样。

这个脚本的想法是获取两个二进制值,将它们转换为整数,在两个整数之间执行相应的操作,转换回二进制和print ( firstvalue , operation , secondvalue , "=" ,result)

我们假设我按此顺序输入两个值:

100

011

*

预期产出:

100 * 011 = 1100

实际输出:

TypeError: bintoint() got an unexpected keyword argument 'firstvalue'

所以我理解我尝试更改函数中的变量是错误的。 bintoint(firstvalue="secondvalue")我也试过没有引号,但仍然给了我同样的错误。

我做错了什么?

1 个答案:

答案 0 :(得分:2)

使用函数的两个重要方面是传入参数并返回结果。如果传入一个参数,那么每次调用该函数时都会收到一个可能不同的值。如果您返回结果,那么每次调用您的函数时,调用代码将收到不同的答案。

尝试这样的事情:

def bintoint(value):
    prod, ans, power = 0, 0, 0
    for i in range (-1,-len(value) - 1,-1):
        try:
            prod = ((int(value[i])) * ((2**power)))
        except ValueError:
            continue
        ans += prod
        prod = 0
        power += 1
    return ans

然后,在您的主要代码中:

firstvalueans = bintoint(firstvalue)
secondvalueans = bintoint(secondvalue)

有关功能的更多信息,请参见The Python Tutorial部分的Defining Functions

除了:在您的示例中,使用two-argument form of the int() constructor可能更容易,如下所示:

firstvalueans=int(firstvalue, 2)