第三章、Python的数据类型

python3中有六个标准的数据类型:

  -- Number(数字)

  --  String(字符串)

  --  List(列表)

  --  Sets (集合)

  --   Dictionary(字典)

  -- tuple(元组)

3.1数字类型:

3.1.1.数字类型:分为整形(int)、浮点数(float)和复数(complex)

整形(int):通常被称之为是整形或者整数,是正整数、负整数和0,不带小数点:如10、-56

浮点数(float):由整数部分与小数部分组成。如:2.65、3.141526

复数(复数):复数由实数部分和虚数部分构成,可以用a+bj,或者complex(a,b)表示,复数的实部a和虚部b都是浮点型(例如:-4的平方根)

3.1.2.类型转换

之前课程已经串讲过,当时用输入函数input()时,默认会将键入的数字1变成字符串‘1’,比如:

>>>i = input('my name is :')
>>>print(type(i))
>><class 'str'>

要将此时字符串“1”转换为整数型,可以使用int(1)的方式。同理,当要将浮点型转换为整形时,可以使用int()函数完成

>>>a = "89"
>>>print(type(a))
<class 'str'>

上述例子,测试a所对应的是字符串,如果要将其转换为整数型,可以使用int(i)的方式。同理,当然要将浮点数转换为整型时,也可以用int()函数完成

>>>a = '46'
>>>print(type(a))
<class 'str'>
>>>b = int(a)
>>>print(type(b))
<class 'int'>

 浮点型转换,如果我们需要将整数

>>>a = '46'
>>>print(type(a))
<class 'str'>
>>>b = float(a)
>>>print(b,type(b))
46.0<class 'float'>

复数类型转换

>>>a = 3
>>>b = 4
>>>c = complex(a,b)
>>>print(3)
3+4j

复数不能转换为整数、浮点型等

 

3.2字符串

  

说到字符串,我们自然会想到中文字符串。但是中文字符串涉及到一些字符集、编码、解码的问题,现在引入这些概念会吧开始的学习复杂化

所以放在后续章节,目前阶段只讨论英文字符串

3.2.1 字符串的定义

  字符串可以用,单引号,双引号或者三引号括起来。其中三引号里面是可以跨行的字符串

#单引号
>>>auto = 'hello world'     

#双引号
>>>auto = "my name is Augus"    

#三引号
>>>auto = '''python is cool'''

#三引号跨行 >>>auto = '''python is cool!'''

3.2.2 字符串的拼接

  3.2.2.1.拼接 

#加号连接
>>>a,b = 'hello','world'
>>>a+b
>>>'hello world'

#逗号连接 **使用逗号,只能用于print打印输出
>>>a,b = 'hello','world'
>>>print(a,b)
#上述代码如果进行赋值操作会生成元组
>>>a,b
("hello","world")

#直接连接
>>>print("hello"   "world")
helloworld

  3.2.2.2.字符串的乘法(重复n次)

>>>"sid" * 3
'sidsidsid'

    3.2.2.3获取字符串的长度

len('my name is: Augus')

  3.2.2.4.字符串的比较

>>>str1 = 'abc'
>>>str2 = 'lmn'
>>>str3 = 'xyz'
>>>str1 == 'abc'
Ture
>>>str1 < str2
True
>>>str2 != str3
True
>>>str1 < str3 and str2 == 'xyz'
False

  当我们比较字符串大小的时候,python是按照字符的字典顺序来比较的

  3.2.2.4.字符串的squence操作

  我们看到字符串‘ZXCVF’,每个字符串可以用正数下标表示,也可以使用负数下标表示它们在字符串中的位置

  

  **注意:字符串截取时,数字位是从0开始,而不是从1开始。所以一个长度为n的字符串的最后一个字符的下标是n-1

 

  我们可以截取(slice)字符串的一部分内容。截取的操作符是[ ],这个操作符如果只有一个下标参数,那么我们将得到一个字符

  如果参数有两个,中间以冒号(:)隔开,将返回一段字字符串。截取操作slice有时也称为切片操作.

 

  例如:str[start:end],我们将得到从下标start开始,到下标end结束,但不包括下标end对应字符的那部分字符串

>>>str = 'zxcvbnm'
>>>str[0] 
'z'

>>>str[-7]
'z'

#注意:这种情况,左含右不含
>>>str[2:4]
'cv'

>>>str[-5:-3]
'cv'

>>>str[3:]
'vbnm'

>>>str[-4:]
'vbnm'

>>>str[:3]
‘zxc

>>>str[:-4]
'zxc'

  

  3.2.3.字符串格式化

  3.2.3.1.旧式”字符串解析(%操作符) 

>>>'hello,%s is my name, I like %s' % ('Augus','footall')
'hello,Augus is my name, I like footall'

  3.2.3.2.str.format

  使用位置参数

  **要点:从以下例子可以看出位置参数不受顺序约束,且可以为{},只要format里面有相对应的参数值即可,参数索引从0开始,

  传入位置参数可用列表即可

>>>"my name is {},i  am {} years old".format("wangwu",18)
"my name is wangwu,i  am 18 years old"

>>>"my name is {0},i  am {1} years old".format("wangwu",18)
"my name is wangwu,i  am 18 years old"

>>>"my name is {1},i  am {0} years old".format(18,"wangwu")
"my name is wangwu,i  am 18 years old"

  

  ~使用关键字参数

  **要点:关键字参数值要对的上,可用字典当做关键字参数传入时,字典前加**即可,如下例子3

>>>"my name is {name},i  am {age} years old".format(name ="wangwu",age = 18)
'my name is wangwu,i  am 18 years old'

>>>info = {"name":"wangwu","age":18}
>>>"my name is {ele[name]},i  am {ele[age]} years old".format(ele=info)
'my name is wangwu,i  am 18 years old'

#例3:将字典当做关键字参数传入 >>>info = {"name":"wangwu","age":18} >>>"my name is {name},i am {age} years old".format(**info) 'my name is wangwu,i am 18 years old'

 

  3.2.3.3.字符串插值/f-string

  在python3.6中添加一个新的字符串格式化方法,被称为字面量格式化字符串或者"f-string"。

>>>name = badboy
>>>f'Hello,{name}!'
'hello,badboy'


>>>a=5
>>>b=10
>>>f'Five plus ten is {a+b}and not {2*(a+b)}'
'Five plus ten is 15 and not 30.'

  

 

3.3 列表

字符串、列表(List)和元组(tupe),三种数据类型在python中都属于Sequence(序列)这种概念

Sequence这个概念和C语言或者Java语言里面的数组特别相似。我们可以把它理解为一串数据

。其中每个数据都可以用数字索引访问。也可以切片,加,乘等。python内置了确定序列的长度len()和确定最大max()和最小min()的元素的方法

 列表是python里面最常用的数据类型之一

字符串里面包含的元素是一个个的字符,并且字符串是不可更改的(你不能修改字符串里面的某个字符,只能根据它创建出新的字符串对象)

列表,它里面的每个元素都可以是任何类型的python对象并且是可以更改的!!!

3.3.1创建列表

创建一个list对象

>>>re = [56,'name','cbd',3.14]
>>>print(re)
[56,'name','cbd',3.14]
>>>print(type(re))
<class 'list'>

通过上述例子可以得出结果,list用方括号([])创建,列表里面的元素可以是整数,小数,字符串。事实上所有类型的python对象,包括python内置对象

和自定义对象都可以存储在list里面,作为list的一个元素

 创建空列表

>>>a = []

也可以这样子创建空列表

>>>a = list()

**list在python里面是一个关键字,大家千万不要定义一个变量的名字叫list。这样会导致list关键字会创建的list变量覆盖掉

3.3.2.sequence(序列)操作

和字符串一样,列表也支持切片(slice)操作。

>>> result = [3.14,'hello',78,['NBA','WNBA','CBA','WCBA'],{'name':'augus','age':'18'},3+4j]
>>> print(result)
[3.14, 'hello', 78, ['NBA', 'WNBA', 'CBA', 'WCBA'], {'name': 'augus', 'age': '18'}, (3+4j)]
>>> result[1:4]
['hello', 78, ['NBA', 'WNBA', 'CBA', 'WCBA']]
>>> result[3]
['NBA', 'WNBA', 'CBA', 'WCBA']
>>> result[:3]
[3.14, 'hello', 78]
>>> result[3:]
[['NBA', 'WNBA', 'CBA', 'WCBA'], {'name': 'augus', 'age': '18'}, (3+4j)]
>>> result[4:]
[{'name': 'augus', 'age': '18'}, (3+4j)]
>>> result[-5:-1]
['hello', 78, ['NBA', 'WNBA', 'CBA', 'WCBA'], {'name': 'augus', 'age': '18'}]
>>> result[-1:-4]
[]
>>> 'hello' in result
True
>>> '3.14' not in result
True
>>> result[3][2]
'CBA'
>>> result[4]["name"]
'augus'
>>> 

 

**特别注意:切片操作都是创建了一个新的列表对象作为返回值。原来的列表对象并没有改变。

**像列表这种元素是任何其他类型对象的对象,我们通常会形象的吧它称之为容器(container)对象,因为它像一个容易一样用来盛放其他对象

3.4元组(tuple)

元组也是sequence对象。它具有sequence(序列)的一切特性

同样他也是一个容器对象,可以存放所有的python对象

它和列表最大的不同是:和字符串类似,它也是不可改变(immutable)。就是说元组内容创建出来以后,它的内容是不能变化的

3.4.1创建元组

元组用()来创建,里面的元素可是是整数、小数、字符串。其实所以类型的python对象,包括python内置对象和自定义对象都可以存储在元组中,

作为其中的一个元素

>>>(78,4.567,'a','NBA')
(78,4.567,'a','NBA')

同意tuple也是python中的一个关键字,不能将其定义为变量名。这样会导致tuple关键字被tuple变量覆盖

3.4.2.sequence操作

既然tuple也是一种squence,那自然支持所有squence的操作

>>> tup = (123,'name',6.33,['mysql','sql service'],4+3j)
>>> tup[0]
123
>>> tup[1:4]
('name', 6.33, ['mysql', 'sql service'])
>>> tup[:3]
(123, 'name', 6.33)
>>> tup[3][0]
'mysql'
>>> 123 in tup
True
>>> 'name' in tup
True
>>> 6.33 not in tup
False
>>> 6.33 in tup
True
>>> tup[0] = '123'
Traceback (most recent call last):
  File "<pyshell#10>", line 1, in <module>
    tup[0] = '123'
TypeError: 'tuple' object does not support item assignment
#元组对象不支持项分配

>>>tup1 = ('google','baidu','sougou','biying')
>>>tup2 = (1,2,3)

#连接操作
>>>tup3 = tup2 + tup1
>>>print(tup3)

**注意:切片操作都是创建了一个新的元组对象作为返回值。原来的元组对象并,并没有变

3.4.2赋值给多个变量

另外我们可以吧sequence类型的对象里面的元素赋值给多个变量

>>>a,b=(1,2)
>>>c,d,e = [3,7,5]
>>>print(a,b,c,d,e)
1 2 3 7 5

3.5字典

3.5.1定义字典和元素的访问

前面我们学习过list、tuple对象。可以用来存储别的对象

假设我要存储同学的年龄信息,可以创建如下的list

[
('tom mark',14),
('Jack Mark'),15)
]

这里出现了个问题:

list这种类型的对象是通过下标来访问存储对象的,下标和元素的内容没有关系,如果我们根据某个同学的姓名查找某个同学的信息,只能根据一个个查找元素

如果存储的对象很多,显示着很不方便

为了解决这个问题,python引入了内置对象,字典(dict)对象

dict1 = {}
dict2 = {'name':'augus','age':18}

上面的信息如果用字典对象存储是这样的

studentinfo = {
   'jack ' : 16
   'augus':15            
}

>>>print(studentinfo['augus'])
15

dict对象的存储也叫键值对(key-value)存储。具有如下的特点

~~dict是可变的

~~dict可以存储任意数量的python对象

~~dict可以存储任何python数据对象

~~dict以:key:value,即“键”:“值”对的形式存储数据,每个键是惟一的

~~dict根据键查找值的效率非常高

在根据key去查找value对象的时候,底层是根据key进行hash计算出一个数值,这个数值能直接得到value所在的存储位置

 

像dict这种根据key值找到value内容的,经常被称之为map或者hash table

 dict对象的key可以是很多种对象类型,最常用的效率也是最高的是数字或者字符串

dict对象的值可是另一个dict

studentinfo = {

‘jack ’ :{'age':14,'address':'street waltz,no2'},

'augus':{'age':18,'address':'street waltz,no4'},

}

>>>print(studentinfo['augus']['age'])

3.5.2添加、修改、删除

字典对象可以像下面这样直接进行赋值来添加对象

>>>dict3 = {}

>>>dict3[2] = 'cba'

>>>dict3['2'] = 3.1415126

>>>dict[5.1] = 'xyz'

>>>dict3

{2:'cba','2':3.1415126,5.1:'xyz'}

如果赋值操作里面指定的key不存在则是添加对象,如果key已经存在,则变成了修改操作

>>>dict[2] = 'NBA'

{2:'NBA','2':3.1415126,5.1:'xyz'}

那么大家思考一下,以前的‘cba’对象到哪里去了?

和list类似,如果我们要删除dict的一个元素,可以用如下方法:

del student['name']         #remove entry with key 'name'

或者

value = student.pop('name')                  #remove & return entry w/key

3.5.3字典变量

例如

dict1 = {'Google': 'www.google.com', 'baidu': 'www.baidu.com', 'biying': 'cn.bing.com/','sougou':'www.sogou.com'}

如果我需要答应出所有网站名字和具体网址,可以这样做:

>>> for name in dict1:
    print('Name:%s,URL:%s'% (name,dict1[name]))
  
Name:Google,URL:www.google.com
Name:baidu,URL:www.baidu.com
Name:biying,URL:cn.bing.com/
Name:sougou,URL:www.sogou.com

或者使用items()函数:

Python 字典(Dictionary) items() 函数以列表返回可遍历的(键, 值) 元组数组。

dict1 = {'Google': 'www.google.com', 'baidu': 'www.baidu.com', 'biying': 'cn.bing.com/','sougou':'www.sogou.com'}
for name,url in dict1.items():
    print('Name:%s,URL:%s'% (name,url))

    
Name:Google,URL:www.google.com
Name:baidu,URL:www.baidu.com
Name:biying,URL:cn.bing.com/
Name:sougou,URL:www.sogou.com

3.6.集合

集合是一种序列,可以存放任意格式数据,但集合里元素不允许重复,每个元素用逗号(,)分隔,整个集合是放在花括号{}中,格式如下

s = {value1,value2,.....,valueN}

集合用于包含一组无序的对象。要创建集合,可使用set()函数并像下面这样提供一系列的项:

s = set([3,6,9,4])

或者

t = set('hello')

#注意set()函数只能放入一个参数

集合支持一系列标准操作,包括并集、交集、差集和对称差集,例如:

#t和s的并集
a = t | s       

#t和s的交集
b = t & s

#求差集(项在t中,但不在s中)
c = t - s

#对称差集(项在t或者s中,但不会同时出现在二者中)
d = t ^ s

基本操作

#添加一项
t.add('x')

#在s中添加多项
s.update([10.37,67])

#使用remove可以删除一项
t.remove('j')

#set的长度
len(s)

 

posted @ 2019-07-19 09:50  酒剑仙*  阅读(628)  评论(0编辑  收藏  举报