Python 中的马里奥 CS50
Mario CS50 in Python
所以我尝试用 python 而不是 C 编写 CS50 中的马里奥作业来挑战自己,我设法让它发挥作用!我不太明白循环是如何工作的,尤其是数学,因为我只是玩弄以获得我想要的结果。
作业要求如下
- 使用哈希创建半金字塔
- 确保它正确对齐
- 应与用户给出的身高相符
- 第一行应以 2"#"s 开头
如能对我的循环进行任何澄清,我们将不胜感激:)
print('Height: ', end='');
h = int(input());
while(h<0 or h > 24):
print("That is an invalid input")
print('Height: ', end='');
h = int(input());
for i in range(h):
print(" "*(h-i)+"#"*(i+1));
范围(开始,停止[,步骤])
Python range() 函数 returns 从某个下限(默认为零)到(但不包括)某个上限的整数列表,可能以增量(步骤)一些其他数字(一个,默认情况下)。
因此,
range(3) returns a sequence: 0, 1, 2
range(1,3) returns a sequence: 1, 2
range(1,7,2) returns a sequence: 1, 3, 5
首先,只想指出,您的代码并没有打印出整个金字塔;它只打印出一半。您的输出应该类似于(例如,如果我们输入高度为 3):
# #
## ##
### ###
您的代码只打印左侧:
#
##
###
现在,回答你的问题。这是你如何让它工作的:
for i in range(h):
print(" " * (h - i) + "#" * (i + 1));
描述for循环的条件语句,i
从0开始,一直上升到h
。
要了解您的 print()
语句的工作原理,请将其视为由 space 和散列组成的线段。该段的长度为h
。因此,在 h - i
中,您将此 "segment" 的一部分打印为 spaces,而在 i + 1
中,您打印循环的其余部分。
现在,您使用 i + 1
而不仅仅是 i
的原因是因为 for 循环条件; i
从零开始。因此,您一定已经意识到第一行没有散列,因为有 h - 0
space 和 0
散列。这就是为什么需要 i + 1
的原因;如果您仔细检查当前代码,您将在每一行的开头打印一个额外的 space。
一个更容易理解的代码逻辑,结果相同,是:
for i in range(1, h + 1): # The counter's range is toyed with here
print(" " * (h - i) + "#" * i); # The "i + 1" is removed
在这里,循环的范围被玩弄了;现在它从 1 开始(以便打印第一个散列,并且整个 "segment" 不仅仅是第一行的 spaces),并且它在 h + 1
结束(这样循环范围保持不变)。
删除了i + 1
;看到 print()
语句可以更容易理解上面讨论的 "segment" 逻辑。
*澄清一下,我上面提供的替代代码并不是要替代您的代码;我只是将其包括在内以强化我的 "segment" 想法。你的代码非常好,和我的一样好用。
我认为,这不是正确答案。为了理解它,请使用 "_"
或其他符号代替空格。如果height = 1
,我们可以看到_#
,但必须是#
。所以正确答案,可以是:
print('Height: ', end='');
h = int(input());
while(h<0 or h > 24):
print("That is an invalid input")
print('Height: ', end='');
h = int(input());
for i in range(h):
print("_" * (h - (i+1)) + "#" * (i + 1));
对不起我的英语。
你想把它们分成两部分,这样你就可以看到图片 clearly.From 并排实现会更容易。
left_align_counter = 0
print("Printing left aligned")
print("Height: ", end="")
height = int(input())
for h in range(height):
left_align_counter +=1
print("#"*left_align_counter)
print("DONE.")
right_align_counter = 0
print("Printing right align ")
for h in range(height):
right_align_counter += 1
print(" "*int(height-right_align_counter), end="")
print("#"*int(right_align_counter))
print("DONE.")
并排打印
left_align_counter = 0
print("Printing left aligned")
print("Height: ", end="")
height = int(input())
for h in range(height):
left_align_counter +=1
print("#"*left_align_counter)
print("DONE.")
right_align_counter = 0
print("Printing right align ")
for h in range(height):
right_align_counter += 1
print(" "*int(height-right_align_counter), end="")
print("#"*int(right_align_counter))
print("DONE.")
#here we can use any counter for the blocks be it right or left so just use counter variable
counter = 0
for h in range(height):
counter += 1
print(" "*int(height-counter), end="")
print("#"*int(counter), end=' ')
print("#"*int(counter),end="\n")
所以我尝试用 python 而不是 C 编写 CS50 中的马里奥作业来挑战自己,我设法让它发挥作用!我不太明白循环是如何工作的,尤其是数学,因为我只是玩弄以获得我想要的结果。
作业要求如下
- 使用哈希创建半金字塔
- 确保它正确对齐
- 应与用户给出的身高相符
- 第一行应以 2"#"s 开头
如能对我的循环进行任何澄清,我们将不胜感激:)
print('Height: ', end='');
h = int(input());
while(h<0 or h > 24):
print("That is an invalid input")
print('Height: ', end='');
h = int(input());
for i in range(h):
print(" "*(h-i)+"#"*(i+1));
范围(开始,停止[,步骤])
Python range() 函数 returns 从某个下限(默认为零)到(但不包括)某个上限的整数列表,可能以增量(步骤)一些其他数字(一个,默认情况下)。 因此,
range(3) returns a sequence: 0, 1, 2
range(1,3) returns a sequence: 1, 2
range(1,7,2) returns a sequence: 1, 3, 5
首先,只想指出,您的代码并没有打印出整个金字塔;它只打印出一半。您的输出应该类似于(例如,如果我们输入高度为 3):
# #
## ##
### ###
您的代码只打印左侧:
#
##
###
现在,回答你的问题。这是你如何让它工作的:
for i in range(h): print(" " * (h - i) + "#" * (i + 1));
描述for循环的条件语句,i
从0开始,一直上升到h
。
要了解您的 print()
语句的工作原理,请将其视为由 space 和散列组成的线段。该段的长度为h
。因此,在 h - i
中,您将此 "segment" 的一部分打印为 spaces,而在 i + 1
中,您打印循环的其余部分。
现在,您使用 i + 1
而不仅仅是 i
的原因是因为 for 循环条件; i
从零开始。因此,您一定已经意识到第一行没有散列,因为有 h - 0
space 和 0
散列。这就是为什么需要 i + 1
的原因;如果您仔细检查当前代码,您将在每一行的开头打印一个额外的 space。
一个更容易理解的代码逻辑,结果相同,是:
for i in range(1, h + 1): # The counter's range is toyed with here
print(" " * (h - i) + "#" * i); # The "i + 1" is removed
在这里,循环的范围被玩弄了;现在它从 1 开始(以便打印第一个散列,并且整个 "segment" 不仅仅是第一行的 spaces),并且它在 h + 1
结束(这样循环范围保持不变)。
删除了i + 1
;看到 print()
语句可以更容易理解上面讨论的 "segment" 逻辑。
*澄清一下,我上面提供的替代代码并不是要替代您的代码;我只是将其包括在内以强化我的 "segment" 想法。你的代码非常好,和我的一样好用。
我认为,这不是正确答案。为了理解它,请使用 "_"
或其他符号代替空格。如果height = 1
,我们可以看到_#
,但必须是#
。所以正确答案,可以是:
print('Height: ', end='');
h = int(input());
while(h<0 or h > 24):
print("That is an invalid input")
print('Height: ', end='');
h = int(input());
for i in range(h):
print("_" * (h - (i+1)) + "#" * (i + 1));
对不起我的英语。
你想把它们分成两部分,这样你就可以看到图片 clearly.From 并排实现会更容易。
left_align_counter = 0
print("Printing left aligned")
print("Height: ", end="")
height = int(input())
for h in range(height):
left_align_counter +=1
print("#"*left_align_counter)
print("DONE.")
right_align_counter = 0
print("Printing right align ")
for h in range(height):
right_align_counter += 1
print(" "*int(height-right_align_counter), end="")
print("#"*int(right_align_counter))
print("DONE.")
并排打印
left_align_counter = 0
print("Printing left aligned")
print("Height: ", end="")
height = int(input())
for h in range(height):
left_align_counter +=1
print("#"*left_align_counter)
print("DONE.")
right_align_counter = 0
print("Printing right align ")
for h in range(height):
right_align_counter += 1
print(" "*int(height-right_align_counter), end="")
print("#"*int(right_align_counter))
print("DONE.")
#here we can use any counter for the blocks be it right or left so just use counter variable
counter = 0
for h in range(height):
counter += 1
print(" "*int(height-counter), end="")
print("#"*int(counter), end=' ')
print("#"*int(counter),end="\n")