标签:访问 类对象 改变 ext mysq 作用域 -- 参数 安装
装饰器
一.函数是第一类对象:指函数可以当做数据传递
1.可以被引用 如:x=1 ,y=x
def foo(x,y):
print(x,y)
f=foo
f(1,2)
2.可以当做函数的参数传入
def foo():
print(‘ad djf‘)
def bar(yy):
#print(yy)
yy()
bar(foo)
ad djf
3.可以当做函数的返回值
def foo():
print(‘ad djf‘)
def bar():
return foo
f=bar()
f()
ad djf
4.可以当做容器类型的元素
def foo():
print(‘ad djf‘)
def bar():
return foo
l=[foo,bar]
print(l[0]())
二:
函数的嵌套调用:
def foo(x,y):
if x > y:
return x
else:
return y
def foo1(a,b,c,d):
res1=foo(a,b)
res2=foo(res1,c)
res3=foo(res2,d)
return res3
函数的嵌套定义:
def f1():
def f2():
print(‘oooo‘)
def f3():
print(‘33333‘)
f3()
f2()
f1()
三.名称空间:存放变量的名字和值绑定关系的地方
分类:
1.内置名称空间
python解释器内置的名字,len,print等
2.全局名称空间
执行ptyhon文件时生效
文件级别定义的名字
3.局部名称空间
函数调用时生效,调用结束失效
函数内部定义的名字
加载顺序:内置--->全局--->局部
访问名字顺序:局部--->全局--->内置
x=2 #全局
def f1():
x=1 #局部
def f2():
print(x)
f2()
f1()
全局作用域(全局范围):内置名称空间和全局名称空间的名字,全局存活,全局有效。查看全局名称空print(globals())
局部作用域(局部范围):局部名称空间的名字,临时存活,局部有效。查看局部名称print(localse())
x=2
def f1():
global x #指定要改变的全局名称
x=1
f1()
x=2
def f1():
x=3
def f2():
nonlocal x #指定要改变上次层的局部名称
x=0
f2()
f1()
四.
1.打破函数层级限制来调用函数
def foo():
def iner():
print(‘2222‘)
return iner
f=foo()
2.函数的作用域关系是在函数定义阶段就已经固定了,与调用位置无关。
x=1
def foo():
x=2
def iner():
print(x)
return iner
f=foo()
def bar():
x=3
f()
bar()
五.
闭包函数:
1.定义在函数内部的函数
2.该函数的函数体代码包含对外部作用域(而不是全局作用域)名字的引用
3.通常将闭包函数用return返回,然后可以再任意使用
def foo():
x=2
y=3
def iner():
print(x,y)
return iner
f=foo()
print(f.__closure__[0,1].cell_contents)
爬页面:
import requests #安装pip3 install requests
def get(url):
requests.get(url)
if response.status_code == 200:
print(response.text)
get(‘https://www.baidu.com‘)
闭包传参:
def foo(url)
def get():
requests.get(url)
if response.status_code == 200:
print(response.text)
return get
baidu=foo(‘https://www.baidu.com‘)
baidu()
六:
1.开放封闭原则:对扩展开放,对修改是封闭的
2.装饰器:装饰它人,器值的是任意可调用的对象,现在的场景装饰器-->函数,被装饰的对象也是-->函数
原则:1.不会修改装饰器的源代码,2.不修改装饰器对象的调用方式
装饰器的目的:在遵循1,2的前提下为被装饰的对象添加上新功能。
例:
inport time
def index():
time.sleep(3)
print(‘welecome to index‘)
def foo(goso):
#goso=index #最原始的index
def line():
start=time.time() #time.time()时间戳,以单位
goso() #原始的index()
stop=time.time()
print(‘run time is %s‘ %(stop-start))
retuen line
index=foo(index)
index() #foo()
装饰器的语法:在被装饰对象的上方单独的一行写上,@装饰器名
inport time
def foo(goso):
#goso=index #最原始的index
def line():
start=time.time() #time.time()时间戳,以单位
goso() #原始的index()
stop=time.time()
print(‘run time is %s‘ %(stop-start))
retuen line
@foo #等于index=foo(index),自动调用下面的函数名,把值赋给装饰器,并且变量名与调用函数名相同。
def index():
time.sleep(3)
print(‘welecome to index‘)
index() #foo()
1.如果函数理由返回值:
inport time
def foo(goso):
#goso=index #最原始的index
def line():
start=time.time() #time.time()时间戳,以单位
res=goso() #原始的index()
stop=time.time()
print(‘run time is %s‘ %(stop-start))
return res
return line
@foo #等于index=foo(index),自动调用下面的函数名,把值赋给装饰器,并且变量名与调用函数名相同。
def index():
time.sleep(3)
print(‘welecome to index‘)
retuen 1
res=index()
print(res)
2.传参:
inport time
def foo(goso):
#goso=home #最原始的index
def line(*args,**kwargs):
start=time.time() #time.time()时间戳,以单位
res=goso(*args,**kwargs) #原始的index()
stop=time.time()
print(‘run time is %s‘ %(stop-start))
return res
return line
@foo #等于index=foo(index),自动调用下面的函数名,把值赋给装饰器,并且变量名与调用函数名相同。
def home(name):
print(‘welecome %s to home pagc‘ %nam )
home(‘abc‘)
3.有参装饰器:
import time
def auth2(engin=‘file‘):
def foo(goso):
def line(*args,**kwargs):
if engin == ‘file‘:
name=input(‘name>>:‘).strip()
password=input(‘password>>:‘).strip()
if name == ‘bili‘ and password == ‘123456‘:
print(‘login successful‘)
return line(*args,**kwargs)
else:
print(‘login err‘)
elif engin == ‘mysql‘:
print(‘myql auth‘)
elif engin = ‘ldap‘:
print(‘ldap auth‘)
else:
print(‘engin not exists‘)
return line
return foo
@auth2(engin=‘mysql‘)
def index():
time.sleep(3)
print(‘welecome to index‘)
retuen 1
res=index(‘egon‘)
print(res)
4.wraps:
inport time
def foo(goso):
@wraps(goso)
def line(*args,**kwargs):
start=time.time() #time.time()时间戳,以单位
res=goso(*args,**kwargs)
stop=time.time()
print(‘run time is %s‘ %(stop-start))
return res
return line
@foo
def index():
‘‘‘注释‘‘‘
time.sleep(3)
print(‘welecome to index‘)
retuen 1
print(help(index))
标签:访问 类对象 改变 ext mysq 作用域 -- 参数 安装
原文地址:http://blog.51cto.com/13399294/2158283