安全作业(5)
python知识总结
1、闭包
定义:
python中的闭包从表现形式上定义(解释)为:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure).这个定义是相对直白的,好理解的,不像其他定义那样学究味道十足(那些学究味道重的解释,在对一个名词的解释过程中又充满了一堆让人抓狂的其他陌生名词,不适合初学者)。下面举一个简单的例子来说明。
>>>def addx(x):
>>> def adder(y): return x + y
>>> return adder
>>> c = addx(8)
>>> type(c)
<type 'function'>
>>> c.__name__
'adder'
>>> c(10)
18
结合这段简单的代码和定义来说明闭包:
如果在一个内部函数里:adder(y)就是这个内部函数,
对在外部作用域(但不是在全局作用域)的变量进行引用:x就是被引用的变量,x在外部作用域addx里面,但不在全局作用域里,
则这个内部函数adder就是一个闭包。
2、序列
一、序列是字符串法得到一个范围内的元素的集合
—都可以通过索引得到每一个元素
—默认索引值总是从零开始
—可以通过切片的方法得到一个范围内的元素的集合
—有很多共同的操作符(重复操作符、拼接操作符、成员关系操作符)
二、Python针对序列有非常多的内置函数ersed(),enumerate(), zip()等等。
list(), tuple(), str(), len(), max(), min(), sum(), sorted(), reversed(),enumerate(), zip()等等。
注:在Python 中 sorted 是内置函数(BIF), 而 sort() 是列表类型的内置方法(函数) list.sort()。
前者可以作用于序列的任意一种类型,甚至是字典排序,后者只能对列表类型排序。
(1 ) 列表(list):
\1. list 是处理一组有序项目的数据结构,即你可以在一个列表中存储一个序列的项目。
列表中的项目应该包括在方括号中,这样Python 就知道你是在指明一个列表。一旦你创建了一个列表,你可以添加、删除或是搜索列表中的项目。由于你可以增加或删除项目,我们说列表是可变的数据类型,即这种类型是可以被改变的。
列表根据列表中的元素可以简单地分为三类:普通(同一数据类型)、混合(混合数据类型)、空列表。
列表一些很常用的内置方法:append() , extend() , insert() , remove() , del , pop() , count() , index() , reverse() , sort()等等。这些内置方法的参数和用法都很简单,只需说明一个,sort 函数:sort([*, key=None, reverse=None]),注意,在Python3中,第一个参数为不可变(排序的算法默认为归并排序),无法传入其他的实参,第二个参数代表参加排序的关键字,可以采用lambda函数:
L = [('b',2),('a',1),('c',3),('d',4)]
L.sort(key=lambda x:x[1])
L
[('a', 1), ('b', 2), ('c', 3), ('d', 4)]
第三个参数reverse有两个值可选,默认False为从小到大排序,设为True为从大到小排序。三个参数都是可选的。
- 很多操作符也可以用于列表,如比较操作符,逻辑操作符(and or not),‘+’拼接操作符(只能用于列表间的拼接不能用于添加元素相当于extend),’*‘重复操作符,
成员关系操作符(in/not in)。注意操作符的用法和运算规则。
-
列表同样可以采用切片(slice)操作,用法规则几乎和字符串的完全相同。
-
注意,y = x[:] 通过切片操作将列表x的元素全部拷贝给y,如果简单的把x赋值给y:y = x,y和x还是指向同一个列表,并没有产生新的副本。Python里的变量名其实就相当于贴标签。
(2)元组(tuple):
1.元组用来将多样的对象集合到一起。元组和列表十分类似,只不过元组和字符串一样是不可变的,即你不能修改元组。
元组通过圆括号中用逗号分割的项目定义。
元组通常用在使语句或用户定义的函数能够安全地采用一组值的时候,即被使用的元组的值不会改变。
- 注意,在元组最关键的其实不是圆括号,而是’,‘号。特别的,如果Python中只有一个元素,一定要写成(a,),记住下面两个例子:
a = (3), type(a) = int ; b = 3, 4, 5 type(b) = tuple。可以看出元组中逗号是关键,甚至可以不要括号,事实上确实不是必须的。
-
对于上文提到的可以作用于列表的操作符同样可以作用于元组。
-
因为元组是不可变的,但是如果你确实需要”改变“元组的元素,可以考虑采用拼接的方法,如:
L = ('I','love','you') L = L[:1] + ('really',) +L[1:] >>> L ('I', 'really', 'love', 'you')
注意,这里的实质并不是”改变“元组,元组本身是不可变的毫无疑问。这里的实质只是通过拼接构造了一个新的元组,然后把 ‘L’ 这个标签贴到了新的元组上面,旧的元组依然存在,且保持不变。(当然适当的时机Python的垃圾回收机制会回收掉它)
(3)字符串(string):
-
这里重提字符串主要是作为序列,了解它的一些奇葩的内置方法。
-
这里必须要说的两个最常用的字符串的内置方法:
join(sub),以字符串作为分隔符,插入参数sub字符串中所有的字符中间。
format():其实就相当于C语言中的格式化输出。参数有两种,一种是位置参数,一种是关键字参数。
3、字典
字典是一种无序的、可变的序列,他的元素是以键值对的形式存储,而列表和元组都是有序的序列,他们的元素在底层都是挨着存储的。
1.字典的特征
通过键而不是通过索引来读取元素
字典是任意数据类型的无序集合
字典是可变的,并且可以任意嵌套
字典中的键必须唯一
字典中的键必须不可变
使用fromkeys()方式创建字典:
dictname = dict.fromkeys(list,value=None)—list表示字典中所有键的列表,value表示默认值,如果不写就是为空值
访问字典,命令格式为:
dictname[key]----方括号中的键是必须存在的,如果不存在会报错