网站建设资讯

NEWS

网站建设资讯

python数据描述函数 python函数的描述

python可以做哪些数据分析

1、检查数据表

创新互联公司是一家专注于网站制作、成都网站制作与策划设计,河北网站建设哪家好?创新互联公司做网站,专注于网站建设十年,网设计领域的专业建站公司;建站业务涵盖:河北等地区。河北做网站价格咨询:13518219792

Python中使用shape函数来查看数据表的维度,也就是行数和列数。你可以使用info函数查看数据表的整体信息,使用dtypes函数来返回数据格式。Isnull是Python中检验空值的函数,你可以对整个数据表进行检查,也可以单独对某一列进行空值检查,返回的结果是逻辑值,包含空值返回True,不包含则返回False。使用unique函数查看唯一值,使用Values函数用来查看数据表中的数值。

2、数据表清洗

Python中处理空值的方法比较灵活,可以使用Dropna函数用来删除数据表中包含空值的数据,也可以使用fillna函数对空值进行填充。Python中dtype是查看数据格式的函数,与之对应的是astype函数,用来更改数据格式,Rename是更改列名称的函数,drop_duplicates函数删除重复值,replace函数实现数据替换。

3、数据预处理

数据预处理是对清洗完的数据进行整理以便后期的统计和分析工作,主要包括数据表的合并、排序、数值分列、数据分组及标记等工作。在Python中可以使用merge函数对两个数据表进行合并,合并的方式为inner,此外还有left、right和outer方式。使用ort_values函数和sort_index函数完成排序,使用where函数完成数据分组,使用split函数实现分列。

4、数据提取

主要是使用三个函数:loc、iloc和ix,其中loc函数按标签值进行提取,iloc按位置进行提取,ix可以同时按标签和位置进行提取。除了按标签和位置提起数据以外,还可以按具体的条件进行数据,比如使用loc和isin两个函数配合使用,按指定条件对数据进行提取。

5、数据筛选汇总

Python中使用loc函数配合筛选条件来完成筛选功能,配合sum和 count函数还能实现excel中sumif和countif函数的功能。Python中使用的主要函数是groupby和pivot_table。groupby是进行分类汇总的函数,使用方法很简单,制定要分组的列名称就可以,也可以同时制定多个列名称,groupby 按列名称出现的顺序进行分组。

python中函数定义

1、函数定义

①使用def关键字定义函数

def 函数名(参数1.参数2.参数3...):

"""文档字符串,docstring,用来说明函数的作用"""

#函数体

return 表达式

注释的作用:说明函数是做什么的,函数有什么功能。

③遇到冒号要缩进,冒号后面所有的缩进的代码块构成了函数体,描述了函数是做什么的,即函数的功能是什么。Python函数的本质与数学中的函数的本质是一致的。

2、函数调用

①函数必须先定义,才能调用,否则会报错。

②无参数时函数的调用:函数名(),有参数时函数的调用:函数名(参数1.参数2.……)

③不要在定义函数的时候在函数体里面调用本身,否则会出不来,陷入循环调用。

④函数需要调用函数体才会被执行,单纯的只是定义函数是不会被执行的。

⑤Debug工具中Step into进入到调用的函数里,Step Into My Code进入到调用的模块里函数。

python 函数是不是描述符

在Python中,访问一个属性的优先级顺序按照如下顺序:

1.类属性

2.数据描述符

3.实例属性

4.非数据描述符

5.__getattr__()方法。这个方法的完整定义如下所示:

[python] view plain copy

def __getattr__(self,attr) :#attr是self的一个属性名

pass;

先来阐述下什么叫数据描述符。

数据描述符是指实现了__get__,__set__,__del__方法的类属性(由于Python中,一切皆是对象,所以你不妨把所有的属性也看成是对象)

PS:个人觉得这里最好把数据描述符等效于定义了__get__,__set__,__del__三个方法的接口。

阐述下这三个方法:

__get__的标准定义是__get__(self,obj,type=None),它非常接近于JavaBean的get

第一个函数是调用它的实例,obj是指去访问属性所在的方法,最后一个type是一个可选参数,通常为None(这个有待于进一步的研究)

例如给定类X和实例x,调用x.foo,等效于调用:

type(x).__dict__["foo"].__get__(x,type(x))

调用X.foo,等效于调用:

type(x).__dict__["foo"].__get__(None,type(x))

第二个函数__set__的标准定义是__set__(self,obj,val),它非常接近于JavaBean的set方法,其中最后一个参数是要赋予的值

第三个函数__del__的标准定义是__del__(self,obj),它非常接近Java中Object的Finailize()方法,指

Python在回收这个垃圾对象时所调用到的析构函数,只是这个函数永远不会抛出异常。因为这个对象已经没有引用指向它,抛出异常没有任何意义。

接下来,我们来一一比较这些优先级.

首先来看类属性

[python] view plain copy

# -*- coding:utf-8 -*-

'''''

Created on 2013-3-29

@author: naughty

'''

class A(object):

foo=3

print A.foo

a=A()

print a.foo

a.foo=4

print a.foo

print A.foo

上面这段代码的输出如下:

3

3

4

3

从输出可以看到,当我们给a.foo赋值的时候,其实与类实例的那个foo是没有关系的。a.foo=4 这句话给a对象增加了一个属性叫foo。其值是4。

最后两个语句明确的表明了,我们输出a.foo和A.foo的值,他们是不同的。

但是为什么a=A()语句后面的print

a.foo输出了3呢?这是因为根据搜索顺序找到了类属性。当我们执行a.foo=4的时候,我们让a对象的foo属性指向了4这个对象。但是并没有改变

类属性foo的值。所以最后我们print A.foo的时候,又输出了3。

[python] view plain copy

# -*- coding:utf-8 -*-

'''''

Created on 2013-3-29

@author: naughty

'''

class A(object):

foo=3

a=A()

a.foo=4

print a.foo

del a.foo

print a.foo

上面的代码,我给a.foo赋值为4,在输出一次之后就del了。两次输出,第一次输出的是a对象的属性。第二次是类属性。不是说类属性的优先级比

实例属性的高吗。为啥第一次输出的是4而不是3呢?还是上面解释的原因。因为a.foo与类属性的foo只是重名而已。我们print

a.foo的时候,a的foo指向的是4,所以输出了4。

------------------------------------

然后我们来看下数据描述符这一全新的语言概念。按照之前的定义,一个实现了__get__,__set__,__del__的类都统称为数据描述符。我们来看下一个简单的例子。

[python] view plain copy

# -*- coding:utf-8 -*-

'''''

Created on 2013-3-29

@author: naughty

'''

class simpleDescriptor(object):

def __get__(self,obj,type=None):

pass

def __set__(self,obj,val):

pass

def __del__(self,obj):

pass

class A(object):

foo=simpleDescriptor()

print str(A.__dict__)

print A.foo

a=A()

print a.foo

a.foo=13

print a.foo

上面例子的输出结果如下:

[plain] view plain copy

{'__dict__': attribute '__dict__' of 'A' objects, '__module__': '__main__', 'foo': __main__.simpleDescriptor object at 0x005511B0, '__weakref__': attribute '__weakref__' of 'A' objects, '__doc__': None}

None

None

None

从输出结果看出,print语句打印出来的都是None。这说明a.foo都没有被赋值内容。这是因为__get__函数的函数体什么工作都没有做。直接是pass。此时,想要访问foo,每次都没有返回内容,所以输出的内容就是None了。

[python] view plain copy

# -*- coding:utf-8 -*-

'''''

Created on 2013-3-29

@author: naughty

'''

class simpleDescriptor(object):

def __get__(self,obj,type=None):

return "hi there"

def __set__(self,obj,val):

pass

def __del__(self,obj):

pass

class A(object):

foo=simpleDescriptor()

print str(A.__dict__)

print A.foo

a=A()

print a.foo

a.foo=13

print a.foo

把__get__函数实现以下,就可以得到如下输出结果:

[plain] view plain copy

{'__dict__': attribute '__dict__' of 'A' objects, '__module__': '__main__', 'foo': __main__.simpleDescriptor object at 0x00671190, '__weakref__': attribute '__weakref__' of 'A' objects, '__doc__': None}

hi there

hi there

hi there

为了加深对数据描述符的理解,看如下例子:

[python] view plain copy

# -*- coding:utf-8 -*-

'''''

Created on 2013-3-29

@author: naughty

'''

class simpleDescriptor(object):

def __init__(self):

self.result = None;

def __get__(self, obj, type=None) :

return self.result - 10;

def __set__(self, obj, val):

self.result = val + 3;

print self.result;

def __del__(self, obj):

pass

class A(object):

foo = simpleDescriptor();

a = A();

a.foo = 13;

print a.foo;

上面代码的输出是

16

6

第一个16为我们在对a.foo赋值的时候,人为的将13加上3后作为foo的值,第二个6是我们在返回a.foo之前人为的将它减去了10。

所以我们可以猜测,常规的Python类在定义get,set方法的时候,如果无特殊需求,直接给对应的属性赋值或直接返回该属性值。如果自己定义类,并且继承object类的话,这几个方法都不用定义。

-----------------

在这里看一个题外话。

看代码

[python] view plain copy

# -*- coding:utf-8 -*-

'''''

Created on 2013-3-29

@author: naughty

'''

class simpleDescriptor(object):

def __init__(self):

self.result = None;

def __get__(self, obj, type=None) :

return self.result - 10;

def __set__(self, obj, val):

if isinstance(val,str):

assert False,"int needed! but get str"

self.result = val + 3;

print self.result;

def __del__(self, obj):

pass

class A(object):

foo = simpleDescriptor();

a = A();

a.foo = "13";

print a.foo;

上面代码在__set__ 函数中检查了参数val,如果val是str类型的,那么要报错。这就实现了我们上一篇文章中要实现的,在给属性赋值的时候做类型检查的功能。

-----------------------------------------------

下面我们来看下实例属性和非数据描述符。

[python] view plain copy

# -*- coding:utf-8 -*-

'''''

Created on 2013-3-29

@author: naughty

'''

class B(object):

foo = 1.3

b = B()

print b.__dict__

b.bar = 13

print b.__dict__

print b.bar

上面代码输出结果如下:

{}

{'bar': 13}

13

那么什么是非数据描述符呢?

简单的说,就是没有实现get,set,del三个方法的所有类。

让我们任意看一个函数的描述:

def call():

pass

执行print dir(call)会得到如下结果:

[plain] view plain copy

['__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__doc__', '__format__', '__get__', '__getattribute__', '__globals__', '__hash__', '__init__', '__module__', '__name__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'func_closure', 'func_code', 'func_defaults', 'func_dict', 'func_doc', 'func_globals', 'func_name']

先看下dir的帮助。

dir列出给定对象的属性或者是从这个对象能够达到的对象。

回到print dir(call)方法的输出,看到,call方法,有输出的那么多个属性。其中就包含了__get__函数。但是却没有__set__和__del__函数。所以所有的类成员函数都是非数据描述符。

看一个实例数据掩盖非数据描述符的例子:

[python] view plain copy

'''''

Created on 2013-3-29

@author: naughty

'''

class simpleDescriptor(object):

def __get__(self,obj,type=None) :

return "get",self,obj,type

class D(object):

foo=simpleDescriptor()

d=D()

print d.foo

d.foo=15

print d.foo

看输出:

('get', __main__.simpleDescriptor object at 0x02141190,

__main__.D object at 0x025CAF50, class '__main__.D')

15

可见,实例数据掩盖了非数据描述符。

如果改成数据描述符,那么就不会被覆盖了。看下面:

[python] view plain copy

'''''

Created on 2013-3-29

@author: naughty

'''

class simpleDescriptor(object):

def __get__(self,obj,type=None) :

return "get",self,obj,type

def __set__(self,obj,type=None) :

pass

def __del__(self,obj,type=None) :

pass

class D(object):

foo=simpleDescriptor()

d=D()

print d.foo

d.foo=15

print d.foo

代码的输出如下:

[plain] view plain copy

('get', __main__.simpleDescriptor object at 0x01DD1190, __main__.D object at 0x0257AF50, class '__main__.D')

('get', __main__.simpleDescriptor object at 0x01DD1190, __main__.D object at 0x0257AF50, class '__main__.D')

由于是数据描述符,__set __函数体是pass,所以两次输出都是同样的内容。

最后看下__getatrr__方法。它的标准定义是:__getattr__(self,attr),其中attr是属性名

python中函数包括

1. print()函数:打印字符串

2. raw_input()函数:从用户键盘捕获字符

3. len()函数:计算字符长度

4. format(12.3654,'6.2f'/'0.3%')函数:实现格式化输出

5. type()函数:查询对象的类型

6. int()函数、float()函数、str()函数等:类型的转化函数

7. id()函数:获取对象的内存地址

8. help()函数:Python的帮助函数

9. s.islower()函数:判断字符小写

10. s.sppace()函数:判断是否为空格

11. str.replace()函数:替换字符

12. import()函数:引进库

13. math.sin()函数:sin()函数

14. math.pow()函数:计算次方函数

15. 3**4: 3的4次方

16. pow(3,4)函数:3的4次方

17. os.getcwd()函数:获取当前工作目录

18. listdir()函数:显示当前目录下的文件

19. socket.gethostbyname()函数:获得某主机的IP地址

20. urllib.urlopen(url).read():打开网络内容并存储

21. open().write()函数:写入文件

22. webbrowser.open_new_tab()函数:新建标签并使用浏览器打开指定的网页

23. def function_name(parameters):自定义函数

24. time.sleep()函数:停止一段时间

25. random.randint()函数:产生随机数


网站栏目:python数据描述函数 python函数的描述
分享网址:http://njwzjz.com/article/doeoioh.html