函数三

接着上一次说到的*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解释器时失效,解释器关闭则失效。

比如:

print

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()

 

posted @ 2018-03-28 19:18  Ryansuperwa  阅读(180)  评论(0编辑  收藏  举报