目录
Python:
迭代器:
概念:
实现了迭代协议的对象。
__iter__: 返回对象本身,这个意义在于让调用它的人知道他是一个迭代器
__next__: 返回迭代器的下一个元素,这个是实现迭代真正的过程
如果到迭代器结尾,怎么去知道迭代器结束了,要抛出一个异常:StopIteration
这个用意:for循环的,判断循环结束依靠是否捕获StopIteration异常来判断,如果有这个异常,循环结束,如果没有,循环继续执行
举例:
class MyIterator:
def __init__(self, stop):
self.start = -1
self.stop = stop
def __iter__(self):
return self
def __getitem__(self, item):
return self.start + item + 1
def __next__(self):
self.start = self.start + 1
if self.start < self.stop:
return self.start
else:
raise StopIteration
data = MyIterator(10)
# print(data[0])
for i in data:
print(i)
print(next(data))
print(next(data))
print(next(data))
print(next(data))
//如果要用下标去访问迭代器的话,要实现__getitem__方法
//next(iterator): 本质就是调用__next__
生成器:
yield表达式:yield expression_list(表达式列表)
生成器函数: 定义了一个函数,且函数有使用yield
生成器:执行生成器函数的时候,返回的就是生成器
生成器怎么去执行呢?通过调用某一种方法:send和next
send是生成器内部的方法: 生成器对象.send
next方法:是内置的方法, next(生成器对象)
当你使用某一种方法去启动生成器的时候,执行到什么地方挂起?
是执行yield表达式后挂起, 通过调用某一种方法,第一次启动的时候调用方法注意事项
如果调用send: 生成器对象.send(None)
如果调用next: next(生成器对象)
那么挂起之后,怎么去继续执行?调用某一种方法继续执行
如果要调用send: 生成器对象.send(value),这块儿的value没有空值的限制
如果要调用next: next(对象生成器)
如果没有找到yield语句,抛出异常:StopIteration
生成器就是一个迭代器,意味着他是有结束的时候,结束时候就会抛出StopIteration异常
举例:
'''
列表生成器
'''
# l = []
# for x in range(1,11):
# l.append(x * x)
# print(l)
aa = [i * i for i in range(1, 5)]
print(aa)
结果一次性全部输出
‘【】’和‘()’的差别----------------------------------------------------------------------------------------------------
l = (x * x for x in range(10))
print(next(l))
print(next(l))
print(next(l))
结果一次性只输出一个,调用一次next()才会输出下一个
assert利用蚁剑登录:
方法一:
原理:
PHP 支持可变函数的概念。这意味着如果一个变量名后有圆括号,PHP 将寻找与变量的值同名的函数,并且尝试执行它。可变函数可以用来实现包括回调函数,函数表在内的一些用途。
可变函数不能用于例如 echo,print,unset(),isset(),empty(),include,require 以及类似的语言结构。需要使用自己的包装函数来将这些结构用作可变函数。
assert在php中被认为是一个函数。
方法二:
抓包:
实质是这样的
数字1我们post数据为assert
数字2我们post数据为eval($_POST['nanjing'])
其本质还是assert(eval()),所以可以执行