我编写了这个程序,但运行它并键入" 2"当我输入一个主题时,它不会打印一次但只有九次。问题出在哪儿? 9是名为mat
的列表中的主题数,因此它是严格连接的。现在检查一些文件.txt作为占位符,但我也想使用模块json
。
import os
def spat():
a=len(list(os.listdir('C:/Users/SUINO/Desktop/python/prob/cache/'+y)))
print(a)
b=100/(25-a)
print(b)
mat=["latino","greco","storia","latino","scienze","matematica","grammatica",
"promessi sposi,","eneide"] #mat means subject
c=input("Do you want to add a placeholder or calculate probabilties? 1|2: ")
if c == "1":
c=input("Insert a subject: ")
c=c.lower
if c in mat:
name=input("Insert the name of the student: ")
open('C:/Users/SUINO/Desktop/python/prob/cache/'+c+'/'+name+".txt")
else:
print("Materia non esistente!")
if c == "2":
y=input("Materia: ")
y=y.lower()
x={"latino":spat(),"greco":spat(),"eneide":spat(),"promessi sposi":spat(),
"mate":spat(),"grammatica":spat(),"storia":spat(),"scienze":spat(),
"inglese":spat(),}
该计划的目标是使用文件.txt来计算被询问的概率,该文件的名称已经被询问的学生的姓名。
答案 0 :(得分:0)
如果我理解你的问题,你基本上是在尝试创建一个CLI来访问家庭作业或学生可以与之交互并访问其文件的其他学校作业。
我刚刚注意到您还尝试访问函数y
中的var spat()
。您需要将此值传递给函数调用。如果要将每个键映射到函数。
如果你想让关键字作为参考,你需要像这样构建你的字典:
x = {
'latino': spat,
'greco': spat,
...
}
然后,当用户输入值时,您只需将新变量声明为键的值,然后创建一个变量,该变量是对该函数的引用。
因此,如果您收到带有
的输入y
y = input("Materia: ")
然后你应该创建一个像这样的新变量
func = x[y]
这将找到从上面的输入函数输入的键值,并将该引用赋值给变量func
。从本质上讲,func
现在等于函数,你可以像任何其他正常函数一样执行func
以及传入变量。
func(y)
这将执行引用的函数(spat)并传入变量y。您还需要重写spat()
:
def spat(y):
a = len(list(os.listdir('C:/Users/SUINO/Desktop/python/prob/cache/'+y)))
print(a)
b = 100/(25-a)
print(b)
基本上相同,除了你现在从下面的输入传入y
。
您还需要将字典的声明移到顶部,以便在声明func
时识别您对此字典的引用。
所以整个代码:
import os
def spat(y):
a = len(list(os.listdir('C:/Users/SUINO/Desktop/python/prob/cache/'+y)))
print(a)
b=100/(25-a)
print(b)
x = {"latino":spat,"greco":spat,"eneide":spat,"promessi sposi":spat,
"mate":spat,"grammatica":spat,"storia":spat,"scienze":spat,
"inglese":spat,} # x moved up from bottom
mat = ["latino","greco","storia","latino","scienze","matematica","grammatica",
"promessi sposi,","eneide"] #mat means subject
c = input("Do you want to add a placeholder or calculate probabilties? 1|2: ")
if c == "1":
c = input("Insert a subject: ")
c = c.lower
if c in mat:
name = input("Insert the name of the student: ")
open('C:/Users/SUINO/Desktop/python/prob/cache/'+c+'/'+name+".txt")
else:
print("Materia non esistente!")
if c == "2":
y=input("Materia: ")
y=y.lower()
func = x[y] # creates reference to the key which is a ref to a function
func(y)
但是,由于每个键值都在执行相同的功能,因此您最好不要为每个新键编写新的词典条目,只需简单地列出学生可以输入的已识别主题:
subjects = ['latino', 'greco', 'grammatica', ...]
然后,您只需检查输入是否存在于此列表中,如果存在,则运行spat()
并传入y
。
if y in subjects:
spat(y)
else:
print("Unrecognized command...")
字典中的映射函数对于创建“接口”非常有用,该接口可以将各种输入路由到将为该给定选项执行的函数。您可以通过简单地检查列表/字典中的输入来检查它们的命令是否有效,如果它不存在,那么您可以跳过运行该函数并输出错误消息 - 如果该命令存在,那么您可以将它引用到一个键值(然后将其引用到该键的值),然后它将运行正确的函数。
答案 1 :(得分:0)
简短的回答是它打印了9次,因为您在声明中对spat()
进行了所有调用:
x={"latino":spat(),"greco":spat(),"eneide":spat(),"promessi sposi":spat(),
"mate":spat(),"grammatica":spat(),"storia":spat(),"scienze":spat(),
"inglese":spat(),}
您的代码还存在许多其他问题,但由于我并不完全了解它所要完成的所有事情,因此我不打算告诉您该做什么,而不是多次调用它那样的。