函数三
接着上一次说到的*args和**kwargs的混合使用,这次我们来讲讲它们分别的应用场景:
*的应用场景:(*后面都是打散)
def sum2(*args): #args=(1,2,3) res=0 for num in args: res+=num return res print(sum2(1,2,3,4.5,6)) 电脑输出: 21
**的应用场景:(**是引入字典,输出的是字典形式)
def auth(name,pwd,**kwargs): print(name) print(pwd) print(kwargs) auth(name='egon',pwd='123',group='group1') 电脑输出: egon 123 {'group':'group1'}
今天的内容:
一:函数嵌套;在函数内定义其他函数
def func1(): print('from func1') def func2(): print('from func2') print(func2) func2() func1() 电脑输出: from func1 <function func1.<locals>.func2 at 0x105a99620> from func2
注意:首先电脑输出的第二东西叫做内存地址;
我们先来看看这个首先我们输出的是def func1函数下面的第一条指令也就是print(‘from func1’)
其次我们再输出def func2函数下面的指令,但func2不加括号意思是打印上一个指令的函数内存地址
最后我们打印出‘from func2’
我们再来一个:你们猜猜结果是什么?
def f1() print('f1') def f2(): print('f2') def f3(): print('f3') f3() f2() f1()
答案:
f1
f2
f3
二,名称空间与作用域
1、名称空间:存放名字与值绑定关系的地方
x=111111111
我们先存放1,1专门有地方存。然后,我们再存放x和存放1的地址,绑定关系。
2、名称空间分为三类:
1、内置名称空间
存放python解释器自带的名字,内置的名字在打开python解释器时失效,解释器关闭则失效。
比如:
for
input
这些有作用的词
2、全局名称空间:文件级别的名字,在执行文件的时候生效,在文件结束或者删除失效
(定头写的都是全局,缩紧的都是局部的)
x=1
def func():
pass
if 10>3:
y=333
while True:
a=333
3.局部名称空间
存放函数内定义的名字(函数的参数以及函数内的名字都存放在局部名称空间)
在函数调用时临时生效,不调用就失效。
def func(x):
4、加载顺序:内置名称空间---》全局名称空间-----》局部名称空间
查找名字:局部名称——》全局名称空间——》内置名称空间
5作用域:发挥作用的范围
全局作用域:包含的是内置名称空间与全局名称空间的名字。
特点:
1.在任何位置都能够访问到
2.该范围内的名字会伴随程序的整个生命周期
局部作用域:包含的是局部名称空间的名字
特点:
1.只有在函数内使用
2.调用函数时生效,调用结束失效
三:函数对象:
1、可以被引用
f=func
2、func可以当作参数传给x
def func(): print('from func') def bar(): print(x) x() bar(func)
电脑输出:
<function func at 0x1018dde18>
from func
3、func还可以当作返回值
def fun(): print('from func') def bar(x): return x res=bar(func) print(res) res() 电脑输出; <function fun at 0x1072b6e18> from func
4、可以当中容器类型的元素
def auth(): print('登录。。。') def register(): print('注册。。。') def search(): print('查看。。。') def interactive(): print('互动。。。') l=[auth,reigster,search,interactive] print(l)
注意:要用列表形式
四;闭包函数:
def outter(): x=2 def inner(): print('from inner',x) return inner f=outter() print(f) x=1111111111. (这里x不会干扰到上面的x,因为函数在定义阶段就规定死了) f()
了解:
为函数体传值的方式
方式一:
import requests def get(url): response=requests.get(url) if response.status_code== 200: print(response.text) get('https://www.baidu.com')
方式二:
import requests import time def outter(url): #url='https://www.baidu.com' # url='https://www.baidu.com' def get(): response=requests.get(url) if response.status_code == 200: print(response.text) return get baidu=outter('https://www.baidu.com') python=outter('https://www.python.org') baidu()