第二周学习python总结
列表和元组的区别
元组也是多个元素按照一定的顺序构成的序列。元组和列表的不同之处在于,元组是不可变类型,这就意味着元组类型的变量一旦定义,其中的元素不能再添加或删除,而且元素的值也不能进行修改
集合(set()
)
集合的定义是“把一定范围的、确定的、可以区别的事物当作一个整体来看待”,集合中的各个事物通常称为集合的元素。集合肯定不能够支持索引运算。
- 无序性:一个集合中,每个元素的地位都是相同的,元素之间是无序的。决定了集合是四个容器类型中无法用下标操作的,不能取下标
- 互异性:一个集合中,任何两个元素都认为是不相同的,即每个元素只能出现一次。集合用
len()
函数可以看出其互异性 - 确定性:给定一个集合,任给一个元素,该元素或者属于或者不属于该集合,二者必居其一,不允许有模棱两可的情况出现
集合的定义运算和操作
set1 = {1, 2, 5, 7, 9}
set2 ={2, 4, 6, 8}
# 成员运算 - 确定性(元素要么在集合中,要么在集合中
# 集合的成员运算在效率上远远低于列表的成员运算,因为采用了哈希存储
print(1 in set1)
print(1 not in set1)
# 交集
print(set1 & set2)
print(set1.intersection(set2))
# 并集
print(set1 | set2)
print(set1.union(set2))
# 差集
print(set1 - set2)
print(set1.difference(set2))
print(set2 - set1)
# 对称差
print(set1 ^ set2)
print((set1|set2) - (set1 - set2))
print(set1.symmetric_difference(set2))
a = '移动互联网 | 电商 | 生鲜'
print(a.split('|'))
set3 = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
# 判断真子集
print(set1 < set2)
# 判断子集
print(set1 <= set2)
# 判断子集,
print(set3 > set2)
集合中的元素必须是hashable
类型。所谓hashable
类型指的是能够计算出哈希码的数据类型,你可以暂时将哈希码理解为和变量对应的唯一的ID值。通常不可变类型都是hashable
类型,如整数、浮点、字符串、元组等,而可变类型都不是hashable
类型,因为可变类型无法确定唯一的ID值,所以也就不能放到集合中
Python中的集合底层使用了哈希存储的方式,对于这一点我们暂时不做介绍,在后面的课程有需要的时候再为大家讲解集合的底层原理,现阶段大家只需要知道集合是一种容器,元素必须是hashable
类型,与列表不同的地方在于集合中的元素没有序、不能用索引运算、不能重复。用哈希函数来算出地址,设计好的哈希函数,让不同对象尽可能才生不同的哈希码,降低哈希冲突(放入一个列表里)。不依赖问题规模,是一种常量级时间复杂度的存储方案。如果一个对象无法设计哈希码,就不能放到集合中,列表就是无法计算哈希对象。
random.choices() # 随机选取元素
''.join() # 拼接字典,列表,元组,以空格
列表,元组,集合,字典之间转换
nums = [1, 1, 10, 10, 10, 5, 3, 9, 9]
set2 = set(nums)
print(set2)
list3 = list(set2)
print(list3)
tuple4 = tuple(list3)
print(tuple4)
dict5 = dict(tuple4)
不可变集合
Python中还有一种不可变类型的集合,名字叫frozenset
。set
跟frozenset
的区别就如同list
跟tuple
的区别,frozenset
由于是不可变类型,能够计算出哈希码,因此它可以作为set
中的元素。除了不能添加和删除元素,frozenset
在其他方面跟set
基本是一样的,下面的代码简单的展示了frozenset
的用法。
set1 = frozenset({1, 3, 5, 7})
set2 = frozenset(range(1, 6))
print(set1 & set2) # frozenset({1, 3, 5})
print(set1 | set2) # frozenset({1, 2, 3, 4, 5, 7})
print(set1 - set2) # frozenset({7})
print(set1 < set2) # False
字典(dict()
)
元素由键和值两部分构成,冒号前面的称为键,冒号
后面的称为值,合在一起称为键值对。使用{}
字面量语法,这一点跟上一节课讲的集合是一样的。但是字典的{}
中的元素是以键值对的形式存在的,每个元素由:
分隔的两个值构成,***:
前面是键(必须是不可变类型),:
后面是值***。
person = {
'name': '王大锤', 'age': 55, 'weight': 60, 'office': '科华北路62号',
'home': '中同仁路8号', 'tel': '13122334455', 'econtact': '13800998877'
'contacts':{'qq':'957658','tel':'13548041193'}
}
print(person)
print(person['name']) # 取到健对应的值
for contact in person['contacts']:
print(contact)
dict1 = {} # 字面量语法,空字典
字典的构造
# 构造器函数
students = dict(id=100, name='王大锤', sex=True, birthday='1980-11')
# 生成式(推导式)语法
list1 = [i for i in range(1, 10)]
print(list1)
set1 = {i for i in range(1, 10)}
print(set)
dict1 = {i: i**2 for i in range(1, 10)}
print(dict1)
# 后两者的区别是冒号,无是集合,有是字典
# 生成器
gen_onj = (i for i in range(1, 10)) # 不是元组,需要相对的函数一个一个取出
for value i gen_obj:
print(value)
# 用的时候生成给你,不像上面一次给给你
# print(next(gen_obj))
print(type(x))
字典的遍历
print(len(students)) # 取字典的元素
# 对键的循环
for key in students:
# for key in students.keys(): 这两种写法一样
print(students[key])
# 遍历键并取值(通过方括号索引运算)
# 对值的循环
print(students.values()) # 取出所有的值
for value in students.values():
print(value)
# 对键值对的循环
for key,value in students.items():
print(key, value)
字典的运算
# 成员运算(in / not in)
students = dict(id=100, name='王大锤', sex=True,birthday='1980-1-1')
# 字典的索引运算放在赋值运算符的左边
# 如果索引对应的键存在,就更新它的值
students['id'] = 100
students['sex'] = False
# 没有这个健就加上这个健并赋予相应的值
students['address'] = '四川成都'
print(students)
print('name' in students)
print('age' in students)
print('address' in students)
程序语句代码顺序要正确:try … expect….或get()函数
while True:
try:
a, b, c = map(float, input('请输入: ').split())
print(a, type(a))
print(b, type(b))
print(c, type(c))
break
except ValueError:
print('输入错误,请重新输入!!!')
# 使用get函数通过key获取value时,如果key不存在,不会发生异常错误
# 而是得到一个空值
print(students.get('age'))
# 或者得到你指定的默认值
print(students.get('age',20))
print(students['name'])
print(students['birthday'])
# 删除键值对
del student['name']
print(students.pop('name'))
print(student.get('name', '无名氏')) # 推介的算法,相当稳健
# 如果使用下标(索引)运算,那么必须保证键一定存在
if 'birthday' in student:
print(student['birthday'])
字典的相关操作
运用的是哈希存储,既可以保存很多值有很方便取值
dict1 = {'A': 100, 'B': 200, 'C': 300}
dict2 = {'D': 400, 'E': 500, 'A': 600}
# 合并 不能用 + 进行拼接操作
# 更新字典 update()函数
dict1.update(dict2)
# 删除元素,给的键必须存在,如果不存在就会才生KEyError
del dict1['B']
dict1.pop('C')
dict1.popitem() # 执行最后一个,删除最后一个
stu2 = dict1.pop('C',{})
print(stu2) # 返回300,如果键值不存在返回{}
# 键值存在并返回原来的值
# 键值不存在则添加并执行该键值对,或返回None
dict1.setdefault('C',800)
# 清空字典
dict1.clear()
print
凯撒密码
"""凯撒密码 - 通过对应的字符替换,实现对明文进行加密的一种方式
abcdefghijklmnopqrstuvwxyz
defghijklmnopqrstuvwxyzabc
明文: attack at dawn
密文: dwwdfn dw gdzg
对称加密:加密和解密使用了相同的密钥 ---> AES
非对称加密:加密和解密使用不同的密钥(公钥,私钥)--> RSA --》适合互联网的应用。
"""
message = 'attack at dawn.'
# 用str.maketrans()函数进行加密操作
table = str.maketrans('abcdefghijklmnopqrstuvwxyz','defghijklmnopqrstuvwxyzabc')
# 用对象.translate(加密规则的列表里)函数进行解密操作
print(message.translate(table))
编码和解码
"""
str(字符串) ----> encode ----> decode
example04 - 字符串的操作
编码:把有一种字符集转换成另外一种字符集
1. 在选择字符集(编码)的时候,最佳的选择(也是默认)是UTF -8编码
2. 编码和解码的字符集要保持一致,否则就会出现乱码现象
3. 不能用ISO-8850-1编码保存中文,否则会出现编码黑洞,中文变成?
4. UTF -8是unicode的一种实现方法,也是一种变长的编码。
最少1个字节(英文和数值),最多4个字节(Emoji),表示中文用3个字节。
"""
a = '我爱你中国'
b = a.encode('gbk')
print(b)
print(len(b))
# 通过len()可以相应字符对应几个字节
c = b'\xce\xd2\xb0\xae\xc4\xe3\xd6\xd0\xb9\xfa'
print(c.decode('gbk'))
# 当字节和字符不对应,就会出现异常错误
# 一般使用的是utf-8
# encode()和decoude()里什么都没有时,默认utf-8
# UnicodeEncodeError: 'latin-1' codec can't encode characters in position 0-9: ordinal not in range(256)
# latin -1编码不能够用来处理中文,会出现黑洞
JSON格式的字符串
"""
操作系统:Windows、iOS、Android、macOS、Linux、Unix
编程语言:Python、Java、PHP、Go、C++
1. 两个异构的系统之间交换数据最好的选择是交换纯文本(可以屏蔽系统和编程语言的差异)
2. 纯文本应该是结构化或半结构化的纯文本(有一定的格式)
~ XML ---> eXtensible Markup Language ---> 可扩展标记语言
~ JSON ---> JavaScript Object Notation ---> 大多数网站和数据接口服务使用的数据格式
~ YAML ---> Yet Another Markup Language
3. 如何将JSON格式的字符串转成Python程序中的字典?
---> json 模块 ---> loads 函数
URL ---> Universal Resource Locator ---> 统一资源定位符
"""
import requests
laji_name = input('请输入垃圾名称:')
resp = requests.get(
url='http://api.tianapi.com/txapi/lajifenlei/index',
params={'key': '2cb5b10171d22edd71fac83e9354fa25', 'word':laji_name, 'num':30}
)
news_dict = resp.json()
news_list = news_dict['newslist']
for news in news_list:
print(news['name'])
print(news['explain'])
小知识总结
- max, min, sorted函数都有一个名为key的参数,该参数可以指定比较元素大小的规则。
- 例如下面的key = len 可以通过对元素指定的len函数获取一个长度值来作为比较大小的规则。
- random.choices()返回的是一个列表,random.choice()返回的不是列表,就返回该元素的类型。