Python常见问题汇总

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

以下是爬取下来的专业信息:


 上一篇
P值应该这么用,学界有错须改正 P值应该这么用,学界有错须改正
来源 美国统计学会,retractionwatch.com 编译 谭坤 2014年2月,美国曼荷莲学院(Mount Holyoke College)数学与统计学教授George Cobb在美国统计学会(American Statistica
2021-06-20
下一篇 
Python面试180题 Python面试180题
Python这门语言入门容易,但是学精比较苦难。入门容易就没有门槛,什么人学能学会,怎么能体现出竞争优势来呢?首先是掌握基础的概念和知识点,然后开始从深度和广度拓展,深度优先,广度次之。以下是来源为CSDN的面试题目,建议逐一解决。 基
2021-06-20
// // //
  目录