学习目标:将python所涉及的数据类型、数据结构弄清楚
python作为面向对象编程语言。那么代表数据的对象都有哪些呢?
在这里我把他们分为内置数据类型,文件数据类型,第三方常用数据结构和自定义的数据结构四个方向去介绍。
内置数据类型有7种:
数值型:整型int, 浮点数(小数)float,复数complex
文本型:字符与字符串str
序列型:列表list,元组tuple,序列对象range
集合类型:集合set,不可变集合frozenset
布尔类型:布尔bool
二进制类型:字节数组bytearray,不可变字节(字节串)bytes,对象内存存储memoryview。
以上内置数据类型用于编程当中,为数据表示,也就是说程序结束,数据也将不存在。所以他们都不是持久化对象。那么数据对象持久化应该是下面所说的文件数据类型。
文件数据类型
常见文件数据类型:XML
,JSON
,shelve, pickle和open打开的其他文件。
以及数据库(db文件):Mysql,MongoDB, SQLite 。
常见数据结构在python中的体现
常见数据结构:双端队列deque, 栈,链表(顺序链表,双向链表,循环链表)
自定义的数据结构
class Stack:
class LinkList
学习内容:内置数据类型
在学习内容之前,推荐先了解以下内置函数:type,dir,help。便于编程中查看数据类型和对象的使用方法。
dir(obj):返回obj的属性和方法列表
type(obj): 返回对象类型
help() 函数用于查看函数或模块用途的详细说明
提示:前面也说了,内置的数据类型重在数据表示,就是编程中操作的时候使用。
关于内置数据类型,当我们需要做一些运算的时候,以什么样的形式表示变量,就涉及到常用的数据类型int, float, complex, str;当我们需要在数据库中存储记录,以什么样的形式表示记录呢?通常使用内置数据类型的列表,字典,元组,集合就能满足需要。
数值型内置对象,int float complex
用dir了解这三个类型,就可以轻松知道它们的用法和属性。
实例:python环境中输入:dir(int)
可以查看到int对象的方法和属性。我们把每一个属性都过一遍,方便我们以后查看对象的属性方法,或自定义对象设置属性和方法做参考。
# dir(int)
dir(1)
Out[2]:
['__abs__','__add__','__and__','__bool__','__ceil__','__class__', '__delattr__', '__dir__', '__divmod__',
'__doc__','__eq__', '__float__','__floor__','__floordiv__','__format__','__ge__','__getattribute__',
'__getnewargs__', '__gt__','__hash__','__index__','__init__','__init_subclass__','__int__','__invert__','__le__',
'__lshift__','__lt__','__mod__','__mul__','__ne__','__neg__','__new__','__or__','__pos__', '__pow__','__radd__',
'__rand__', '__rdivmod__','__reduce__', '__reduce_ex__','__repr__', '__rfloordiv__','__rlshift__','__rmod__',
'__rmul__','__ror__','__round__','__rpow__','__rrshift__','__rshift__','__rsub__','__rtruediv__','__rxor__',
'__setattr__','__sizeof__','__str__','__sub__','__subclasshook__','__truediv__','__trunc__', '__xor__',
'bit_length','conjugate','denominator','from_bytes','imag','numerator','real','to_bytes']
我们以int类为例,看一下里面的魔法方法吧!
将dir返回的结果为列表,里面有70个元素,我们给里面的方法和属性分个类:
定义过类,我们就知道这两个魔法方法:支持创建类方法__new__()
,支持初始化实例方法__init_()
魔法方法
就是被重写成特殊符号的方法,比如常见的,+ - * / // & | ^
加减乘除与或非等,对象支持这些方法就表示定义对象的时候就把方法写进类定义里了。简单来说。定义方法的时候一种形式,调用方法用另一种符号代替,让代码更加立体直观。就是魔法方法了。
魔法方法是python内置方法,不需要主动调用,存在的目的是为了给python的解释器进行调用,几乎每个魔法方法都有一个对应的内置函数,或者运算符,当我们对这个对象使用这些函数或者运算符时就会调用类中的对应魔法方法,可以理解为重写内置函数。
支持类访问__class__
,使用方式type(对象)
返回该对象的类。
支持设置属性:__setattr__
支持查看占用空间:__sizeof__
支持打印方法__repr__
,
__format__
方法里面定义了对象的格式:x.__ format__(format_spec) ———— format(x, format_spec)
支持查看文档__doc__
,通常我们定义类的时候会在开头用三引号引一段文字来介绍类的作用功能信息,使用doc属性可以查看
支持删除属性方法 __delattr__()
,使用方式:del 某属性
支持查看对象的方法和属性的方法 __dir__()
,使用方式dir()
查看
支持查看指定属性的值'__getattribute__'
,使用方法:对象.属性
支持求hash散列值__hash__
,使用方法:hash(obj)
支持运算方法:
支持求绝对值__abs__
,使用方式abs(对象)
;
支持加法运算__add__
使用方式:+
;__radd__
支持x += 1
支持减法运算__sub__
使用方式:-
;__rsub__
支持-=
支持乘法运算__mul__
使用方式:*
; __rmul__
支持*=
,
支持取模__mod__
使用方式%
;__rmod__
支持%=
支持除法运算__truediv__
使用方式:/
;__rtruediv__
支持/=
,
支持除法得余数和商运算__divmod__
,使用方式:divmod()
,返回元组(商,余数);__rdivmod__
为:x= divmod(x, y)
支持地除法或叫整除__floordiv__
,使用方式://
,返回值去掉小数;__rfloordiv__
支持//=
支持N次方运算__pow__
;__rpow__
表示支持**=
支持富比较方法运算:小于__lt__、大于__gt__、小于等于__le__、大于等于__ge__、等于__eq__
和不等于__ne__
六个方法,使用操作运算符为:<、>、<=、>=、==和!=
支持按位的逻辑运算:与运算__and__
使用方式&
和and
; __rand__
,表示支持&=
支持或运算__or__
使用方式:|
和or
;__ror__
,表示支持|=
支持异或运算__xor__
,使用方式:^
;__rxor__
,表示支持^=
支持取反运算__invert__
,使用方式~
;
支持布尔运算
支持布尔方法__bool__()
返回True False
,使用:对象直接当作条件使用
约数
支持类四舍五入取整运算: 向上__ceil__()
返回不小于该对象的整数’;支持向下取整运算__floor__
,返回小于等于该对象的最大值。
支持四舍五入运算:__round__
这几个在float类中作用更大,int类里没什么作为。
支持移位操作
左移__lshift__
使用方式:<<
;__rlshift__
表示支持<<=
右移'__rshift__'
使用方式:>>
;__rrshift__
表示支持>>=
__init_subclass__
__subclasshook__
支持正号:__pos__
:其中obj是实现__pos__()的泛型对象。
支持负号:__ neg__
x.__ neg__() ———— -x
x.__ pos__() ———— +x
可能被其他包的函数用到的支持方法:
x.__ trunc__() ———— math.trunc(x)
a_list[x.__ index__()] ———— a_list[x]
x.__ reduce__() ———— pickle.dump(x, file)
x.__ reduce_ex__(protocol_version) ———— pickle.dump(x, file, protocol_version)
x.__ getnewargs__() ———— x = pickle.load(fp)
支持类型转换方法:转换成浮点类型__float__
,转换成整形__int__
,转换成字符串__str__
, from_bytes
, to_bytes
类方法,经常用到就不多说。
实例方法
‘bit_length’:长度
‘conjugate’,'共轭复数计算
属性
denominator
,对象的分母
numerator
,对象的分子
imag
,对象的虚部
real
,对象的实部
以上类型int的属性和方法就介绍完毕,其他内置内型,同理可查。掌握了查询方法,理解了对象的作用,可操作空间就大了。自己定义类型的时候也就得心应手。
学习过程:代码验证,调试
提示:以上大部分方法和属性的测试代码
# Begin to show your code!
import time
import math
# 创建对象
num = -1
num_c = int(2)
# 继承
class IntData(int):
def __init__(self, x):
super().__init__()
self.work = "起来"
pass
num_d = IntData(2) # 创建对象
# dir查看对象的方法和属性
check_1 = dir(1)
'''
['__abs__', '__add__', '__and__', '__bool__', '__ceil__',
'__class__', '__delattr__', '__dir__', '__divmod__',
'__doc__', '__eq__', '__float__', '__floor__',
'__floordiv__', '__format__', '__ge__', '__getattribute__',
'__getnewargs__', '__gt__', '__hash__', '__index__', '__init__',
'__init_subclass__', '__int__', '__invert__', '__le__', '__lshift__',
'__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__or__',
'__pos__', '__pow__', '__radd__', '__rand__', '__rdivmod__', '__reduce__',
'__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__',
'__rmul__', '__ror__', '__round__', '__rpow__', '__rrshift__', '__rshift__',
'__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__',
'__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'bit_length',
'conjugate', 'denominator', 'from_bytes', 'imag', 'numerator', 'real', 'to_bytes']
'''
# 访问类属性,得到类
msg1 = num.__class__ # <class 'int'>
# 删除属性__delattr__
del num_d.work
# 查看对象的属性方法,返回列表
# msg = num.__dir__()
msg = dir(num)
# 支持求绝对值'__abs__',使用`abs(对象)`
num_abs = abs(num)
# 支持加法运算`__add__`,
num_add = num + num_c
# 支持除法得余数和商运算`__divmod__`,
num_div2 = num.__divmod__(num_c)
num_div3 = divmod(num, num_c)
num_div1 = num/num_c
# 支持富比较方法运算:小于__lt__、大于__gt__、小于等于__le__、大于等于__ge__、等于__eq__和不等于__ne__六个方法,
# 使用操作运算符为:<、>、<=、>=、==和!=
num_lt = num < num_c # 返回bool值
# 支持逻辑与运算`__and__`使用方式`&`;支持或运算`__or__`使用方式`|`;;支持异或运算`__xor__`
num_and = num.__and__(num_c)
num_and2 = num & num_c
num_and3 = num and num_c
num_or = num | num_c
num_or2 = num or num_c
num_xor = num ^ num_c
# 支持布尔方法`__bool__()`返回`True False`,使用:`对象直接当作条件使用`
if num:
print(f'{num} is {bool(num)}')
# 支持类四舍五入取整运算`__ceil__()`返回不小于该对象的整数',
num_ceil1 = num.__ceil__()
# 支持求hash散列值`__hash__`
num_hash = hash(num)
# 支持泛型对象
print(+1, -1)
# '__sizeof__'
mum_size = num.__sizeof__()
# 'bit_length':长度
num_bit = num.bit_length()
# 'conjugate', 共轭复数
num_con = num.conjugate()
# denominator:分母
num_den = num.denominator
# 'numerator',分子
num_num = num.numerator
# 'from_bytes',类方法
# 'imag',
num_im = num.imag
# 'real',\
num_real = num.real
# 'to_bytes'
num_to = bytes(1)
time.sleep(2)
调试结果:
从今以后以后,编程中拿不准的方法在查询源码的时候,是不是就没那么头痛了。以小见大嘛~
学习产出:当面试笔试遇到到以下题目时,你知道怎么回答吗?
提示:个人笔记
1、 技术笔记 1 篇
0. 论dir的重要作用
数据类型 数据结构
1. 你所了解的常用字符串,字符方法
切片:,split,组合join,+,
格式化输出%s,{}format,f-string
字符串大小写lower,
字符编码解码ord,
替换replace
去除空格
2.字典的增删改查更新方法
dict. clear()
dict.get()
dict.setdefault()
pop(key)
popitem()
update(dict)
3.集合和元素关系属于in;
a集合与b集合的关系子集a.issubset(b),b<a,
等于==,交集a.intersection(b),&,
并集a.union(b),|,补集差集a.diffrence(b),^。
集合方法:add(元素),update(集合)
pop,remove(元素),集合.clear()
4 列表常用方法
扩展extend,+
增添append,删除pop,remove,
5. 列表解析式
power=[x**2 for x in range(1,10)]
得到的是一个列表
6. 生成器generator,创建生成器的两种方式?
函数构成生成器
def gener():
yield 1
元组解析式构成生成器
gen =(i**2 for I in range(1,10))
7. 迭代器iterators和可迭代对象
iter(可迭代对象)= 迭代器,同时含有__iter__和__next__
可迭代对象,列表,元组,字典,字符串等含有__iter__的对象。
8. 双端队列deque
方法:增添append,appendleft;删pop,popleft。
9. 堆栈
class Stack
10. 链表(节点,顺序链表,双向链表,循环链表)
class Node
class LinkLIst
11. 文件open
模式:r,r+,w,w+,a,a+,
rb,rb+,wb,wb+,ab,ab+
方法:read(size),readline(size),readlines(),f. tell(),f. seek()
特点:一次性读入内存,所以接近或大于内存的文件限制使用。
大文件读取推荐fileinput
import fileinput
for line in fileinput. input():
11. XML
12. JSON
13.shelve,pickle
14.数据库:补上
15. zip()并行迭代,以最短迭代对象长度为止。
16. Python中注释符号有几种?注释的位置一般有几种?
两种:井号# 和三单引号"' '"
两种:被注释代码头顶,或该行代码末尾。
17. 单引号,双引号,三单引号,三引号的作用
字符串" " 和 ' '
注释 三单
__doc__长串文本,换行的字符串 用三引号
18.对象的类型,type函数返回值是什么,有什么作用?
type函数返回该对象的类
比如:type("11")和type(23)
<class str>
<class int>
功能用途,可以同化:type(23)("11")
可将数字字符串整数化
19. isinstance(1, int)返回True