一、装饰器
想添加功能,但是不改变原来的逻辑结构。所以在前面写了一个函数A,然后在被装饰的函数B前面写@A,这样就将B作为一个参数传入A,就可以在实现B的同时,T添加A的功能。
常用格式:
def deco(func):
def wrapper(*args,**kwargs):
res = func(*args,**kwargs)
return res
return wrapper
https://www.jb51.net/article/165063.htm
*表示:接收任意多个参数并自动解析为元组,元组就是不能改变的。
>>> def d(a,b,c):
print(a,b,c)
>>> d(1,2,3)
1 2 3
>>> a=[1,2,3]
>>> b=[1,2,3]
>>> c=[1,2,3]
>>> d(a,b,c)
[1, 2, 3] [1, 2, 3] [1, 2, 3]
>>> d(*a)
1 2 3
test(*args):* 的作用其实就是把序列 args 中的每个元素,当作位置参数传进去。比如上面这个代码,如果 args 等于 (1,2,3) ,那么这个代码就等价于 test(1, 2, 3) 。
**表示: 将参数解析为字典。有关键字:键值。
**parameter用于接收类似于关键参数一样赋值的形式的多个实参放入字典中(即把该函数的参数转换为字典)。
字典:{a:b}
>>> def demo(**p):
for i in p.items():
print(i)
>>> demo(x=1,y=2)
('x', 1)
('y', 2)
二、迭代器
可以直接作用于for循环的对象统称为可迭代对象(Iterable)。
可以被next()函数调用并不断返回下一个值的对象称为迭代器(Iterator)。
所有的Iterable均可以通过内置函数iter()来转变为Iterator。
>>> list=[1,2,3,4]
>>> it = iter(list) # 创建迭代器对象
>>> print (next(it)) # 输出迭代器的下一个元素
1
>>> print (next(it))
2
>>>
三、生成器
如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间,在Python中,这种一边循环一边计算的机制,称为生成器:generator。返回迭代函数值,然后下次从暂停位置继续。跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。生成器一次只能产生一个值,这样消耗的内存数量将大大减小,而且允许调用函数可以很快的处理前几个返回值,因此生成器看起来像是一个函数,但是表现得却像是迭代器
在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行。
使用()来定义。例如a=sum(i for i in range(10))
使用yield函数,例如斐波那契数列
>>> def fibs():
a = 0
b = 1
while True:
a, b = b, a + b
yield a
看上去,好像是死循环,因为永远为True,但是这是一个生成器,随时都可以被暂停,只要 yield, 就返回,就暂停了。
我们用一个 for 语句把它打印出来,我们这里设置一下,如果大于100的话,就跳出循环,要不就会一直走下去:
>>> for each in fibs():
if each > 100:
break
print(each, end = ' ')
1 1 2 3 5 8 13 21 34 55 89
这里的for是逼着调用下一个fibs,因为遇到yield就会停止和保存返回数据。
四、labmda表达式
五、列表的切片
就是从列表中取出数值
#group members
groups = ["张三","李四","王五","赵六","老七"];
#print the members range of 0-2
print(groups[0:3]);