
1.基本变量类型
计算机程序要处理不同的数据,需要定义不同的数据类型。Python 定义了六种标准的数据类型,分布如下所示:
Numbers(数字)
Strings(字符串)
List(列表)
Tuple(元组)
Set(集合)
Dictionary(字典)
1.1Numbers(数字)
数字类型用于存储数值,它是不可改变的数据类型。Python 3 支持以下几种数字类型:
int (整数)
float (浮点型)
complex(复数)
bool (布尔)
数字类型的使用很简单,也很直观,如下所示:
# int
q = 1
# float
w = 2.3
# bool
e = True
# complex
r = 1 + 3j
print(q, w, e, r) # 1 2.3 True (1+3j)
# 内置的 type() 函数可以用来查询变量所指的对象类型
print(type(q)) # <class 'int'>
print(type(w)) # <class 'float'>
print(type(e)) # <class 'bool'>
print(type(r)) # <class 'complex'>
# 也可以采用 isinstance()
# isinstance 和 type 的区别在于:type()不会认为子类是一种父类类型,isinstance()会认为子类是一种父类类型
print(isinstance(q, int)) # True
print(isinstance(q, float)) # False
混合计算的时候, Python 会把整数转换为浮点数。
1.2 Strings(字符串)
注意:
1、反斜杠可以用来转义,使用 r 可以让反斜杠不发生转义。
2、字符串可以用 + 运算符连接在一起,用 * 运算符重复。
3、Python 中的字符串有两种索引方式,从左往右以 0 开始,从右往左以 -1 开始。
4、Python 中的字符串不能改变。

字符串包含了很多内置函数,这里只介绍几种非常常见的函数:
strip(x):当包含参数 x 表示删除句首或者句末 x 的部分,否则,就是删除句首和句末的空白字符,并且可以根据需要调用 lstrip() 和 rstrip() ,分别删除句首和句末的空白字符;
split():同样可以包含参数,如果不包含参数就是将字符串变为单词形式,如果包含参数,就是根据参数来划分字符串;
join():主要是将其他类型的集合根据一定规则变为字符串,比如列表;
replace(x, y):采用字符串 y 代替 x
index():查找指定字符串的起始位置
startswith() / endswith():分别判断字符串是否以某个字符串为开始,或者结束;
find():查找某个字符串;
upper() / lower() / title():改变字符串的大小写的三个函数
# strip()
s3 = " I love python "
s4 = "show something!"
print('输出直接调用 strip() 后的字符串结果: ', s3.strip())
print('lstrip() 删除左侧空白后的字符串结果: ', s3.lstrip())
print('rstrip() 删除右侧空白后的字符串结果: ', s3.rstrip())
print('输出调用 strip(\'!\')后的字符串结果: ', s4.strip('!'))
# split()
s5 = 'hello, world'
print('采用split()的字符串结果: ', s5.split())
print('采用split(\',\')的字符串结果: ', s5.split(','))
# join()
l1 = ['an', 'apple', 'in', 'the', 'table']
print('采用join()连接列表 l1 的结果: ', ''.join(l1))
print('采用\'-\'.join()连接列表 l1 的结果: ', '-'.join(l1))
# replace()
print('replace(\'o\', \'l\')的输出结果: ', s5.replace('o', 'l'))
# index()
print('s5.index(\'o\')的输出结果: ', s5.index('o'))
# startswith() / endswith()
print('s5.startswith(\'h\')的输出结果: ', s5.startswith('h'))
print('s5.endswith(\'h\')的输出结果: ', s5.endswith('h'))
# find()
print('s5.find(\'h\')的输出结果: ', s5.find('h'))
# upper() / lower() / title()
print('upper() 字母全大写的输出结果: ', s5.upper())
print('lower() 字母全小写的输出结果: ', s5.lower())
print('title() 单词首字母大写的输出结果: ', s5.title())
1.3 列表(容器类型)

同样,列表也有很多内置的方法,这里介绍一些常见的方法:
len(list):返回列表的长度
append(obj) / insert(index, obj) / extend(seq):增加元素的几个方法
pop() / remove(obj) / del list[index] / clear():删除元素
reverse() / reversed:反转列表
sort() / sorted(list):对列表排序,注意前者会修改列表内容,后者返回一个新的列表对象,不改变原始列表
index():查找给定元素第一次出现的索引位置
列表——内存模型:
(理解关键:在内存中是如何摆放的;才能知道它们直接的差别;)
数据结构
1.学习每一种数据结构,它的内存模型最为重要;
2.了解每一种数据结构的差异
3.时间复杂度问题;
列表:排好队的,连续有序(就可以索引)的,查找的快,前中部修改(增删)慢;
链表:手拉手模型,有散落的顺序(有关系,知道上下),不知道位置在哪,线性编辑的内存地址中;内存中散落的、不连续的;从某一头开始找,速度慢; 查询比list慢,插队快(插队手拉手快)
queue:队列(先进先出)
队列是根据先进先出(FIFO)原则插入和移除的对象的容器。 在现实世界中排队的一个很好的例子是售票柜台的线路,根据他们的到达顺序上车,因此首先到达的人也是第一个离开的人。
列表实现队列效率不高,因为列表末尾的append()和pop()速度很快, 但是,最后插入和从列表开头删除不是那么快,因为它需要元素位置的移动。
stack:堆栈(后进先出)
后进先出,扔盘子模型(弹夹模型);函数压栈(非常重要的模型);
想象一下这样一种场景,即在一个有一堆盘子的晚宴上,总是在堆顶部添加或移除盘子。 否则里面的数据拿不出来;在计算机科学中,这个概念用于评估表达式和语法分析,调度算法/例程等。可以使用Python中的列表来实现堆栈。 将元素添加到堆栈时,它被称为推送操作,而当您删除或删除元素时,它被称为弹出操作。 请注意,当您在Python中使用堆栈时,实际上有一个pop()方法可供使用:
2. 数据类型的转换
有时候我们需要对数据类型进行转换,比如列表变成字符串等,这种转换一般只需要将数据类型作为函数名即可。
下面列举了这些转换函数:
int(x, [,base]):将 x 转换为整数,base 表示进制,默认是十进制
float(x):将 x 转换为一个浮点数
complex(x, [,imag]):创建一个复数, imag 表示虚部的数值,默认是0
str(x):将对象 x 转换为字符串
repr(x): 将对象 x 转换为表达式字符串
eval(str): 用来计算在字符串中的有效 Python 表达式,并返回一个对象
tuple(s): 将序列 s 转换为一个元组
list(s): 将序列 s 转换为一个列表
set(s):转换为可变集合
dict(d): 创建一个字典。d 必须是一个序列 (key,value)元组
frozenset(s): 转换为不可变集合
chr(x):将一个整数转换为一个字符
ord(x):将一个字符转换为它的整数值
hex(x):将一个整数转换为一个十六进制字符串
oct(x):将一个整数转换为一个八进制字符串
3.数字处理函数

**取整函数的原则**;(math向上向下取整,int截断/整除// round)
向上天花板ceil 与向下地板 floor ;
math.floor(-2.5),math.ceil(-2.5) | (-3,-2)
math.floor(2.5),math.ceil(2.5) | (2,3)
int只管它的整数部分(无论正负);
int(2.5),int(3.5) | (2,3)
int(-2.5),int(-3.5) | (-2,-3) #只关心整数部分;
round 函数规则:四舍六入五取偶数(离他最近的偶数),区分正负;
round(0.5),round(1.5),round(2.5),round(3.5),round(4.5)
(0, 2, 2, 4, 4)
round(0.1),round(1.3),round(1.6),round(2.45),round(2.71)
(0, 1, 2, 2, 3)
取整函数去区分正负;数值都是往下走的,趋向于小值;(负数:正值+1取负值;)
运算函数:
min(iterable,[key,default]) #可迭代的对象;
max
pow(2,3) /2**3 8 #2的3次方=2**3
进制相关函数,返回值是:字符串str
#合法数字的转化为字符;
# bin 转换为二进制;
# hex 转换为16进制;
# math.pi=3.141592654
# math.e=
类型函数
# type()函数输出的是类型,不是字符;
# isinstance(a,b) a是否是b的类型;
如何快速判断一个数据类型是否可以更改呢?有以下两种方法:
id():判断变量更改前后的 id,如果一样表示可以更改,不一样表示不可更改。
hash():如果不报错,表示可以被哈希,就表示不可更改;否则就是可以更改。
i = 2
print('i id value=', id(i))
i += 3
print('i id value=', id(i))
输出结果,更改前后 id 是更改了,表明整型变量是不可更改的。
i id value= 1758265872
i id value= 1758265968
然后在列表变量上进行同样的操作:
l1 = [1, 3]
print('l1 id value=', id(l1))
l1.append(4)
print('l1 id value=', id(l1))
输出结果,id 并没有改变,说明列表是可以更改的。
l1 id value= 1610679318408
l1 id value= 1610679318408
然后就是采用 hash() 的代码例子:
# hash
s = 'abc'
print('s hash value: ', hash(s))
l2 = ['321', 1]
print('l2 hash value: ', hash(l2))
输出结果如下,对于字符串成功输出哈希值,而列表则报错 TypeError: unhashable type: 'list',这也说明了字符串不可更改,而列表可以更改。
s hash value: 1106005493183980421
TypeError: unhashable type: 'list'
总结:
1. 内置函数是可迭代对象;本质上是列表是可迭代对象;
2. 隐式转换(数值类型之间的转换,高级语言都支持)能像整型像整形,整形不够就浮点型;
3. 强弱转换(不同类型转换)