Python语言程序设计基础 第二版(嵩天著)课后答案第六章

2023-05-16

思考与练习:
P159

6.1 元组是不可变的。即你不能修改元组。元组通过圆括号中用逗号将元素分隔。 集合内的元素不能重复,只能是固定的数据类型,例如:整数、浮点数、字符串、元组等,列表,字典,和集合本身是可变数据类型,不能作为集合的元素出现。

元组和集合的相互转换:元组→集合:set(X),例:

t = ('a','p','p','l','e')
t = set(t)   #转换成集合
print(t)
#运行结果:
#{'l', 'p', 'e', 'a'}

集合→元组:tuple(X),例:

t = {'l', 'p', 'e', 'a'}
t = tuple(t)  #转换成元组
print(t)
#运行结果:
#('l', 'a', 'p', 'e')

6.2

S1 = {1,3,5,6}
S2 = {2,5,6}
print(S1|S2 )   # {1, 2, 3, 5, 6}
print(S1&S2)    # {5, 6}
print(S1^S2)    # {1, 2, 3}
print(S1-S2)    # {1, 3}

6.3 不知道 不会写,等有答案再来更

关于组合型数据类型的函数在一章中已经总结过了,这里就不再重复解释

P162
6.4

S1 = [1,3,2,4,6,5]
S1 = sorted(S1)   #升序
print(S1)
S1 = sorted(S1,reverse=True)   #降序
print(S1)
# sorted(iterable, cmp=None, key=None, reverse=False) 函数对所有可迭代的对象进行排序操作。
# iterable -- 可迭代对象。
# cmp -- 比较的函数,这个具有两个参数,参数的值都是从可迭代对象中取出,此函数必须遵守的规则为,大于则返回1,小于则返回-1,等于则返回0。
# key -- 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
# reverse -- 排序规则,reverse = True 降序 , reverse = False 升序(默认)。


#当然可以用sort(),他们两个的区别是,sort(),是将原来的列表正序排序,所以它是对原来的列表进行的操作,不会产生一个新列表,(sort 方法返回的是对已经存在的列表进行操作,无返回值)具体使用如下:
S1 = [1,3,2,4,6,5]
S1.sort()
print(S1)
S1.sort(reverse=True)
print(S1)

运行结果:
在这里插入图片描述
6.5

import operator #使用内置比较函数需要引入operator模块,如果是python2则可以直接使用cmp
ls1 = [30,1,2,0]
ls2 = [1,21,133]
print(operator.lt(ls1,ls2))#若ls1<ls2,则返回True,否则返回Flase
#运行结果:
#False

# operator 其他内置函数:
# operator.lt(a, b)    lt(a,b) 相当于 a<b     从第一个数字或字母(ASCII)比大小,若a<b,则返回True,否则返回Flase
# operator.le(a, b)    le(a,b)相当于a<=b
# operator.eq(a, b)    eq(a,b)相当于a==b     字母完全一样,返回True,
# operator.ne(a, b)    ne(a,b)相当于a!=b
# operator.ge(a, b)    ge(a,b)相当于 a>=b
# operator.gt(a, b)    gt(a,b)相当于a>b
# operator.__lt__(a, b)
# operator.__le__(a, b)
# operator.__eq__(a, b)
# operator.__ne__(a, b)
# operator.__ge__(a, b)
# operator.__gt__(a, b)

6.6

ls1 = [1,43]
ls2 = ls1
ls1[0] = 22  #ls1列表更新直接使ls2列表更新
print(ls1,ls2)
#运行结果:
#[22, 43] [22, 43]

6.7

ls = [[2,3,7],[[3,5],25],[0,9]]#[2,3,7],[[3,5],25],[0,9],以逗号间隔为一个
print(len(ls))
#运行结果:
#3

P165
6.8
20行代码改为:new = sorted(numbers,reverse=True)

from math import sqrt
def getNum():
    nums = []
    iNumStr = input("请输入数字(直接输入回车退出):")
    while iNumStr != "":
        nums.append(eval(iNumStr))
        iNumStr = input("请输入数字(直接输入回车退出):")
    return nums
def mean (numbers):
    s = 0.0
    for num in numbers:
        s = s + num
    return s / len(numbers)
def dev (numbers,mean):
    sdev = 0.0
    for num in numbers:
        sdev = sdev + (num - mean) ** 2
    return sqrt(sdev/(len(numbers)-1))
def median (numbers):
    new = sorted(numbers,reverse=True)#倒序排列
    size = len(numbers)
    if size % 2==0:
        med = (new[size//2-1]+new[size//2])/2
    else:
        med = new[size//2]
    return med
n = getNum()
m = mean(n)
print("平均值:{},标准差:{:.2},中位数:{}".format(m,dev(n,m),median(n)))

6.9

from math import sqrt
def getNum():
    nums = []
    iNumStr = input("请输入数字(直接输入回车退出):")
    while iNumStr != "":
        nums.append(eval(iNumStr))
        iNumStr = input("请输入数字(直接输入回车退出):")
    return nums
def mean (numbers):
    s = 0.0
    for num in numbers:
        s = s + num
    return s / len(numbers)
def dev (numbers,mean):
    sdev = 0.0
    for num in numbers:
        sdev = sdev + (num - mean) ** 2
    return sqrt(sdev/(len(numbers)-1))
def median (numbers):
    new = sorted(numbers)
    size = len(numbers)
    if size % 2==0:
        med = (new[size//2-1]+new[size//2])/2
    else:
        med = new[size//2]
    return med
def Max (number):   #最大值
    return max(number)
def Min (number):  #最小值
    return min(number)
n = getNum()
m = mean(n)
print("平均值:{},标准差:{:.2},中位数:{},最大值:{},最小值:{}".format(m,dev(n,m),median(n),Max(n),Min(n)))
#当然可以直接改为print("平均值:{},标准差:{:.2},中位数:{},最大值:{},最小值:{}".format(m,dev(n,m),median(n),max(n),min(n)))这样就可以不用增加函数,直接使用内置函数,当然上面本质也还是使用了序列类型的内置函数

6.10
中位数与其他统计指标的对比可以看出大概的贫富差距,为解决贫富差距问题思考解决办法,为贫困地区脱贫。(个人想法)

P168
6.11 错误
在字典里。一个键只对应一个值。
6.12

D = {"张三":88,"李四":90,"王五":73,"赵六":82}
D["钱七"]=90#增加钱七
D["王五"] = 93#修改王五的值
D.pop("赵六")#删除赵六
print(D)
#运行结果:
#{'张三': 88, '李四': 90, '王五': 93, '钱七': 90}

6.13 ACDE
字典的key不能为列表的原因:字典里的key有一个原则,必须可哈希(有个函数hash()可以检测是否支持可哈希),因为字容典查找数据是通过哈希算法得到的,比元组,列表等的数组类型快很多,这本来也是字典的特性,字典里的key和value一一对应的。
而字典查找用的就是key,那么key就必须支持哈希算法,也就是前面说的可哈希。
列表,是一个可变对象,支持原处修改。
字典里存的数据,要通过key查找,如果key是一个可变对象,上一次查找的是这样,这一次查找key变了,就不能通过key查找value(前面说过,字典里的key和value是一一对应),成了另一个数据,但还是它自己,这就不符合规则啊,value也就无法查找出来了。

6.14 3

d = {"abc":1,"qwe":3,"zxc":2}
print(len(d))
#运行结果:
#3

P171
jieba库的安装我按照课本上方法,用的pip,命令为:pip3 install jieba

6.15

import jieba

6.16

import jieba
print(jieba.lcut("中华人民共和国是一个伟大的国家"))
#运行结果:
#['中华人民共和国', '是', '一个', '伟大', '的', '国家']

6.17
直接分词好像跟预料中的不太一样

import jieba
print(jieba.lcut("打工人打工魂打工都是人上人"))
jieba.add_word("打工人")
jieba.add_word("打工魂")
jieba.add_word("人上人")
print(jieba.lcut("打工人打工魂打工都是人上人"))#增加了新词后,还有那么一点点像了
#运行结果:
#['打', '工人', '打工', '魂', '打工', '都', '是', '人', '上', '人']
#['打工人', '打工魂', '打工', '都', '是', '人上人']

jieba库的常用分词函数:
在这里插入图片描述
P177
6.18
按照count的数值倒序排列

关于lambda的解释:细说lambda

6.19 对于实例代码10.1而言,是13行代码 :items = list (counts.items())
简单解释一下关于10.1的代码:

def getText():
    txt = open("hamlet.txt", "r").read()
    txt = txt.lower()
    for ch in '!"#$%&()*+,-./:;<=>?@[\]^_‘{|}~': txt = txt.replace(ch, " ") #将文本中特殊字符替换为空格
    return txt
hamletTxt = getText()
words = hamletTxt.split() ##以默认空格来分割整个字符串,返回列表
counts = {}#创建字典
for word in words:
    counts[word] = counts.get(word,0) + 1#字典单词为键,已经有这个键的话就把相应的值加1,没有的话就取值为0,再加1
    items = list(counts.items())  #将字典类型转换为list类型
    items.sort(key=lambda x:x[1], reverse=True)  #按照count的数值倒序排列
    for i in range(10):
        word, count = items[i]
    print ("{0:<10}{1:>5}".format(word, count))

P179

6.20
1.可读性强,代码清晰明了
2.尽量减少嵌套层数,太多层次的嵌套,不容易被别人理解
3.捕获异常,尽可能的使代码完善无漏洞,不因错误而退出。
4.可以给出多种方案,比较不同方案之间的区别,找到最优方案(书上跟我想法不太一样,但这是我的答案,我做主)
5.逻辑简单明了,不要有太过复杂的逻辑(仍然是从可读性角度考虑)

6.21
对字典中键值进行填充,26个字母,键对应的值13位之后的字母。
对代码11.1的解释:

s = """Gur Mra bs Clguba, ol Gvz Crgref 
Ornhgvshy vf orggre guna htyl. 
Rkcyvpvg vf orggre guna vzcyvpvg. 
Fvzcyr vf orggre guna pbzcyrk. 
Pbzcyrk vf orggre guna pbzcyvpngrq. 
Syng vf orggre guna arfgrq. 
Fcnefr vf orggre guna qrafr. 
Ernqnovyvgl pbhagf. 
Fcrpvny pnfrf nera'g fcrpvny rabhtu gb oernx gur ehyrf. 
Nygubhtu cenpgvpnyvgl orngf chevgl. 
Reebef fubhyq arire cnff fvyragyl. 
Hayrff rkcyvpvgyl fvyraprq. 
Va gur snpr bs nzovthvgl, 
ershfr gur grzcgngvba gb thrff. 
Gurer fubhyq or bar-- naq cersrenoyl bayl bar --boivbhf jnl gb qb vg. 
Nygubhtu gung jnl znl abg or boivbhf ng svefg hayrff lbh'er Qhgpu. 
Abj vf orggre guna arire. 
Nygubhtu arire vf bsgra orggre guna *evtug* abj. 
Vs gur vzcyrzragngvba vf uneq gb rkcynva, vg'f n onq vqrn. 
Vs gur vzcyrzragngvba vf rnfl gb rkcynva, vg znl or n tbbq vqrn. 
Anzrfcnprf ner bar ubaxvat terng vqrn -- yrg'f qb zber bs gubfr!"""
d = {} #创建字典
for c in (65, 97): #大写字母A到Z
    for i in range(26):#循环26个字母
        d[chr(i+c)] = chr((i+13) % 26 + c)  #键对应的值13位之后的字母。
print("".join([d.get(c, c) for c in s])) #输出解密结果。结果就是P177页的python之禅

程序练习题:

6.1 随机密码生成。编写程序,在26个字母大小写和9和数字组成的列表中,随机生成一个10个8位密码。

import random
list = [] #字符列表
m = []  #密码列表
for i in range (10):
    list.append(str(i))  #将int型转换成str,方便下边列表向str转换,如果列表中有int型不能直接转字符串
for i in range(65,91):#大写字母
    list.append(chr(i)) #chr(i)可将数字与ASCII字符转换,ord(i)可将ASCII字符与数字进行转换
for i in range(97,123):#小写字母
    list.append(chr(i))
for i in range(10): #10组密码
    for j in range(8):#每组八个字符
        m.append(random.choice(list)) #随机在列表中选择一个添加至密码列表中
    print("".join(m))  #列表转字符串输出
    m = [] #清空列表,生成下一组密码

运行结果:
在这里插入图片描述
6.2 重复元素判定。编写一程序,接收列表作为参数,如果一个元素在列表中出现了不止一次,则返回Ture,但不要改变原来列表的值。同时编写调用这个函数和测试结果的程序。

def find (list):
    if len(list) != len(set(list)):  #set会生成一个去掉相同元素的列表,若原列表与生成的列表长度相同则返回Ture,不同返回False
        return False
    else:
        return True
list = []
list = input("请输入一些元素:")
while len(list) == 0:
    list = input("输入为空,请再次输入一些元素:")
print(find(list))
#运行结果
#请输入一些元素:some
#True
# 请输入一些元素:summer
# False

6.3 重复元素判定续。利用集合的无重复性改变程序6.2的程序,获得一个更快更简洁的版本。

上一题的答案中,set()已经转换成集合类型,所以,本题代码同上。

6.4 文本字符分析。编写程序接收字符串,按字符串出现频率的降序打印字符。分别尝试录入一些中英文文章片段,比较不同语言之间字符频率的差别。

改了改哈姆雷特的代码,也不知道改了个啥,就这吧(文本部分用了here with you的部分歌词,中文部分是对应的翻译)

def getText(str):
    counts = {}#创建字典
    if '一'<=str<='?':
        str = str
    else:
        str = str.split()
    for word in str:
        counts[word] = counts.get(word,0) + 1#字典单词为键,已经有这个键的话就把相应的值加1,没有的话就取值为0,再加1
        items = list(counts.items())  #将字典类型转换为list类型
        items.sort(key=lambda x:x[1], reverse=True)  #按照count的数值倒序排列
    for i in range(10):
        word, count = items[i]
        print ("{0:<10}{1:>5}".format(word, count))
str = """
Here With You
To all my friends
The night is young
The music’s loud
They playing our song
Nowhere else that I belong
Than here with you
Than here with you
"""
getText(str)
str = """对我所有好友来讲夜未央乐未殇他们在我们喜爱的歌声里欢畅我只想和你在此相伴不想去任何其他地方有你相伴就是天堂有你相伴就是天堂
"""
getText(str)

运行结果:
在这里插入图片描述
6.5 生日悖论分析。生日悖论指如果一个房间里有23人或以上,那么至少有两个人的生日相同的概论大于50%。编写程序,输出在不同随机样本数量下,23个人中至少两人生日相同的概率。

import random
men=10000  #样本数
same = 0
birthday = []#生日列表
for i in range(men):
    for j in range (23):
        birthday.append(random.randint(1,365))  #从365天中选23天为23人的生日
    if len(birthday) !=len(set(birthday)):   #若23人中有人生日一样就加一
        same = same +1
    birthday = [] #一轮过后生日列表设为空
same = same/men#计算概率
print("23人中至少两人生日相同的概率是:{:.3}%".format(same*100))
#运行结果:
#23人中至少两人生日相同的概率是:51.2%

6.6 《红楼梦》人物统计。编写程序统计《红楼梦》中前20位出场最多的人物。
代码主要参考三国演义的例子很好改,就是排除无关词排除了半天

import jieba
excludes = {"什么","一个","我们","那里","如今","你们","起来","这里","说道",
           "众人","他们","出来","姑娘","知道","自己","一面","只见","两个",
           "怎么","没有","不是","不知","这个","不知","听见","这样","进来",
           "告诉","东西","就是","咱们","回来","大家","只是","所以","出去",
            "不敢","这些","只得","丫头","不过","的话","一时","不好","回去",
            "过来","不能","心里","如此","今日","银子","二人","几个","答应",
            "还有","罢了","一回","说话","只管","这么","那边","这话","外头",
            "打发","自然","那些","今儿","听说","小丫头","屋里","姐姐","奶奶",
            "太太","如何","问道","妹妹","老爷","看见","不用","人家","媳妇",
            "原来","不得","一声","一句","家里","进去","到底","这会子","姊妹"
            }
txt = open("红楼梦.txt", "r", encoding='utf-8').read()
words = jieba.lcut(txt)
counts = {}
for word in words:
    if len(word) == 1:
        continue
    elif word == "老太太":
        rword = "贾母"
    elif word == "凤姐" or word == "凤姐儿":
        rword = "王熙凤"
    elif word == "黛玉":
        rword = "林黛玉"
    else:
        rword = word
    counts[rword] = counts.get(rword,0) + 1
for word in excludes:
    del(counts[word])
items = list(counts.items())
items.sort(key=lambda x:x[1], reverse=True)
for i in range(20):
    word, count = items[i]
    print ("{0:<10}{1:>5}".format(word, count))

注:写博客只是为了当笔记看,有任何问题可以评论说,一起互相交流学习

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python语言程序设计基础 第二版(嵩天著)课后答案第六章 的相关文章

  • docker 容器如何查看正在运行容器的端口映射

    1 查看docker容器的版本 root 64 opt docker version Docker version 19 03 5 build 633a0ea 2 查看正在运行的容器 root 64 opt docker ps CONTAI
  • docker退出关闭容器

    可以使用 docker stop 来终止一个运行中的容器 此外 xff0c 当Docker容器中指定的应用终结时 xff0c 容器也自动终止 例如对于上一章节中只启动了一个终端的容器 xff0c 用户通过 exit 命令或 Ctrl 43
  • STM32收入高也好找工作,所以我学嵌入式linux终究是错付了吗

    STM32收入高也好找工作 xff0c 所以我学嵌入式linux终究是错付了吗 经常有同学纠结问我 xff1a 我到底是学STM32还是学嵌入式linux 这个问题很多人都会有自己的看法 xff0c 今天我试着从多个角度 xff0c 把了解
  • Java面试基础篇

    Java面试基础篇 基础总结 博客链接导航 Java语言基础常识 https blog csdn net article details 88531257 J2EE基础知识 https blog csdn net article detai
  • 项目实战-外卖自提柜 3. FreeRTOS主要API的应用

    项目实战 外卖自提柜 1 项目介绍 协议制定 项目实战 外卖自提柜 2 CubeMX 43 FreeRTOS入门 项目实战 外卖自提柜 3 FreeRTOS主要API的应用 项目实战 外卖自提柜 4 FreeRTOS 堆栈分配 调试技巧 项
  • [Spring] IntelliJ IDEA 新建工程时没有Spring选项的解决方法

    Spring IntelliJ IDEA 新建工程时没有Spring选项的解决方法 专业版 xff08 ultimate xff09 社区版 xff08 community xff09 刚开始学习Java Spring框架 xff0c 也是
  • MySQL下载与安装教程(超详细)

    一 MySQL下载 下载地址 xff1a https dev mysql com downloads mysql 根据自己需要下载对应的版本 xff0c 我下载的是mysql 5 7 31 二 MySQL安装教程 1 解压安装包 下载后得到
  • docker 开发编译环境搭建

    参与docker开源社区 xff0c 成为docker项目的contributor xff0c 首先要搭建docker的开发编译环境 xff0c 下面是docker官网介绍的编译环境的搭建 xff0c 这里做个笔记 docker的编译环境准
  • qt基础入门教程

    1 t的介绍 优点 成功案例 5 8 0 Qt是一个跨平台的C 43 43 图形用户界面应用程序框架 它为应用程序开发者提供建立艺术级图形界面所需的所有功能 爸是完全面向对象的 xff0c 很容易扩展 xff0c 并且允许真正的组件编程 推
  • Java开发自学教程!japonensisjava东莞

    三大内容 xff1a Java并发编程Java高并发编程高并发系统设计 Java并发编程 1 概览 2 进程与线程 3 Java 线程 4 共享模型之管程 5 共享模型之内存 6 共享模型之无锁 7 共享模型之不可变 8 共享模型之工具 并
  • MySQL 5.7 安装教程(全步骤、保姆级教程)

    2022年05月30日更新 本文介绍的是只安装MySQL数据库的过程 xff0c 并不包含各种其他附加工具 安装完成之后通常使用Navicat或SQLyog进行可视化操作 清华的镜像网站只保存最新的几个MySQL版本 xff0c 所以直链可
  • 手把手教你如何Vue项目打包dist文件并Tomcat发布【超级详细】

    作者 xff1a bug菌 博客 xff1a CSDN 掘金等 公众号 xff1a 猿圈奇妙屋 特别声明 xff1a 原创不易 xff0c 转载请附上原文出处链接和本文声明 xff0c 谢谢配合 版权声明 xff1a 文章里可能部分文字或者
  • node 14.19.0 版本成功解决:安装 node-sass 和 sass-loader 的过程及各 node 版本对应的 node-sass 版本号

    1 node 版本 node sass 版本及 sass loader 版本查看 xff1a 其一 我的 node 版本查看 xff1a 在命令行输入查询命令 xff1a node v 我的 node 版本为 xff1a v14 19 0
  • Shiro反序列化漏洞【详细解析】

    Shiro是什么东西 Shiro 是 Java 的一个安全框架 xff0c 执行身份验证 授权 密码 会话管理shiro默认使用了CookieRememberMeManager xff0c 其处理cookie的流程是 xff1a 得到rem
  • Go语言面试题

    1 Go有哪些数据类型 f 2 方法与函数的区别 在Go语言中 xff0c 函数和方法不太一样 xff0c 有明确的概念区分 xff1b 函数是指不属于任何结构体 类型的方法 xff0c 也就是说函数是没有接收者的 xff1b 而方法是有接
  • 项目实战-外卖自提柜 4. FreeRTOS 堆栈分配、调试技巧

    项目实战 外卖自提柜 1 项目介绍 协议制定 项目实战 外卖自提柜 2 CubeMX 43 FreeRTOS入门 项目实战 外卖自提柜 3 FreeRTOS主要API的应用 项目实战 外卖自提柜 4 FreeRTOS 堆栈分配 调试技巧 项
  • ubuntu中关于通过编辑.bashrc文件修改提示符的简单过程

    这两天在看关于shell变量的一些内容 xff0c 突然有个想法 xff0c 就是修改下自己终端的提示符 记得先前的提示符应该是 xff1a wjl 64 wjl desktop 使用wjl账户在 home wjl目录下 root 64 w
  • MySQL高级篇知识点——索引优化与查询优化

    目录 1 数据准备 1 1 建库建表1 2 创建相关函数1 3 创建存储过程1 4 调用存储过程1 5 删除某表上的索引 2 索引失效案例 2 1 全值匹配2 2 最佳左前缀匹配原则2 3 主键插入顺序2 4 计算 函数 类型转换 xff0
  • Vue路由&&无痕浏览 - nodeJs环境搭建

    目录 一 Vue路由 1 1 路由的使用步骤 1 2 无痕浏览 二 nodeJs环境搭建 2 1 Node js是什么 2 2 配置NodeJS环境 2 3 下载github的Vue项目 一 Vue路由 1 1 路由的使用步骤
  • Docker的数据管理和端口映射实现容器访问

    Docker的数据管理 存储资源类型 在使用Docker的过程中 xff0c 需要查看容器内应用产生的数据 xff0c 或者需要将容器内数据进行备份 xff0c 甚至需要多个容器之间进行数据共享时 xff0c 势必会设计到容器的数据管理 x

随机推荐