我正在阅读Paul Deitel的《Intro to Python for Computer Science and Data Science》一书。我在第71页,它要求我运行一个脚本。这是这本书的下载文件的一部分,它不运行。我已经去了文件,并在记事本中打开它,复制代码,并将其放入代码编辑器(PyCharm),在第32行,它说索引超出范围。那我该怎么办
enter code here
# RollDieDynamic.py
"""Dynamically graphing frequencies of die
rolls."""
from matplotlib import animation
import matplotlib.pyplot as plt
import random
import seaborn as sns
import sys
def update(frame_number, rolls, faces,
frequencies):
"""Configures bar plot contents for each animation
frame."""
# roll die and update frequencies
for i in range(rolls):
frequencies[random.randrange(1, 7) - 1] += 1
# reconfigure plot for updated die frequencies
plt.cla() # clear old contents contents of current
Figure
axes = sns.barplot(faces, frequencies,
palette='bright') # new bars
axes.set_title(f'Die Frequencies for
{sum(frequencies):,} Rolls')
axes.set(xlabel='Die Value', ylabel='Frequency')
axes.set_ylim(top=max(frequencies) * 1.10) # scale
y-axis by 10%
# display frequency & percentage above each patch
(bar)
for bar, frequency in zip(axes.patches,
frequencies):
text_x = bar.get_x() + bar.get_width() / 2.0
text_y = bar.get_height()
text = f'{frequency:,}\n{frequency /
sum(frequencies):.3%}'
axes.text(text_x, text_y, text, ha='center',
va='bottom')
# read command-line arguments for number of frames
and rolls per frame
number_of_frames = int(sys.argv[1])
rolls_per_frame = int(sys.argv[2])
sns.set_style('whitegrid') # white backround with
gray grid lines
figure = plt.figure('Rolling a Six-Sided Die') #
Figure for animation
values = list(range(1, 7)) # die faces for display
on x-axis
frequencies = [0] * 6 # six-element list of die
frequencies
# configure and start animation that calls function
update
die_animation = animation.FuncAnimation(
figure, update, repeat=False,
frames=number_of_frames, interval=33,
fargs=(rolls_per_frame, values, frequencies))
plt.show() # display window
4条答案
按热度按时间41zrol4v1#
这段代码也可以在github上找到。这里是链接。https://github.com/pdeitel/IntroToPython/blob/master/examples/ch01/RollDieDynamic.py
Github中的代码运行得非常好。下面是我制作的一个简短视频,以证明代码没有问题。https://drive.google.com/file/d/1hrzOAWRS34U1vgfOehhWzuqRktndRJhC/view?usp=sharing
但是,您得到的错误可能是由于代码中的缩进。请确保您没有使用制表符缩进,而只是空格键。此外,由于您发布的代码已经失去了缩进,可能您的一些注解可能会在代码中运行。
解决方案直接从github链接复制代码,在IDE上运行即可。确保使用正确的命令,即
如书中所述。
另一种方法是将代码复制到Google Colab或Jupyter notebook上,并在单独的单元格中运行每个命令,以确切地找到为什么会出现错误。每一行代码都可以在一个单元格中单独运行。这样你就能更好地理解代码的作用,也能让你知道错误在哪里以及为什么会产生。
tp5buhyn2#
我修正了32和33行的错误。我将int(sys.argv [1])和[2]改为len(sys.argv [0])和[0]
q5lcpyga3#
下面是GitHub链接,指向作者的源代码RollDieDynamic.py,来自Paul Deitel的Python for Computer Science and Data Science。这将有助于解决您发布的代码中的任何缩进问题。
https://github.com/pdeitel/IntroToPython/blob/master/examples/ch01/RollDieDynamic.py
下面是作者从自述文件中的注解。https://github.com/pdeitel/IntroToPython
注:如果您尝试运行RollDieDynamic.py第1章中的www.example.com脚本,但窗口未出现,则这是由于软件中存在已知问题,正在进行修复。您可以改为使用
然后在关闭脚本窗口后终止IPython交互模式(Ctrl + D两次)。
我不熟悉IPython,但这里有一个链接可以了解更多有关它的信息。https://ipython.org/install.html
mm5n2pyu4#
我也有问题运行线
RollDieDynamic.py 6000 1
对我来说,它说:
ModuleNotFoundError Traceback(most recent call last)File ~/Documents/examples/ch01/RollDieDynamic.py:6 4 import matplotlib.pyplot as plt 5 import random ----> 6 import seaborn as sns 7 import sys 9 def update(frame_number,rolls,faces,frequencies):
ModuleNotFoundError:No module named 'seaborn'(base)meldrum@Meldrums-MBP ch01%