python可以体现数学中映射概念的是_课时27:集合:在我的世界里,你就是唯一...

本文介绍了Python中的集合数据类型,强调其唯一性和无序性。通过示例展示了如何创建、访问和操作集合,包括去除列表重复元素的方法。还提到了不可变集合frozenset的使用,并给出了相关练习及解答。

目录:

一、字典的表亲:集合

二、创建集合

三、访问集合

四、不可变集合

五、课时27课后习题及答案

**************************

一、字典的表亲:集合

**************************

Python的字典是对数学中映射概念支持的直接体现。字典有个表亲:集合。哦?它们长得很像?

>>> num1 ={}>>>type(num1)

>>> num2 = {1,2,3,4,5}>>>type(num2)

在Python里,如果用大括号括起一堆数字但没有体现映射关系,那么Python就会认为这堆玩意就是个集合。

集合的作用:唯一。举个例子:

>>> num = {1,2,3,4,5,4,3,2,1}>>>num

{1, 2, 3, 4, 5}

大家看到,我们根本就不需要做什么,集合就会帮我们把重复的数据清理掉,这样是不是很方便呢?但要注意的是,集合是无序的,也就是你不能试图去索引集合中的某一个元素:

>>> num[2]

Traceback (most recent call last):

File"", line 1, in num[2]

TypeError:‘set‘ object does not support indexing

***************

二、创建集合

***************

创建集合有两种方法:一种是直接把一堆元素用大括号{ }括起来;另一种是用set()。

>>> set1 = {"小甲鱼","小鱿鱼","小护士","小甲鱼"}>>> set2 = set(["小甲鱼","小鱿鱼","小护士","小甲鱼"])>>> set1 ==set2

True>>>set1

{‘小鱿鱼‘, ‘小护士‘, ‘小甲鱼‘}>>>set2

{‘小鱿鱼‘, ‘小护士‘, ‘小甲鱼‘}

现在要求去除列表[1,2,3,4,5,5,3,1,0]中重复的元素。没学过集合时,可以这样写:

>>> list1 = [1,2,3,4,5,5,3,1,0]>>> temp =list1[:]>>>list1.clear()>>> for each intemp:if each not inlist1:

list1.append(each)>>>list1

[1, 2, 3, 4, 5, 0]

学习了集合后,可以这样干:

>>> list1 = [1,2,3,4,5,5,3,1,0]>>> list1 =list(set(list1))>>>list1

[0,1, 2, 3, 4, 5]

看!知识才是第一生产力。在这里,由于set()创造了的集合内部是无序的,所以再调用list()将无序的集合转换成列表就不能保证原来的列表的顺序了(这里Python好心办坏事,把0放在最前边去了。)所以如果关注列表中元素的前后顺序问题,使用set()这个函数时就要提高警惕啦!

***************

三、访问集合

***************

由于集合中的元素是无序的,所以并不能像序列那样用下标来进行访问,但是可以使用迭代把集合中的数据一个个读取出来:

>>> set1 = {1,2,3,4,5,4,3,2,1,0}>>> for each inset1:print(each,end= ‘ ‘)

01 2 3 4 5

当然也可以使用in或者not in判断一个元素是否在集合中已经存在:

>>> 0 inset1

True>>> "oo" inset1

False>>> "xx" not inset1

True

使用add()方法可以为集合添加元素,使用remove()方法可以删除集合中已知的元素:

>>>set1

{0,1, 2, 3, 4, 5}>>> set1.add(6)>>>set1

{0,1, 2, 3, 4, 5, 6}>>> set1.remove(5)>>>set1

{0,1, 2, 3, 4, 6}

******************

四、不可变集合

******************

有些时候,我们希望集合中的元素具有稳定性,也就是说,像元组一样不能随意的增加或者删除集合中的元素。那么我们可以定义不可变集合,这里使用的是frozenset()函数,没错,就是把元素frozen(冰冻)起来:

>>> set1 = frozenset({1,2,3,4,5})>>>set1

frozenset({1, 2, 3, 4, 5})>>> set1.add(6)

Traceback (most recent call last):

File"", line 1, in set1.add(6)

AttributeError:‘frozenset‘ object has no attribute ‘add‘

*******************************

五、课时27课后习题及答案

*******************************

20180816172421902971.png

20180816172422273103.png

20180816172422580732.png

20180816172422672532.png

20180816172422979185.png

原文:https://www.cnblogs.com/DC0307/p/9488305.html

内容概要:本文详细记录了对一个Android ARM64静态ELF文件中字符串加密机制的逆向分析过程。该ELF文件的所有字符串均被加密,无法通过常规strings命令或IDA直接识别。作者通过分析发现,加密字符串存储在.rodata段,其解密所需信息(包括密文地址、长度和16位密钥)保存在.data.rel.ro段的40字节描述符中。核心解密函数sub_10F408采用自反的双pass流密码算法,结合固定密钥KEY_TERM(由.data段24字节数据计算得出),实现字节级非线性、位置与长度相关的加密。文章还复现了完整的Python解密脚本,并揭示了该保护机制的本质为代码混淆而非强加密,最终成功批量解密全部956条字符串,暴露程序真实行为,如shell命令模板、设备标识篡改、网络重置等操作。此外,文中还提及未启用的自定义壳框架及其反dump设计。; 适合人群:具备逆向工程基础的安全研究人员、二进制分析人员及对ELF保护技术感兴趣的开发者。; 使用场景及目标:①学习ELF二进制中字符串加密的典型实现方式与逆向突破口;②掌握从结构识别、函数追踪到算法还原的完整逆向流程;③理解“绑定二进制”的完整性校验设计及其局限性;④实践编写IDAPython脚本自动化提取与解密敏感数据。; 阅读建议:此资源以实战案例驱动,不仅展示技术细节,更强调逆向思维与验证方法,建议读者结合IDA调试环境,逐步跟随文中步骤进行动态分析与算法验证,深入理解每一步的推理依据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值