Python-基本数据类型的常用内置方法

一、数字类型

int类型

定义:
age = 20  # 本质为 age = int(20)

# 注意:名字+括号的意思就是调用某个功能,比如
# print(...)调用打印功能
# int(...)调用创建整型数据的功能
# float(...)调用创建浮点型数据的功能
类型转换:

(1)纯数字的字符串转成int

# 纯数字的字符串转成int
res = int('100111')
print(res, type(res))  # 100111 <class 'int'>

(2)十进制转成其他进制

# 十进制 -> 二进制
11 - > 1011
1011-> 8 + 2 + 1
print(bin(11))  # 0b1011  0b表示二进制

# 十进制 -> 八进制
print(oct(11))  # 0o13  0o表示八进制

# 十进制 -> 十六进制
print(hex(11))  # 0xb  0x表示十六进制
print(hex(123))  # 0x7b

(3)其他进制转十进制

# 二进制 -> 十进制
print(int('0b1011',2))  # 11

# 二进制 -> 八进制
print(int('0o13',8))  # 11

# 二进制 -> 十六进制
print(int('0xb',16))  # 11

float类型

定义:
salary = 333.3  # 本质salary = float(333.3)
类型转换:
res = float("3.1")
print(res, type(res))  # 3.1 <class 'float'>

int与float没有需要掌握的内置方法,它们的使用就是数学运算和比较运算。

二、字符串类型(重要)

定义:
msg = 'hello python'  # msg = str('msg')
类型转换:str可以把任意其他类型都转成字符串
res = str({'a': 1})
print(res, type(res))  # {'a': 1} <class 'str'>
内置方法:Python的字符串是不可变类型,所以通过内置方法得到的字符串并不是改变了原字符串,而是产生了新的字符串。
1. 按索引取值(正向取+反向取) :只能取不能改
msg = 'hello world'
# 正向取
print(msg[0])  # h
print(msg[5])  # 空格
# 反向取
print(msg[-1])  # d

# 字符串按索引只能取值,若进行赋值操作则会报错
msg[0] = 'H'  # 程序报错
2. 切片:索引的拓展应用,从一个大字符串中 拷贝 出一个子字符串
msg = 'hello world'
# 要取到索引为4的字符结束的字符串,范围必须写到5
# 程序是“顾头(0)不顾尾(5)”
res = msg[0:5]
print(res)  # hello
print(msg)  # hello world
# 步长

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

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

print(msg[0:5:-1])  # 空
# 0:5的意思为从左往右,-1是从右往左
# 相当于要求人要往前走,但腿必须往后迈,是一件相悖的事情,所以结果为空。

print(msg[5:0])  # 空
# 步长不写默认为1,程序相当于print(msg[5:0:1]),与上面是一个道理,所以结果为空。要想正常输出,步长也应该更改为-1。
# 反转字符串

msg = 'hello world'
res = msg[::-1]
print(res)  # dlrow olleh
# 步长为正,从左至右。头位不写默认0,尾位不写默认为全;
# 步长为负,从右至左。头位不写默认为全,尾位不写默认为全。

msg = 'hello world'

res0 = msg[:5]
print(res0)  # hello

res1 = msg[0:]
print(res1)  # hello world

res2 = msg[:5:-1]
print(res2)  # dlrow

res3 = msg[4::-1]
print(res3)  # olleh

# 步长为负,尾位写0时,取不到0号字符。“顾头不顾尾”
res4 = msg[4:0:-1]
print(res4)  # olle
# 字符串是不可变类型,通过内置方法得到的字符串并不是改变了原字符串,而是产生了新的字符串,那这里的id为什么还是一样的?

msg1 = 'hello:world:<>:19[]==123'
msg2 = msg1[:]
print(msg1, id(msg1))
# hello:world:<>:19[]==123 1271272885104
print(msg2, id(msg2))
# hello:world:<>:19[]==123 1271272885104

# 通过[:]的方法,等于是拷贝了整个字符串。
# 取字符串是为了读(因为不能改),没有必要生成和原字符串一模一样的新字符串,所以[:]得到的字符串并不是新生成的,还是原来的字符串。
3. 长度len
# 统计字符个数

msg = 'hello world'
print(len(msg))  # 11
4. 成员运算in和not in
# 判断一个子字符串是否存在于一个大字符串中

print("hello" in "hello world")  # True
print("hello" not in "hello world")  # False 推荐使用
print(not "hello" in "hello world")  # False 不推荐使用
5. 移除字符串左右两侧的符号strip
# 默认去掉的是空格

msg = '      abcd      '
res = msg.strip()
print(msg) # 不会改变原值  “      abcd      ”
print(res) # 是产生了新值  “abcd”
# 想去掉什么符号,在strip()中写入这个符号即可。

msg = '****abcd****'
print(msg.strip('*'))  # abcd
# strip只去两边,不去中间

msg = '****a*****bcd****'
print(msg.strip('*'))  # a*****bcd
# 去掉多种符号,在strip()中可以不按顺序的写入要去掉的符号即可。

msg = '**/*===-**abcd**---/-=()**'
print(msg.strip('*/-=()'))  # abcd
# 小例子:清除用户误触输入空格的影响

inp_user = input('your name>>: ').strip()
inp_pwd = input('your password>>: ').strip()
if inp_user == 'admin' and inp_pwd == '123':
    print('登录成功')
else:
    print('账号密码错误')
6. 切分split:把一个字符串按照某种分隔符进行切分,得到一个列表
# 默认分隔符是空格

info = 'Python JavaScript Golang'
res = info.split()
print(res)  # ['Python', 'JavaScript', 'Golang']
# 指定分隔符

info = 'Python、JavaScript、Golang'
res = info.split('、')
print(res)  # ['Python', 'JavaScript', 'Golang']
# 指定分隔次数

info = 'Python:JavaScript:Golang'
res = info.split(':', 1)  # 分隔1次
print(res)  # ['Python', 'JavaScript:Golang']
7. 循环
info = 'Python:JavaScript:Golang'
for x in info:
    print(x, end=',')

# P,y,t,h,o,n,:,J,a,v,a,S,c,r,i,p,t,:,G,o,l,a,n,g,
8. strip,lstrip,rstrip
msg = '***abcd****'
# 移除两侧符号 详细用法见上方5。
print(msg.strip('*'))  # abcd
# 移除左侧符号
print(msg.lstrip('*'))  # abcd****
# 移除右侧符号
print(msg.rstrip('*'))  # ***abcd
9. lower,upper
msg = 'AbbbCCCC'
print(msg.lower())  # abbbcccc 将字符串中的大写字母转成小写字母
print(msg.upper())  # ABBBCCCC 将字符串中的小写字母转成大写字母
10. startswith,endswith
print("alex is sb".startswith("alex"))  # True 判断字符串是否以指定字符(串)开头
print("alex is sb".endswith('sb'))  # True 判断字符串是否以指定字符(串)结尾
11. format
(1)按位置传值:
res = '我的名字是 {} 我的年龄是 {}'.format('JL',19)
print(res)
# 我的名字是 JL 我的年龄是 19

res='我的名字是 {0}{0}{0} 我的年龄是 {1}{1}'.format('JL',19)
print(res)
# 我的名字是 JLJLJL 我的年龄是 1919
(2)打破位置的限制,按照 key = value 传值:
res="我的名字是 {name} 我的年龄是 {age}".format(age=19,name='JL')
print(res)
# 我的名字是 JL 我的年龄是 19
12. split,rsplit:将字符串切成列表

split见上方“6.切分split”

info = "Python:JavaScript:Golang"
# split按照从左往右的顺序切分
print(info.split(':', 1))  # ['Python', 'JavaScript:Golang']
# rsplit按照从右往左的顺序切分
print(info.rsplit(':', 1))  # ['Python:JavaScript', 'Golang']
13. join:把列表拼接成字符串
l = ['Python', 'JavaScript', 'Golang']

res0 = l[0] + ":" + l[1] + ":" + l[2]
print(res0)  # Python:JavaScript:Golang

res = ":".join(l)  # 按照某个分隔符号,把元素全为字符串的列表拼接成一个大字符串
print(res)  # Python:JavaScript:Golang
l = [1, "2", 'aaa']
res = ":".join(l)  # 程序报错
14. replace
msg = "you can you up no can no bb"

# 三个参数,第一个参数为要被替换的字符串,第二个参数为要替换成的字符串,第三个参数为替换次数,不写为全部。
print(msg.replace("you", "YOU", ))  # YOU can YOU up no can no bb
print(msg.replace("you", "YOU", 1))  # YOU can you up no can no bb
15. isdigit
# 判断字符串是否由纯数字组成,带除数字之外的任何符号都不行

print('123'.isdigit())  # True
print('12.3'.isdigit())  # False
# 应用案例

age = input('请输入你的年龄:').strip()
if age.isdigit():
    age = int(age)  # int("abbab")
    if age > 19:
        print('猜大了')
    elif age < 19:
        print('猜小了')
    else:
        print('才最了')
else:
    print('必须输入数字,傻子')
16. find,rfind,index,rindex,count
# 找到返回起始索引

msg = 'hello world of python '

print(msg.find('e'))  # 1 返回要查找的字符串在大字符串中的起始索引
print(msg.find('py'))  # 15

# find与index的功能和用法一样,唯一区别在于找不到时的情况
print(msg.index('o'))  # 4
print(msg.index('of'))  # 12
# 找不到

msg = 'hello world of python '

print(msg.find('xxx'))  # 返回-1,代表找不到
print(msg.index('xxx'))  # 程序报错
# count统计子字符(串)在大字符串中出现的次数

msg = 'Hello python hahaha,Bye java oh my god!'
print(msg.count('a'))  # 5
print(msg.count('ha'))  # 3
17. center,ljust,rjust,zfill
# 两个参数,第一个参数为指定字符串长度,第二个参数为补全所用符号

print('jl'.center(12, '*'))  # *****jl*****  长度12,'jl'居中,其余位置用'*'补全。
print('jl'.ljust(15, '*'))  # jl*************  左对齐
print('jl'.rjust(10, '*'))  # ********jl  右对齐

# 一个参数,为指定字符串长度,其余位置用'0'补全,内容右对齐。
print('jl'.zfill(10))  # 00000000jl
18. expandtabs
# '\n'代表换行的意思,'\t'代表制表符(空格)的意思。
# expandtabs()用来设置制表符代表的空格数

msg = 'hello\tworld'
print(msg.expandtabs(2))  # 设置制表符代表的空格数为2
19. captalize,swapcase,title
# 三个方法都无参数
# capitalize():首字母大写;
# swapcase():大小写反转,大写全变小写,小写全变大写;
# title():每个单词的首字母大写。

print("hello world jl".capitalize())  # Hello world jl
print("Hello WorLd JL".swapcase())  # hELLO wORlD jl
print("hello world jL".title())  # Hello World Jl
20. 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
21. is其他
print('abc'.islower())  # 判断是否全为小写。
print('ABC'.isupper())  # 判断是否全为大写。
print('Hello World'.istitle())  # 判断是否各单词首字母大写。
print('123123aadsf'.isalnum())  # 判断字符串是否只由字母或数字组成,纯字母/纯数字/字母+数字。
print('ad'.isalpha())  # 判断字符串是否只由字母组成。
print('     '.isspace())  # 判断字符串是否只由空格组成。
print('print'.isidentifier())  # 判断标识符是否合法,python内置的标识符全部为合法。
print('age_of_tony'.isidentifier())  # 字母数字下划线组成,且开头不是数字,合法。
print('1age_of_tony'.isidentifier())  # 数字开头,不合法。

三、列表类型(有序)

作用:按位置存放多个值
类型转换:但凡能够被for循环遍历的类型都可以当做参数传给list()转成列表
res = list('hello')
print(res)  # ['h', 'e', 'l', 'l', 'o']

res = list({'k1': 111, 'k2': 222, 'k3': 3333})
print(res)  # ['k1', 'k2', 'k3']
内置方法
按索引存取值(正向存取+反向存取):即可以取也可以改
l = [111, 'world', 'hello']

# 正向取
print(l[0])  # 111
# 反向取
print(l[-1])  # hello

# 可以取也可以改:索引存在则修改对应的值
l[0] = 222
print(l)  # [222, 'world', 'hello']

# 无论是取值操作还是赋值操作:索引不存在则报错
l[3] = 333  # 程序报错
切片(顾头不顾尾,步长)
l = [111, 'world', 'hello', 'a', 'b', 'c', 'd', [1, 2, 3]]

print(l[0:3])  # [111, 'world', 'hello']
print(l[0:5:2])  # 0 2 4 [111, 'hello', 'b']

print(l[0:len(l)])  # [111, 'world', 'hello', 'a', 'b', 'c', 'd', [1, 2, 3]]
print(l[:])  # [111, 'world', 'hello', 'a', 'b', 'c', 'd', [1, 2, 3]]

new_l = l[:]  # 切片等同于拷贝行为,而且相当于浅copy
print(id(l))  # 2268740252288
print(id(new_l))  # 2268740082368
l[-1][0] = 1111111
print(l)  # [111, 'world', 'hello', 'a', 'b', 'c', 'd', [1111111, 2, 3]]
print(new_l)  # [111, 'world', 'hello', 'a', 'b', 'c', 'd', [1111111, 2, 3]]  可以看到new_l也发生了变化

# 列表反转倒序
print(l[::-1])  # [[1111111, 2, 3], 'd', 'c', 'b', 'a', 'hello', 'world', 111]
长度
print(len([1, 2, 3]))  # 3
成员运算in和not in
print('aaa' in ['aaa', 1, 2])  # True
print(1 in ['aaa', 1, 2])  # True
print(3 not in ['aaa', 1, 2])  # True
往列表中添加值
追加
l = [111, '222', 'hello']
l.append(3333)
print(l)  # [111, '222', 'hello', 3333]
l.append(4444)
print(l)  # [111, '222', 'hello', 3333, 4444]
指定位置插入值
l = [111, 'JavaScript', 'Golang']
l.insert(0, 'Python')  # (索引, 插入值)
print(l)  # ['Python', 111, 'JavaScript', 'Golang']
l.insert(0, 1)
print(l)  # [1, 'python', 111, 'JavaScript', 'Golang']
l.extend()
# 列表后面追加另一个列表的全部元素

new_l = [1, 2, 3]
l = [111, 'Python', 'JavaScript']
l.append(new_l)
print(l)  # [111, 'Python', 'JavaScript', [1, 2, 3]]  结果不对,插入的直接是整个列表
# 使用for循环可以实现

new_l = [1, 2, 3]
l = [111, 'Python', 'JavaScript']

for item in new_l:
    l.append(item)
print(l)  # [111, 'Python', 'JavaScript', 1, 2, 3]
# extend直接实现上述代码

l.extend(new_l)
print(l)  # [111, 'Python', 'JavaScript', 1, 2, 3]
l.extend('abc')
print(l)  # [111, 'Python', 'JavaScript', 1, 2, 3, 'a', 'b', 'c']
删除
方式一:通用的删除方法,只是单纯的删除、没有返回值
l = [111, 'world', 'hello']
del l[1]
# x = del l[1]  # 程序报错,不支持赋值语法(没有返回值)
print(l)  # [111, 'hello']
方式二:l.pop()根据索引删除,会返回删除的值
l = [111, 'world', 'hello']
l.pop()  # 不指定索引默认删除最后一个
l.pop()
print(l)  # [111]
l = [111, 'world', 'hello']
res = l.pop(1)
print(l)  # [111, 'hello']
print(res)  # world
方式三:l.remove()根据元素删除,返回None(主观上相当于无返回值)
l = [111, 'world', [1, 2, 3], 'hello']

l.remove([1, 2, 3])
print(l)  # [111, 'world', 'hello']

res = l.remove('world')
print(res)  # None
print(l)  # [111, 'hello']
循环
l = [1, 'aaa', 'bbb']
for x in l:
    print(x)
    
# 结果
# 1
# aaa
# bbb
l.copy

见“Python学习_ 基础 _05_if条件判断、列表的深浅copy:三、2. a. 浅copy”

l.count()
# 元素在列表中的出现次数

l = [1, 'aaa', 'bbb', 'aaa', 'aaa']
print(l.count('aaa'))  # 3
l.index()
# 查找指定元素在列表中第一次出现的位置,列表没有find()方法,只有index()方法。

l = [1, 'aaa', 'bbb', 'aaa', 'aaa']
print(l.index('aaa'))  # 1
print(l.index('aaaaaaaaa'))  # 找不到报错
l.clear()
# 清空列表中所有的元素

l = [1, 'aaa', 'bbb', 'aaa', 'aaa']
l.clear()  # 无参数
print(l)  # []
l.reverse():不是排序,而是将列表倒过来(反转)
l = [1, 'PY', 'JS', 'GO']
l.reverse()  # 无参数
print(l)  # ['GO', 'JS', 'PY', 1]
l.sort(): 列表内元素必须是同种类型才可以排序,不然会报错
l = [11, -3, 9, 2, 3.1]
l.sort()  # 默认从小到大排,称之为升序  l.sort(reverse=False)
print(l)  # [-3, 2, 3.1, 9, 11]

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

l = ['c', 'e', 'a']
l.sort()
print(l)  # ['a', 'c', 'e']

字符串可以比大小,按照对应的位置的字符依次pk,直到比出胜负。

字符的大小是按照ASCI码表的先后顺序加以区别,表中排在后面的字符大于前面的。

print('a' > 'b')  # False
print('abz' > 'abcdefg')  # True

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

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

print(l1 < l2)  # True
列表实现队列与堆栈
队列:FIFO(First In, First Out),先进先出
l=[]
# 入队操作

l.append('first')
l.append('second')
l.append('third')

print(l)  # ['first', 'second', 'third']
# 出队操作

print(l.pop(0))  # first
print(l.pop(0))  # second
print(l.pop(0))  # third
堆栈:LIFO(Last In, First Out),后进先出
l=[]
# 入栈操作

l.append('first')
l.append('second')
l.append('third')
print(l)  # ['first', 'second', 'third']
# 出栈操作

print(l.pop())  # third
print(l.pop())  # second
print(l.pop())  # first

四、元组类型(就是一个“不可变的列表”,有序,属于不可变类型)

作用:按照索引/位置存放多个值,只用于读不用于改
定义:( )内用逗号分隔开多个任意类型的元素j
t = (1, 1.3, 'aa')  # t=tuple((1,1.3,'aa'))
print(t, type(t))  # (1, 1.3, 'aa') <class 'tuple'>
t = (10,)  # 如果元组中只有一个元素,必须加逗号
print(t, type(t))  # (10,) <class 'tuple'>

x = (10)  # 单独一个括号代表包含的意思
print(x, type(x))  # 10 <class 'int'>
# 元组的元素不能被更改,没有更改操作。
# 从本质上讲,是元组内元素的内存地址不能发生变化。若元组内有元素是可变类型,值发生变化内存而地址不发生变化,这种情况可以更改。

t = (1, 1.3, 'aa')  # t=(0->值1的内存地址,1->值1.3的内存地址,2->值'aaa'的内存地址,)
# t[0] = 11111  程序报错

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

# t[0] = 111111111 # 不能改
# t[1] = 222222222 # 不能改

t[1][0] = 11111111111111111
print(t)  # (1, [11111111111111111, 22])
print(id(t[0]), id(t[1]))  # 140711415256736 1630339462720
类型转换:
# 使用tuple()进行转换,变为元组类型

print(tuple('hello'))  # ('h', 'e', 'l', 'l', 'o')
print(tuple([1, 2, 3]))  # (1, 2, 3)
print(tuple({'a1': 111, 'a2': 333}))  # ('a1', 'a2')
内置方法:
按索引取值(正向取+反向取):只能取
t = ('aa', 'bbb', 'cc')
print(t[0])  # aa
print(t[-1])  # cc
切片(顾头不顾尾,步长)(切片是一种拷贝操作)
t = ('aa', 'bbb', 'cc', 'dd', 'eee')
print(t[0:3])  # ('aa', 'bbb', 'cc')
print(t[::-1])  # ('eee', 'dd', 'cc', 'bbb', 'aa')
长度
t = ('aa', 'bbb', 'cc', 'dd', 'eee')
print(len(t))  # 5
成员运算in和not in
t = ('aa', 'bbb', 'cc', 'dd', 'eee')
print('aa' in t)  # True
循环
t = ('aa', 'bbb', 'cc', 'dd', 'eee')
for x in t:
    print(x)
# aa
# bbb
# cc
# dd
# eee
index()
t = (2, 3, 111, 111, 111, 111)
print(t.index(111))  # 2
#print(t.index(1111111111))  # 找不到,报错
count()
t = (2, 3, 111, 111, 111, 111)
print(t.count(111))  # 4

五、字典类型(无序)

定义:{ }内用逗号分隔开多个 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'>
造字典的方式二:
d = dict(x=1, y=2, z=3)
print(d, type(d))  # {'x': 1, 'y': 2, 'z': 3} <class 'dict'>
造字典的方式三:快速初始化一个字典
# 字典的key值分别对应列表元素,值全为None

keys=['name','age','gender']
# d={}
# for k in keys:
#     d[k]=None
# print(d)  # {'name': None, 'age': None, 'gender': None}
d={}.fromkeys(keys,None) # 一行代码搞定上述for循环的工作
print(d)  # {'name': None, 'age': None, 'gender': None}



# fromkeys()对字典进行初始化,不一定非是None,写其他不可变类型也是可以的。
# fromkeys()产生的是一个新的字典,必须要用一个变量名接住。
# 初始化值要用不可变类型,实际情况是所有的值都来自同一个地方,id都是相同的。对其中一个进行更改,直接改变绑定关系,所以影响不大。
# 切记不要用可变类型,如果用了,对其中一个进行更改,所有的值都会发生改变。

keys = ['a', 'b', 'c', 'd']
d = {}

d = d.fromkeys(keys, 10)
print(d, '\n', id(d['a']), id(d['b']), id(d['c']))
# {'a': 10, 'b': 10, 'c': 10, 'd': 10} 
#  140711063066560 140711063066560 140711063066560

d = d.fromkeys(keys, '字母')
print(d, '\n', id(d['a']), id(d['b']), id(d['c']))
# {'a': '字母', 'b': '字母', 'c': '字母', 'd': '字母'} 
#  2234263779728 2234263779728 2234263779728

d = d.fromkeys(keys, [1, 2, 3, 4])
d['a'][0] = 99
print(d)  # {'a': [99, 2, 3, 4], 'b': [99, 2, 3, 4], 'c': [99, 2, 3, 4], 'd': [99, 2, 3, 4]}
数据类型转换
info = [
    ['name', '李白'],
    ('age', 18),
    ['gender', 'male']
]

# 使用循环进行数据类型转换
d = {}
for x in info:
    d[x[0]] = x[1]  # x第一次取的是 ['name', '李白']
print(d)  # {'name': '李白', 'age': 18, 'gender': 'male'}

# 对上面的代码进行优化
d = {}
for k, v in info:  # 第一次为:k,v=['name','李白'] 循环相当于进行三次解压赋值
    d[k] = v
print(d)  # {'name': '李白', 'age': 18, 'gender': 'male'}

# dict()就相当于做了上面的事情
res = dict(info)  # 一行代码搞定上述for循环的工作
print(res)
内置方法
按key存取值:可存可取
d = {'k1': 111}

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

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

print(d)  # {'k1': 222, 'k2': 3333}
长度len
d = {'k1': 111, 'k2': 2222, 'k1': 3333, 'k1': 4444}
print(d)  # {'k1': 4444, 'k2': 2222}
print(len(d))  # 2
成员运算in和not in:根据key
d = {'k1': 111, 'k2': 2222}
print('k1' in d)  # True
print(111 in d)  # False
删除
4.1 通用删除
d = {'k1': 111, 'k2': 2222}
del d['k1']
print(d)  # {'k2': 2222}
4.2 pop删除:根据key删除元素,返回删除key对应的那个value值
d = {'k1': 111, 'k2': 2222}
res = d.pop('k2')
print(d)  # {'k1': 111}
print(res)  # 2222
4.3 popitem删除:随机删除(不是从末尾删除,因为字典无序),返回元组(删除的key,删除的value)
d = {'k1': 111, 'k2': 2222}
res = d.popitem()
print(d)  # {'k1': 111}
print(res)  # ('k2', 2222)
键keys(),值values(),键值对items() =>在python3中得到的是老母鸡(为了节省空间)
'''
在python2中:
d.keys()得到的是一个由字典全部key组成的列表;
d.values()得到的是一个由字典全部key的值(value)组成的列表;
d.items()得到的是一个由字典(key,value)组成的一个个元组所组成的列表。

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

# 在python3中:
d = {'k1': 111, 'k2': 2222}
print(d.keys())  # dict_keys(['k1', 'k2'])
print(d.values())  # dict_values([111, 2222])
print(d.items())  # dict_items([('k1', 111), ('k2', 2222)])

让老母鸡下蛋的方法看下面“6. for循环”

for循环
d = {'k1': 111, 'k2': 2222}

#for k in d.keys():
#    print(k)  # k1  k2
# 可以用d直接替代d.keys()

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

for v in d.values():
    print(v)  # 111  2222
    
for item in d.items():
    print(item)  # ('k1', 111)  ('k2', 2222)  取出来的是元组

for k, v in d.items():  # 利用解压赋值
    print(k, v)  # k1 111  k2 2222

# 使用list()直接转换成列表
print(list(d.keys()))  # ['k1', 'k2']
print(list(d.values()))  # [111, 2222]
print(list(d.items()))  # [('k1', 111), ('k2', 2222)]
d.clear()(清空字典,结果为 { } )
d.copy()(相当于浅拷贝)
d.update()
d = {'k1': 111, 'k2': 2222}
d.update({'k2': 222, 'k3': 333, 'k1': 88888})
print(d)  # {'k1': 88888, 'k2': 222, 'k3': 333}
d.get():根据key取值,容错性好
d = {'k1': 111, 'k2': 2222}
# print(d['k3'])  # key不存在则报错

print(d.get('k1'))  # 111
print(d.get('k3'))  # key不存在不报错,而是返回None


# d.get()的自定义返回值用法

d = {'k1': 111, 'k2': 2222}
res0 = d.get('k1', '空空如也')
res1 = d.get('k3', '空空如也')
print(res0)  # 111   存在即返回对应value值
print(res1)  # 空空如也  不存在即返回自定义值
d.setdefault():有则不改,无则添加
# 常规方法实现

info = {}
if 'name' in info:
    pass  # 什么都不执行(执行空语句),也可以写成 ... ,效果等同于pass,但这个位置不能不写代码
else:
    info['name'] = 'Python'
print(info)  # {'name': 'Python'}
# 如果key已有则不添加(不更改),返回字典中key对应的值

info = {'name': 'JS'}
res = info.setdefault('name', 'PY')
print(res)  # JS
print(info)  # {'name': 'JS'}
# 如果key没有则添加,返回字典中key对应的值

info = {}
res = info.setdefault('name', 'GO')
print(res)  # GO
print(info)  # {'name': 'GO'}

六、集合类型

在学习集合类型之前,先思考一个简单的问题,怎样得到具有重合元素的两个列表的交集(重合)部分?且得到的部分用新列表表示。

# 用一个新的列表输出下面两个列表的重合部分

friends1 = ["zero", "kevin", "jason", "egon"]
friends2 = ["Jy", "ricky", "jason", "egon"]

l = []
for x in friends1:
    if x in friends2:
        l.append(x)
print(l)  # ['jason', 'egon']
定义:

定义集合的三大注意:

  1. 集合内元素必须为不可变类型
  2. 集合内元素无序
  3. 集合内元素没有重复
s = {1, 2}  # s=set({1,2})

# s = {1, [1, 2]}  # 程序报错  集合内元素必须为不可变类型
s = {1, 'a', 'z', 'b', 4, 7}  # 集合内元素无序
s = {1, 1, 1, 1, 1, 1, 'a', 'b'}  # 集合内元素没有重复
print(s)  # {1, 'a', 'b'}

s = {}  # 默认是空字典
print(type(s))  # <class 'dict'>

# 定义空集合
s = set()
print(s, type(s))  # set() <class 'set'>
类型转换:
# 进行类型转换时,要切记定义集合的三大注意。
# 别忘记,集合可以通过列表的类型转换list()转成列表,这也是很常见的情况。

res = set('hellolllll')

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

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

# print(set([1, 1, 1, 1, 1, 1, [11, 222]])  # 报错

print(set({'k1': 1, 'k2': 2}))  # {'k2', 'k1'}
内置方法:关系运算、去重
取交集:两者共同的好友
friends1 = {"zero", "kevin", "jason", "egon"}
friends2 = {"Jy", "ricky", "jason", "egon"}

res = friends1 & friends2
print(res)  # {'jason', 'egon'}

# 也可使用内置方法
# print(friends1.intersection(friends2))
取并集/合集:两者所有的好友
friends1 = {"zero", "kevin", "jason", "egon"}
friends2 = {"Jy", "ricky", "jason", "egon"}

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

# 也可使用内置方法
# print(friends1.union(friends2))
取差集:取friends1独有的好友、取friends2独有的好友
friends1 = {"zero", "kevin", "jason", "egon"}
friends2 = {"Jy", "ricky", "jason", "egon"}

# 取friends1独有的好友
print(friends1 - friends2)  # {'zero', 'kevin'}

# 也可使用内置方法
# print(friends1.difference(friends2))

#-------------------------------------------------------------#

# 取friends2独有的好友
print(friends2 - friends1)  # {'ricky', 'Jy'}

# 也可使用内置方法
#print(friends2.difference(friends1))
取对称差集: 求两个用户独有的好友们(即各种去掉共有的好友然后取并集)
friends1 = {"zero", "kevin", "jason", "egon"}
friends2 = {"Jy", "ricky", "jason", "egon"}

# print((friends1 - friends2)|(friends2 - friends1))
print(friends1 ^ friends2)  # {'Jy', 'zero', 'ricky', 'kevin'}

# 也可使用内置方法
# print(friends1.symmetric_difference(friends2))
父子集:包含与被包含的关系
s1 = {1, 2, 3}
s2 = {1, 2, 4}
# 不存在包含关系,下面两个比较均为False
print(s1 > s2)  # False
print(s1 < s2)  # False

s1 = {1, 2, 3}
s2 = {1, 2}
print(s1 > s2)  # True  当s1大于或等于s2时,才能说是s1是s2他爹
# print(s1.issuperset(s2))  # True
# print(s2.issubset(s1))  # s2 < s1  =>True

s1 = {1, 2, 3}
s2 = {1, 2, 3}
print(s1 == s2)  # True  s1与s2互为父子
# print(s1.issuperset(s2))  # True
# print(s2.issuperset(s1))  # True
长度
s = {'a', 'b', 'c'}
print(len(s))  # 3
成员运算
s = {'a', 'b', 'c'}
print('a' in s)  # True
print('b' not in s)  # False
循环
s = {'a', 'b', 'c'}
for item in s:
    print(item)
    
# b
# c
# a
discard()
# 删除元素,存在就删除,不存在就do nothing
s = {1, 2, 3}
s.discard(3)
print(s)  # {1,2}

# remove()也是删除,不过当元素不存在时就会报错
# s.remove(4)  # 程序报错
update()
# 更新集合
s = {1, 2, 3}
s.update({1,3,5})
print(s)  # {1, 2, 3, 5}
pop()
# 随机删除,并返回删除的值
res = s.pop()
print(res)
add()
# 添加元素
s.add(66)
print(s)
两个了解的方法
s = {1, 2, 3}
res = s.isdisjoint({3, 4, 5, 6})  # 两个集合完全独立、没有共同部分,返回True
print(res)  # False

s.difference_update({3, 4, 5})  # s = s.difference({3,4,5})
# 取s相对于集合{3, 4, 5}独有的部分,再覆盖赋值给s自己
print(s)  # {1, 2}
集合可以去重,但是有局限性。
  1. 只能针对不可变类型去重
print(set([1,1,1,1,2]))  # {1, 2}
  1. 无法保证原来的顺序
l = [1, 'a', 'b', 'z', 1, 1, 1, 2]
l = list(set(l))
print(l)  # 每一次都是随机顺序  ['b', 1, 'z', 2, 'a']
利用循环对可变类型进行去重,而且保留顺序:
l = [
    {'name': 'lili', 'age': 18, 'sex': 'male'},
    {'name': 'jack', 'age': 73, 'sex': 'male'},
    {'name': 'tom', 'age': 20, 'sex': 'female'},
    {'name': 'lili', 'age': 18, 'sex': 'male'},
    {'name': 'lili', 'age': 18, 'sex': 'male'},
]
new_l = []
for dic in l:
    if dic not in new_l:
        new_l.append(dic)

print(new_l)

总结:


Python打印数据 类型 python打印int型数据_Python打印数据 类型

本文参考文章:https://zhuanlan.zhihu.com/p/108793771