python 数据类型

一,数字

Python 数字数据类型用于存储数值。

数据类型是不允许改变的,这就意味着如果改变数字数据类型的值,将重新分配内存空间。

以下实例在变量赋值时 Number 对象将被创建:

var1 = 1
var2 = 10

您也可以使用del语句删除一些数字对象的引用。

del语句的语法是:

del var1[,var2[,var3[....,varN]]]

您可以通过使用del语句删除单个或多个对象的引用,例如:

del var
del var_a, var_b

Python 支持三种不同的数值类型:

  • 整型(Int) - 通常被称为是整型或整数,是正或负整数,不带小数点。Python3 整型是没有限制大小的,可以当作 Long 类型使用,所以 Python3 没有 Python2 的 Long 类型。
  • 浮点型(float) - 浮点型由整数部分与小数部分组成,浮点型也可以使用科学计数法表示(2.5e2 = 2.5 x 102 = 250)
  • 复数( (complex)) - 复数由实数部分和虚数部分构成,可以用a + bj,或者complex(a,b)表示, 复数的实部a和虚部b都是浮点型。

我们可以使用十六进制和八进制来代表整数:

>>> number = 0xA0F # 十六进制
>>> number
2575

>>> number=0o37 # 八进制
>>> number
31
  • Python支持复数,复数由实数部分和虚数部分构成,可以用a + bj,或者complex(a,b)表示, 复数的实部a和虚部b都是浮点型。

数字类型转换

有时候,我们需要对数据内置的类型进行转换,数据类型的转换,你只需要将数据类型作为函数名即可。

  • int(x) 将x转换为一个整数。
  • float(x) 将x转换到一个浮点数。
  • complex(x) 将x转换到一个复数,实数部分为 x,虚数部分为 0。
  • complex(x, y) 将 x 和 y 转换到一个复数,实数部分为 x,虚数部分为 y。x 和 y 是数字表达式。

以下实例将浮点数变量 a 转换为整数:

>>> a = 1.0
>>> int(a)
1

数字运算

Python 解释器可以作为一个简单的计算器,您可以在解释器里输入一个表达式,它将输出表达式的值。

表达式的语法很直白: +, -, ***** 和 /, 和其它语言(如Pascal或C)里一样。例如:

>>> 2 + 2
4
>>> 50 - 5*6
20
>>> (50 - 5*6) / 4
5.0
>>> 8 / 5  # 总是返回一个浮点数
1.6

注意:在不同的机器上浮点运算的结果可能会不一样。

在整数除法中,除法 / 总是返回一个浮点数,如果只想得到整数的结果,丢弃可能的分数部分,可以使用运算符 //

>>> 17 / 3  # 整数除法返回浮点型
5.666666666666667
>>>
>>> 17 // 3  # 整数除法返回向下取整后的结果
5
>>> 17 % 3  # %操作符返回除法的余数
2
>>> 5 * 3 + 2 
17

注意://得到的并不一定是整数类型的数,它与分母分子的数据类型有关系。

>>> 7//2
3
>>> 7.0//2
3.0
>>> 7//2.0
3.0
>>> 

Python 可以使用 ** 操作来进行幂运算:

>>> 5 ** 2  # 5 的平方
25
>>> 2 ** 7  # 2的7次方
128

不同类型的数混合运算时会将整数转换为浮点数:

>>> 3 * 3.75 / 1.5
7.5
>>> 7.0 / 2
3.5

python是强类型动态语言,即字符串格式的1和数字格式的1不能做数学运算


数学常量

常量 描述
pi 数学常量 pi(圆周率,一般以π来表示)
e 数学常量 e,e即自然常数(自然常数)。

二,字符串

字符串是 Python 中最常用的数据类型。我们可以使用引号( '" )来创建字符串。

创建字符串很简单,只要为变量分配一个值即可。例如:

var1 = 'Hello World!' var2 = "Runoob"


转义字符

在需要在字符中使用特殊字符时,python用反斜杠()转义字符。如下表:

转义字符 描述
(在行尾时) 续行符
\ 反斜杠符号
' 单引号
" 双引号
\a 响铃
\b 退格(Backspace)
\000
\n 换行
\v 纵向制表符
\t 横向制表符
\r 回车
\f 换页
\oyy 八进制数,yy 代表的字符,例如:\o12 代表换行,其中 o 是字母,不是数字 0。
\xyy 十六进制数,yy代表的字符,例如:\x0a代表换行
\other 其它的字符以普通格式输出

字符串运算符

下表实例变量 a 值为字符串 "Hello",b 变量值为 "Python":

操作符 描述 实例
+ 字符串连接 a + b 输出结果: HelloPython
* 重复输出字符串 a*2 输出结果:HelloHello
[] 通过索引获取字符串中字符 a[1] 输出结果 e
[ : ] 截取字符串中的一部分,遵循左闭右开原则,str[0:2] 是不包含第 3 个字符的。 a[1:4] 输出结果 ell
in 成员运算符 - 如果字符串中包含给定的字符返回 True 'H' in a 输出结果 True
not in 成员运算符 - 如果字符串中不包含给定的字符返回 True 'M' not in a 输出结果 True
r/R 原始字符串 - 原始字符串:所有的字符串都是直接按照字面的意思来使用,没有转义特殊或不能打印的字符。 原始字符串除在字符串的第一个引号前加上字母 r(可以大小写)以外,与普通字符串有着几乎完全相同的语法。 print( r'\n' ) print( R'\n' )
% 格式字符串 请看下一节内容。

字符串格式化

Python 支持格式化字符串的输出 。尽管这样可能会用到非常复杂的表达式,但最基本的用法是将一个值插入到一个有字符串格式符 %s 的字符串中。

在 Python 中,字符串格式化使用与 C 中 sprintf 函数一样的语法。

print ("我叫 %s 今年 %d 岁!" % ('小明', 10))
我叫 小明 今年 10 岁!

python字符串格式化符号:

符 号 描述
%c 格式化字符及其ASCII码
%s 格式化字符串
%d 格式化整数
%u 格式化无符号整型
%o 格式化无符号八进制数
%x 格式化无符号十六进制数
%X 格式化无符号十六进制数(大写)
%f 格式化浮点数字,可指定小数点后的精度
%e 用科学计数法格式化浮点数
%E 作用同%e,用科学计数法格式化浮点数
%g %f和%e的简写
%G %f 和 %E 的简写
%p 用十六进制数格式化变量的地址

格式化操作符辅助指令:

符号 功能
* 定义宽度或者小数点精度
- 用做左对齐
+ 在正数前面显示加号( + )
在正数前面显示空格
# 在八进制数前面显示零('0'),在十六进制前面显示'0x'或者'0X'(取决于用的是'x'还是'X')
0 显示的数字前面填充'0'而不是默认的空格
% '%%'输出一个单一的'%'
(var) 映射变量(字典参数)
m.n. m 是显示的最小总宽度,n 是小数点后的位数(如果可用的话)

三引号

python三引号允许一个字符串跨多行,字符串中可以包含换行符、制表符以及其他特殊字符。实例如下

#!/usr/bin/python3 para_str = """这是一个多行字符串的实例 多行字符串可以使用制表符 TAB ( \t )。 也可以使用换行符 [ \n ]。 """ print (para_str)

以上实例执行结果为:

这是一个多行字符串的实例
多行字符串可以使用制表符
TAB (    )。
也可以使用换行符 [ 
 ]。

f-string

f-string 是 python3.6 之后版本添加的,称之为字面量格式化字符串,是新的格式化字符串的语法。

f-string 格式化字符串以 f 开头,后面跟着字符串,字符串中的表达式用大括号 {} 包起来,它会将变量或表达式计算后的值替换进去,实例如下:

name = 'Runoob'
f'Hello {name}' # 替换变量

f'{1+2}'     # 使用表达式
'3'

w = {'name': 'Runoob', 'url': 'www.runoob.com'}
f'{w["name"]}: {w["url"]}'
'Runoob: www.runoob.com'

用了这种方式明显更简单了,不用再去判断使用 %s,还是 %d。

在 Python 3.8 的版本中可以使用 = 符号来拼接运算表达式与结果:

x = 1
print(f'{x+1}')  # Python 3.6
2

x = 1
print(f'{x+1=}')  # Python 3.8
'x+1=2'

Unicode 字符串

在Python2中,普通字符串是以8位ASCII码进行存储的,而Unicode字符串则存储为16位unicode字符串,这样能够表示更多的字符集。使用的语法是在字符串前面加上前缀 u

在Python3中,所有的字符串都是Unicode字符串。


字符串内建方法

Python 的字符串常用内建函数如下:

常用方法

1,按索引取值(正向取+反向取)

res='1234567'

print(res[0])

print(res[-1])

2,切片:索引的拓展应用,从一个大字符串中拷贝出一个子字符串

msg='hello world'
# 顾头不顾尾
res=msg[0:5] #x
print(res)
print(msg)

#步长
res=msg[0:5:2] # 0 2 4
print(res) # hlo

#反向步长
res=msg[5:0:-1]
print(res) #" olle"

#不填写时的默认值
msg='hello world'
res=msg[:] # res=msg[0:11]
print(res)
res=msg[::-1] # 把字符串倒过来
print(res)

3 长度 len

msg='hello world'
print(len(msg))

4 成员运算in和not in

判断一个子字符串是否存在于一个大字符串中

print("alex" in "alex is sb")
print("alex" not in "alex is sb")
print(not "alex" in "alex is sb") # 不推荐使用

5 移除字符串左右两侧的符号strip

默认去掉的空格

msg='      egon      '
res=msg.strip()
print(msg) # 不会改变原值
print(res) # 是产生了新值

括号内传什么参数就去掉什么,直到遇到第一个不能删除的字符

msg='****egon****'
print(msg.strip('*'))

注意删除多个字符时:只要头尾有对应其中的某个字符即删除,不考虑顺序,直到遇到第一个不包含在其中的字符为止。

str = '123132231213321312==321312213231123132'
print(str.strip('123'))

以上代码输出结果为:==
msg='****e*****gon****'
print(msg.strip('*'))

msg='**/*=-**egon**-=()**'
print(msg.strip('*/-=()'))

还有左删除和右删除 lstrip()和 rstrip()

6 切分split:把一个字符串按照某种分隔符进行切分,得到一个列表

默认分隔符是空格

info='egon 18 male'
res=info.split()
print(res)

指定分隔符

info='egon:18:male'
res=info.split(':')
print(res)

指定分隔次数

info='egon:18:male'
res=info.split(':',1)
print(res)

**把列表拼接成字符串 join **

l=['egon', '18', 'male']
res=l[0]+":"+l[1]+":"+l[2]
res=":".join(l) # 按照某个分隔符号,把元素全为字符串的列表拼接成一个大字符串
print(res)

l=[1,"2",'aaa'] # 不能拼接有非字符串的列表,会报错!
":".join(l)

7 用于for循环

info='egon:18:male'
for x in info:
    print(x)

8 大小写转换 lower,upper

全大写全小写

msg='AbbbCCCC'
print(msg.lower())
print(msg.upper())

9 判断开头结尾 startswith,endswith

返回布尔值

print("alex is sb".startswith("alex"))
print("alex is sb".endswith('sb'))

10 格式化字符 format

Python2.6 开始,新增了一种格式化字符串的函数 str.format(),它增强了字符串格式化的功能。

基本语法是通过 {}: 来代替以前的 %

format 函数可以接受不限个参数,位置可以不按顺序。还可以用字典传值

>>>"{} {}".format("hello", "world")    # 不设置指定位置,按默认顺序
'hello world'
 
>>> "{0} {1}".format("hello", "world")  # 设置指定位置
'hello world'
 
>>> "{1} {0} {1}".format("hello", "world")  # 设置指定位置
'world hello world'

11 maketrans 和translate 群替换字符串

maketrans创建映射关系,translate负责替换

intab = "aeiou"
outtab = "12345"
trantab = str.maketrans(intab, outtab)

str = "this is string example....wow!!!"
print (str.translate(trantab))

th3s 3s str3ng 2x1mpl2....w4w!!!

参数详解:

一个参数,该参数必须为字典

>>> d = {'a':'1','b':'2','c':'3','d':'4','e':'5','s':'6'}
>>> trantab = str.maketrans(d)
>>> st='just do it'
>>> print(st.translate(trantab))
ju6t 4o it

两个参数 x 和 y,x、y 必须是长度相等的字符串,并且 x 中每个字符映射到 y 中相同位置的字符

>>> x = 'abcdefs'
>>> y = '1234567'
>>> st='just do it'
>>> trantab = str.maketrans(x,y)
>>> print(st.translate(trantab))
ju7t 4o it

三个参数 x、y、z,第三个参数 z 必须是字符串,其字符将被映射为 None,即删除该字符;如果 z 中字符与 x 中字符重复,该重复的字符在最终结果中还是会被删除。也就是无论是否重复,只要有第三个参数 z,z 中的字符都会被删除。

>>> x = 'abcdefs'
>>> y='1234567'
>>> z='ot'
>>> st='just do it'
>>> trantab = str.maketrans(x,y,z)
>>> print(st.translate(trantab))
ju7 4 i

>>>x = 'abst'
>>>y = '1234'
>>>z = 's'
>>>st = 'just do it'
>>>trantab = str.maketrans(x,y,z)
>>>print(st.translate(trantab))
ju4 do i4

replace 单次替换

msg="you can you up no can no bb"
print(msg.replace("you","YOU",))
print(msg.replace("you","YOU",1))

12 isdigit

判断字符串是否由纯数字组成

print('123'.isdigit())
print('12.3'.isdigit())

其他方法

1 查找,计数

find,rfind,index,rindex,count

msg='hello egon hahaha' 找到返回起始索引

msg='hello egon hahaha'
print(msg.find('e')) # 返回要查找的字符串在大字符串中的起始索引
print(msg.find('egon'))
print(msg.index('e'))
print(msg.index('egon'))

找不到时两种方法的不同情况

msg='hello egon hahaha'
print(msg.find('xxx')) # 返回-1,代表找不到
print(msg.index('xxx')) # 抛出异常

msg='hello egon hahaha egon、 egon'
print(msg.count('egon'))

2 设置填充

center,ljust,rjust,zfill

居中,左对齐,右对齐,zero fill用零填充

print('egon'.center(50,'*'))
print('egon'.ljust(50,'*'))
print('egon'.rjust(50,'*'))
print('egon'.zfill(10))

3 设置制表符的空格数 expandtabs

msg='hello\tworld'
print(msg.expandtabs(2)) # 设置制表符代表的空格数为2

4 样式调整 capitalize,swapcase,title

整个字符串的第一个单词首字母大写,大小写翻转,每个单词的首字母大写

print("hello world egon".capitalize())
print("Hello WorLd EGon".swapcase())
print("hello world egon".title())

5 is数字系列

num1=b'4' #bytes
num2=u'4' #unicode,python3中无需加u就是unicode
num3='四' #中文数字
num4='Ⅳ' #罗马数字

isdigit只能识别:num1、num2

print(num1.isdigit()) # True
print(num2.isdigit()) # True
print(num3.isdigit()) # False
print(num4.isdigit()) # False

isnumberic可以识别:num2、num3、num4

print(num2.isnumeric()) # True
print(num3.isnumeric()) # True
print(num4.isnumeric()) # True

isdecimal只能识别:num2

print(num2.isdecimal()) # True
print(num3.isdecimal()) # False
print(num4.isdecimal()) # False

is其他

print('abc'.islower())  # 是否全小写
print('ABC'.isupper())  # 是否全大写
print('Hello World'.istitle())  # 是否所有单词首字母大写
print('123123aadsf'.isalnum()) # 字符串由字母或数字组成结果为True
print('ad'.isalpha()) # 字符串由由字母组成结果为True
print('     '.isspace()) # 字符串由空格组成结果为True
print('print'.isidentifier())   # 是否合法标识符,True
print('age_of_egon'.isidentifier())     #True
print('1age_of_egon'.isidentifier())    # False

三,列表

作用:列表一般用于按位置存放多个值

定义:列表是一个由多个数据组成的数据结构

l=[1,1.2,'a'] 
# 相当于l=list([1,1.2,'a'])
print(type(l))
# <class 'list'>

类型转换: 能够被for循环遍历的类型都可以使用list()转成列表

res=list('hello')
print(res)
s = "hello"
l = []
for i in s:
    l.append(i)
print(l)

列表运算

列表对 + 和 * 的操作符与字符串相似。+ 号用于组合列表,* 号用于重复列表。

如下所示:

Python 表达式 结果 描述
len([1, 2, 3]) 3 长度
[1, 2, 3] + [4, 5, 6] [1, 2, 3, 4, 5, 6] 组合
['Hi!'] * 4 ['Hi!', 'Hi!', 'Hi!', 'Hi!'] 重复
3 in [1, 2, 3] True 元素是否存在于列表中
for x in [1, 2, 3]: print(x, end=" ") 1 2 3 迭代

列表内建方法

常用方法

1、按索引存取值(正向存取+反向存取):即可以取也可以改

l=[111,'egon','hello']
# 正向取值
print(l[0])
# 反向取值
print(l[-1])
# 可以取也可以改:索引存在则修改对应的值
l[0]=222
print(l)
# 无论是取值操作还是赋值操作:索引不存在则报错
l[3]=333

2、切片(顾头不顾尾,步长)

l = [111, 'egon', 'hello', 'a', 'b', 'c', 'd', [1, 2, 3]]
print(l[0:3])
# [111, 'egon', 'hello']
print(l[0:5:2]) # 取索引为0 2 4的值
# [111, 'hello', 'b']

print(l[0:len(l)])
# [111, 'egon', 'hello', 'a', 'b', 'c', 'd', [1, 2, 3]]
print(l[:])
# [111, 'egon', 'hello', 'a', 'b', 'c', 'd', [1, 2, 3]]
new_l=l[:] # 切片等同于拷贝行为,而且相当于浅copy
print(id(l))
# 2277356332168
print(id(new_l))
# 2277356332936

l[-1][0]=1111111		# 修改原列表,验证切片与浅拷贝类似
print(l)
# [111, 'egon', 'hello', 'a', 'b', 'c', 'd', [1111111, 2, 3]]
print(new_l)
# [111, 'egon', 'hello', 'a', 'b', 'c', 'd', [1111111, 2, 3]]
print(l[::-1])
# [[1111111, 2, 3], 'd', 'c', 'b', 'a', 'hello', 'egon', 111]

3、长度

print(len([1, 2, 3]))
# 3

4、成员运算in和not in

print('aaa' in ['aaa', 1, 2])
# True
print(1 in ['aaa', 1, 2])
# True

5、往列表中添加值

追加 append

在列表尾部添加单个数据

l=[111,'egon','hello']
l.append(3333)
l.append(4444)
print(l)
# l=[111,'egon','hello',3333,4444]

插入 insert

按照填入的索引,在对应的位置插入数据

l=[111,'egon','hello']
l.insert(0,'alex')
print(l)
# ['alex', 111, 'egon', 'hello']

**解压添加值 extend **

extend可以将新列表内的数据解压添加到原列表

如果我们想将一个新的列表内的数据添加到原列表,使用append无法实现,我们可以使用extend方法

new_l = [1, 2, 3]
l = [111, 'egon', 'hello']
for item in new_l:
    l.append(item)
print(l)
# [111, 'egon', 'hello', 1, 2, 3]
# 实现了功能
l.extend('abc')
print(l)
# [111, 'egon', 'hello', 1, 2, 3, 'a', 'b', 'c']

6 删除

方式一:根据索引删除,只是单纯的删除、没有返回值

l = [111, 'egon', 'hello']
del l[1]
print(l)
x = del l[1] # 查看返回值,抛出异常,不支持赋值语法

方式二:list.pop()根据索引删除,会返回删除的值(经常使用)

不输入索引时默认删除最后一个数据

l = [111, 'egon', 'hello', 55]
l.pop()  # 不指定索引默认删除最后一个
l.pop()
print(l)
# [111, 'egon']
res = l.pop(1)
print(l)
# [111]
print(res)
# egon

方式三:l.remove()根据元素删除,返回None

l = [111, 'egon', [1,2,3],'hello']
l.remove([1,2,3])
print(l)
# [111, 'egon', 'hello']
res=l.remove('egon')		# 返回值为None
print(res) 
# None

7、循环与列表

不要在循环中对列表进行删除操作,会导致索引错乱,

l=[1,'aaa','bbb']
for x in l:
    l.pop(1)
    print(x)

其他方法

1、l.count()

输入内容在列表中出现的次数

print(l.count('aaa'))

2、l.index()

查找方法,查找输入内容第一次出现的位置的索引

print(l.index('aaa'))
print(l.index('aaaaaaaaa')) # 找不到报错

3、l.clear()

清空列表

l.clear()

4、l.reverse():

注意: reverse不是排序后翻转,是将列表的索引翻转

l = [1, 'egon','alex','lxx']
l.reverse()
print(l)

5、l.sort(): 列表内元素必须是同种类型才可以排序

l=[11,-3,9,2,3.1]
l.sort() # 默认从小到大排,称之为升序
l.sort(reverse=True) # 从大到小排,设置为降序
print(l)

l=[11,'a',12]  # 不同类型报错!
l.sort()

l=['c','e','a']		# 按ascii码排序,A<a
l.sort()
print(l)

字符串可以比大小,按照对应的位置的字符依次pk
字符串的大小是按照ASCI码表的先后顺序加以区别,表中排在后面的字符大于前面的

print('a'>'b')
# False

print('abz'>'abcdefg')
# True

列表也可以比大小,原理同字符串一样,但是对应位置的元素必须是同种类型

l1=[1,'abc','zaa']
l2=[1,'abc','zb']

print(l1 < l2)
# True

max(list)返回列表元素最大值

min(list) 返回列表元素最小值

四,元组

Python 的元组与列表类似,不同之处在于元组的元素不能修改。元组就是"一个不可变的列表"

1、作用:按照索引/位置存放多个值,只用于读不用于改

2、定义:()内用逗号分隔开多个任意类型的元素

t=(1,1.3,'aa') 
# 相当于t=tuple((1,1.3,'aa'))
print(t,type(t))
# (1, 1.3, 'aa') <class 'tuple'>

x=(10) # 单独一个括号代表包含的意思为整数数据类型!!
print(x,type(x))
# 10 <class 'int'>

t=(10,) # 如果元组中只有一个元素,必须加逗号
print(t,type(t))
# (10,) <class 'tuple'>

元组是不可变数据类型:不可变体现在它第一层的数据指向的内存地址不能更改.

t=(1,1.3,'aa') # t=(0->值1的内存地址,1->值1.3的内存地址,2->值'aaa'的内存地址,)
t[0]=11111
# TypeError: 'tuple' object does not support item assignment

t=(1,[11,22]) # t=(0->值1的内存地址,1->值[1,2]的内存地址,)
print(id(t[0]),id(t[1]))
# 1358874288 2579862236488

t[0]=111111111 # 不能改第一层的内存地址
# TypeError: 'tuple' object does not support item assignment

t[1]=222222222 # 不能改第一层的内存地址
# TypeError: 'tuple' object does not support item assignment

t[1][0]=11111111111111111	# 修改第二层的内存地址
print(t)
# (1, [11111111111111111, 22])

print(id(t[0]),id(t[1]))
# 1358874288 2579862236488
# 修改第二层的内存地址后第一层内存地址不变

3、类型转换: 所有能被for循环遍历的数据都能转换成元组,与列表的转换条件相同

print(tuple('hello'))
# ('h', 'e', 'l', 'l', 'o')

print(tuple([1,2,3]))
# (1, 2, 3)

print(tuple({'a1':111,'a2':333}))
# ('a1', 'a2')

print(tuple(range(10)))
# (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)

元组运算

与字符串一样,元组之间可以使用 + 号和 * 号进行运算。这就意味着他们可以组合和复制,运算后会生成一个新的元组。

Python 表达式 结果 描述
len((1, 2, 3)) 3 计算元素个数
(1, 2, 3) + (4, 5, 6) (1, 2, 3, 4, 5, 6) 连接
('Hi!',) * 4 ('Hi!', 'Hi!', 'Hi!', 'Hi!') 复制
3 in (1, 2, 3) True 元素是否存在
for x in (1, 2, 3): print (x,) 1 2 3 迭代

元组内置方法

1、按索引取值(正向取+反向取):只能取,不能修改,否则会报错

t=('aa','bbb','cc')
print(t[0])
# aa
print(t[-1])
# cc

2、切片(顾头不顾尾,步长):切片为索引附带的功能,本质为浅拷贝,并不在原数据上进行修改

t=('aa','bbb','cc','dd','eee')
print(t[0:3])
# ('aa', 'bbb', 'cc')

print(t[::-1])
# ('eee', 'dd', 'cc', 'bbb', 'aa')

3、长度: 元组内元素个数

t=('aa','bbb','cc','dd','eee')
print(len(t))
# 5

4、成员运算in和not in

t=('aa','bbb','cc','dd','eee')
print('aa' in t)
# True

5、循环: 遍历读取

for x in t:
    print(x)

6、查找:index和count

t=(2,3,111,111,111,111)
print(t.index(111))
# 2

print(t.index(1111111111))    # index查找数据不存在时会报错
# ValueError: tuple.index(x): x not in tuple

print(t.count(111))			# 111出现的次数
# 4

五,字典

1、作用

字典可以用来存储含有描述性信息的数据,可读性比其他类型高,比如{"name":"wu","age":24}

它是以键值对的形式存储数据

2、定义:{}内用逗号分隔开多个key:value,其中value可以使任意类型,但是key必须是不可变类型,且不能重复

造字典的方式一 手写:

d={'k1':111,(1,2,3):222} # d=dict(...)
print(d['k1'])
# 111
print(d[(1,2,3)])
# 222
print(type(d))
# <class 'dict'>

d={} # 默认定义出来的是空字典
print(d,type(d))
# {} <class 'dict'>

造字典的方式二 dict()函数:

>>>dict()                        # 创建空字典
{}
>>> dict(a='a', b='b', t='t')     # 传入关键字
{'a': 'a', 'b': 'b', 't': 't'}
>>> dict(zip(['one', 'two', 'three'], [1, 2, 3]))   # 映射函数方式来构造字典
{'three': 3, 'two': 2, 'one': 1} 
>>> dict([('one', 1), ('two', 2), ('three', 3)])    # 可迭代对象方式来构造字典
{'three': 3, 'two': 2, 'one': 1}
>>>

造字典的方式三:初始化一个字典

seq = ('name', 'age', 'sex')
 
dict = dict.fromkeys(seq)
print ("新的字典为 : %s" %  str(dict))

dict = dict.fromkeys(seq, 10)
print ("新的字典为 : %s" %  str(dict))

新的字典为 : {'age': None, 'name': None, 'sex': None}
新的字典为 : {'age': 10, 'name': 10, 'sex': 10}

字典不能运算

字典内置方法

基础方法

1、按key存取值:可存可取

d={'k1':111}

# 针对赋值操作:如果key存在,则修改
d['k1']=222

# 针对赋值操作:如果key不存在,则创建新值
d['k2']=3333

print(d)
# {'k1': 222, 'k2': 3333}

2、长度len

d={'k1':111,'k2':2222,'k1':3333,'k1':4444}
print(len(d))
# 4

3、成员运算in和not in:根据key

d={'k1':111,'k2':2222}
print('k1' in d)
# True
print(111 in d)       	# 只检测key
# False

4、删除

通用删除方法

d={'k1':111,'k2':2222}
del d['k1']
print(d)

pop删除:根据key删除元素,返回删除key对应的那个value值,如果要删除的 key 不存在,则需要添加默认值,否则会报错:

d={'k1':111,'k2':2222}
res=d.pop('k2')
print(d)
print(res)


dict1 = {1: "a", 2: [1, 2]}
print(dict1.pop(3,"nokey"),dict1) # 设置默认值,必须添加,否则报错
nokey {2: [1, 2]}

popitem删除:python2随机删除,python3删除最后一个,返回元组(删除的key,删除的value)

d={'k1':111,'k2':2222}
res=d.popitem()
print(d)
# {'k1': 111}

print(res)
# ('k2', 2222)

5 键值对items() ,键keys(),值values()

在python2中
d={'k1':111,'k2':2222}

d.keys()
['k2', 'k1']
d.values()
[2222, 111]
d.items()
[('k2', 2222), ('k1', 111)]
dict(d.items())
{'k2': 2222, 'k1': 111}

6、for循环使用

d={'k1':111,'k2':2222}
for k in d.keys():
    print(k)
# k1
# k2

for k in d:
    print(k)
# k1
# k2

for v in d.values():
    print(v)
# 111
# 2222

for k,v in d.items():
    print(k,v)
# k1 111
# k2 2222

print(list(d.keys()))
# ['k1', 'k2']
print(list(d.values()))
# [111, 2222]
print(list(d.items()))
# [('k1', 111), ('k2', 2222)]

常用方法

1、d.clear() 清空字典

d = {'k1': 111}
d.clear()
print(d)
# {}

2、d.update()

把字典参数 dict2 的 key/value(键/值) 对更新到字典 dict 里。

d={'k1':111}
d.update({'k2':222,'k3':333,'k1':111111111111111})
print(d)
# {'k1': 111111111111111, 'k2': 222, 'k3': 333}

3、d.get() :根据key取值,容错性好

d={'k1':111}
print(d['k2'])  # key不存在则报错
# KeyError: 'k2'

print(d.get('k1')) 
# 111

print(d.get('k2')) 
# key不存在不报错,返回None

4、d.setdefault()

如果key有则不添加,返回字典的值

info = {"name": "wu"}
print(info.setdefault("name", "???"))
# wu

print(info)
# {'name': 'wu'}

如果key没有则添加,返回添加的值

info = {}
print(info.setdefault("name", "???"))
# ???

print(info)
# {'name': '???'}

5 values() 方法

values() 方法返回一个迭代器,可以使用 list() 来转换为列表,列表为字典中的所有值。

dict = {'Sex': 'female', 'Age': 7, 'Name': 'Zara'}
 
print ("字典所有值为 : ",  list(dict.values()))

字典所有值为 :  ['female', 7, 'Zara']

6 copy()方法

copy() 函数返回一个字典的浅复制。

dict1 = {'Name': 'Runoob', 'Age': 7, 'Class': 'First'}
 
dict2 = dict1.copy()
print ("新复制的字典为 : ",dict2)

新复制的字典为 :  {'Age': 7, 'Name': 'Runoob', 'Class': 'First'}

六,集合

作用:集合可以进行独特的关系运算,对某些数据能做出去重的操作

1,集合的定义:

集合的形式是在{}内用逗号分隔开多个元素,并且这多个元素有以下三个特点

集合内元素必须为不可变类型

集合内元素无序

集合内元素不重复

s={} # 直接使用{}默认创建空字典
print(type(s))
# <class 'dict'>

# 定义空集合的方法
s=set()
print(s,type(s))
# set() <class 'set'>

s={1,2} # s=set({1,2}),集合的定义
s={1} # s=set({1}),集合的定义


# 集合内元素的3个特征

s={1,[1,2]} # 集合内元素必须为不可变类型
# TypeError: unhashable type: 'list'

s={1,'a','z','b',4,7} # 集合内元素无序
# 输出结果不同

s={1,1,1,1,1,1,'a','b'} # 集合内元素没有重复
print(s)
# {1, 'a', 'b'}

2,类型转换(集合的创建)

所有能被for循环遍历的数据类型都能被转换成集合,但是有一个前提条件:这个数据内的元素必须都为不可变数据类型

res=set('hellolllll')
print(res)
# {'e', 'l', 'o', 'h'}

s = set(range(5))
print(s)
# {0, 1, 2, 3, 4}

print(set([1,1,1,1,1,1]))
# {1}

print(set([1,1,1,1,1,1,[11,222]]) # 报错
# TypeError: unhashable type: 'list'
      
print(set({'k1':1,'k2':2}))
# {'k2', 'k1'}

集合关系运算

取交集:等价于intersection() 方法

两者共同的好友
friends1 = {"zero","kevin","jason","egon"}
friends2 = {"Jy","ricky","jason","egon"}
res=friends1 & friends2
print(res)
# {'egon', 'jason'}

print(friends1.intersection(friends2))
# {'egon', 'jason'}


取并集:等价于union() 方法

两者所有的好友
friends1 = {"zero","kevin","jason","egon"}
friends2 = {"Jy","ricky","jason","egon"}
print(friends1 | friends2)
# {'Jy', 'ricky', 'jason', 'kevin', 'egon', 'zero'}

print(friends1.union(friends2))
# {'Jy', 'ricky', 'jason', 'kevin', 'egon', 'zero'}

取差集:等价于difference() 方法

取friends1独有的好友
friends1 = {"zero","kevin","jason","egon"}
friends2 = {"Jy","ricky","jason","egon"}
print(friends1 - friends2)
# {'zero', 'kevin'}

print(friends1.difference(friends2))
# {'zero', 'kevin'}

取friends2独有的好友
friends1 = {"zero","kevin","jason","egon"}
friends2 = {"Jy","ricky","jason","egon"}
print(friends2 - friends1)
# {'Jy', 'ricky'}

print(friends2.difference(friends1))
# {'Jy', 'ricky'}

**对称差集: **

求两个用户独有的好友们(即去掉共有的好友)

friends1 = {"zero","kevin","jason","egon"}
friends2 = {"Jy","ricky","jason","egon"}
print(friends1 ^ friends2)
# {'ricky', 'Jy', 'zero', 'kevin'}

print(friends1.symmetric_difference(friends2))
# {'ricky', 'Jy', 'zero', 'kevin'}

父子集:包含的关系

issuperset()与issubset()

s1={1,2,3}
s2={1,2,4}
# 不存在包含关系,下面比较均为False
print(s1 > s2)
print(s1 < s2)

s1={1,2,3}
s2={1,2}
print(s1 > s2) # 当s1大于或等于s2时,才能说是S2是s1的子集
print(s1.issuperset(s2)) # s1是父集
# True

print(s2.issubset(s1)) # s2是子集,s2 < s1  =>True
# True

s1={1,2,3}
s2={1,2,3}
print(s1 == s2) # s1与s2互为子集
# True

print(s1.issuperset(s2))
# True

print(s2.issuperset(s1))
# True

集合去重

使用集合去重有两个注意点

1,只能针对不可变类型去重

因为集合内不能存放不可哈希的数据类型,即集合内不能有可变数据类型的数据,所以集合的去重只能针对不可变类型去重。

print(set([1,1,1,1,2]))
# {1, 2}

print({1, 1, 1, [1, 1, 2]})
# TypeError: unhashable type: 'list'

2,无法保证原来的顺序

集合是一种无序的数据类型,所以去重后无法保证顺序相同

l=[1,'a','b','z',1,1,1,2]
l=list(set(l))
print(l)
# [1, 2, 'b', 'z', 'a']

其他方法

长度 len

s1 = {1, 2, 3}
print(len(s1))
# 3

成员运算 in

s1 = {1, 2, 3}
print(1 in s1)
# True

循环遍历

s1 = {1, 2, 3}
for i in s1:
    print(i)

删除元素 discard,remove,pop,clear

s1 = {1, 2, 3}
s1.discard(4)
# 不会报错
s1 = {1, 2, 3}
s1.remove(4)
# KeyError: 4
pop有返回值:删除的元素
s1 = {1, 2, 3}
res = s1.pop()
print(res)
# 1

print(s1)
# {2, 3}
clear() 方法用于移除集合中的所有元素。
fruits = {"apple", "banana", "cherry"}
fruits.clear()

添加元素:add

s1 = {1, 2, 3}
s1.add(4)
print(s1)
# {1, 2, 3, 4}

更新:update

s1 = {1, 2, 3}
s1.update({1, 3, 5})
print(s1)
# {1, 2, 3, 5}

不常用方法

是否独立:isdisjoint

s1 = {1, 2, 3}
res = s1.isdisjoint({3, 4, 5, 6})
# 两个集合有交集,则返回False
print(res)
res = s1.isdisjoint({4, 5, 6})
# 两个集合完全独立、没有共同部分,则返回True
print(res)

update

这个系列相当于在之前的功能上添加一个赋值操作

s = {1, 2, 3}
s.difference_update({3,4,5}) # s=s.difference({3,4,5})
print(s)
# {1, 2}

copy() 方法用于拷贝一个集合。

fruits = {"apple", "banana", "cherry"}
x = fruits.copy()
posted @ 2020-03-12 21:47  Franciszw  阅读(305)  评论(0编辑  收藏  举报