工作日每天比前一天进步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位小数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))法一:公式法近似
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获取用户输入的未知个数的数字:
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’)]
注: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))