Python安全开发之条件判断流程控制【C04课】

  • A+
所属分类:安全开发

Python安全开发之条件判断流程控制【C04课】

  


写在前面的话:这是以前的存货,课件和代码字体没有修改最大,所以建议电脑观看视频,下节课开始视频代码和课件文本字体都会变大,方便观看。


           



1
课程目标


  1. 掌握条件判断和流程控制

  2. 掌握条件运算符 ==,>,<,in

  3. 掌握 if/else/elif 判断


2
核心知识



2-1


     掌握条件运算符

判断是否相同

==和is是条件判断符,用作判断两个变量的值是否一样。

可以用作判断数字是否相等,字符串是否一致,列表的内容是否一致等等

但是==仅仅是判断数据的值是否一样,is不仅判断数据的值还判断数据是否指向同一个对象。

1a = 1
2if a == 1:
3    print('A等于1')
4运行结果>>>A等于1

判断大于小于

大于>,小于< 用作判断数字大小是否一致,>=这是大于等于

判断数据是否在列表中

使用 in 可以判断数据是否在列表(适用于集合,元组,字典)中

1a = [1,2,3,4]
2b = 1
3if b in a:
4    print('A在B中')
5运行结果>>>A在B中



2-2


    掌握if/else判断

现代编程语言都支持的两种基本流程控制结构,分支结构和循环结构:

  1. 分支结构:实现根据条件来选择性地执行某段代码

  2. 循环结构:实现根据循环条件重复执行某段代码

if/else是python流程控制结构的主要模块,作用为条件判断。下节课将会讲解while循环和 break 和 continue 控制程序的循环结构。



2-3


    判断的格式

if 判断

其判断的格式如下:

1if 判断表达式:
2    运行代码

比如:

1if 1<2:
2    print('1的确小于2')
3运行结果>>>1的确小于2
4
5if 1>2:
6    print('1的确小于2')
7运行结果>>>
8

如果判断表达式的条件正确,则会执行下面的代码,否者不会执行

if else 判断

其判断的格式如下:

1if 判断表达式:
2    运行代码1
3else:
4    运行代码2

比如:

 1if 1<2:
2    print('1的确小于2')
3else:
4    print('哈哈哈哈哈哈哈')
5运行结果>>>1的确小于2
6
7if 1>2:
8    print('1的确小于2')
9else:
10    print('哈哈哈哈哈哈哈')
11运行结果>>>哈哈哈哈哈哈哈

if else elif 判断

1if 判断表达式1:
2    运行代码1
3elif 判断表达式2:
4    运行代码2
5elif 判断表达式3:
6    运行代码3
7else:
8    运行代码4

比如

1a = 1
2if a>1:
3    print('A大于1')
4elif a <1:
5    print('A小于1')
6else:
7    print('A等于1')
8运行结果>>>A等于1


3
应用场景


  1. 条件判断是程序流程控制的重要方法

  2. 数据类型的比较==,>,<是最常用的方法

  3. 判断数据是否在列表中,判断某关键词是否出现在网页内容中,在漏洞复现中使用

  4. 条件判断占据了代码中几乎所有的逻辑判断



4
总结归纳


  1. 数据类型的比较==,>,<是最常用的方法

  2. 条件判断符if/else/elif必须要熟悉格式和用法,记住引号和第二行要4个空格

  3. 多个if elif条件判断,可以把最有可能先发生的条件放到前面写,这样可以减少程序判断的次数,提高效率


5
拓展知识


变量

Python作为静态语言,他的变量与其他语言的变量是不一样的。比如java中的变量你需要提前申明,定义数据类型,然后交给虚拟机执行。但是在python中的变量,本质上是一个指针,举个例子。

1a = 1

python会做如下步骤:

  1. 在内存中申请一块内存空间存储一个int类型的对象

  2. 生成int类型的对象

  3. 最后把变量a指向数字1上面

  4. 可以把多个变量指向同一个对象

所以说,python中变量其实是一个指针,指向不同的对象。

is 与 ==

在深入类与对象-上中提起到is与==的区别:

这一开头就介绍了类的三大特性,类型(type),值(value),身份(id)

1is:只要id相同,就返回True
2==:只要value相同,就返回True

比如 1 == 1.0就返回True,1 is 1.0 就返回False。

注意了,这里变量都是不可变的类型,数字,字符串,浮点数都是不可变的(这里其实是python的小整形小字符串指向的都是同一个指针),所以使用is他们的id都是一样的,并且你定义一个类,实例化给a和b(不传入参数),他们的id也是一样的,如果实例化后传入参数,即使参数一样的,那他们的id也是不一样的。

但是对于list,set,dict这种可变的数据类型来说id也是不一样的。

判断字符串开头结尾

一般来说,此方法应用于那些判断处理文件,或者对文本处理做判断。
判断字符串的开头使用startswith(),判断字符串的结尾使用endswith()方法。说教无益,上代码。

1data_str='langzi'
2if data_str.startswith('l'):
3    print True
4if data_str.endswith('i'):
5    print True

运行结果:

1True
2True

当然括号内还可以加上元组,只要元组内的元素某一个元素满足要求就返回True。

1if data_str.endswith(('l','2','i')):
2    print True

运行结果:

1True

垃圾回收

定义

python中的垃圾回收是以引用计数为主,标记-清除和分代收集为辅。

引用计数:python在内存中存储每个对象的引用计数,如果计数变成0,该对象就会消失,分配给该对象的内存就会释放出来。

标记-清除:一些容器对象,比如说list、dict、tuple、instance等可能会出现引用循环,对于这些循环,垃圾回收器会定时回收这些循环(对象之间通过引用(指针)连在一起,构成一个有向图,对象构成这个有向图的节点,而引用关系构成这个有向图的边)。

分代收集:python把内存根据对象存活时间划分为三代,对象创建之后,垃圾回收器会分配它们所属的代。每个对象都会被分配一个代,而被分配更年轻的代是被优先处理的,因此越晚创建的对象越容易被回收。

讲解

python的垃圾回收算法是引用计数为主,举个例子:

1a = 100
2b = a

这里python做了两步:

  1. 在100这个对象上,会有一个计数器,因为定义变量a=100,那么计数器的数值为1

  2. 然后又让b指向了a,本质上是b的指针也指向了100,这个时候100这个对象的计数器的数值为2

  3. 也就是说目前100这个对象的有两个变量指向他,计数器值是2

一开始在dict中介绍过,删除字典的某一对键值使用 del dict['user'],那么删除其他变量也是一样的,使用del即可。这个时候删除a

1del a

这个时候100的计数器的值为1了,但是这个时候python并没有对100回收,因为之后当计数器的数值为0的时候才会回收100,这个时候你del a后,使用print(b)是没问题的,因为这个时候100这个对象还没有完全清除。

在一开始的魔法函数中,有__del__这个魔法函数,你定义的类中使用这个魔法函数,当你的类实例化运行完成后,需要回收垃圾的时候,就会调用这个del魔法函数,做你想要完成的事情。

内存池机制

Python提供了对内存的垃圾收集机制,但是它将不用的内存放到内存池而不是返回给操作系统。

1,Pymalloc机制。为了加速Python的执行效率,Python引入了一个内存池机制,用于管理对小块内存的申请和释放。

2,Python中所有小于256个字节的对象都使用pymalloc实现的分配器,而大的对象则使用系统的malloc。

3,对于Python对象,如整数,浮点数和List,都有其独立的私有内存池,对象间不共享他们的内存池。也就是说如果你分配又释放了大量的整数,用于缓存这些整数的内存就不能再分配给浮点数。

往期推荐

对象引用与垃圾回收

Python 解释器

Python 一切皆对象

Python中常见需求与完成方法






本文始发于微信公众号(安全研发):Python安全开发之条件判断流程控制【C04课】

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: