在Python中调用其他文件中的函数

时间:2016-04-17 22:13:22

标签: python

我有一个练习说:

  

创建一个程序,用户输入x位数字,程序将按升序打印。用户也将给出位数(x)。

必须在另一个文件中定义3个函数:

  1. 功能einaiXPsifia(x,kodikos)其中x是位数,kodikos是数字。 此函数必须检查数字是否为整数且 x 位数

  2. 函数pareKodikousMeSimaTelous(x,sima)其中x是位数,sima是终止程序的数字(在我的情况下,数字是0)。 此函数必须使用上一个函数来检查数字sima是否有效,然后将其输入列表

  3. 功能afairesiDiplotypwn(lista)其中lista是之前的排序列表。 此功能必须采用排序列表并删除重复的数字

  4. 我的功能如下:

    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'未定义

    有人可以帮助我吗?

2 个答案:

答案 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