python基本数据类型
Numbers(数字)
int 整数:
通常被称为是整型或整数,可以是正整数或负整数,不带小数点。python3整型是没有限制大小的,可以当做long类型使用,但实际上由于机器内存的限制,我们使用的整数不可能无限大。
整型的四种表现形式:
- 2进制:以‘0b’开头。例如:‘0b11011’表示10进制的27
- 8进制:以‘0o’开头。例如‘0o33’表示10进制的27
- 10进制:正常显示
4. 16进制:以‘0x’开头。例如:‘0x1b’表示16进制的27
各进制数字进行转换(python内置函数):
- bin(i):将i转换为2进制,以‘0b’开头,具体使用可参照上面图片。
- oct(i):将i转换为8进制,以‘0o’开头,具体使用可参照上面图片。
- int(i): 将i转换为10进制,正常显示,具体使用可参照上面图片。
- hex(i):将i转换为16进制,以‘0x’开头,具体使用可参照上面图片。
注:
- 在Python中整型是有限制大小的
在32位机器上,整型的位数为32位,取值范围为-2**31~31-1, 即- 2147483648~2147483647
在64位机器上,整型的位数为64位,取值范围为-2**63~63-1, 即-9223372036854775808~9223372036854775807
超过这个范围的整型就是long型
- Python有个特别的机制,它会在解释器启动的时候事先分配好一些缓冲区,这些缓冲区部分是固定好取值,例如整数[-5,256]的内存地址是固定的(这里固定指这一次程序启动后,这些数字在这个程序中的内存地址就不变了,但是启动新的python程序,两次的内存地址不一样)。有的缓冲区就可以重复利用。这样的机制就使得不需要python频繁的调用内存malloc和free。
float 浮点数:
浮点数也就是小数,之所以称为浮点数,是因为按照科学记数法表示时,一个浮点数的小数点位置是可变的,比如,1.23x109和12.3x108是完全相等的。浮点数可以用数学写法,如1.23,3.14,-9.01,等等。但是对于很大或很小的浮点数,就必须用科学计数法表示,把10用e替代,1.23x109就是1.23e9,或者12.3e8,0.000012可以写成1.2e-5,等等。
Boolean 布尔类型
布尔值和布尔代数的表示完全一致,一个布尔值只有True、False两种值,要么是True,要么是False,在Python中,可以直接用True、False表示布尔值(请注意大小写),也可以通过布尔运算计算出来:
布尔值可以用and、or和not运算。
and运算是与运算,只有所有都为True,and运算结果才是True:
or运算是或运算,只要其中有一个为True,or运算结果就是True:
not运算是非运算,它是一个单目运算符,把True变成False,False变成True:
布尔值经常用在条件判断中,比如:
if age >= 18:
print('age>=18,Output sentence')
else:
print('age<18,Output sentence')
String 字符串
- 字符串,用 ‘ ’ 或者 “ ” 包含在内,也可以用 ‘’’ ‘’’ 来包含多行字符串
- 字符串用转义字符 \ 来转义,转义字符 \ 可以转义很多字符,比如 \n 表示换行, \t 表示制表符,字符 \ 本身也要转义,所以 \\ 表示的字符就是 \
print('I\'m learning\nPython.')
print('I\'m \"OK\"!')
print('\\\n\\')
print('\\\t\\')
print(r'\\\t\\')#Python还允许用r''表示''内部的字符串默认不转义
print('''line1
... line2
... line3''')
输出语句
I'm learning
Python.
I'm "OK"!
\
\
\ \
\\\t\\
line1
... line2
... line3
- 有两种索引方式:从左到右(0开始),从右到左(-1开始)
x = 'Wozuishuai'
print(x[0],x[5])
>>>W s
print(x[-1],x[-10])
>>>i W
- 可以进行切片(Slice)
L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack']
print(L[0:3])#L[0:3]表示,从索引0开始取,直到索引3为止,但不包括索引3。即索引0,1,2,正好是3个元素。
>>>['Michael', 'Sarah', 'Tracy']
- 元素不可变
a = 'ABC'
b = a
a = 'XYZ'
print(b)
>>>ABC
6. 没有单独的字符形式,只有长度为一的字符串
List 列表
- 用 [ ] 表示,中间用 , 隔开,元素的类型可以不同
- 和字符串一样可以切片,也可以用 + 进行串联
- 元素是可变的
classmates = ['Michael',1, 'Bob', 'Tracy']
classmates.append('admin')
print(classmates)
print(classmates[0],classmates[-1])
print(classmates[0:3])
输出结果
['Michael', 1, 'Bob', 'Tracy', 'admin']
Michael admin
['Michael', 1, 'Bob']
Tuple 元组
- 写在 () 里面,用 , 隔开,元素类型可以不相同
- 构建 0 个元素或者一个元素的元组是特殊的,tuple =() tuple = (1,)
- 元素不可变
- 可以用 + 链接,也可以用索引切片
classmates = ('Michael',1, 'Bob', 'Tracy',['A', 'B'])
classmates[4][0] = 'X'
classmates[4][1] = 'Y'
print(classmates)
print(classmates[0],classmates[-1])
print(classmates[0:3])
输出结果
('Michael', 1, 'Bob', 'Tracy', ['X', 'Y'])
Michael ['X', 'Y']
('Michael', 1, 'Bob')
注:表面上看,tuple的元素确实变了,但其实变的不是tuple的元素,而是list的元素。tuple一开始指向的list并没有改成别的list,所以,tuple所谓的“不变”是说,tuple的每个元素,指向永远不变。即指向 ‘a’,就不能改成指向 ‘b’,指向一个list,就不能改成指向其他对象,但指向的这个list本身是可变的!
dict 字典
Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。
- 是一个无序的键值对集合
- 声明格式为:t = {key:value,key:value}
d = {'Michael': 95, 'Bob': 75, 'Tracy': 85}
print(d['Michael'])
d['Adam'] = 67#向dict中添加一个对应的key:value
print(d['Adam'],d)
d['Michael'] = 90#由于一个key只能对应一个value,所以,多次对一个key放入value,后面的值会把前面的值冲掉
print(d['Michael'],d)
print('Thomas' in d)#如果key不存在,dict就会报错,要避免key不存在的错误,有两种办法,一是通过in判断key是否存在
print(d.get('Thomas'),d.get('Thomas', -1))#二是通过dict提供的get()方法,如果key不存在,可以返回None,或者自己指定的value
print(d.pop('Bob'),d)#要删除一个key,用pop(key)方法,对应的value也会从dict中删除
输出结果
95
67 {'Michael': 95, 'Bob': 75, 'Tracy': 85, 'Adam': 67}
90 {'Michael': 90, 'Bob': 75, 'Tracy': 85, 'Adam': 67}
False
None -1
75 {'Michael': 90, 'Tracy': 85, 'Adam': 67}
注:dict内部存放的顺序和key放入的顺序是没有关系的。
和list比较,dict有以下几个特点:
- 查找和插入的速度极快,不会随着key的增加而变慢;
- 需要占用大量的内存,内存浪费多。
而list相反:
- 查找和插入的时间随着元素的增加而增加;
- 占用空间小,浪费内存很少。
所以,dict是用空间来换取时间的一种方法。
dict可以用在需要高速查找的很多地方,在Python代码中几乎无处不在,正确使用dict非常重要,需要牢记的第一条就是dict的key必须是不可变对象。
这是因为dict根据key来计算value的存储位置,如果每次计算相同的key得出的结果不同,那dict内部就完全混乱了。这个通过key计算位置的算法称为哈希算法(Hash)。
要保证hash的正确性,作为key的对象就不能变。在Python中,字符串、整数等都是不可变的,因此,可以放心地作为key。而list是可变的,就不能作为key
Set 集合
set和dict类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的key。
- 无序不重复的集
- 可以用 { } 来创建包含元素的集合,或者用 () 来创建空元素的集合
- 可以进行去重或者测试成员的关系
要创建一个set,需要提供一个list作为输入集合:
s = set([1, 2, 3])
print(s)
{1, 2, 3}#输出结果
注意,传入的参数[1, 2, 3]是一个list,而显示的{1, 2, 3}只是告诉你这个set内部有1,2,3这3个元素,显示的顺序也不表示set是有序的。。
重复元素在set中自动被过滤:
s = set([1, 1, 2, 2, 3, 3])
print(s)
{1, 2, 3}#输出结果
通过add(key)方法可以添加元素到set中,可以重复添加,但不会有效果:
s.add(4)
print(s)
{1, 2, 3, 4}#输出结果
s.add(4)
print(s)
{1, 2, 3, 4}#输出结果
通过remove(key)方法可以删除元素:
s.remove(4)
print(s)
{1, 2, 3}#输出结果
set可以看成数学意义上的无序和无重复元素的集合,因此,两个set可以做数学意义上的交集、并集等操作:
s1 = set([1, 2, 3])
s2 = set([2, 3, 4])
print(s1 & s2)
{2, 3}#输出结果,交集
print(s1 | s2)
{1, 2, 3, 4}#输出结果,并集
set和dict的唯一区别仅在于没有存储对应的value,但是,set的原理和dict一样,所以,同样不可以放入可变对象,因为无法判断两个可变对象是否相等,也就无法保证set内部“不会有重复元素”。试试把list放入set,看看是否会报错。
再议不可变对象
上面我们讲了,str是不变对象,而list是可变对象。
对于可变对象,比如list,对list进行操作,list内部的内容是会变化的,比如:
a = ['c', 'b', 'a']
a.sort()
print(a)
['a', 'b', 'c']#输出结果
而对于不可变对象,比如str,对str进行操作呢:
a = 'abc'
print(a.replace('a', 'A'))
'Abc'#输出结果
print(a)
'abc'#输出结果
虽然字符串有个replace()方法,也确实变出了’Abc’,但变量a最后仍是’abc’,应该怎么理解呢?
我们先把代码改成下面这样:
a = 'abc'
b = a.replace('a', 'A')
print(b_
'Abc'#输出结果
print(a)
'abc'#输出结果
要始终牢记的是,a是变量,而’abc’才是字符串对象!有些时候,我们经常说,对象a的内容是’abc’,但其实是指,a本身是一个变量,它指向的对象的内容才是’abc’:
┌───┐ ┌───────┐
│ a │─────────────────>│ ‘abc’ │
└───┘ └───────┘
当我们调用a.replace(‘a’, ‘A’)时,实际上调用方法replace是作用在字符串对象’abc’上的,而这个方法虽然名字叫replace,但却没有改变字符串’abc’的内容。相反,replace方法创建了一个新字符串’Abc’并返回,如果我们用变量b指向该新字符串,就容易理解了,变量a仍指向原有的字符串’abc’,但变量b却指向新字符串’Abc’了:
┌───┐ ┌───────┐
│ a │─────────────────>│ ‘abc’ │
└───┘ └───────┘
┌───┐ ┌───────┐
│ b │─────────────────>│ ‘Abc’ │
└───┘ └───────┘
所以,对于不变对象来说,调用对象自身的任意方法,也不会改变该对象自身的内容。相反,这些方法会创建新的对象并返回,这样,就保证了不可变对象本身永远是不可变的。
None 空值
空值是Python里一个特殊的值,用None表示。None不能理解为0,因为0是有意义的,而None是一个特殊的空值。
此外,Python还提供了列表、字典等多种数据类型,还允许创建自定义数据类型。
变量
变量的概念基本上和初中代数的方程变量是一致的,只是在计算机程序中,变量不仅可以是数字,还可以是任意数据类型。
变量在程序中就是用一个变量名表示了,变量名必须是大小写英文、数字和_的组合,且不能用数字开头,比如:
a = 1
变量a是一个整数。
t_007 = 'T007'
变量t_007是一个字符串。
Answer = True
变量Answer是一个布尔值True。
在Python中,等号=是赋值语句,可以把任意数据类型赋值给变量,同一个变量可以反复赋值,而且可以是不同类型的变量,例如:
a = 123 # a是整数
print(a)
a = 'ABC' # a变为字符串
print(a)
这种变量本身类型不固定的语言称之为动态语言,与之对应的是静态语言。静态语言在定义变量时必须指定变量类型,如果赋值的时候类型不匹配,就会报错。例如Java是静态语言,赋值语句如下(// 表示注释):
int a = 123; // a是整数类型变量
a = "ABC"; // 错误:不能把字符串赋给整型变量
和静态语言相比,动态语言更灵活,就是这个原因。
请不要把赋值语句的等号等同于数学的等号。比如下面的代码:
x = 10
x = x + 2
如果从数学上理解x = x + 2那无论如何是不成立的,在程序中,赋值语句先计算右侧的表达式x + 2,得到结果12,再赋给变量x。由于x之前的值是10,重新赋值后,x的值变成12。
最后,理解变量在计算机内存中的表示也非常重要。当我们写:
a = 'ABC'
时,Python解释器干了两件事情:
在内存中创建了一个’ABC’的字符串;
在内存中创建了一个名为a的变量,并把它指向’ABC’。
也可以把一个变量a赋值给另一个变量b,这个操作实际上是把变量b指向变量a所指向的数据,例如下面的代码:
a = 'ABC'
b = a
a = 'XYZ'
print(b)
最后一行打印出变量b的内容到底是’ABC’呢还是’XYZ’?如果从数学意义上理解,就会错误地得出b和a相同,也应该是’XYZ’,但实际上b的值是’ABC’,让我们一行一行地执行代码,就可以看到到底发生了什么事:
执行a = ‘ABC’,解释器创建了字符串’ABC’和变量a,并把a指向’ABC’:
py-var-code-1
执行b = a,解释器创建了变量b,并把b指向a指向的字符串’ABC’:
py-var-code-2
执行a = ‘XYZ’,解释器创建了字符串’XYZ’,并把a的指向改为’XYZ’,但b并没有更改:
py-var-code-3
所以,最后打印变量b的结果自然是’ABC’了。
常量
所谓常量就是不能变的变量,比如常用的数学常数π就是一个常量。在Python中,通常用全部大写的变量名表示常量。
常量 | 描述 |
---|---|
PI | 数学常量PI(圆周率,一般以π来表示) |
e | 数学常量e,e即自然常数 |
数学函数
函数 | 返回值 ( 描述 ) |
---|---|
abs(x) | 返回数字的绝对值,如abs(-10) 返回 10 |
ceil(x) | 返回数字的上入整数,如math.ceil(4.1) 返回 5 |
cmp(x, y) | 如果 x < y 返回 -1, 如果 x == y 返回 0, 如果 x > y 返回 1 |
exp(x) | 返回e的x次幂(ex),如math.exp(1) 返回2.718281828459045 |
fabs(x) | 返回数字的绝对值,如math.fabs(-10) 返回10.0 |
floor(x) | 返回数字的下舍整数,如math.floor(4.9)返回 4 |
log(x) | 如math.log(math.e)返回1.0,math.log(100,10)返回2.0 |
log10(x) | 返回以10为基数的x的对数,如math.log10(100)返回 2.0 |
max(x1, x2,…) | 返回给定参数的最大值,参数可以为序列。 |
min(x1, x2,…) | 返回给定参数的最小值,参数可以为序列。 |
modf(x) | 返回x的整数部分与小数部分,两部分的数值符号与x相同,整数部分以浮点型表示。 |
pow(x, y) | x**y 运算后的值。 |
round(x [,n]) | 返回浮点数x的四舍五入值,如给出n值,则代表舍入到小数点后的位数。 |
sqrt(x) | 返回数字x的平方根 |
三角函数
函数 | 描述 |
---|---|
acos(x) | 返回x的反余弦弧度值。 |
asin(x) | 返回x的反正弦弧度值。 |
atan(x) | 返回x的反正切弧度值。 |
atan2(y, x) | 返回给定的 X 及 Y 坐标值的反正切值。 |
cos(x) | 返回x的弧度的余弦值。 |
hypot(x, y) | 返回欧几里德范数 sqrt(x * x + y * y)。 |
sin(x) | 返回的x弧度的正弦值。 |
tan(x) | 返回x弧度的正切值。 |
degrees(x) | 将弧度转换为角度,如degrees(math.pi/2) , 返回90.0 |
radians(x) | 将角度转换为弧度 |
随机数函数
函数 | 描述 |
---|---|
choice(seq) | 从序列的元素中随机挑选一个元素,比如random.choice(range(10)),从0到9中随机挑选一个整数。 |
randrange([start] stop [step]) | 从指定范围内,按指定基数递增的集合中获取一个随机数,基数缺省值为1 |
random() | 随机生下一个实数,它在[0,1]范围内。 |
seed([x]) | 改变随机数生成器的种子seed。如果你不了解其原理,你不必特别去设定seed,python会帮你选择seed。 |
shuffle(lst) | 将序列的所有元素随机排列 |
uniform(x,y) | 随机生下一个实数,它在[x,y]范围内 |
自定义函数
自定义函数使用到关键字def,返回值return可有可无,但函数名后面一定要有一对圆括号,里面填上需要引入的参数即可,比较简单
def y(x):
return x+1