# 查看所有关键词
import keysword
keyword.kwlist
'''
# 逻辑与 或 非 and or not
优先级:not and or
x and y 如果 x 为 False 、空、0,返 回 x,否则返回 y
x or y 如果 x 为 False、 空、0,返回 y,否则返回x
not x 如果 x 为 False、 空、0,返回 True,否则返回False
# 判断 与 循环
if elif else
is in
for while break continue
# 函数
def lambda
pass return yied
# 异常处理
try except finally raise assert
# 导入模块 包
import from
# 重命名
as
# 变量
global nonlocal
# 类
class
# 删除
del
# 上下文管理
with
'''
一、关键词raise
关键字raise是用来抛出异常的,一旦抛出异常后,后续的代码将无法运行。 这实际上的将不合法的输出直接拒之门外,避免黑客通过这种试探找出我们程序的运行机制,从而找出漏洞,获得非法权限。
基础使用
try:
s = None
if s is None:
print "s 是空对象"
raise NameError #如果引发NameError异常,后面的代码将不能执行
print len(s) #这句不会执行,但是后面的except还是会走到
except TypeError:
print "空对象没有长度"
s = None
if s is None:
raise NameError
print 'is here?' #如果不使用try......except这种形式,那么直接抛出异常,不会执行到这里
触发异常
我们可以使用raise语句自己触发异常
raise语法格式如下:
raise [Exception [, args [, traceback]]]
语句中 Exception 是异常的类型(例如,NameError)参数标准异常中任一种,args 是自已提供的异常参数。
最后一个参数是可选的(在实践中很少使用),如果存在,是跟踪异常对象。
二、关键词yield
yield的功能类似于return,但是不同之处在于它返回的是生成器。
生成器
生成器是通过一个或多个yield表达式构成的函数,每一个生成器都是一个迭代器(但是迭代器不一定是生成器)。
如果一个函数包含yield关键字,这个函数就会变为一个生成器。
生成器并不会一次返回所有结果,而是每次遇到yield关键字后返回相应结果,并保留函数当前的运行状态,等待下一次的调用。
由于生成器也是一个迭代器,那么它就应该支持next方法来获取下一个值。
# 通过`yield`来创建生成器
def n():
for i in range(2):
yield i
for i in n():
print(i)
# 输出:0,1
def n():
print('1')
yield 2
print('3')
h = n() # yield 制作出的生成器
print(h.send(None))
print(h.__next__()) # 1,2
print(h.__next__()) # 3 报错
# 通过列表来创建生成器
[i for i in xrange(10)]
next()分开执行代码(python2用next(),python3用__next__());
h.next()调用后,n()开始执行,直到遇到yield 2,因此输出结果:
当我们再次调用h.next()时,会继续执行,直到找到下一个yield表达式,由于后面没有yield了,因此会拋出异常:
其实next()和send()在一定意义上作用是相似的,区别是send()可以传递yield表达式的值进去;
而next()不能传递特定的值,只能传递None进去。因此,.next() 和 .send(None) 作用可以理解为是一样的。