既然你想知道为什么打印语句是不是在for循环, 我猜你没有自己编写的代码。 如果你的代码来自在线教程, 然后我建议切换到另一个。
for i in range(number):
string = input()
这是行不通的。 Python是布局敏感的。
for i in range(number):
string = input()
这是有效的Python代码。但是语义可能是错误的。见下文。
if not found:
print("NO")
else:
print("YES")
对于你的问题,我很清楚打印语句不应该在for循环中。
不过,如果我发现在理解的代码长块, 困难我通常会尝试将它重构为小功能:
def get_inputs():
number = int(input())
for i in range(number):
string = input()
return number, string
def is_palindrome(number, string):
found = False
char_set = set(string)
d_dict = {}
for c in char_set:
d_dict[c] = string.count(c)
odd_l = [e for e in d_dict.values() if e%2 == 1]
if len(odd_l) >1:
pass
else:
found = True
return found
def report(found):
if not found:
print("NO")
else:
print("YES")
def main():
number, string = get_inputs()
result = is_palindrome(number, string)
report(result)
main()
我希望这个版本是为什么打印语句是不是在更清晰循环, 和为什么for i in range(number): string = input()
是错误的。
P.S.我想你的意思是为什么打印不会在第二循环中, 但事实证明,你的意思是为什么印刷是不是在第一个循环:
Output should be: NO YES YES all in different lines
是的,你是对的。代码错误地缩进。
number = int(input())
for i in range(number):
string = input()
# the algorithm does the work
if not found:
print("NO")
else:
print("YES")
一旦我们发现问题,请尝试修复它。
首先,回去规格:
给出一个数字和一些字符串,这些字符串报告结果。
然后get_inputs
不应返回字符串List[str]
的int
和str
, 而是int
和一个列表。 Python如何表示and
的概念? 一些语言使用多个返回值, Python不会。 相反,Python仍然会返回一个值,但是这个值是一个包含两个值的元组。
return (first_result, second_result)
和Python可以让你省略括号:
return first_result, second_result
更改get_inputs
为:
def get_inputs():
# do not need to touch this line
number = int(input())
# change string to strings
strings = [input() for i in range(number)]
# change return value accordingly
return number, strings
这里[input() for i in range(number)]
意味着 构建基于range(number)
, 在每个元素的列表range(number)
, 填写结果input()
在要建立的列表中。 它有时比for循环更清晰。
而实际上number
不is_palindrome
使用, 只是将其删除
def is_palindrome(string):
# function body dose not need to change
然后改变main
功能:
def main():
# change string to strings accordingly
number, strings = get_inputs()
# change result to result in a way similar to
# the change of `string -> strings` in `get_inputs()`.
results = [is_palindrome(string) for string in strings]
for result in results:
report(result)
# We could write [report(result) for result in results] here.
# But we are not interested in the result list
# The result list will be [None, None, ...].
# So this is side-effects only.
# A for loop is usually preferred for side-effects only,
# and list comprehension for building a list.
为什么你认为版画应该是在循环? – jackarms
我很困惑:首先,这个程序似乎并没有检查字符串是否是回文(可能你的意思是字符串的一些排列是否可能是回文?)。其次,你为什么想知道为什么印刷报表不在循环中? – MyStackRunnethOver
我是python新手。我简直就是从今天开始。 – Kuais