打印【大数字】、生成随机语句----课后习题(详解)

Python 3 程序开发指南(第二版)第一章课后习题讲解

不是参考答案,但也能准确得出答案,博主本人写的代码

题目有的太长了,没抄全,参考书本放结尾了

若有差错,欢迎指正

目录

1.书中代码

1.1 bigdigits.pv

1.1.1 源码

1.1.2 讲解

1.2 generate_grid.py

1.2.1 源码

2.课后练习

2.1 书本bigdigits.py程序的一个变形,不再打印*,而是打印具体的数字。

思路

实现

例图

2.2 创建程序,打印输入数组本身、个数、和、最值、均值

思路

实现

例图

2.3 随机生成简单语句(冠词、主语、动词、状语)……

思路

实现

例图

2.4 控制2.3输出语句的数量思路

实现

例图

2.5 将2.2的数组排序并输出中间值

思路

实现

例图

 结语:


1.书中代码

1.1 bigdigits.pv

主讲这个,后面的练习有很大程度的借鉴。

1.1.1 源码

import sys
Zero = ["  *** ",
        " *   *",
        " *   *",
        " *   *",
        " *   *",
        " *   *",
        " *   *",
        " *   *",
        "  *** "];
One = ["   *  ",
       "  **  ",
       " * *  ",
       "   *  ",
       "   *  ",
       "   *  ",
       "   *  ",
       "   *  ",
       " *****",];
Two = [" *****",
       "     *",
       "     *",
       "     *",
       "  *** ",
       " *    ",
       " *    ",
       " *    ",
       " *****"];
Three = [" **** ",
         "     *",
         "     *",
         "     *",
         " *****",
         "     *",
         "     *",
         "     *",
         " **** "];
Four = [" *   *",
        " *   *",
        " *   *",
        " *   *",
        "  ****",
        "     *",
        "     *",
        "     *",
        "     *"];
Five = ["  ****",
        " *    ",
        " *    ",
        " *    ",
        "  *** ",
        "     *",
        "     *",
        "     *",
        " *****"];
Six = ["  ****",
       " *    ",
       " *    ",
       " *    ",
       " *****",
       " *   *",
       " *   *",
       " *   *",
       " *****"];
Seven = ["  ****",
         " *   *",
         "     *",
         "     *",
         "     *",
         "     *",
         "     *",
         "     *",
         "     *",];
Eight = ["  *** ",
         " *   *",
         " *   *",
         " *   *",
         "  *** ",
         " *   *",
         " *   *",
         " *   *",
         "  *** "];
Nine = ["  *** ",
        " *   *",
        " *   *",
        " *   *",
        "  *** ",
        "     *",
        "     *",
        "     *",
        " *****"]
Digits = [Zero, One, Two, Three, Four, Five, Six, Seven, Eight, Nine]
try:
    digits = input("Please input the number:")
    row = 0
    while row < 9:
        line = ""
        column = 0
        while column < len(digits):
            number = int(digits[column])
            digit = Digits[number]
            line += digit[row] + ""
            column += 1
        print(line)
        row += 1
except IndexError:
    print("usage: big_digits.py <number>")
except ValueError as err:
    print(err, "in", digits)

1.1.2 讲解

观察源码,我们发现这个程序的的核心思路如下:

  1. 输入原始数组digits[1,2,4,,……](随意输入)
  2. 从大数字数组Digits抽取第一个数字1对应的大数字
  3. 将1对应的大数字第一行加到line字符串上
  4. 进入循环,将原始数组每一个数字对应的大数字的第一行加到line上
  5. 输出第一行
  6. 进入循环,不断输出第2,3,……行
  7. 结束代码

1.2 generate_grid.py

不讲这个了,因为博主也没咋懂,献上源码

1.2.1 源码

import random
def get_int(msg, minimum, default):
    while True:
        try:
            line = input(msg)
            if not line and default is not None :
                return default
            i = int(line)
            if i < minimum:
                print("must be >=", minimum)
            else:
                return i
        except ValueError as err:
            print(err)

rows = get_int("rows:", 1, None)
columns = get_int("columns:", 1, None)
minimum = get_int("minimum (or Enter for 0):", -1000000, 0)

default = 1000
if default < minimum:
    default = 2*minimum
maximum = get_int("maximum (or Enter for "+ str(default) +"):",
                  minimum, default)

row = 0
while row < rows:
    line = ""
    column = 0
    while column < columns:
        i = random.randint(minimum, maximum)
        s = str(i)
        while len(s) < 10:
            s = " " + s
        line += s
        column += 1
    print(line)
    row += 1

2.课后练习

2.1 书本bigdigits.py程序的一个变形,不再打印*,而是打印具体的数字。

思路

在我看来,变形的最关键步骤在于将每一个大数字的每一行加在line字符串上。如果我能实现提取第一个大数字的第一行后,将其先进行转化,后加到line上,不就可以完美实现要求了。

实现

# 新建大数字数组
Zero = ["  *** ",
        " *   *",
        " *   *",
        " *   *",
        " *   *",
        " *   *",
        " *   *",
        " *   *",
        "  *** "]
One = ["   *  ",
       "  **  ",
       " * *  ",
       "   *  ",
       "   *  ",
       "   *  ",
       "   *  ",
       "   *  ",
       " *****",]
Two = [" *****",
       "     *",
       "     *",
       "     *",
       "  *** ",
       " *    ",
       " *    ",
       " *    ",
       " *****"]
Three = [" **** ",
         "     *",
         "     *",
         "     *",
         " *****",
         "     *",
         "     *",
         "     *",
         " **** "]
Four = [" *   *",
        " *   *",
        " *   *",
        " *   *",
        "  ****",
        "     *",
        "     *",
        "     *",
        "     *"]
Five = ["  ****",
        " *    ",
        " *    ",
        " *    ",
        "  *** ",
        "     *",
        "     *",
        "     *",
        " *****"]
Six = ["  ****",
       " *    ",
       " *    ",
       " *    ",
       " *****",
       " *   *",
       " *   *",
       " *   *",
       " *****"]
Seven = ["  ****",
         " *   *",
         "     *",
         "     *",
         "     *",
         "     *",
         "     *",
         "     *",
         "     *",]
Eight = ["  *** ",
         " *   *",
         " *   *",
         " *   *",
         "  *** ",
         " *   *",
         " *   *",
         " *   *",
         "  *** "]
Nine = ["  *** ",
        " *   *",
        " *   *",
        " *   *",
        "  *** ",
        "     *",
        "     *",
        "     *",
        " *****"]
Digits = [Zero, One, Two, Three, Four, Five, Six, Seven, Eight, Nine]





try:
    # 输入待放大数组
    digits = input("Please input the number:")
    
    # 按行号输出大数字
    row = 0 # 初始行号
    while row < 9: # 总共输出9行
        line = "" # 初始行字符串
        column = 0 
        while column < len(digits): # 输出大数字数量控制
            number = int(digits[column]) # 提取待放大数组第column个数字
            digit = Digits[number] # 从大数字数组中抽取对应大数字数组元素

            # 大数字数组元素*->number转换
            column_2 = 0 # 初始列号
            number_2 = str(digits[column]) # 转化number为str格式
            P = "" # 转化后初始行
            while column_2 < 6: # 总共转化6行
                # 提取第一个大数字第一行第一列进行比较
                if digit[row][column_2] == "*": # 字符为*
                    P += number_2
                else: #字符为blank
                    P += ' '
                column_2 += 1

            # 将转化后的第一个大数字的第一行加在初始行字符串上
            line += P + "" 
            
            # line += digit[row] + ""
            column += 1
        # 输出第一行字符串
        print(line)
        # 行数加一
        row += 1 
# 异常处理
except IndexError:
    print("usage: big_digits.py <number>")
except ValueError as err:
    print(err, "in", digits)

例图

2.2 创建程序,打印输入数组本身、个数、和、最值、均值

思路

数组的输入比较简单,while循环就可以很轻松做到。输出的话用print函数。数组个数可以使用len函数。和直接用while全都循环加起来。最值可以参考学过的C语言上的两两比较。均值直接用和除以个数。

实现

# 数组输入
number_str = []
while True:
    P = ""
    P += input("enter a number or Enter to finish: ")
    # 判断是否结束
    if P != " ":
        number_str += P
    else:
        break
    
# 将str型数组整体转换为int型数组
number_str_new = list(map(int, number_str))
print("numbers:",number_str_new)

# 直接利用函数求数组元素数量
count = len(number_str_new)

# 设置初始最值
highest = lowest = number_str_new[0]

count_2 = 0
summ = 0

# 求和、求最值
while count_2 < count:# 全部元素进行循环
    
    summ += number_str_new[count_2]# 求和
    
    if lowest > number_str_new[count_2]:# 依次进行比较
        lowest = number_str_new[count_2]
        
    if highest < number_str_new[count_2]:# 同上
        highest = number_str_new[count_2]


    count_2 += 1# 下一个元素

# 求平均数
mean = summ/count
mean_2 = round(mean, 11)# 对mean保留11位小数

# 输出最终数据
print("count = ",count," sum = ",summ," lowest = ",lowest," highest = ",highest," mean = ",mean_2)


'''
求最值原始代码
lowest = number_str_new[0]
count_lowest = 0
while count_lowest < count:
    if lowest > number_str_new[count_lowest]:
        lowest = number_str_new[count_lowest]
    count_lowest += 1

highest = number_str_new[0]
count_highest = 0
while count_highest < count:
    if highest < number_str_new[count_highest]:
        highest = number_str_new[count_highest]
    count_highest += 1
'''


例图

2.3 随机生成简单语句(冠词、主语、动词、状语)……

思路

创建冠词数组、主语数组、动词数组、状语数组,使用random.choice随机从数组中抽取元素组合。

实现

import random

# 编写词典数组集
article = ["The","A","One","Another",]
subject = ["mouse","cow","tiger","rabbit","dragon","snake",
           "horse","sheep","monkey","cock","dog","pig"]
verb = ["singed","danced","rapped","played the basketball"]
adverbial = ["happily","angrily","sadly"]

#输出随机组合语句
choice = random.randint(0,1)# 随机选取0或1
if choice == 0:
    # 输出冠词+主语+动词+状语
    print(random.choice(article),random.choice(subject),
      random.choice(verb),random.choice(adverbial))
else:
    # 输出冠词+主语+动词
    print(random.choice(article),random.choice(subject),
      random.choice(verb))

例图

2.4 控制2.3输出语句的数量
思路

while语句和input函数

实现

import random

# 编写词典数组集
article = ["The","A","One","Another",]
subject = ["mouse","cow","tiger","rabbit","dragon","snake",
           "horse","sheep","monkey","cock","dog","pig"]
verb = ["singed","danced","rapped","played the basketball"]
adverbial = ["happily","angrily","sadly"]

# 定义函数-随机输出row_max条语句
def output_sentence(row_max):
    row = 1
    while row <= int(row_max):
        #输出随机组合语句
        choice = random.randint(0,1)# 随机选取0或1
        if choice == 0:
            # 输出冠词+主语+动词+状语
            print(random.choice(article),random.choice(subject),
                  random.choice(verb),random.choice(adverbial))
        else:
            # 输出冠词+主语+动词
            print(random.choice(article),random.choice(subject),
                  random.choice(verb))
        row += 1


# 判断是否需要输出行数
print("whether to specify a row parameter ?:")
print("Yes(Y)    No(N)")
judge = ""
judge += input("input your answer:")


if judge == "N":
    output_sentence(5)
else:
    row_max = input("please input the row parameter: ")# 输入行数
    output_sentence(row_max)

例图

2.5 将2.2的数组排序并输出中间值

思路

从第一个元素开始,每一个元素都要和其后面的每一个元素进行比较。若比后面的大,则交换。直到实现数组元素从小到大排序。中间值的化与个数有关,具体方法不再赘述,代码中的注释很详细。

实现

# 数组输入
number_str = []
while True:
    P = ""
    P += input("enter a number or Enter to finish: ")
    # 判断是否结束
    if P != " ":
        number_str += P
    else:
        break
    
# 将str型数组整体转换为int型数组
number_str_new = list(map(int,number_str))
print("numbers:",number_str_new)

# 直接利用函数求数组元素数量
count = len(number_str_new)

# 设置初始最值
highest = lowest = number_str_new[0]

count_2 = 0
summ = 0

# 求和、求最值
while count_2 < count:# 全部元素进行循环
    
    summ += number_str_new[count_2]# 求和
    
    if lowest > number_str_new[count_2]:# 依次进行比较
        lowest = number_str_new[count_2]
        
    if highest < number_str_new[count_2]:# 同上
        highest = number_str_new[count_2]


    count_2 += 1# 下一个元素

# 求平均数
mean = summ/count
mean_2 = round(mean, 11)# 对mean保留11位小数

# 从小到大排序
index_4 = 0# 从第一个元素开始
while index_4 < count:
    index_5 = index_4 + 1
    # 将第一个元素依次和后面全部元素对比
    while index_5 < count:
        # 如果第一个大,则交换,将最小的交换到第一位置
        if number_str_new[index_4] > number_str_new[index_5]:
            number_str_new[index_4],number_str_new[index_5]=number_str_new[index_5],number_str_new[index_4]
        index_5 += 1
    index_4 += 1
print(number_str_new)

# 取中间值
if count % 2 == 1:# 判断为奇数
    index_odd = (int(count)-1)/2# 计算下标
    middium = number_str_new[int(index_odd)]
else:
    index_even_1 = int(count)/2# 计算中间两个下标
    index_even_2 = (int(count)/2)-1
    middium_1 = number_str_new[int(index_even_1)]# 取出中间两个元素的值
    middium_2 = number_str_new[int(index_even_2)]
    middium = (middium_1 + middium_2)/2



# 输出最终数据
print("count = ",count," sum = ",summ," lowest = ",lowest," highest = ",highest," mean = ",mean_2," middium = ",middium)


'''
求最值原始代码
lowest = number_str_new[0]
count_lowest = 0
while count_lowest < count:
    if lowest > number_str_new[count_lowest]:
        lowest = number_str_new[count_lowest]
    count_lowest += 1

highest = number_str_new[0]
count_highest = 0
while count_highest < count:
    if highest < number_str_new[count_highest]:
        highest = number_str_new[count_highest]
    count_highest += 1
'''


例图

 结语:

学了C语言后再来学Python总会有一种触类旁通的感觉。

参考书:Python 3 程序设计开发指南(第二版修订版)人民邮电出版社

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xxhls0208

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值