1.python计算科恩d值
from numpy import std, mean, sqrt
#correct if the population S.D. is expected to be equal for the two groups.
def cohen_d(x,y):
nx = len(x)
ny = len(y)
dof = nx + ny - 2
return (mean(x) - mean(y)) / sqrt(((nx-1)*std(x, ddof=1) ** 2 + (ny-1)*std(y, ddof=1) ** 2) / dof)
#dummy data
x = [2,4,7,3,7,35,8,9]
y = [i*2 for i in x]
# extra element so that two group sizes are not equal.
x.append(10)
#correct only if nx=ny
d = (mean(x) - mean(y)) / sqrt((std(x, ddof=1) ** 2 + std(y, ddof=1) ** 2) / 2.0)
print ("d by the 1st method = " + str(d))
if (len(x) != len(y)):
print("The first method is incorrect because nx is not equal to ny.")
#correct for more general case including nx !=ny
print ("d by the more general 2nd method = " + str(cohen_d(x,y)))
2.python中的self有啥作用?
一直感觉对面向对象不是很了解,前几天突然被问到,self有啥作用的时候,我确实一愣。最开始学的时候感觉理解了,但是没有记录也不知道当时理解了现在忘了,还是根本没理解,anyway,查阅了一些资料,自己也动手了下代码,深入理解下self的作用吧。
一、self是必须的吗?
self只有在类的初始化(构造函数)时才会用到,一般我们写函数很少用到:
def eat():
print('I want to eat')
eat()
#输出结果是I want to eat
这里的eat()函数就是一普通的,,看下面的2个类中self的位置:
class Person():
def __init__(self,name,age):
self.name = name
self.age = age
ming = Person('明春','100')
print(ming.name) #明春
print(ming.age) #100
class Person():
def __init__(xx,name,age):
xx.name = name
xx.age = age
ming = Person('明春','100')
print(ming.name) #明春
print(ming.age) #100
从这里可以看出来,self换成xx也是可以的,只不过self是大家长久以来默认的一种写法,所以最好还是保持一直吧,不要那么特立独行
二、self的作用到底是啥呢?
self就是实例本身,注意不是类,是类的实例,self接收到类的实例所有参数,让然后绑定,通过 点来访问
class Person():
def __init__(self,name,age):
self.name = name
self.age = age
ming = Person('明春','100')
print(ming.name)
print(ming.age)
如在本例中,ming 是一个实例,ming的所有参数都传到类里了,self它不仅仅是为了在类内部传递参数导入的数据,还能在 初始化函数中,通过 self.attribute 的方式,规定 self 实例对象的属性,这个属性也是类实例化对象的属性,即 做为类通过初始化函数初始化后所具有的属性
那为啥不能是类本身,看下面的例子:
class Person():
def __init__(self,name,age):
self.name = name
self.age = age
ming = Person('明春','100')
chun = Person('春明','001')
print(ming.name) #明春
print(chun.name) #春明
</strong>
如果self指向的是Person这个类,那么ming和chun这两个怎么办,self分辨不出来到底传入哪个了。
汇总:self的作用就是指向实例,传入实例所有的数据
3.python中浮点数计算问题
a = 1.7
b = 0.9 + 0.8
if a == b:
print("a 等于 b")
else:
print("哎呀,a 不等于 b")
# 哎呀,a 不等于 b
a = 1.0
b = 0.5 + 0.5
if a == b:
print("a 等于 b")
else:
print("哎呀,a 不等于 b")
#a 等于 b
from decimal import Decimal
a = Decimal('1.7')
b = Decimal('0.9') + Decimal('0.8')
if a == b:
print("a 等于 b")
else:
print("哎呀,a 不等于 b")
#a 等于 b
4.matplotlib, plt 出图会闪退
解决方式:在最后可以加上 plt.pause(0) 可以防止图闪退
5.python中list方法的时间比较:append、列表推导式、extend
在python的数据结构中,list可以说是常用的数据结构,针对list的一些操作,我们来比较下他们的运行时间,以后我们在写相关的代码时,为了有较好的执行效率,可以选择开销小的方法:
一、这里,我们使用python的timeit库,基本使用方法如下:
class timeit.Timer(stmt=’pass’, setup=’pass’, timer=
Timer是测量小段代码执行速度的类。
stmt参数是要测试的代码语句(statment);
setup参数是运行代码时需要的设置;
timer参数是一个定时器函数,与平台有关。
timeit.Timer.timeit(number=1000000)
Timer类中测试语句执行速度的对象方法。number参数是测试代码时的测试次数,默认为1000000次。方法返回执行代码的平均耗时,一个float类型的秒数。
二、比较了append、拼接操作、列表推导式、list()、extend五种方式,以下是测试代码:
from timeit import Timer
def t1():
li = []
for i in range(10000):
li.append(i)
def t2():
li = []
for i in range(10000):
li = li + [i]
def t3():
li = [i for i in range(10000)]
def t4():
li = list(range(10000))
def t5():
li = []
for i in range(10000):
li.extend([i])
timer1 = Timer("t1()", "from __main__ import t1")
print("append:", timer1.timeit(100))
timer2 = Timer("t2()", "from __main__ import t2")
print("+:", timer2.timeit(100))
timer3 = Timer("t3()", "from __main__ import t3")
print("[i for i in range]:", timer3.timeit(100))
timer4 = Timer("t4()", "from __main__ import t4")
print("list(range()):", timer4.timeit(100))
timer5 = Timer("t5()", "from __main__ import t5")
print("extend:", timer5.timeit(100))
从这里我们可以看出,执行效率从好到差的顺序是:列表推导式 > list() >append > extend>拼接操作,所以,我们要学会使用列表推导式,活学活用。
6.Mac系统下Matplotlib中文显示问题解决
用Matplotlib显示中文字体一直是个大问题,通过自我探索终于找到解决之道了。
一、首先我们需要知道系统已经安装了哪些字体,可以通过以下代码展示:
import matplotlib
# 显示mac系统下所有的字体
font_list = sorted([f.name for f in matplotlib.font_manager.fontManager.ttflist])
for font in font_list:
print(font)
输出结果是:
Microsoft Sans Serif
Microsoft YaHei
Minion Pro
Minion Pro
Minion Pro
Minion Pro
Minion Pro
二、 找到常用的或者想要的字体,然后通过代码调用:
# 设置中文字体
plt.rcParams['font.family'] = ['FZXiaoBiaoSong-B05S']
三、生成随机数据,最后可视化展示:
# 设置随机数据
data = np.random.random(100)
print(data)
plt.title('测试中文显示,我就是个标题')
plt.plot(data, '*', label='随机数据分布')
plt.legend()
plt.show()
四、最终代码如下:
import matplotlib
import matplotlib.pyplot as plt
import numpy as np
# 显示mac系统下所有的字体
font_list = sorted([f.name for f in matplotlib.font_manager.fontManager.ttflist])
for font in font_list:
print(font)
# 设置随机数据
data = np.random.random(100)
print(data)
# 设置中文字体
plt.rcParams['font.family'] = ['FZXiaoBiaoSong-B05S']
plt.title('测试中文显示,我就是个标题')
plt.plot(data, '*', label='随机数据分布')
plt.legend()
plt.show()
效果图:
7.python爬取中国研究生招生信息网专业信息
最近想看看研招网有哪些专业,于是用python写了几行代码,很简单,以下是代码部分:
import requests
import json
url = 'https://yz.chsi.com.cn/zsml/code/zy.do'
header={
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'
}
for i in range(101,1352):
try:
if len(str(i)) <= 3:
data = {'q':'0'+str(i)}
r = requests.post(url,params=data,headers=header)
json_srting = json.loads(r.text)
print(json_srting)
else:
data = {'q': str(i)}
r = requests.post(url, params=data, headers=header)
json_srting = json.loads(r.text)
print(json_srting)
except:
pass
以下是爬取下来的专业信息: