Python 基础练习题

mac2024-04-02  29

基础练习

1.温度转换实例2.天天向上的力量3.身体质量指数计算4. 圆周率计算5.计算基本统计值6.简单的文本词频统计英文文本:hamlet中文文本-三国演义统计人物 7.政府工作报告词云

1.温度转换实例

tStr=input("请输入温度值:") # 输出获得的是一个字符串 if tStr[-1] in ['F','f']: # 字符串最后一个字符是否在这个列表中 t=(eval(tStr[:-1])-32)/1.8 # 索引切片:将字符串最后一个字符前面的子串取出,去掉引号变成数字参与运算 print("转换后的温度是{:.2f}C".format(t)) # 槽内一定要有冒号引导 elif tStr[-1] in ['C','c']: t=eval(tStr[:-1])*1.8+32 print("转换后的温度是{:.2f}F".format(t)) else: print("输入格式错误")

2.天天向上的力量

工作日每天比前一天进步0.01,周末每天比前一天退步0.01,一年后比原点的效果? 采用循环模拟一年365天,判断工作日与周末

result=1 # 原点设为1 dayfactor=0.01 for i in range(365): if i%7 in [0,6]: # 周末 result*=(1-dayfactor) else: result*=(1+dayfactor) print("工作日的力量:{:.2f}".format(result))

第二问:工作日模式要努力到什么水平,才能与每天努力1%一样? -A君: 一年365天,每天进步1%,不停歇 -B君: 一年365天,每周工作5天休息2天,休息日下降1%,weekday要多努力呢? 提示:试错法,每次给努力因素增加0.001 注意:代码共用 函数

def dayup(dayfactor): result=1 for i in range(365): if i % 7 in [0, 6]: # 周末 result *= (1 - 0.01) else: result *= (1 + dayfactor) return result dayfactor=0.01 while dayup(dayfactor)<pow(1.01,365): dayfactor+=0.001 print("工作日每天需进步{:.3%}".format(dayfactor)) # 将数字变成%格式,保留3位小数

3.身体质量指数计算

BMI(Body Mass Index):国际上常用的衡量人体肥胖和健康程度的重要标准,主要用于统计分析。 BMI = 体重(kg) / 身高2(m2) 难点: 国内和国际评判标准不一样,一行代码同时操作两个变量

height,weight=eval(input("请输入身高(m)和体重(kg):")) # 输入格式为英文逗号分隔 bmi=weight/(height**2) if bmi<18.5: local, wto = "偏瘦", "偏瘦" elif 18.5<=bmi<24: local, wto = "正常", "正常" elif 24<=bmi<25: local, wto = "偏胖", "正常" elif 25<=bmi<28: local, wto = "偏胖", "偏胖" elif 28<=bmi<30: local, wto = "肥胖", "偏胖" else: local, wto = "肥胖", "肥胖" print("BMI指标为国际:{:},国内:{:}".format(wto,local))

4. 圆周率计算

法一:公式法近似

pi = 0 N = 100 for k in range(N) : pi += (1/pow(16,k)*(4/(8*k+1)-2/(8*k+4)-1/(8*k+5)-1/(8*k+6))) print("圆周率值是: {}".format(pi))

法二:蒙特卡洛法模拟

from time import perf_counter # 返回一个CPU级别的精确时间计数值,单位为秒 from random import random N=1000*1000 # 模拟N次,即投N个点 hits=0.0 # 落入扇形内点的个数 start=perf_counter() # record start time =0 for i in range(N): # 模拟投点过程 x,y=random(),random() # 同时生成两个随机数,0-1之间 dist=pow(x**2+y**2,0.5) # 计算点到圆心的距离 if dist<=1: hits+=1 # 落于扇形内 pi=4*hits/N print("pi的值为:{}".format(pi)) print("运行时间为:{}".format(perf_counter()-start))

注:time库的perf_counter()方法: 返回一个CPU级别的精确时间计数值,单位为秒。用在测试代码时间上,具有最高的可用分辨率。测试代码的时候需要调用两次,做差值。perf_counter()会包含sleep()休眠时间,适用测量短持续时间。 示例:

from time import perf_counter,sleep a=perf_counter() print(a) # 近似于0,第一次调用是0 sleep(5) print(perf_counter()-a) # 下一次调用是两次间隔时间,近似于5

5.计算基本统计值

获取用户输入的未知个数的数字:

def getnum(): # 获取用户不定长度的输入 numbers=[] inumstr = input("请输入数字,回车退出:") # 每次输入一个数字,是字符串形式 while inumstr!='': # 如果只输回车,则获取到空串,意味着输入结束 numbers.append(eval(inumstr)) # 将字符串变成数字,存入数字列表 inumstr = input("请输入数字,回车退出:") # 循环输入一个数字 return numbers

计算均值:

def mean(numbers): # 求平均值 sum=0.0 for number in numbers: # 遍历列表 sum+=number return sum/len(numbers)

计算方差和标准差:

def dev(numbers,mean): s=0.0 for number in numbers: s+=(number-mean)**2 # 偏差平方和 d=s/(len(numbers)-1) # 方差 sd=d**0.5 # 标准差 return d,sd

计算中位数:

def median(numbers): slist=sorted(numbers) # 内置排序函数 size=len(slist) if size%2!=0: # 个数是奇数,中位数是中间的数 return slist[(size-1)//2] # 列表内索引必须是整数int型,除法无论能不能整除都得到float型,所以要用//整除 else: return (slist[size//2-1]+slist[size//2])/2.0

主程序:

n=getnum() d,sd=dev(n,mean(n)) print("平均数是{},方差是{:.2f},标准差是{},中位数是{}".format(mean(n),d,sd,median(n))) # 保留小数位数记得加数据类型

注:排序 Python中sort 与 sorted 区别: 1. sort 是应用在 list 上的方法,属于列表的成员方法,直接在原列表上操作,无返回值,原列表被更新。使用方法为ls.sort() 2. sorted 可以对所有可迭代的对象进行排序操作,返回的是一个排好序的列表,原来未排序的对象仍然存在。使用方法为a=sorted(ls) 3. sorted()中的参数: key – 主要是用来进行比较的元素,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。此函数将在每个元素比较前被调用。 reverse – 排序规则, True 降序 , False 升序(默认) 示例:

a=[('b',2),('a',1),('c',3),('d',4)] b=sorted(L, key=lambda x:x[1]) print(b)

结果为: [(‘a’, 1), (‘b’, 2), (‘c’, 3), (‘d’, 4)]

字典的items 也可以这么排序(不能对字典类型直接排序,要通过items()获得键值对再排):

dict={1:'a',2:'b',3:'c',4:'d'} d=dict.items() d=sorted(d,key=lambdax:x[0],reverse=True) print(d)

返回一个列表:[(4, ‘d’), (3, ‘c’), (2, ‘b’), (1, ‘a’)]

6.简单的文本词频统计

英文文本:hamlet
def getText(): # 得到干净的文本字符串 f=open("E:\\Bing\\dataAnalyse_dataMining\\Python语言程序设计\\课件\\Hamlet.txt",'r') # 以只读方式打开文件 t=f.read() # 读入全文本为一个字符串 t=t.lower() # 内置方法也是返回新值的,极个别例外 # 将字符串中的标点符号替换为空格. 法一:笨方法,遍历每个字符,行不通,因为直接遍历中不能直接每个每个修改字符串或列表的元素 # 法二:遍历每一个标点符号,使用list的替换函数整体全部替换 for ch in '!"#$%&()*+,-./:;<=>?@[\\]^_‘{|}~': t=t.replace(ch," ") # 内置函数返回新对象,一定要记得重新赋值 return t t=getText() wordsls=t.split() # 分隔成单词列表 dict={} # 建立字典,统计词频,key是word,value是频数 for word in wordsls: # 对列表内每个单词,计算出现次数 dict[word]=dict.get(word,0)+1 # 得到键对应的值,即单词对应的次数,如果是新单词,则创建新键值对,并采用默认值0次+1,否则,在原值上+1 # print(type(dict.items),'\n',dict.items()) # 返回列表形式的元组数组,可用key,value遍历 items=dict.items() # 以列表形式返回所有键值对元组数组,但是是dict_items类型,可以变为list类型 items=sorted(items,key=lambda x:x[1],reverse=True) # 按value值降序排列,sorted返回的是列表类型 for i in range(10): # 列表的下标 word,count=items[i] # 元组 print("{:<10}{:>5}".format(word,count))

注:Python 字典的items() 函数 以列表返回可遍历的(键, 值) 元组数组。可以用 for key,value in dict来循环遍历。示例:

dict={1:'a',2:'b',3:'c',4:'d'} print(dict.items()) for key,value in dict.items(): print(key,":"+value) #只有字符串之间才能连接,key是int,不能与字符串连接,字典遍历输出是分行的,一个kv一行,没有+号也行,间隔会与前面一致

注二:lambda函数 匿名函数,没有具体名称,允许快速定义单行函数,可以用在任何需要函数的地方。语法形式如下:   lambda arg1, arg2, …, argN : expression 关键字:lambda 冒号前:输入的参数,可以有多个,用逗号隔开, 冒号后:是表达式且只能为一个,是函数的返回结果。

中文文本-三国演义统计人物

一开始的分词总不尽如人意,需要根据结果不断优化迭代改进,去除无用词,加入自定义词等。 而且不需要检查所有的词,只需要检查前面的我们需要展示的部分即可。

import jieba # 读入中文文本,文件编码的参数,前两个参数没指定名称就要写对顺序 f=open('E:\\Bing\\dataAnalyse_dataMining\\Python语言程序设计\\课件\\三国演义.txt','r',encoding='utf-8') txt=f.read() # 读入全文本为一个字符串 f.close() # 将前面的结果中的词优化,去掉对人物无意义的词 stopwords=['将军','却说','荆州','二人','不可','不能','如此'] wordls=jieba.lcut(txt) # 分词为一个单词列表,包括标点符号 dict={} # 定义词频字典 for word in wordls: # 逐个单词判断,并建立新的单词变量new if len(word)==1: # 长度为1的字符,即中文的一个字和标点符号,不统计 continue elif word=='诸葛亮' or word=='孔明曰': new='孔明' # 因为不能在遍历中直接修改列表元素,所以采用定义新变量,列表元素可以赋值给新变量,再将其放入新的结构,达到更新的目的 elif word== "关公" or word == "云长": new= "关羽" elif word == "玄德" or word == "玄德曰": new= "刘备" elif word == "孟德" or word == "丞相": new= "曹操" else: new=word # 遍历中列表元素不能被赋值修改,但可以赋值给别的变量 # 将每个经过处理的单词放入字典 dict[new] = dict.get(new, 0) + 1 # 在字典中过滤停词,不想过滤所有的话,就显示前几百个,就可以挑出里面的人物了 for word in stopwords: del dict[word] items=dict.items() # 取出字典中所有键值对 itemsls=sorted(items,key=lambda x:x[1],reverse=True) # 对字典的键值对按value排序,返回列表,不能对字典对象直接排序 for i in range(15): # 下标 word,count=itemsls[i] print("{:<10}{:>5}".format(word,count))

7.政府工作报告词云

import jieba # 库名小写,函数名遵循命名规则 import wordcloud from imageio import imread import os # 提供与操作系统的交互 mask=imread("五角星.jpg") # 设置词云显示形状 f=open("E:\\Bing\\dataAnalyse_dataMining\\Python语言程序设计\\课件\\新时代中国特色社会主义.txt","r",encoding='utf-8') txt=f.read() f.close() wordls=jieba.lcut(txt) # 单词列表 # 生成词云要求不用统计词频,只需要输入一个以空格分隔的字符串,函数便能自动完成统计词频并生成词云的工作 txt=' '.join(wordls) # 一行写不开了用‘\’换行,理论上还是一行所以后面不能有注释 w=wordcloud.WordCloud(font_path= "msyh.ttc",mask=mask,width = 1000, height = 700, \ background_color= "white",max_words=200) # 设置各种参数生成词云对象 w.generate(txt) # 产生词云 w.to_file("E:\\Bing\\dataAnalyse_dataMining\\Python语言程序设计\\课件\\新时代.png") # 写入文件,原有的文件被覆盖 # 打开生成的图片 os.system("E:\\Bing\\dataAnalyse_dataMining\\Python语言程序设计\\课件\\新时代.png") # 进程管理,执行system(command)的command,返回cmd的调用返回信息
最新回复(0)