python(九)——装饰器、偏函数、变量作用域、异常处理、断言

目录

 

装饰器

简单的装饰器

复杂点的装饰器

偏函数

变量的作用域

异常处理

错误处理的语句:

断言


装饰器

概念:是一个闭包,把一个函数当作参数返回一个替代版的函数,本质上就是一个返回函数的函数

简单的装饰器

def a():
    print("this is hanshu\n")

def b(fun):
    print("************")
    fun()

b(a)

def a():
    print("this is hanshu\n")

def b(fun):
    def k():
        print("************")
        fun()
    return k

f = b(a)
f()

 

复杂点的装饰器

def a(ok):
    print("this is %s\n" %ok)

a('10')

def b(fun):
    def c(ok):
        print('********')
        if ok > 0 :
            ok = 0
        fun(ok)
    return c

a = b(a)
a(10)

python(九)——装饰器、偏函数、变量作用域、异常处理、断言_第1张图片

如果你想使用别人的方法,但你不能修改别人的原码,这时候可以写一个装饰器去修改

还可以在需要被装饰的方法上使用@装饰方法去装饰  相当于a = b(a)

python2.4开始支持使用@符合

def b(fun):
    def c(ok):
        print('********')
        if ok > 0 :
            ok = 0
        fun(ok)
    return c

@b
def a(ok):
    print("this is %s\n" %ok)

a(10)

但是参数不一时需要注意,因为使用了 ok > 0 判断,所有ok的值需要为整型,不能为字符串

def b(fun):
    def c(ok):
        print('********')
        if ok > 0 :
            ok = 0
        fun(ok)
    return c

@b
def a(ok):
    print("this is %s\n" %ok)

a('10')

python(九)——装饰器、偏函数、变量作用域、异常处理、断言_第2张图片

 

偏函数

base=n   将字符串当作n进制来计算,输出结果仍是10进制

print(int('1010',base=10))
print(int('1010',base=8))
print(int('1010',base=2))

 

变量的作用域

作用域:变量可以使用的范围

程序的变量并不是在所有位置都能使用的,访问的权限决定于变量在哪里赋值的

作用域:

  • 全局作用域
  •  局部作用域
  • 内建作用域

 

异常处理

print(3/0)

需求:当程序遇到错误时不让程序结束,让程序继续执行下去

错误处理的语句:

try......except.....else 

格式:

try:

  语句t

except 错误码 as e:

  语句1

except 错误码 as e:

  语句2

........

else:

  语句e

注意:else语句可有可无

作用:用来检测try语句块中的错误,从而让expect语句捕获错误信息并处理

逻辑:当程序执行到try...expect时

  1. 如果当try“语句t”执行出现错误,会匹配第一个错误码,如果匹配的上就执行语句1
  2. 如果try“语句t”执行出现错误,没有匹配的异常,错误将会被提交到上一层的try语句。或者到程序的最上层
  3. 如果当try“语句t”没有出现错误,执行else下的语句e
try:
    print(3/0)
except ZeroDivisionError as e:
    print("除数为0了\n")

try:
   # print(3/0)
    print(n)
except ZeroDivisionError as e:
    print("除数为0了")
except NameError as e:
    print("没有该变量")

使用except而不匹配错误类型,只要程序出现异常就报错

try:
    print(n)
except :
    print("程序出现异常")

 使用except带着多个异常

try:
    print(5 / 0)
except (NameError,ZeroDivisionError):
    print("程序没有变量或出现除数为0")

错误其实是class类,所有的错误都继承自BaseException,所以捕获了该类型的错误还把子类的错误一网打尽

多层调用报错

def fun1(num):
    print(2/num)
def fun2(num):
    fun1(num)
def main():
    fun2(0)
try:
    main()
except (NameError,ZeroDivisionError,BaseException):
    print("程序没有变量或出现除数为0")

try...except...finally...

格式:

try:

  语句t

except 错误码 as e:

  语句1

except 错误码 as e:

  语句2

........

finally:

  语句f

 语句t无论是否出现错误,都将执行语句f

 

断言

断言正确则不会显示断言

def su(a,b):
    assert (b != 0),"b不能为0"
    print(a / b)

su(10,2)
su(10,0)

python(九)——装饰器、偏函数、变量作用域、异常处理、断言_第3张图片

 

 

你可能感兴趣的:(python)