python从入门到实践15章答案

前言

这里是Python从入门到实践的练习答案,在这里把我的答案记录下来,如果有错误或者可以改进的地方欢迎在评论区指正。

在使用本文代码

前请确保已经安装了matplotlib

 


一、15-1立方

import matplotlib.pyplot as plt

x_values = [1, 2, 3, 4, 5]
y_values = [ x**3 for x in x_values]

plt.style.use('seaborn')
fig, ax = plt.subplots()

ax.scatter(x_values, y_values, s = 100)

# 设置图表标题并给坐标轴加上标签
ax.set_title('Cube Numbers', fontsize = 24)
ax.set_xlabel('Values', fontsize = 14)
ax.set_ylabel('Cube Of The Values', fontsize = 14)

# 设置刻度标记的大小
ax.tick_params(axis='both', which='major', labelsize = 14)

plt.show()

结果如下:

 


二、15-2彩色立方 

import matplotlib.pyplot as plt

x_values = range(1, 5001)
y_values = [ x**3 for x in x_values]

plt.style.use('seaborn')
fig, ax = plt.subplots()

ax.scatter(x_values, y_values, c=y_values, cmap=plt.cm.Blues, s = 10)

# 设置图表标题并给坐标轴加上标签
ax.set_title('Cube Numbers', fontsize = 24)
ax.set_xlabel('Values', fontsize = 14)
ax.set_ylabel('Cube Of The Values', fontsize = 14)

# 设置刻度标记的大小
ax.tick_params(axis='both', which='major', labelsize = 14)

ax.axis([0, 5500, 0, 5500**3])

plt.show()

结果如下:

 


 三、15-3分子运动

 

rw_visual.py

import matplotlib.pyplot as plt

from random_walk import RandomWalk

# 只要程序处于活动状态,就不断的模拟随机漫步
while True:

    # 创建一个 RandomWalk 实例
    rw = RandomWalk()
    rw.fill_walk()
    # 将所有点都绘制出来
    plt.style.use('classic')
    fig, ax = plt.subplots(figsize=(15, 9))
    point_numbers = range(rw.num_points)
    # ax.scatter(rw.x_values, rw.y_values, c=point_numbers, cmap=plt.cm.Blues,
    #         edgecolors='none', s=1)
    ax.plot(rw.x_values, rw.y_values, linewidth=1)

    # 突出起点和终点
    ax.scatter(0, 0, c='green',edgecolors='none', s=100)
    ax.scatter(rw.x_values[-1], rw.y_values[-1], c='red', edgecolors='none', s=100)

    # 隐藏坐标轴
    ax.get_xaxis().set_visible(False)
    ax.get_yaxis().set_visible(False)

    plt.show()

    keep_running = input('Make another walk?(y/n): ')
    if keep_running == 'n':
        break

 random_walk.py

from random import choice

class RandomWalk:
    """一个生成随机漫步数据的类"""

    def __init__(self, num_points=5000):
        """初始化随机漫步的属性"""
        self.num_points = num_points

        # 所有随机漫步都始于(0,0)
        self.x_values = [0]
        self.y_values = [0]

    def fill_walk(self):
        """计算随机漫步包含的所有点"""

        # 不断漫步,直到列表达到指定的长度
        while len(self.x_values) < self.num_points:

            # 决定前进方向以及沿这个方向前进的距离
            x_direction = choice([1, -1])
            x_distance = choice([0, 1, 2, 3, 4])
            x_step = x_direction * x_distance

            y_direction = choice([1, -1])
            y_distance = choice([0, 1, 2, 3, 4])
            y_step = y_direction * y_distance

            # 拒绝原地踏步
            if x_step == 0 and y_step == 0:
                continue

            # 计算下一个点的 x 值和 y 值
            x = self.x_values[-1] + x_step
            y = self.y_values[-1] + y_step

            self.x_values.append(x)
            self.y_values.append(y)

 结果如下:

 


四、15-4改进的随机漫步

 这样改一下就行了,看看结果:

 

 剔除-1:
 

 

结果如下:

 


五、15-5重构

 

 


六、15-6两个D8

 dice_visual.py

from die import Die
from plotly.graph_objs import Bar, Layout
from plotly import offline

# 创建骰子
die_1 = Die(8)
die_2 = Die(8)

# 掷几次骰子并将结果储存在一个列表中
results = []
for roll_num in range(1000):
    result = die_1.roll() + die_2.roll()
    results.append(result)

# 分析结果
frequencies = []
max_result = die_1.num_sides + die_2.num_sides
for value in range(2, max_result+1):
    frequency = results.count(value)
    frequencies.append(frequency)

# 对结果进行可视化
x_values = list(range(2, max_result+1))
data = [Bar(x=x_values, y=frequencies)]

x_axis_config = {'title': '结果', 'dtick': 1}
y_axis_config = {'title': '结果的频率'}
my_layout = Layout(title='掷两个D8 1000次的结果',
        xaxis=x_axis_config, yaxis=y_axis_config)
offline.plot({'data': data, 'layout': my_layout}, filename='d8_d8.html')

print(frequencies)

 die.py

from random import randint

class Die:
    """表示一个骰子的类"""

    def __init__(self, num_sides=6):
        """骰子默认为6面"""
        self.num_sides = num_sides

    def roll(self):
        return randint(1, self.num_sides)

结果:

 


七、同时掷三个骰子

 

 修改一下 dice_visual.py即可:

from die import Die
from plotly.graph_objs import Bar, Layout
from plotly import offline

# 创建骰子
die_1 = Die()
die_2 = Die()
die_3 = Die()

# 掷几次骰子并将结果储存在一个列表中
results = []
for roll_num in range(50_000):
    result = die_1.roll() + die_2.roll() + die_3.roll()
    results.append(result)

# 分析结果
frequencies = []
max_result = die_1.num_sides + die_2.num_sides + die_3.num_sides
for value in range(3, max_result+1):
    frequency = results.count(value)
    frequencies.append(frequency)

# 对结果进行可视化
x_values = list(range(3, max_result+1))
data = [Bar(x=x_values, y=frequencies)]

x_axis_config = {'title': '结果', 'dtick': 1}
y_axis_config = {'title': '结果的频率'}
my_layout = Layout(title='掷三个D6 50 000次的结果',
        xaxis=x_axis_config, yaxis=y_axis_config)
offline.plot({'data': data, 'layout': my_layout}, filename='d6_d6_d6.html')

print(frequencies)

结果如下:

 


八、15-8将点数相乘

 

  修改一下 dice_visual.py即可:

from die import Die
from plotly.graph_objs import Bar, Layout
from plotly import offline

# 创建骰子
die_1 = Die()
die_2 = Die()

# 掷几次骰子并将结果储存在一个列表中
results = []
for roll_num in range(50_000):
    result = die_1.roll() * die_2.roll()
    results.append(result)

# 分析结果
frequencies = []
max_result = die_1.num_sides * die_2.num_sides
for value in range(1, max_result+1):
    frequency = results.count(value)
    frequencies.append(frequency)

# 对结果进行可视化
x_values = list(range(1, max_result+1))
data = [Bar(x=x_values, y=frequencies)]

x_axis_config = {'title': '结果', 'dtick': 1}
y_axis_config = {'title': '结果的频率'}
my_layout = Layout(title='掷两个D6 50 000次的结果',
        xaxis=x_axis_config, yaxis=y_axis_config)
offline.plot({'data': data, 'layout': my_layout}, filename='d6__d6.html')

print(frequencies)

结果如下:

 


 九、15-9改用列表解析

对 dice_visual.py做如下改动即可:

 


十、15-10使用两个库

先把官方文档贴在这里:

matplotlib 3.5.2 文档

​​​​​​Plotly Python Graphing Library

die.py不变,稍微改动dice_visual.py

可视化模拟掷骰子的情况: 

import matplotlib.pyplot as plt
from plotly import offline
from die import Die

# 创建骰子
die_1 = Die()
die_2 = Die()

# 掷几次骰子并将结果储存在一个列表中
results = [die_1.roll() + die_2.roll() for roll_num in range(50_000)]

# 分析结果
max_result = die_1.num_sides + die_2.num_sides
frequencies = [results.count(value) for value in range(2, max_result+1)]

# 对结果进行可视化
x_values = list(range(2, max_result+1))

plt.style.use('classic')
fig, ax = plt.subplots()

ax.plot(x_values, frequencies, linewidth=3)


plt.show()
print(frequencies)

 

 

 用Plotly通过可视化来模拟随机漫步的情况

不太会看文档,要是有会的uu写在评论区呀

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值