python第六天:作业+is+编码

课堂回顾:

 

# 1、昨日内容回顾
# 字典:
# 增:
# dic['name'] = '小米' 有则覆盖,无则添加
# dic.setdefault('name', '无此内容') 有则不变,无则添加
# 删:
# pop: dic.pop('键', '无此键') 有返回值,返回对应的值。
# popitem() 3.5以上删除最后一个,3.5及以前版本随机删除,有返回值。
# clear 清空字典
# del
# del dic['name ']
# del dic 在内存级别,删除字典。
# 改:
# dic['name'] = 'alex'有则覆盖,无则添加
# update 将一个字典的所有键值对,覆盖到另外一个字典。
# dic2.update(dic1) 将dic1的键值对覆盖到dic2, dic1原内容不变
# 查:
# dic['name']
# dic.get('name1') 无此键默认返回None,可自定义返回值
# for循环
# dic.keys() dic.values() dic.items() 返回的类似list的数据类型,可遍历,无索引。
# list(dic.keys())

# 案例讲解1:
dic = {
'name': 'alex',
'age': 12,
'hobby': 'girl',
}
for i in dic:
print(i)
测试结果:
C:\Users\hongd\AppData\Local\Programs\Python\Python38\python.exe "D:/pycharm/project/day 06/01 今日内容大纲.py"
name
age
hobby

Process finished with exit code 0

# 案例讲解2:
dic = {
'name': 'alex',
'age': 12,
'hobby': 'girl',
}

for i in dic.keys():

print(i)
测试结果:
C:\Users\hongd\AppData\Local\Programs\Python\Python38\python.exe "D:/pycharm/project/day 06/01 今日内容大纲.py"
name
age
hobby

Process finished with exit code 0

# 案例讲解3
dic = {
'name': 'alex',
'age': 12,
'hobby': 'girl',
}
# for i in dic:
# for i in dic.keys():
# print(i)

for i in dic.items():
print(i)
测试结果:
C:\Users\hongd\AppData\Local\Programs\Python\Python38\python.exe "D:/pycharm/project/day 06/01 今日内容大纲.py"
('name', 'alex')
('age', 12)
('hobby', 'girl')

Process finished with exit code 0

# 案例讲解4:
dic = {
'name': 'alex',
'age': 12,
'hobby': 'girl',
}

for i in dic.values():
print(i)
测试结果:
C:\Users\hongd\AppData\Local\Programs\Python\Python38\python.exe "D:/pycharm/project/day 06/01 今日内容大纲.py"
alex
12
girl

Process finished with exit code 0

# 案例讲解5:
dic = {
'name': 'alex',
'age': 12,
'hobby': 'girl',
}

for k, v in dic.items():
print(k, v)

测试结果:
C:\Users\hongd\AppData\Local\Programs\Python\Python38\python.exe "D:/pycharm/project/day 06/01 今日内容大纲.py"
name alex
age 12
hobby girl

Process finished with exit code 0

 

 

作业题:
# 1,有如下变量(tu是个元祖),请实现要求的功能
# tu = ("alex", [11, 22, {"k1": 'v1', "k2": ["age", "name"], "k3": (11,22,33)}, 44])
# a. 讲述元祖的特性: 答:只读列表属性,没有增删改的功能;
# b. 请问tu变量中的第一个元素 “alex” 是否可被修改? 答:不能改,只属于元组。
# c. 请问tu变量中的"k2"对应的值是什么类型?是否可以被修改?如果可以,请在其中添加一个元素 “Seven” 答:可以修改k2,
# tu[1][2]["k2"].append('Seven')
# print(tu)
# d. 请问tu变量中的"k3"对应的值是什么类型?是否可以被修改?如果可以,请在其中添加一个元素 “Seven” 答:元组,不可以修改。

# 2, 字典dic,
dic = {'k1': "v1", "k2": "v2", "k3": [11,22,33]}
# a. 请循环输出所有的key
# for i in dic:
# print(i)
# b. 请循环输出所有的value
# for value in dic.values():
# print(value)
# c. 请循环输出所有的key和value
# for k, v in dic.items():
# print(k,v)
# d. 请在字典中添加一个键值对,"k4": "v4",输出添加后的字典
# dic.setdefault('k4', 'v4')
# print(dic)
# e. 请在修改字典中 “k1” 对应的值为 “alex”,输出修改后的字典
# dic['k1'] ="alex"
# print(dic)
# f. 请在k3对应的值中追加一个元素 44,输出修改后的字典
# dic['k3'].append(44)
# print(dic)
# g. 请在k3对应的值的第 1 个位置插入个元素 18,输出修改后的字典
# dic['k3'].insert(0, 18)
# print(dic)

#3、
av_catalog = {
"欧美":{
"www.xxx.com": ["很多免费的,世界最大的","质量一般"],
"www.pornhub.com": ["很多免费的,也很大","质量比yourporn高点"],
"letmedothistoyou.com": ["多是自拍,高质量图片很多","资源不多,更新慢"],
"x-art.com":["质量很高,真的很高","全部收费,屌丝请绕过"]
},
"日韩":{
"tokyo-hot":["质量怎样不清楚,个人已经不喜欢日韩范了","verygood"]
},
"大陆":{
"1024":["全部免费,真好,好人一生平安","服务器在国外,慢"]
}
}
#
# 1,给此 ["很多免费的,世界最大的","质量一般"]列表第二个位置插入一个元素:'量很大'。
# av_catalog['欧美']["www.xxx.com"].insert(1,'量很大')
# print(av_catalog)
# 2,将此 ["质量很高,真的很高","全部收费,屌丝请绕过"]列表的 "全部收费,屌丝请绕过" 删除。
# av_catalog['欧美']['x-art.com'].pop(1)
# print(av_catalog)

# 4,将此["质量怎样不清楚,个人已经不喜欢日韩范了","verygood"]列表的 "verygood"全部变成大写。
# print(av_catalog['日韩']['tokyo-hot'])
# av_catalog['日韩']["tokyo-hot"][-1] = av_catalog['日韩']["tokyo-hot"][-1].upper()
# print(av_catalog)
# 5,给 '大陆' 对应的字典添加一个键值对 '1048' :['一天就封了']
# av_catalog['大陆'][1048]= ['一天就封了']
# av_catalog['大陆'].setdefault(1048, ['一天就封了'])
# print(av_catalog)

# 6,删除此"letmedothistoyou.com": ["多是自拍,高质量图片很多","资源不多,更新慢"]键值对。
# av_catalog['欧美'].pop('letmedothistoyou.com')
# print(av_catalog)

# 7,给此["全部免费,真好,好人一生平安","服务器在国外,慢"]列表的第一个元素,加上一句话:'可以爬下来'
# print(av_catalog['大陆']['1024'])

# av_catalog['大陆']["1024"].insert(1, '可以爬下来')
# print(av_catalog)
# av_catalog['大陆']["1024"][0] += '可以爬下来' # av_catalog['大陆']["1024"][0] = av_catalog['大陆']["1024"][0] +'可以爬下来'
# print(av_catalog)

 

# 4、有字符串"k:1|k1:2|k2:3|k3:4" 处理成字典 {'k':1,'k1':2....}
li = 'k:1|k1:2|k2:3|k3:4'.split('|')
dic = {}
for i in li:
i = i.split(':')
dic.setdefault(i[0], int(i[1]))
print(dic)
测试结果:
D:\pythonProject\venv\Scripts\python.exe "D:/pythonProject/day 06/作业讲解.py"
{'k': 1, 'k1': 2, 'k2': 3, 'k3': 4}

Process finished with exit code 0

 

# 5、元素分类
# 有如下值li= [11,22,33,44,55,66,77,88,99,90],
# 将所有大于 66 的值保存至字典的第一个key中,将小于 66 的值保存至第二个key的值中。
# 即: {'k1': 大于66的所有值列表, 'k2': 小于66的所有值列表}
dic = {'k1':[], 'k2':[]}
li= [11,22,33,44,55,66,77,88,99,90]
for i in li:
if i > 66:
dic['k1'].append(i)
elif i < 66:
dic['k2'].append(i)
print(dic)

测试结果:
C:\Users\hongd\AppData\Local\Programs\Python\Python38\python.exe "D:/pycharm/project/day 06/作业讲解.py"
{'k1': [77, 88, 99, 90], 'k2': [11, 22, 33, 44, 55]}

Process finished with exit code 0


# 6、输出商品列表,用户输入序号,显示用户选中的商品
# 商品 li = ["手机", "电脑", '鼠标垫', '游艇']
# 要求:1:页面显示 序号 + 商品名称,如:
# 1 手机
# 2 电脑
# …
# 2: 用户输入选择的商品序号,然后打印商品名称 input
# 3:如果用户输入的商品序号有误,则提示输入有误,并重新输入。
# 1、数字 (在范围内)
# 2、包含非数字字符
# 4:用户输入Q或者q,退出程序。

# 用户输入的总资产:3000

li = ["手机", "电脑", '鼠标垫', '游艇']
for i in range(len(li)):
print('{}\t{}'.format(i+1, li[i]))
while True:
msg = input('请输入商品序号: (按Q或者q退出!)').strip()
if msg.lower() =='q': break
elif msg.isdigit():
msg = int(msg)
if msg in range(0, len(li)+1):
print("您选择的商品是:%s" % li[msg-1])
else:
print("您输入的数字不在范围内,请重新输入!")
else:
print("您输入的不是数字或不在列表范围内,请重新输入!")


3、is == id 小数据池
id 查询内存地址
name = 'alex'
print(id((name)))
name1 = 'alex'
name2 = 'alex'
print(name1 == name2)
= 赋值运算 == 比较数值相同
is 内存地址是否相同 测试(注意有pycharn有个bug,需要在python环境下测试)
Microsoft Windows [版本 10.0.19043.1348]
(c) Microsoft Corporation。保留所有权利。

C:\Users\hongd>python
Python 2.7.14 (v2.7.14:84471935ed, Sep 16 2017, 20:19:30) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> i = 24
>>> i1 = 24
>>> print(i is i1)
True
>>>


>>>
>>> i = 300
>>> i1 = 300
>>> print(i is i1)
False
>>>

#这上面两个说明了什么问题?解答如下
相同,为了节省内存,统一划归为一个内存地址。
int的范围: -5~ 256
str的范围: 1、有非字母元素就不是小数据池
2、单子字母*int(<21)存在小数据池

验证:
>>> i = 24
>>> i1 = 24
>>> print(i is i1)
True


False
>>> i = 257
>>> i1 = 257
>>> print(i is i1)
False
>>>

验证str范围:如果str是不含有特殊字符的情况下:
>>> i1 = 'alex'
>>> i2 = 'alex'
>>> print(i1 is i2)
True
>>>
如果str是含有特殊字符的情况下:
>>> i1 = 'alex@'
>>> i2 = 'alex@'
>>> print(i1 is i2)
False
>>>

 

如果str是含有字符和数字的情况下:

>>> i1 = 'aa1'
>>> i2 = 'aa1'
>>> print(i1 is i2)

 

2、单子字母*int(<21)存在小数据池
>>> i1 = 'a'*20
>>> i2 = 'a'*20
>>> print(i1 is i2)
True
>>> i1 = 'a'*21
>>> i2 = 'a'*21
>>> print(i1 is i2)
False
>>>

#验证3: 超过21个字母的情况:
>>> i1 = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasssssssssssssssssssssssssssssssssssss'
>>> i2 = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasssssssssssssssssssssssssssssssssssss'
>>> print(i1 is i2)
True
>>>

3、剩下的没有小数据池概念
>>> l1 = [1, 2]
>>> l2 = [1, 2]
>>> print(l1 is l2)
False
>>>

# 4、编码二
ASCII: 一个字符一个字节表示(8位),数字字母特殊字符。

unicode:万国码:
一个字符用四个字节表示
A:0000 0001 0000 0001 0000 0001 0000 0001
中:0000 0001 0000 0001 0000 0001 0000 0001

utf-8:
a:0000 0001
欧洲:0000 0001 0100 0001
亚洲:0000 0001 0000 0001 1100 0001

gbk:国标
a:0000 0001
中文:0000 0001 0000 0001

1、不同的密码本之间的二进制是不能互相识别的,容易报错或产生乱码。
2、计算机的文件存储和传输都是01010101(gbk、utf-8、ascii,gb2312等),不能是unicode

大前提:python3编码
数据类型:
int
str
bytes: str 拥有的所有方法,bytes都有。
bool
list
tuple
dict
set

str:python3x 内存中的编码方式是unicode
bytes: 内部编码方式 utf-8 gbk gd2313 非unicode
英文
str:表现形式 name = 'alex'
内部编码:unicode

bytes:表现形式 name1 = b'alex'
内部编码:非unicode


中文
str:表现形式 name = '中国'
内部编码:unicode

bytes:表现形式 b'\xe4\xb8\xad\xe5\x9b\xbd'
内部编码:非unicode

name = 'alex' #颜色和下面的name1不同(需在环境中体现出来。)
name1 = b'alex' #颜色和上面的name不同(需在环境中体现出来。)


name = 'alex'
name1 = b'alex'
print(name,type(name))
print(name1,type(name1))
测试结果:
C:\Users\hongd\AppData\Local\Programs\Python\Python38\python.exe "D:/pycharm/project/day 06/01 今日内容大纲.py"
alex <class 'str'>
b'alex' <class 'bytes'>

Process finished with exit code 0

 

关于中文的类型测试1
name = '中国'
print(name,type(name))
测试结果:
C:\Users\hongd\AppData\Local\Programs\Python\Python38\python.exe "D:/pycharm/project/day 06/01 今日内容大纲.py"
中国 <class 'str'>

Process finished with exit code 0


中文测试2
name = '中国'.encode('utf-8')
print(name,type(name))
测试结果:
C:\Users\hongd\AppData\Local\Programs\Python\Python38\python.exe "D:/pycharm/project/day 06/01 今日内容大纲.py"
b'\xe4\xb8\xad\xe5\x9b\xbd' <class 'bytes'>

Process finished with exit code 0

 

测试对比:
s1 = '中国'
b1 = s1.encode('utf-8')
b2 = s1.encode('gbk')
print(b1)
print(b2)
测试结果:
C:\Users\hongd\AppData\Local\Programs\Python\Python38\python.exe "D:/pycharm/project/day 06/01 今日内容大纲.py"
b'\xe4\xb8\xad\xe5\x9b\xbd'
b'\xd6\xd0\xb9\xfa'

Process finished with exit code 0

测试对比2
s1 = '中国'
b1 = s1.encode('utf-8') #encode 编码
s2 = b1.decode('utf-8') #decode 解码
print(s2)
测试结果:
C:\Users\hongd\AppData\Local\Programs\Python\Python38\python.exe "D:/pycharm/project/day 06/01 今日内容大纲.py"
中国

Process finished with exit code 0


测试验证3:bytes和str有相同的功能
s1 = b'alex'
print(s1.capitalize())
测试结果:
C:\Users\hongd\AppData\Local\Programs\Python\Python38\python.exe "D:/pycharm/project/day 06/01 今日内容大纲.py"
b'Alex'

Process finished with exit code 0

posted @ 2021-10-22 14:48  hongdudu  阅读(934)  评论(0)    收藏  举报