全国计算机等级考试(2019年版python)用自己的思路编写课后习题代码(6-8章)

本来想把后面五章的代码一块放进来的,但是吸收了发布前面五章代码的经验,这次在代码的基础上又增加了注释和代码验证结果部分,所以整体看起来6-8章的代码会比较多,但是如果除去这些非必要代码和说明的部分,其实也还好,加上那些只是为了更好地加深理解。

第六章 组合数据类型

#1 英文字符频率统计

'''
编写一个程序,对给定字符串中出现的a~z字母频率进行分析,忽略大小写采用降序方式输出
'''
txt = 'I love you three thousand times.'  # 给定一个字符串
txt = txt.lower()  # 全部小写
def get_char(txt):
    for ch in '!"#$%&()*+-,-./:;<=>?@" "[\\]^_`{|}~':
        txt = txt.replace(ch,'')  # 将文本中的特殊字符进行替换
    return txt
txt_char = get_char(txt)
# print(txt_char)    #输出结果为iloveyouthreethousandtimes,符合要求
length = len(txt_char)

# 建立字典
counts = {}
for i in txt_char:
    counts[i] = counts.get(i,0) + 1  # d.get(key,default) 键存在则返回对应值,否则返回默认值default
items = list(counts.items()) # 键值对以元组形式返回
items.sort(key = lambda x : x[1],reverse=True) # 元组中的第二个值进行排序,每个字母的计数值
for i in items:
    key,value = i
    print("{0} 字母出现的频率为 {1} ".format(key,value / length))
# 输出结果为
e 字母出现的频率为 0.15384615384615385
o 字母出现的频率为 0.11538461538461539
t 字母出现的频率为 0.11538461538461539
i 字母出现的频率为 0.07692307692307693
u 字母出现的频率为 0.07692307692307693
h 字母出现的频率为 0.07692307692307693
s 字母出现的频率为 0.07692307692307693
l 字母出现的频率为 0.038461538461538464
v 字母出现的频率为 0.038461538461538464
y 字母出现的频率为 0.038461538461538464
r 字母出现的频率为 0.038461538461538464
a 字母出现的频率为 0.038461538461538464
n 字母出现的频率为 0.038461538461538464
d 字母出现的频率为 0.038461538461538464
m 字母出现的频率为 0.038461538461538464

#2 中文字符频率统计

'''
编写一个程序,对给定字符串中出现的全部字符(含中文字符)频率进行统计,采用降序方式输出
'''
txt = 'English: I love you three thousand times.' \
      '中   文:我爱你三千遍。'  # 给定一个字符串
txt = txt.lower()  # 全部小写
# print(txt)    # 输出结果为 english: i love you three thousand times.中   文:我爱你三千遍。    # 符合要求
length = len(txt)

# 建立字典
counts = {}
for i in txt:
    counts[i] = counts.get(i,0) + 1
items = list(counts.items()) # 键值对以元组形式返回
items.sort(key = lambda x : x[1],reverse=True) # 元组中的第二个值进行排序,每个字母的计数值
for i in items:
    key,value = i
    print("{0} 字母出现的频率为 {1} ".format(key,value / length))
# 输出结果为
  字母出现的频率为 0.16666666666666666
e 字母出现的频率为 0.09259259259259259
i 字母出现的频率为 0.05555555555555555
s 字母出现的频率为 0.05555555555555555
h 字母出现的频率为 0.05555555555555555
o 字母出现的频率为 0.05555555555555555
t 字母出现的频率为 0.05555555555555555
n 字母出现的频率为 0.037037037037037035
l 字母出现的频率为 0.037037037037037035
u 字母出现的频率为 0.037037037037037035
g 字母出现的频率为 0.018518518518518517
: 字母出现的频率为 0.018518518518518517
v 字母出现的频率为 0.018518518518518517
y 字母出现的频率为 0.018518518518518517
r 字母出现的频率为 0.018518518518518517
a 字母出现的频率为 0.018518518518518517
d 字母出现的频率为 0.018518518518518517
m 字母出现的频率为 0.018518518518518517
. 字母出现的频率为 0.018518518518518517
中 字母出现的频率为 0.018518518518518517
文 字母出现的频率为 0.018518518518518517
: 字母出现的频率为 0.018518518518518517
我 字母出现的频率为 0.018518518518518517
爱 字母出现的频率为 0.018518518518518517
你 字母出现的频率为 0.018518518518518517
三 字母出现的频率为 0.018518518518518517
千 字母出现的频率为 0.018518518518518517
遍 字母出现的频率为 0.018518518518518517
。 字母出现的频率为 0.018518518518518517

#3 随机密码生成

'''
编写程序在26个字母大小写和9个数字组成的列表中随机生成10个8位密码
'''
import random
max_list = [chr(i) for i in range(97,123)] + [chr(i) for i in range(65,91)] + [chr(i) for i in range(49,58)]
# print(max_list) 列表生成式

length = len(max_list)  # 61
list_10 = [[max_list[random.randint(0,length-1)] for i in range(8)] for j in range(10)]
for i in list_10:
    print(''.join(i)) # 列表转字符串输出
# 输出结果为
eDiq932P
k7cGdBCh
m4dfyhUG
P6N3qBRm
utE8EKLO
cNqTi1vB
e5iz6sXS
uRFinfka	
NExT6pj3
Eod4XTAR

#4 重复元素判定

'''
编写一个函数,接受列表作为参数,如果一个元素在列表中出现了不止一次,则返回True,
但不要改变原有列表的值。同时编写调用这个函数和输出测试结果的程序。
'''
L = input("请您输入一个列表:")
L = list(L)  # 确认列表
def ele_rep(L):
    for i in L:
        if L.count(i) > 1:
            return True
    return False  # for循环运行结束如果还没有符合要求的就会运行此处的代码
print(ele_rep(L))
print(L)
# 输出结果
请您输入一个列表:hahhaha
True
['h', 'a', 'h', 'h', 'a', 'h', 'a']

#5 重复元素判定续。

'''
利用集合的无重复性改编上一个程序,获得一个更快更简洁的版本。
'''
L = input("请您输入一个列表:")
L = list(L)  # 确认列表
def ele_rep(L):
    set_L = set(L)  # set(L)会自动去重
    if set_L != L:
        return True
    return False  # for循环运行结束如果还没有符合要求的就会运行此处的代码
print(ele_rep(L))
print(L)
# 输出结果
请您输入一个列表:hahhaha
True
['h', 'a', 'h', 'h', 'a', 'h', 'a']

第七章 文件和数据格式化

#1 输入一个文件和一个字符,统计该字符在文件中出现的次数。

file_name = input("请输入一个文件的名字:")
a_char    = input("请输入一个字符:")
f = open(file_name,'r',encoding='utf-8')  # 对象和文件关联起来
txt = f.read()  # 读操作
f.close()       # 关闭打开的文件
count = txt.count(a_char)  # 统计字符的次数
print("{} 字符在《{}》中出现的次数是:{} 次".format(a_char,file_name.split('.')[0],count))
# 输出结果
请输入一个文件的名字:Hamlet哈姆雷特中英对照剧本.txt
请输入一个字符:Hamlet
Hamlet 字符在《Hamlet哈姆雷特中英对照剧本》中出现的次数是:43

#2 假设有一个英文文本文件,编写一个程序读取其内容并将里面的大写字母变成小写字母,小写字母变成大写字母

file_name     = input("请输入一个原英文文件的名字:")
file_name     = file_name + '.txt'
file_new_name = input("请输入一个新英文文件的名字:")
file_new_name = file_new_name + '.txt'

# 打开原文件
f = open(file_name,'r',encoding='utf-8')
txt = f.readlines()
f.close()   # 关闭文件
print(txt)  # 原文本(作为后续的对比)
new_txt = []
for line in txt:
    for i in line:
        if 'A' <= i <= 'Z':
            new_txt.append(i.lower())
        elif 'a' <= i <= 'z':
            new_txt.append(i.upper())
        else:
            new_txt.append(i)

# 写入新文件
f_new = open(file_new_name,'w',encoding='utf-8')
for lines in new_txt:
    f_new.writelines(lines)
f_new.close()      # 关闭文件

# 读取新文件的内容
f_new_r = open(file_new_name,'r',encoding='utf-8')
txt = f_new_r.readlines()
f_new_r.close()    # 关闭文件
print(txt)         # 新文本

# 此题也可以采用函数的方式会更加有利于代码的移植和复用,大家可以自行尝试,这里不再提供
# 输出结果
请输入一个原英文文件的名字:English_test
请输入一个新英文文件的名字:English_test_new
['HAMLET:Good madam!\n', 'KING CLAUDIUS:Gertrude, do not drink.\n', 'QUEEN GERTRUDE:I will, my lord; I pray you, forgive me.\n', 'KING CLAUDIUS :It is the poisonous cup : it is too late.(悄悄说)\n', 'HAMLET:I dare not drink yet, madam; by and by.\n', 'QUEEN GERTRUDE:Come, let me wipe you face.\n', "LAERTES:My lord, I'll hit him now.\n", 'KING CLAUDIUS:I do not think so.\n', 'HAMLET:Come, for the third.\n', 'LAERTES: come on.']
['hamlet:gOOD MADAM!\n', 'king claudius:gERTRUDE, DO NOT DRINK.\n', 'queen gertrude:i WILL, MY LORD; i PRAY YOU, FORGIVE ME.\n', 'king claudius :iT IS THE POISONOUS CUP : IT IS TOO LATE.(悄悄说)\n', 'hamlet:i DARE NOT DRINK YET, MADAM; BY AND BY.\n', 'queen gertrude:cOME, LET ME WIPE YOU FACE.\n', "laertes:mY LORD, i'LL HIT HIM NOW.\n", 'king claudius:i DO NOT THINK SO.\n', 'hamlet:cOME, FOR THE THIRD.\n', 'laertes: COME ON.']

#3 编写一个程序,生成一个10x10的随机矩阵并保存为文件。

'''
空格分隔行向量、换行分隔列向量
再写程序将刚才保存的矩阵文件另存为CSV格式,用Excel或文本编辑器打开看看结果对不对
'''
# 生成10x10矩阵
from random import *
matrix = ''  # 这里最好使用str形式,一开始我使用列表形式后面报错需要使用str形式进行写操作
for row in range(10):
    line = ''
    for line_row in range(10):
        line += "{} ".format(randint(1,10))
    matrix += "{}\n".format(line)

# 将矩阵保存为txt文件
#print(matrix)
f = open('matrix.txt','w',encoding='utf-8')
f.write(matrix)
# print(f)  # <_io.TextIOWrapper name='matrix.txt' mode='w' encoding='utf-8'>
f.close()

# 将随机矩阵存储为CSV格式
f_csv = open('matrix.csv','w',encoding='utf-8')
f_csv.write(matrix.replace(' ',','))  # csv格式要求用逗号进行分开
f_csv.close()
# 输出结果
# matrix.txt
2 8 3 8 7 6 9 2 3 5
6 10 8 1 9 3 2 5 4 2
4 9 1 2 4 2 6 4 3 4
4 1 8 2 7 7 2 10 9 4
5 1 5 4 1 1 6 5 9 5
3 9 1 5 1 9 10 10 5 1
4 9 8 3 6 2 8 10 9 3
2 3 3 8 10 8 1 9 4 9
4 7 2 4 6 4 2 3 3 9
10 8 1 9 2 6 8 3 7 2

# matrix.csv
2,8,3,8,7,6,9,2,3,5,
6,10,8,1,9,3,2,5,4,2,
4,9,1,2,4,2,6,4,3,4,
4,1,8,2,7,7,2,10,9,4,
5,1,5,4,1,1,6,5,9,5,
3,9,1,5,1,9,10,10,5,1,
4,9,8,3,6,2,8,10,9,3,
2,3,3,8,10,8,1,9,4,9,
4,7,2,4,6,4,2,3,3,9,
10,8,1,9,2,6,8,3,7,2,

#4 编写一个程序,读取一个python源代码文件,将文件中所有除保留字外的小写字母转换成大写字母,生成后的文件要能够被python解释器正确执行。

import keyword
keyword_list = keyword.kwlist
# print(keyword_list) # ['False', 'None', 'True', 'and', 'as', 'assert', 'async', 'await', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']
table_keyword = ['def','return'] # 源代码中的保留字
table = ['input','eval','print','format'] # 源代码保留字以外的关键字

# 打开文件
f = open('test_keyword.py','r',encoding='utf-8')
content = f.read()
f.close()

# 字符处理
new = ''
temp = '' # 临时字符串,用于判断和处理
for ch in content:
    if ch.isalpha():  # 如果字符串至少有一个字符并且所有字符都是字母则返回 True,否则返回 False,类似的用法还有iaslnum(),判断是否由字母和数字组成
        temp += ch
    else: # 如果不是字母,表示一个连续的字母构成的字符串结束,此时ch为非字母
        if(not keyword.iskeyword(temp)) and (temp not in table):
            temp = temp.upper()  # 如果不是保留字和内置方法,变成大写形式
        new += temp # 将temp添加进新字符串中
        new += ch   # 添加非字母ch
        temp = ''   # 清空临时字符串,用于下次继续使用
#print(new)

# 生成文件
new_file = open('test_keyword_finally.py','w',encoding='utf-8')
new_file.write(new)
new_file.close()
# 输出结果
# test_keyword.py 源文件内容

def add_num(a,b):
    c = a + b
    return c
x = eval(input("请输入第一个数:"))
y = eval(input("请输入第二个数:"))
print("这两个数相加的输出结果是:{}".format(add_num(x,y)))

# test_keyword_finally.py 输出结果文件内容(经验证是可以编译并输出的)

def ADD_NUM(A,B):
    C = A + B
    return C
X = eval(input("请输入第一个数:"))
Y = eval(input("请输入第二个数:"))
print("这两个数相加的输出结果是:{}".format(ADD_NUM(X,Y)))

#5 编写一个程序,要求能够将元素为任意python支持的类型(包括含有半角逗号的字符串)的列表转储为csv,并能够重新正确解析为列表

# 定义处理列表的函数save_csv()
def save_csv(list_ele,file_name):
    f_csv = open(file_name,'w')
    t = ''
    for i in range(len(list_ele)):
        t += str(list_ele[i]) + '列表分隔处'
    # print(t)
    '''
    filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回一个迭代器对象,如果要转换为列表,可以使用 list() 来转换。
    该接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判,
    然后返回 True 或 False,最后将返回 True 的元素放到新列表中。
    '''
    x = t.split("列表分隔处")     # 造成最后一个元素是''
    del x[-1]        # 因为最后一个元素是'',所有需要删除掉
    # print(x)
    # x = list(filter(None,t.split("列表分隔处"))) # 如果function传入None,则返回所有本身可以判断为True的元素。(0会返回false)
    f_csv.write(",".join(x))
    f_csv.close()

# 定义打开csv文件并正确解析为列表的函数
def open_csv(file_name):
    f = open(file_name,'r')
    f = f.read().replace(',','从此处分隔')
    new_list = f.split('从此处分隔')
    print("解析出的列表为 {}".format(new_list))

# 先定义主函数,由上到下的模块设计思想
def main():
    list_ele = input("请输入列表元素,以空格分隔:")
    list_ele = list_ele.replace(' ',',').split(',')
    print("你输入的列表为 {}".format(list_ele))
    file_name = input("请输入要保存的csv文件名:")
    save_csv(list_ele,file_name)
    open_csv(file_name)
    
main()
# 输出结果
请输入列表元素,以空格分隔:1 2 3 4 的 de , . /  over
你输入的列表为 ['1', '2', '3', '4', '的', 'de', '', '', '.', '/', '', 'over']
请输入要保存的csv文件名:list_test_csv.csv
解析出的列表为 ['1', '2', '3', '4', '的', 'de', '', '', '.', '/', '', 'over']

第八章 Python计算生态

#1 用户输入一个年份,编写程序判断该程序是否是闰年。

'''
如果年份能够被400整除,则为闰年;如果年份能够被4整除但不能被100整除也为闰年
'''
def leap_year(year):
    if year % 4 == 0:
        if year % 100 != 0:  # 不能单纯地以为能被4整除也能被100整除就是能够被400整除了,比如1000
            return "{}年是闰年!".format(year)
        elif year % 400 == 0:
            return "{}年是闰年!".format(year)
        else:
            return "{}年不是闰年!".format(year)
    else:
        return "{}年不是闰年!".format(year)

year = eval(input("请输入一个年份:"))
print(leap_year(year))
# 输出结果
请输入一个年份:1000
1000年不是闰年!
#2 参考最后一个实例,尝试将不同标签中的内容分门别类地提取出来,再想想如何提取可以更为准确。(提示:可以查询HTML相关语法)
#3 续上一题,找另外一个网站,尝试编程提取一些自己感兴趣的东西出来。(提示:可自行搜索用于HTML解析的第三方库)

#4 参考第六章最后一个例子,按照8.2节中的方法重新实现一个有较好的函数封装的《Hamlet》文本词频统计程序

# 定义处理文本的函数,要特别注意编码和文件打开关闭的问题
def getText():
    f_txt = open('Hamlet哈姆雷特中英对照剧本.txt','r',encoding='utf-8')  # 打开文件
    txt = f_txt.read()   # 读取内容到txt中
    f_txt.close()   # 一定要记得关闭文件
    txt = txt.lower()
    for ch in '!"@#$%^&*()_+=-`~<,.>?\/;:[//]{\}':
        txt = txt.replace(ch,'')
    return txt  # 将文本中的特殊字符替换为空格
print(getText())

# 定义对字符进行处理的函数,返回排好序的字符
def count_words():
    hamletTxt = getText()
    words = hamletTxt.split()  # 将一个字符串里面的每个字符串单独分离出来(不含空格),返回一个列表
    counts = {}   # 建立字符和统计的字典
    for word in words:
        counts[word] = counts.get(word,0) + 1
    items = list(counts.items())   # 将元素转变成列表的形式
    items.sort(key = lambda x :x[1],reverse=True)  # 以第二列排序
    return items

# 主函数代码
def main():
    for i in range(10):
        items = count_words()  # 先调用count_words(),count_words()会自己调用getTxt()函数,层层调用
        word,count = items[i]
        print("{0:<10} {1:>5}".format(word,count))  # 这个地方不要改成return,否则只会产生一个结果,不会有多个结果

print(main())

# 输出结果
the           57
you           43
hamlet        43
i             35
my            32
and           29
to            28
king          27
me            26
it            20
None

#5 词云是设计和统计的结合,也是艺术和计算机科学的碰撞。

'''
wordcloud 是一款基于python的词云第三方库,支持对词语数量、背景蒙版、字体颜色等各种细节的设置,
试结合上一题构建《Hamlet》的词云效果
'''

from wordcloud import WordCloud
import cv2

# cv2模块作为图片的读入
img_mask = cv2.imread('hamlet.jpg')  # 可以自己去百度上找一张照片

# 打开文件
f = open("hamlet.txt","r",encoding='utf-8')
txt = f.read()
f.close()

# 设置参数
wc = WordCloud( width=800,
                height=600,
                max_words=150,
                max_font_size=80,
                mask=img_mask,
                background_color=None
                ).generate(txt)

# 保存文件
wc.to_file("hamlet词云图片.jpg")

注:最后一题的运行产生的hamlet词云图片.jpg总是显示不出来文字部分,搞了很久也没有弄好,弄成英文的就可以,可能是文件编码有问题,如若有人知道原因还请指正,不胜感激。

hamlet词云图片.jpg

在这里插入图片描述

一个简单的测试

import wordcloud
txt = "i love three thousand times."
wc = wordcloud.WordCloud(background_color="white")
wc.generate(txt)
wc.to_file("word_cloud.png")

word_cloud.png

在这里插入图片描述---------------------------------------------------------------------------------------

全国计算机等级考试(2019年版python)用自己的思路编写课后习题代码(1-5章)

全国计算机等级考试(2019年版python)用自己的思路编写课后习题代码(9-10章)

  • 5
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值