Python 基础练习题

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的调用返回信息
  • 7
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值