python基础入门(八)

python基础入门(八)

一、数据类型内置方法之字典

dict()
字典中K值一般为字符串,只有是不可变数据类型就行。
字典中,K:V键值对是无序的。

1、按k取值(不推荐使用)

l1 = {'name': 'jason', 'pwd': 123, 'hobby': 'read'}
print(l1['name']) # jason
print(l1['phone']) # KeyError: 'phone',K值不存在会直接报错

2、按内置方法get取值(推荐使用)

get()
l1 = {'name': 'jason', 'pwd': 123, 'hobby': 'read'}
print(l1.get('name')) # jason 
print(l1.get('age'))  # None, k值不存在不会报错
print(l1.get('name', '没有哟 嘿嘿嘿')) 
# jason   键存在的情况下获取对应的值
print(l1.get('age', '没有哟 嘿嘿嘿'))
# 键不存在默认返回None,可以通过第二个参数自定义

3、修改值数据

l1 = {'name': 'jason', 'pwd': 123, 'hobby': 'read'}
l1['name'] = 'kevin'  # 修改K值对应的V值
print(l1)  
# 输出结果:{'name': 'kevin', 'pwd': 123, 'hobby': 'read'}
# 键在则为修改
l1['age'] = 21
print(l1)  
# 输出结果:{'name': 'jason', 'pwd': 123, 'hobby': 'read', 'age': 21}
# 键不在则为新增

4、删除数据

pop()
l1 = {'name': 'jason', 'pwd': 123, 'hobby': 'read'}
l1.pop('name')
print(l1)  # 输出结果:{'pwd': 123, 'hobby': 'read'},弹出整个键值对
res = l1.pop('name'),定义变量
print(res)  # jason 接收弹出的键值

5、统计字典中键值对的个数

len()
l1 = {'name': 'jason', 'pwd': 123, 'hobby': 'read'}
print(len(l1))
# 3 统计字典中键值对的个数

6、字典三剑客

keys()
l1 = {'name': 'jason', 'pwd': 123, 'hobby': 'read'}
print(l1.keys())
# dict_keys(['name', 'pwd', 'hobby']) 一次性获取字典所有的键

values()
print(l1.values())
# dict_values(['jason', 123, 'read']) 一次性获取字典所有的值

items()
print(l1.items())
# dict_items([('name', 'jason'), ('pwd', 123), ('hobby', 'read')])
# 一次性获取字典的键值对数据 

用for循环也能获取字典的键值对数据,但远不如items()快捷
l1 = {'name': 'jason', 'pwd': 123, 'hobby': 'read'}
for i in l1.items():
    k, v = i
    print(k, v)
# name jason
# pwd 123
# hobby read

7、补充说明

  • 快速生成值相同的字典
fromkeys()
print(dict.fromkeys(['name', 'pwd', 'hobby'], 123))
# {'name': 123, 'pwd': 123, 'hobby': 123}
#()中前面部分为键,逗号后面为相同的值
  • 当第二个公共值是可变类型的时候,通过任何一个键修改都会影响所有
append()
res = dict.fromkeys(['name', 'pwd', 'hobby'], [])
res['name'].append('jason')
res['pwd'].append(123)
res['hobby'].append('study')
print(res)
#{'name': ['jason', 123, 'study'], 'pwd': ['jason', 123, 'study'], 'hobby': ['jason', 123, 'study']}
# fromkeys()后面是空的数列[] , append()给一个键增加值会给所有的键增加相同的值
setdefault()
user_dict = {
    'username': 'jason',
    'password': 123,
    'hobby': ['read', 'music', 'run']
    }
res = user_dict.setdefault('username','tony')
print(user_dict, res)
# {'username': 'jason', 'password': 123, 'hobby': ['read', 'music', 'run']} jason
# username键存在则V值不修改,结果是键对应的值

res = user_dict.setdefault('age',123)
print(user_dict, res)
# {'username': 'jason', 'password': 123, 'hobby': ['read', 'music', 'run'], 'age': 123} 123
# age键不存在则新增键值对,结果是新增的值
popitem() 
# 弹出键值对 后进先出
#pop()需指定弹出某个键,popitem()随机弹出,后进先出
eg:
l1 = {'name': 'jason', 'pwd': 123, 'hobby': 'read'}
l1.popitem()
print(l1)  # {'name': 'jason', 'pwd': 123}

二、数据类型内置方法之元组

tuple()
支持for循环的数据类型都可以转成元组,元组的索引不会改变绑定的地址。

1、索引取值

l1 = (1,2,3,4,5)
print(l1[1])  # 输出结果:2

2、切片操作

L1 = (1,2,3,4,5,6,7,8)
print(L1[0:5])
# (1, 2, 3, 4, 5),索引切割0到4的数据值
print(L1[:])
# (1, 2, 3, 4, 5, 6, 7, 8),不写数字就默认都要,相当于[],输出L1所有的值

3、间隔、方向

L1 = (1,2,3,4,5,6,7,8)
print(L1[::-1])
# (8, 7, 6, 5, 4, 3, 2, 1) 从右往左取值(全部),[::-1]只说明方向未规定范围

4、统计元组内数据值的个数

len()
l1 = (1, 2, 3, 4, 5)
print(len(l1))  # 输出结果:5

5、统计元组内某个数据值出现的次数

count()
t1 = (11, 22, 33, 44, 55, 66)
print(t1.count(11))
# 1 ,11在t1里只出现了1次

6、统计元组内指定数据值的索引值

 t1 = (11, 22, 33, 44, 55, 66)
    print(t1.index(22))
# 1 ,在t1中索引,22在1的位置
  • 当元组里只有一个数据值的时候,我们一定要在数据值后面加一个逗号。否则,括号里是什么数据类型就是什么数据类型。
l1 = (1)
print(type(l1))  # 输出结果:<class 'int'>
l1 = (1,)  # 这里就加了一个逗号,数据类型就发生了变化
print(type(l1))  # 输出结果:<class 'tuple'>
  • 元组内索引绑定的内存地址不能被修改(注意区分数据类型可变还是不可变)
  • 元组不能新增或删除数据

三、数据类型内置方法之集合

set()

  • 集合内数据必须是不可变类型(整型、浮点型、字符串、元组)
  • 集合内数据也是无序的,没有索引的概念
  • 遇到去重和关系运算这两种需求的时候才应该考虑使用集合

1、去重

集合直接打印就可以得到去重的结果,但无法保留原先数据的排列顺序。
l1 = {1, 2, 3, 3, 4, 3, 2, 3, 4, 1, 3, 4, 3, 4, 5, 5}
print(l1)  # 输出结果:{1, 2, 3, 4, 5}

2、关系运算

s与l是两个账号,模拟这两个账号共同好友的情况

s = {'jason', 'oscar', 'kevin', 'ricky', 'gangdan', 'biubiu'}
l = {'kermit', 'tony', 'gangdan'}
print(s & l)  # 两个的共同好友
print(s | l)  # 所有的名字
print(s - l)  # 第一组数据独有的名字
print(s ^ l)  # 在两组数据中没有同时出现的数据
  • 父集、子集
s = {'jason', 'oscar', 'kevin', 'ricky', 'gangdan', 'biubiu'}
l = {'kevin', 'jason', 'gangdan'}
print(s > l)# true,s包含l,s是l的父集
print(s < l)# False,l不能包含s,l是s的子集

四、字符编码理论

解码、字符编码、编码的概念

  • 解码

    当我们打开文本文件时,计算机会根据文件的类型,对文件进行一些处理。比如,将一个txt文件由二进制转换为人类可以读懂的文字,这个过程被称为解码。

    bytes类型数据.decode()

  • 字符编码

    在解码过程中,计算机要依赖于一些规则,将指定的二进制位解码为指定的字符。

    eg:0110 0001被解码为 小写英文字母 a 。

    这个规则被称为字符编码。字符编码有很多种,而前面的例子中用到的编码叫做 ASCII 编码,它是最早产生的字符编码。

  • 编码

    字符串.encode()

    当然,从字符转换为二进制位也要使用字符编码,而这个过程被称为编码。

字符编码发展史

  • 阶段一:一家独大

    美国科学家在设计字符编码的时,只考虑了使用英语的场景,发明的ASCII编码使用8个二进制位来表达一个字符,只支持现代英语和其他西欧语言,不支持汉语等语言。

    部分ASCII对照表:

image

  • 阶段二:群雄割据

    为了让计算机识别中文字符,中国科学家发明了GBK字符编码,该字符编码使用16位二进制位(但有些生僻字还是不支持),且仅支持英语和汉语。

    另一方面,世界上很多国家为了支持本国的语言,各自发明了字符编码。

    eg:日本的Shift_JIS、韩国的Euc-kr等。

    尽管有如此多的字符编码,但没有一个是通用的,它们大多都只支持本国语言和英语。

  • 阶段三:天下归一

    为了实现对所有语言的支持,国际组织ISO制定了Unicode字符编码,也叫万国码。支持各国语言,使用16~32位二进制位来对应一个字符。

现代计算机都使用Unicode字符编码,之前的如GBK等编码可以转换为Unicode编码。

UTF是针对Unicode实现的一种可变长度字符编码,比Unicode更加精简,给出了字符保存的编码规则。这些编码中最常用、应用最广的就是utf-8,使用的位数不固定,最小为8位。

至此,utf-8编码成了最流行的字符编码,我们在开发中也应该尽量使用utf-8编码。

python2与python3差异

  • python2默认的编码是ASCII编码,但是开发过程中可能会输入其他语言,但ASCII编码只能支持英语,这时便会出现乱码。解决方法:

    方法一、文件头
    # encoding:utf8
    
    方法二、字符串前面加u
    u'你好啊'
    

    python3默认的编码是utf系列(unicode)

posted @ 2022-09-30 17:07  知了了了了  阅读(44)  评论(0)    收藏  举报