写在前面的话:这是以前的存货,课件和代码字体没有修改最大,所以建议电脑观看视频,下节课开始视频代码和课件文本字体都会变大,方便观看。
-
掌握条件判断和流程控制
-
掌握条件运算符 ==,>,<,in
-
掌握 if/else/elif 判断
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判断
现代编程语言都支持的两种基本流程控制结构,分支结构和循环结构:
-
分支结构:实现根据条件来选择性地执行某段代码
-
循环结构:实现根据循环条件重复执行某段代码
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
-
条件判断是程序流程控制的重要方法
-
数据类型的比较==,>,<是最常用的方法
-
判断数据是否在列表中,判断某关键词是否出现在网页内容中,在漏洞复现中使用
-
条件判断占据了代码中几乎所有的逻辑判断
-
数据类型的比较==,>,<是最常用的方法
-
条件判断符if/else/elif必须要熟悉格式和用法,记住引号和第二行要4个空格
-
多个if elif条件判断,可以把最有可能先发生的条件放到前面写,这样可以减少程序判断的次数,提高效率
变量
Python作为静态语言,他的变量与其他语言的变量是不一样的。比如java中的变量你需要提前申明,定义数据类型,然后交给虚拟机执行。但是在python中的变量,本质上是一个指针,举个例子。
1a = 1
python会做如下步骤:
-
在内存中申请一块内存空间存储一个int类型的对象
-
生成int类型的对象
-
最后把变量a指向数字1上面
-
可以把多个变量指向同一个对象
所以说,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做了两步:
-
在100这个对象上,会有一个计数器,因为定义变量a=100,那么计数器的数值为1
-
然后又让b指向了a,本质上是b的指针也指向了100,这个时候100这个对象的计数器的数值为2
-
也就是说目前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安全开发之条件判断流程控制【C04课】
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论