我有一个练习说:
创建一个程序,用户输入x位数字,程序将按升序打印。用户也将给出位数(x)。
必须在另一个文件中定义3个函数:
功能einaiXPsifia(x,kodikos)
其中x
是位数,kodikos
是数字。
此函数必须检查数字是否为整数且 x 位数
函数pareKodikousMeSimaTelous(x,sima)
其中x
是位数,sima
是终止程序的数字(在我的情况下,数字是0)。
此函数必须使用上一个函数来检查数字sima
是否有效,然后将其输入列表
功能afairesiDiplotypwn(lista)
其中lista
是之前的排序列表。
此功能必须采用排序列表并删除重复的数字
我的功能如下:
def einaiXPsifia(x,kodikos):
"""
einaiXPsifia(int,int) -> boolean
Function that accepts
two parameters and
returns TRUE only
if the value of the parameter
kodikos integer
and x number has digits.
"""
code = str(kodikos)
if (code.isnumeric()) and (len(code) == x):
result = True
else:
result = False
return result
def pareKodikousMeSimaTelous(x,sima):
"""
pareKodikousMeSimaTelous(int,int) -> list
Function that accepts
the number of digits
chosen by the user
and the value of the signal
end and returns
a list of all
codes entered by the user.
"""
check = einaiXPsifia(x,sima)
if (sima!=0):
if (check == True):
lista.append(sima)
return lista
def afairesiDiplotypwn(lista):
"""
afairesiDiplotypwn(list) -> list
Function that accepts as
a parameter CLASSIFIED
list of numbers and removes
from the list of duplicates,
I.e. each number to
it appears only once.
"""
for duplicate in lista:
for i in lista:
if (duplicate[i] == duplicate[i-1]):
lista.remove(duplicate[i-1])
return lista
到目前为止,我的主要计划如下:
from ergasia2_1_synartiseis import einaiXPsifia
from ergasia2_1_synartiseis import pareKodikousMeSimaTelous
from ergasia2_1_synartiseis import afairesiDiplotypwn
lista = []
length = int(input("Please enter the size of numbers: "))
numbers = int(input("Please enter the number and press Return. 0 terminates entering numbers: "))
while (numbers!=0):
check = einaiXPsifia(length,numbers)
if (check != True):
numbers = int(input("Please enter a valid number: "))
else:
lista = pareKodikousMeSimaTelous(length,numbers)
numbers = int(input("Please enter the next number and press Enter. 0 terminates entering numbers: "))
我的问题是,如果我从同一个文件调用函数pareKodikousMeSimaTelous它可以正常工作,但如果我在我的代码中从另一个文件中调用它,它会给我一个错误,并且必须将这些函数放在另一个文件中。
追踪(最近一次呼叫最后一次):
文件“C:\ Users \ Sotiris \ Desktop \ OUC练习\πποχρεωτικήεργασία2\ ergasia2_1.py”,第12行,在lista = pareKodikousMeSimaTelous(长度,数字)
文件“C:\ Users \ Sotiris \ Desktop \ OUC exercise \Υποχρεωτικήεργασία2\ ergasia2_1_synartiseis.py”,第35行,在pareKodikousMeSimaTelous lista.append(sima)NameError:名称'lista'未定义
有人可以帮助我吗?
答案 0 :(得分:0)
在主程序中,您可以定义>>> exam_solutions = ['B','B','B','B','B','B','B','B','B','B']
>>> student_answers = ['A','B','B','C','B','B','A','B','B','D']
>>> sum(a == b for a, b in zip(student_answers, exam_solutions))
6
:
lista
在函数文件中,lista = []
引用pareKodikousMeSimaTelous
,它永远不会在该文件中定义。它在一切都在同一个文件中时起作用,但当你将它拆分时,该函数在主程序中看不到lista
。要解决此问题,请像lista
一样传递lista
:
afairesiDiplotypwn
然后适当地调用它:
def pareKodikousMeSimaTelous(x, sima, lista):
请注意,如果您传入对可变对象的引用,变异该对象,并且不在函数内重新分配其引用,则无需返回它并重新分配。所以这个:
lista = pareKodikousMeSimaTelous(length, numbers, lista)
相当于:
l = []
def f(x):
x.append(0)
f(l)
答案 1 :(得分:0)
第一个文件可能有用,因为你只是定义了函数,但我不打电话给它们。因此,python永远不必查找lista
,并且未检测到错误。
您的问题是由导入范围引起的。您可以在第一个文件中定义lista
。但请记住,列表是通过引用传递的!
<强> file1.py 强>
lista = []
def f(a):
lista.append(a)
return lista
<强> file2.py 强>
from file1 import f, lista
ref = f(1)
print lista # mutable object lista was changed
print id(ref) == id(lista) # is true, both reference same list