多重嵌套和跳出
嵌套
循环的嵌套,靠缩进控制,如果是list要注意索引是否超出。
定义的嵌套,如有返回值要注意返回值的定义,如是封装的对象要实例化才能用
闭包:在一个外函数中定义了一个内函数,内函数里运用了外函数的临时变量,并且外函数的返回值是内函数的引用。这样就构成了一个闭包。
(转)关于函数名的一个解释说明,以inner和inner()为例:
inner 其实通俗的理解他就是一个函数的名字,这个名字指向一个函数,当后面没有小括号的时候,它可以被传递,被赋值,但是不会去执行。
inner()加上(),就是告诉程序,通过inner 名字找到这个函数,然后执行这个函数
#循环的嵌套
a=[1,2,3]
b=[4,5,6]
c=[7,8,9]
#用tab缩进好像有问题,所以我用空格
for i in a:
print(a[i-1],end='')#如果是i的话就会报错
for j in range(1,4):
print(b[j-1],end='')
for k in range(1,4):
print(c[k-1])
else:
print(1)
#定义的嵌套
def line_fun(a,b):
def line(x):
print(x)
return a*x+b#定义一个y=ax+b的直线
return line
y=line_fun(2,1)#定义a,b
print(dir(y))
y2=y(1)#实例化line,给x赋值
print(y2,'y2 is',dir(y2))
#等同于下面这种形式
x=1
def line_fun(a,b):
def line(x):
print(x)
return a*x+b
return line(x)
y=line_fun(2,1)
print(dir(y))
#y2=y(1)
print(y,'y2 is',dir(y))
详细说明:https://www.jianshu.com/p/d20e42254a38
跳出
break:中断,只跳一层循环或控制流
continue:只进一层循环或控制流
try except(finally) :异常捕获跳出,不用的话就是直接报错。finally的话语句会执行一次。
return:返回,有返回值的跳出一层或控制流。
raise:抛出异常,作用域内raise后面的语句不会执行,可以单独用,
默认抛出RuntimeError异常,也可以加异常类的名字(加描述),还可以和try except 结合起来用,不过结合用的话如果except抛出的异常和raise异常类型不一致会出问题。(这个内容看了下特别多。。。)
更多:http://c.biancheng.net/view/2360.html
https://www.cnblogs.com/mingmingming/p/11254596.html
https://www.cnblogs.com/ggzhangxiaochao/p/9002847.html
else:条件间接跳出,以for…else为例:其中else块中的语句将在for循环完整执行过之后才会被执行,如果for循环被break,则else块将不会被执行。
flag:变量间接跳出,设置一个flag,当循环中定义的变量flag等于设定值时跳出。
另程序运行中只会抛出一个异常
#break,continue,else
for i in range(5):
for j in range(5):
for k in range(5):
if i == j == k == 2:
break
else:
print(i, '----', j, '----', k)
else: # 上面那个else执行完成后执行这个else1
continue#跳出1
print('nouse1')
print('break1')
break # break1
print('nouse2')
else: # else1执行完成后执行这个else2
continue#跳出2
print('nouse3')
print('break2')
break # break2
print('nouse4')
#return
def test():
for i in range(5):
for j in range(5):
if i == j == 2:
return
else:
print i, '----', j
test()
#try except,raise
try:
print ('正在运行try块...')
raise #raise 单用
print ('不再运行...')#这个不会print
except Exception as e: #这里如果指定异常类如TypeError,则会报错
#RuntimeError: No active exception to reraise
print ('正在运行except块...')
#raise 接异常类型
def test():
try:
print ('正在运行try块...')
raise SyntaxError('引发指定异常...')#这里可以直接用SyntaxError,加的括号里面是描述
print ('不再运行...')
except TypeError as e:
print ('对类型无效的操作...',e)
except ValueError as e:
print ('传入无效的参数...',e)
except SyntaxError as e:#这个生效
print ('语法错误...',e)
#上面的raise 和except 异常类型匹配的才输出,即另2个永远不会触发
test()
#结果:语法错误... 引发指定异常...
#raise 自定义异常和衍生异常
#自定义,带参数
def functionName( level ):
if level < 1:
raise Exception("Invalid level!", level)
#自定义2
class Test:
def custom(self):
try:
aaa
except Exception as e:
print('出现异常:', e)
raise CustomException('触发自定义异常~')
def test():
T = Test()
try:
T.custom()
except CustomException as e:
print('test函数捕获异常;', e)
test()
#出现异常: name'aaa' is not defined
#test函数捕获异常; 触发自定义异常
#衍生异常
class FooError(ValueError):
pass
def foo(s):
n=int(s)
if n==0:
raise FooError('无效的值:%s'%s)
return 10/n
a=FooError
print(a.__base__.__name__)#父类名称
print(a.foo(0))
#flag
flag=1
for i in range(1,5):
if flag==4:
break #没有else,换成continue有else
print(i)
flag+=1
else:
print('flag=', flag,'i=',i)
异常类型
更多:https://www.runoob.com/python/python-exceptions.html
异常名称 描述
BaseException 所有异常的基类
SystemExit 解释器请求退出
KeyboardInterrupt 用户中断执行(通常是输入^C)
Exception 常规错误的基类
StopIteration 迭代器没有更多的值
GeneratorExit 生成器(generator)发生异常来通知退出
StandardError 所有的内建标准异常的基类
ArithmeticError 所有数值计算错误的基类
FloatingPointError 浮点计算错误
OverflowError 数值运算超出最大限制
ZeroDivisionError 除(或取模)零 (所有数据类型)
AssertionError 断言语句失败
AttributeError 对象没有这个属性
EOFError 没有内建输入,到达EOF 标记
EnvironmentError 操作系统错误的基类
IOError 输入/输出操作失败
OSError 操作系统错误
WindowsError 系统调用失败
ImportError 导入模块/对象失败
LookupError 无效数据查询的基类
IndexError 序列中没有此索引(index)
KeyError 映射中没有这个键
MemoryError 内存溢出错误(对于Python 解释器不是致命的)
NameError 未声明/初始化对象 (没有属性)
UnboundLocalError 访问未初始化的本地变量
ReferenceError 弱引用(Weak reference)试图访问已经垃圾回收了的对象
RuntimeError 一般的运行时错误
NotImplementedError 尚未实现的方法
SyntaxError Python 语法错误
IndentationError 缩进错误
TabError Tab 和空格混用
SystemError 一般的解释器系统错误
TypeError 对类型无效的操作
ValueError 传入无效的参数
UnicodeError Unicode 相关的错误
UnicodeDecodeError Unicode 解码时的错误
UnicodeEncodeError Unicode 编码时错误
UnicodeTranslateError Unicode 转换时错误
Warning 警告的基类