python对函数回归 python 回归( 四 )


强类型:有强制的类型定义,你有一个整数,除非显示的类型转换,否则绝不能将它当作一个字符串(例如直接尝试将一个整型和一个字符串做+运算);
因此,为了更加优雅的使用add函数,我们需要在执行+运算前,对a和b进行参数检查 。这时候装饰器就显得非常有用:
import logging
logging.basicConfig(level = logging.INFO)
def add(a, b):
return a + b
def checkParams(fn):
def wrapper(a, b):
if isinstance(a, (int, float)) and isinstance(b, (int, float)):#检查参数a和b是否都为整型或浮点型
return fn(a, b)#是则调用fn(a, b)返回计算结果
#否则通过logging记录错误信息 , 并友好退出
logging.warning("variable 'a' and 'b' cannot be added")
return
return wrapper#fn引用add,被封存在闭包的执行环境中返回
if __name__ == "__main__":
#将add函数对象传入 , fn指向add
#等号左侧的add,指向checkParams的返回值wrapper
add = checkParams(add)
add(3, 'hello')#经过类型检查,不会计算结果,而是记录日志并退出
注意checkParams函数:
首先看参数fn,当我们调用checkParams(add)的时候 , 它将成为函数对象add的一个本地(Local)引用;
在checkParams内部 , 我们定义了一个wrapper函数,添加了参数类型检查的功能,然后调用了fn(a, b) , 根据LEGB法则,解释器将搜索几个作用域,并最终在(Enclosing层)checkParams函数的本地作用域中找到fn;
注意最后的return wrapper , 这将创建一个闭包,fn变量(add函数对象的一个引用)将会封存在闭包的执行环境中,不会随着checkParams的返回而被回收;
当调用add = checkParams(add)时 , add指向了新的wrapper对象 , 它添加了参数检查和记录日志的功能,同时又能够通过封存的fn,继续调用原始的add进行+运算 。
因此调用add(3, 'hello')将不会返回计算结果,而是打印出日志:
chiyu@chiyu-PC:~$ python func.py
WARNING:root:variable 'a' and 'b' cannot be added
有人觉得add = checkParams(add)这样的写法未免太过麻烦,于是python提供了一种更优雅的写法 , 被称为语法糖:
@checkParams
def add(a, b):
return a + b
这只是一种写法上的优化,解释器仍然会将它转化为add = checkParams(add)来执行 。
6. 回归问题
def addspam(fn):
def new(*args):
print "spam,spam,spam"
return fn(*args)
return new
@addspam
def useful(a,b):
print a**2+b**2
首先看第二段代码:
@addspam装饰器,相当于执行了useful = addspam(useful) 。在这里题主有一个理解误区:传递给addspam的参数,是useful这个函数对象本身,而不是它的一个调用结果;
再回到addspam函数体:
return new 返回一个闭包,fn被封存在闭包的执行环境中,不会随着addspam函数的返回被回收;
而fn此时是useful的一个引用,当执行return fn(*args)时,实际相当于执行了return useful(*args);
最后附上一张代码执行过程中的引用关系图 , 希望能帮助你理解:
python线性回归有哪些方法线性回归:
设x,y分别为一组数据,代码如下
import matplotlib.pyplot as plt
import numpy as np
ro=np.polyfit(x,y,deg=1) #deg为拟合的多项式的次数(线性回归就选1)
ry=np.polyval(ro,x) #忘记x和ro哪个在前哪个在后了 。。。
print ro #输出的第一个数是斜率k,第二个数是纵截距b
plt.scatter(x,y)
plt.plot(x,ry)
【python对函数回归 python 回归】python对函数回归的介绍就聊到这里吧,感谢你花时间阅读本站内容 , 更多关于python 回归、python对函数回归的信息别忘了在本站进行查找喔 。

推荐阅读