第二周学习python总结

第二周学习python总结

列表和元组的区别

元组也是多个元素按照一定的顺序构成的序列。元组和列表的不同之处在于,元组是不可变类型,这就意味着元组类型的变量一旦定义,其中的元素不能再添加或删除,而且元素的值也不能进行修改

集合(set())

集合的定义是“把一定范围的、确定的、可以区别的事物当作一个整体来看待”,集合中的各个事物通常称为集合的元素。集合肯定不能够支持索引运算。

  1. 无序性:一个集合中,每个元素的地位都是相同的,元素之间是无序的。决定了集合是四个容器类型中无法用下标操作的,不能取下标
  2. 互异性:一个集合中,任何两个元素都认为是不相同的,即每个元素只能出现一次。集合用len()函数可以看出其互异性
  3. 确定性:给定一个集合,任给一个元素,该元素或者属于或者不属于该集合,二者必居其一,不允许有模棱两可的情况出现
集合的定义运算和操作
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中还有一种不可变类型的集合,名字叫frozensetsetfrozenset的区别就如同listtuple的区别,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()返回的不是列表,就返回该元素的类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值