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的调用返回信息