吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1337|回复: 37
收起左侧

[学习记录] Python学习笔记

[复制链接]
ENVI22 发表于 2024-3-21 10:43
本帖最后由 ENVI22 于 2024-4-3 09:38 编辑

//新人报道,主要目的是督促自己学习,同时防止账号收回{:1_919:}

创建集合

1) 使用{}字面量语法

{}中需要至少有一个元素,因为没有元素的{}并不是空集合而是一个空字典;

set1 = {1,2,3,3,3,2}     
print(set1)        # {1,2,3}

2) 使用内置函数set

创建空集合可以使用set();也可以将其他序列转换成集合,例如: set('hello')会得到一个包含了4个字符的集合(重复的l会被去掉);

set2 = set('hello')
print(set2)     # {'h', 'l', 'o', 'e'}

3) 使用生成式语法

set4 = {num for num in range(1,20) if num % 3 == 0 or num % 5 == 0}
print(set4)     # {3, 5, 6, 9, 10, 12, 15, 18}

集合运算

1) 成员运算

可以通过in和not in 检查元素是否在集合中

set1 = {11, 12, 13, 14, 15}
print(10 in set1)        # False 
print(15 in set1)        # True

2) 交并差运算

可以通过运算符和方法调用两种方式来进行操作

set1 = {1, 2, 3, 4, 5, 6, 7}
set2 = {2, 4, 6, 8, 10}
print(set1 & set2)  # 交集为 {2, 4, 6}. 或者使用intersection方法:print(set1.intersection(set2))
print(set1 | set2)  # 并集为 {1, 2, 3, 4, 5, 6, 7, 8, 10}. 或者使用union方法:print(set1.union(set2)) 
print(set1 - set2)  # 差集为 {1,3,5,7}. 或者使用difference方法:print(set1.difference(set2)) 
print(set1 ^ set2)  # 对称差为{1, 3, 5, 7, 8, 10}. 或者使用symmetric_difference方法:print(set1.symmetric_difference(set2));或者print((set1 | set2) - (set1 & set2))

3) 复合赋值运算

集合的交集、并集、差集运算还可以跟赋值运算一起构成复合赋值运算

set1 = {1, 3, 5, 7}
set2 = {2, 4, 6}
# 将set1和set2求并集再赋值给set1
set1 |= set2  # 也可以通过set1.update(set2)来实现
print(set1)    # {1, 2, 3, 4, 5, 6, 7}
set3 = {3, 6, 9}
# 将set1和set3求交集再赋值给set1
# 也可以通过set1.intersection_update(set3)来实现
set1 &= set3
print(set1)    # {3, 6}

4) 比较运算

两个集合可以用==和!=进行相等性判断,如果两个集合中的元素完全相同,那么==比较的结果就是True,否则就是False。如果集合A的任意一个元素都是集合B的元素,那么集合A称为集合B的子集,即对于$\forall {a} \in {A}$,均有${a} \in {B} ,则 {A} \subseteq {B}$,A是B的子集,反过来也可以称B是A的超集。如果A是B的子集且A不等于B,那么A就是B的真子集。Python为集合类型提供了判断子集和超集的运算符,其实就是我们非常熟悉的<和>运算符.

set1 = {1, 3, 5}
set2 = {1, 2, 3, 4, 5}
set3 = set2
# <运算符表示真子集,<=运算符表示子集
print(set1 < set2, set1 <= set2)    # True True
print(set2 < set3, set2 <= set3)    # False True
# 通过issubset方法也能进行子集判断
print(set1.issubset(set2))      # True

# 反过来可以用issuperset或>运算符进行超集判断
print(set2.issuperset(set1))    # True
print(set2 > set1)              # True


学习网址

免费评分

参与人数 3吾爱币 +3 热心值 +3 收起 理由
夜雨微澜 + 1 + 1 用心讨论,共获提升!
鎏年_逝水 + 1 + 1 用心讨论,共获提升!
颜良文丑 + 1 + 1 用心讨论,共获提升!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

niluelf 发表于 2024-3-21 11:23
这个笔记可以~督促自己~
 楼主| ENVI22 发表于 2024-3-21 16:32
chaleaoch 发表于 2024-3-21 12:56
NB啊现在我才发现吾爱左侧有目录...耍了这么长时间吾爱我才知道.

谢谢~我也发现有目录
eredef1368 发表于 2024-3-21 16:52
 楼主| ENVI22 发表于 2024-3-21 19:26
eredef1368 发表于 2024-3-21 16:52
不错不错 祝愿楼主早日放弃

听我说谢谢你~(有个问题:一系列的笔记在吾爱破解发布的话,是发布多个帖子还是在一个帖子里进行多次回复)
eredef1368 发表于 2024-3-21 21:03
ENVI22 发表于 2024-3-21 19:26
听我说谢谢你~(有个问题:一系列的笔记在吾爱破解发布的话,是发布多个帖子还是在一个帖子里进行多次回 ...

系列的话可以在这一个帖子里更新。
甜萝 发表于 2024-3-21 21:07
发在技术区更合适
xingwenzhiyuan 发表于 2024-3-21 21:34
楼主坚持住吧。祝福天天学习,进步
 楼主| ENVI22 发表于 2024-3-22 11:41

2.常用数据结构之字典

当我们要保存一个人的信息,包括姓名、年龄、体重、单位地址、家庭住址、本人手机号、紧急联系人手机号等信息,之前学过的列表、元组和集合都不是最理想的选择。

person1 = ['王大锤', 55, 60, '科华北路62号', '中同仁路8号', '13122334455', '13800998877']   #列表
person2 = ('王大锤', 55, 60, '科华北路62号', '中同仁路8号', '13122334455', '13800998877')   #元组
person3 = {'王大锤', 55, 60, '科华北路62号', '中同仁路8号', '13122334455', '13800998877'}   #集合

集合肯定是最不合适的,因为集合有去重特性,如果一个人的年龄和体重相同,那么集合中就会少一项信息;同理,如果这个人的家庭住址和单位地址是相同的,那么集合中又会少一项信息。另一方面,虽然列表和元组可以把一个人的所有信息都保存下来,但是当你想要获取这个人的手机号时,你得先知道他的手机号是列表或元组中的第6个还是第7个元素;当你想获取一个人的家庭住址时,你还得知道家庭住址是列表或元组中的第几项。总之,在遇到上述的场景时,列表、元组、集合都不是最合适的选择,我们还需字典(dictionary)类型,这种数据类型最适合把相关联的信息组装到一起,并且可以帮助我们解决程序中为真实事物建模的问题。

2.1 创建字典

2.1.1 {}字面量语法

在Python中创建字典可以使用{}字面量语法,这一点跟上一讲的集合是一样的。但是字典的{}中的元素是以键值对的形式存在的,每个元素由:分隔的两个值构成,:前面是键,:后面是值,代码如下所示。

xinhua = {
    '麓': '山脚下',
    '路': '道,往来通行的地方;方面,地区:南~货,外~货;种类:他俩是一~人',
    '蕗': '甘草的别名',
    '潞': '潞水,水名,即今山西省的浊漳河;潞江,水名,即云南省的怒江'
}
print(xinhua)
person = {
    'name': '王大锤', 'age': 55, 'weight': 60, 'office': '科华北路62号',
    'home': '中同仁路8号', 'tel': '13122334455', 'econtact': '13800998877'
}
print(person)

用字典来保存一个人的信息远远优于使用列表或元组,因为我们可以用:前面的键来表示条目的含义,而:后面就是这个条目所对应的值。

2.1.2 内置函数dict
# dict函数(构造器)中的每一组参数就是字典中的一组键值对
person = dict(name='王大锤', age=55, weight=60, home='中同仁路8号')
print(person)    # {'name': '王大锤', 'age': 55, 'weight': 60, 'home': '中同仁路8号'}

# 可以通过Python内置函数zip压缩两个序列并创建字典
items1 = dict(zip('ABCDE', '12345'))
print(items1)    # {'A': '1', 'B': '2', 'C': '3', 'D': '4', 'E': '5'}
items2 = dict(zip('ABCDE', range(1, 10)))
print(items2)    # {'A': 1, 'B': 2, 'C': 3, 'D': 4, 'E': 5}
2.1.3 生成式语法
items3 = {x: x ** 3 for x in range(1, 6)}
print(items3)     # {1: 1, 2: 8, 3: 27, 4: 64, 5: 125}

想知道字典中一共有多少组键值对,仍然是使用len函数;如果想对字典进行遍历,可以用for循环,但是需要注意,for循环只是对字典的键进行了遍历。

person = {'name': '王大锤', 'age': 55, 'weight': 60, 'office': '科华北路62号'}
print(len(person))    # 4
for key in person:
    print(key)

2.2 字典的运算

2.2.1 成员运算
person = {'name': '王大锤', 'age': 55, 'weight': 60, 'office': '科华北路62号' }
# 检查name和tel两个键在不在person字典中
print('name' in person, 'tel' in person)    # True False
# 通过age键将person字典中对应的值修改为25
if 'age' in person:
    person['age'] = 25
2.2.2 索引运算
# 通过索引操作向person字典中存入新的键值对
person['tel'] = '13122334455'
person['signature'] = '你的男朋友是一个盖世垃圾,他会踏着五彩祥云去迎娶你的闺蜜'
print('name' in person, 'tel' in person)    # True True
# 检查person字典中键值对的数量
print(len(person))    # 6
# 对字典的键进行循环并通索引运算获取键对应的值
for key in person:
    print(f'{key}: {person[key]}')

2.3 字典的方法

# 字典中的值又是一个字典(嵌套的字典)
students = {
    1001: {'name': '狄仁杰', 'sex': False, 'age': 22, 'place': '山西大同'},
    1002: {'name': '白元芳', 'sex': False, 'age': 23, 'place': '河北保定'},
    1003: {'name': '武则天', 'sex': True, 'age': 20, 'place': '四川广元'}
}

# 使用get方法通过键获取对应的值,如果取不到不会引发KeyError异常而是返回None或设定的默认值
print(students.get(1002))    # {'name': '白元芳', 'sex': False, 'age': 23, 'place': '河北保定'}
print(students.get(1005))    # None
print(students.get(1005, {'name': '无名氏'}))    # {'name': '无名氏'}

# 获取字典中所有的键
print(students.keys())      # dict_keys([1001, 1002, 1003])

# 获取字典中所有的值
print(students.values())    # dict_values([{...}, {...}, {...}])

# 获取字典中所有的键值对
print(students.items())     # dict_items([(1001, {...}), (1002, {....}), (1003, {...})])

# 对字典中所有的键值对进行循环遍历
for key, value in students.items():
    print(key, '--->', value)

# 使用pop方法通过键删除对应的键值对并返回该值
stu1 = students.pop(1002)
print(stu1)             # {'name': '白元芳', 'sex': False, 'age': 23, 'place': '河北保定'}
print(len(students))    # 2
# stu2 = students.pop(1005)    # KeyError: 1005
stu2 = students.pop(1005, {})
print(stu2)             # {}

# 使用popitem方法删除字典中最后一组键值对并返回对应的二元组
# 如果字典中没有元素,调用该方法将引发KeyError异常
key, value = students.popitem()
print(key, value)    # 1003 {'name': '武则天', 'sex': True, 'age': 20, 'place': '四川广元'}

# 如果这个键在字典中存在,setdefault返回原来与这个键对应的值
# 如果这个键在字典中不存在,向字典中添加键值对,返回第二个参数的值,默认为None
result = students.setdefault(1005, {'name': '方启鹤', 'sex': True})
print(result)        # {'name': '方启鹤', 'sex': True}
print(students)      # {1001: {...}, 1005: {...}}

# 使用update更新字典元素,相同的键会用新值覆盖掉旧值,不同的键会添加到字典中
others = {
    1005: {'name': '乔峰', 'sex': False, 'age': 32, 'place': '北京大兴'},
    1010: {'name': '王语嫣', 'sex': True, 'age': 19},
    1008: {'name': '钟灵', 'sex': True}
}
students.update(others)
print(students)      # {1001: {...}, 1005: {...}, 1010: {...}, 1008: {...}}

跟列表一样,从字典中删除元素也可以使用del关键字,在删除元素的时候如果指定的键索引不到对应的值,一样会引发KeyError异常,具体的做法如下所示:

person = {'name': '王大锤', 'age': 25, 'sex': True}
del person['age']
print(person)    # {'name': '王大锤', 'sex': True}

2.4 字典的应用

例子1:输入一段话,统计每个英文字母出现的次数。

sentence = input('请输入一段英文: ')
counter = {}
for ch in sentence:
    if 'A' <= ch <= 'Z' or 'a' <= ch <= 'z':
        counter[ch] = counter.get(ch, 0) + 1  # get() 返回指定键的值,如果键不在字典中返回默认值 None 或者设置的默认值。如果键在字典中就返回对应的值(即使设置了默认值,返回也和默认值无关)
for key, value in counter.items():
    print(f'字母{key}出现了{value}次.')

例子2:在一个字典中保存了股票的代码和价格,找出股价大于100元的股票并创建一个新的字典。

stocks = {
    'AAPL': 191.88,
    'GOOG': 1186.96,
    'IBM': 149.24,
    'ORCL': 48.44,
    'ACN': 166.89,
    'FB': 208.09,
    'SYMC': 21.29
}
stocks2 = {key: value for key, value in stocks.items() if value > 100}
print(stocks2)

总结

Python程序中的字典以键值对的形式保存数据,再通过键索引对应的值。这是一种非常有利于数据检索的数据类型。!!!注意,字典中的键必须是不可变类型,字典中的值可以是任意类型。



学习网址
Emoei_PG 发表于 2024-3-22 12:00
eredef1368 发表于 2024-3-21 16:52
不错不错 祝愿楼主早日放弃

你的签名不简单啊   这么多集美们
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-13 21:40

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表