关于python:如何将客户名称和客户列表作为下一个名为search()的函数的两个参数?

How do I take the name of a customer and a list of customers as the two parameters for a function that would be written next called search()?

其思想是函数"search()"应该以客户的名称和客户列表作为参数,检查客户是否在customer.txt中(然后返回true),然后返回false。

规范为:1)以客户名称和客户列表(writedata(),customer.txt制作的列表)为参数2)检查名称是否在列表中3)如果在列表中,则返回true;如果不在列表中,则返回false。

目前,1)每当我在菜单中键入s时,它会告诉我它缺少两个必需的位置参数

Traceback (most recent call last):

1
2
3
4
5
6
    cdman()
  File"test.py", line 55, in cdman
    menu()
  File"test.py", line 24, in menu
    search()
TypeError: search() missing 2 required positional arguments: 'name' and 'filename'

2)如果我只是在shell中调用"search()",它会说"name"search"没有定义",在调用"cdman()"之前和之后都是如此。

3)如果我在文件中使用"jacob walker"这个名称并尝试搜索它,它将突出显示walker并说无效语法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
def cdman():

    def menu():

        print('*------------------------*')
        print('| Customer Database Menu |')
        print('*------------------------*
'
)

        choice = input('D: Create/Update Customer Data
R: Display Database
S: Search for User
E: End Program
'
)
        if choice == 'D':
            writeData()
            menu()
        elif choice == 'S':
            search()
            menu()
        elif choice == 'R':
            readData()
            menu()
        elif choice == 'E':
            print('PROGRAM TERMINATED')

    def writeData():
        while True:
            database = open('customer.txt', 'a')
            name = input('Name: ')
            if name == '-1':
                database.close()
                return False
            else:
                id_num = input('ID: ')
                database.write('Name: ' + name + ' ')
                database.write('ID: ' + id_num + '
'
)

    def readData():
        database = open('customer.txt', 'r')
        for line in database:
            print(line)

    def search(name, filename):
        if name in open(filename).read():
            print('True')
        else:
            print('False')

    menu()
cdman()


您的问题是,您试图调用函数search,而不传递您告诉它需要的参数(namefilename)。

这个堆栈溢出问题对python函数参数有很多深入的解释,这将是一个有帮助的阅读,以及本文。为了解决您遇到的错误,有两个基本的解决方案。

第一个解决方案(根据代码的功能,这更有用)是实际传递参数。你在哪里

1
2
3
elif choice == 'S':
   search()
   menu()

你应该告诉它要搜索什么,也就是说。

1
2
3
elif choice == 'S':
   search('Bob', 'customer.txt')
   menu()

您还可以给出参数的默认值,其现在的写入方式

1
 def search(name, filename):

它期望接收这些值,否则将无法定义这些值(您正在运行的错误)

您可以告诉它默认值,并处理没有传递任何内容的情况,如:

1
2
3
4
5
6
7
  def search(name=None, filename='customer.txt'):
        if name is None:
           print('No name provided!')
        elif name in open(filename).read():
            print('True')
        else:
            print('False')


首先,在没有参数的代码中调用search()函数,但在它的定义中,传递的是两个参数。

所以,在输入s之后,您的程序需要一个search(CustomerName, FileName),而不是search()

1
2
3
elif choice == 'S':
   search(CustomerName, FileName)
   menu()

我想你的search()函数不能读取文件中所有可用的行。尝试对search()函数使用以下代码:

1
2
3
4
5
6
7
8
9
def search(CustomerName, filename):
    with open(filename,"r") as fp:
        Customer_Names = [name.rstrip('
'
) for name in fp.readlines()]
    for AvailableName in Customer_Names:
        if AvailableName == CustomerName:
            print True
        else:
            print False