一、什么是命名关键字参数?
格式: 在*后面参数都是命名关键字参数。
特点:1、约束函数的调用者必须按照Kye=value的形式传值。
2,、约束函数的调用者必须用我们指定的Key名。
def auth(*args,name,pwd):print(name,pwd)
auth(pwd='213',name='egon')defregister(name,age):print(type(name),type(age))
register(123,[1,2,3])
###以上输出:
egon 213
二、函数的嵌套
1、函数的嵌套调用:在函数内又调用了其他函数
defmax2(x,y):if x >y:returnxelse:returnydefmax3(x,y,z):
res1=max(x,y)
res2=max(res1,z)returnres2print(max3(88,99,100))
###以上输出:
100
2、函数的嵌套定义:在函数内又定义其他函数。
deffunc1():print('from func1')def func2(): #func2=内存地址
print('from func2')print(func2) #.func2 at 0x0000024907A098C8>func2()
func2()
func2()
func1()
###以上输出:
from func2
from func2
from func2
三、函数的名称空间
1、名称空间:存放名字与值绑定关系的地方
x=888888888
deffunc():pass
2、名称空间分为三类
(1)内置名称空间:存放python解释器自带的名字,在解释器启动时就生效,解释器关闭则失效。
(2)全局名称空间:文件级别的名字,在执行文件的时候生效,在文件结束或者在文件执行期间被删除则失效。
x=1
deff1():deff2():print(x)
f2()
f1()if 10 > 3:
y=33333
whileTrue:
xxxxx=123123123
###以上输出:
1
(3)局部名称空间:存放函数自定义的名字(函数的参数以及函数内的名字都存放与局部名称空间),在函数调用时临时生效,函数结束则失效。
注意:
加载顺序:内置名称空间-------->>全局名称空间------->>>局部名称空间
查找名字:局部名称空间-------->>全局名称空间------->>>内置名称空间
deff1():#len=1
deff2():#len=2
print(len)
f2()
f1()
###以上输出:
global
3、作用域
全局作用域:包涵的是内置名称空间与全局名称空间的名字。
特点:
(1)在任何位置都能够访问的到
(2)该范围内的名字会伴随程序整个生命周期
局部作用域:包含的是局部名称空间的名字
特点:
(1)只在函数内使用
(2)调用函数时生效,调用结束失效
四、函数对象
1、函数在python中是第一类对象
(1)可以被引用
x=1y=xdefbar():print('from bar')
f=bar
f()
###以上输出:
from bar
(2)可以当做参数传入
x=1
deffunc(a):print(a)
func(x)
###以上输出:
1
(3)可以当做函数的返回值
#代码(1)
x=1
deffoo():returnx
res=foo()print(res)
###以上输出:
1
代码(2)
defbar():print('from bar')def foo(func): #func=
return func #return
#print(bar)
f=foo(bar) #f=#print(f)
f()
###以上输出:
from bar
(4)可以当做容器类型的元素
x=1l=[x,]print(l)defget():print('from get')defput():print('from put')
l=[get,put]#print(l)
l[0]()
###以上输出:
[1]
from get
注意:
1、 func可以被引用
f=func
2、func可以当做参数传给x
3、func还可以当做返回值
4、可以当做容器中类型的元素
函数查询登录功能的引用:
defauth():print('请登录:')defreigster():print('注册:')defsearch():print('查看:')deftransfer():print('转账')defpay():print('支付')
dic={'1':auth,'2':reigster,'3':search,'4':transfer,'5':pay
}definteractive():whileTrue:print('''1 认证
2 注册
3 查看
4 转账
5 支付''')
choice= input('请输入编号:').strip()if choice indic:
dic[choice]()else:print('非法操作')
interactive()
五、闭包函数
闭:指的是定义在函数内部的函数
作用域关系,在函数定义阶段就规定死了,与调用位置无关
defoutter():
x=2
definner():#x=1
print('from inner',x)returninner
f=outter() #f=inner
deffoo():
x=1111111111111111111111111111f()
foo()
###以上输出:
from inner 2
1、闭包函数:
(1)定义在函数内部的函数
(2)并且该函数包含对外部函数作用域中名字的引用,该函数就称为闭包函数
了解:
为函数体传值的方式
方式一:将值以参数的形式的传入
利用爬虫获取网站的源代码:
importrequests:defget(url):
response=requests.get(url)if response.status_code == 200:print(response.text)
get('https://www.baidu.com')
方式二
importrequestsimporttimedef outter(url): #url='https://www.baidu.com'
#url='https://www.baidu.com'
defget():
response=requests.get(url)if response.status_code == 200:print(response.text)returnget
baidu=outter('https://www.baidu.com')
python=outter('https://www.python.org')
baidu()print('=====================>')
time.sleep(3)
baidu()