Python课程回顾(day11)

函数补充

命名关键词参数:在定义函数时,在*args与**kwargs之间的参数就称为命名关键词参数,这种参数的特点就是必须要按照key=value的形式去传值,否则会报错。

函数对象

1.函数是第一类对象,指的就是函数的内存地址可以像一个变量值一样去引用

def foo():
    print('from foo')
f=foo                 将foo赋值给f
print(f)              内存地址与foo是一样的
f()                   可直接调用f

2.变量值可以当做一个参数传给另外一个函数

def bar(x):
    print(x)
x=11111         
bar(x)       此处将x的值传递给函数bar

3.变量值可以当做函数的返回值

def func(x):
    return x
f=func(12345)  f后的变量值可以直接当做函数func的返回值
print(f)

4.变量值可以当做容器类型的元素

即变量值可以是以元组、列表、字典类型的元素

使用函数对象的特性,可以取代多分支的if判断

def register():
    print('注册....')
def login():
    print('登录....')
def pay():                             (定义函数功能)
    print('支付....')
def transfer():
    print('转账....')
func_dic={
    '1':register,
    '2':login,                         将函数对象以字典形式存放   不能加括号,加括号代表直接调用函数的功能
    '3':pay,
    '4':transfer
}
while True:
    print("""
    0 退出
    1 注册
    2 登录
    3 支付
    4 转账
    """)
    choice=input('请输入你的操作: ').strip()
    if choice == '0':
break if choice not in func_dic: print(‘输入的指令不存在') continue func_dic[choice]() 因为字典中的value就是一个个函数对象,所以此处取到value就是取到了函数体所以要加括号
choice是用户要选择的数字,数字就是字典中的key

  

函数的嵌套与调用

函数的嵌套与调用:顾名思义就是在一个函数中又调用了其他的函数

def max2(x,y):
    if x > y:
        return x
    else:
        return y
def max4(a,b,c,d):
    res1=max2(a,b)    调用函数中max2的返回值进行函数max4的操作
    res2=max2(res1,c)
    res3=max2(res2,d)
    return res3

函数的嵌套定义:即在函数定义的过程中又在函数体内定义了另外一个函数

def func():
    def foo():      在函数体类定义新的函数
        print('from foo')
    print(foo)
    foo()           要单纯调用foo函数只能在函数foo平级下调用
    x=1
    print(x)
func()              要调用函数体内的函数先调用最外层函数

名称空间与作用域(zzzz)

在了解名称空间之前我们需要回顾之前的一个遗留问题,就是我们的变量。我们使用变量的时候都知道的是,在内存中开辟了一个空间将变量值放了进去,而这个值就与变量名形成了绑定关系,那么我们的变量名呢?究竟放在了哪里?

一.名称空间相关

1.名称空间(Namespaces):指的就是存放名字与值的内存地址绑定关系的地方   (x = 内存地址,再通过内存地址找到值本身)

2.名称空间的分类:

内置名称空间:存放的是python解释器自带的名字

       由python解释器的启动产生,也由python解释器的关闭而销毁

全局名称空间:即在顶级(行首)定义的名字

                        执行python程序时产生,python程序执行完毕后自动销毁

局部名称空间:在函数内定义的名字

       在函数调用时临时产生,在函数调用完毕后自动销毁

三种名称空间产生的先后顺序是  内置名称空间----->全局名称空间----->局部名称空间

x=0
def f1():
    x=1
    def f2():
        x=2
        def f3():
            x=3
            print(x)    查找名字则会首先在当前所在的位置一层层的向上查找,即若上一层没有就再上一层,直至全局名称空间
        f3()
    f2()
f1()

二.作用域相关

作用域指的就是作用范围,作用域也分为两大类

全局作用域:包含内置与全局名称空间的名字,特点是:全局存活,全局有效

局部作用域:包含局部名称空间的名字,特点是临时存活,局部有效

强调!!!!:作用域关系是在函数定义阶段就固定死的,与调用位置无关

def f1():
    print(xxx)
xxx=111            函数f1的返回值就是xxx=111

def f2():
    xxx=222        尽管在此处更改的xxx的值 但是在定义xxx的时候就已经固定死了
    f1()           在此处调用函数f1不会影响xxx的值
f2()

闭包函数

闭包函数的定义:闭包函数指的就是定义在一个函数内部的函数,并且该内部函数包含对外层函数名字的引用

def outter():
    x=1
    def inner(): 
        print('from inner',x)   x在此处就引用了外层的x=1的值
    return inner                返回的值就是x=1
f=outter()                      若有其他函数需要调用inner的值不可以直接调用,只能调用outter,所以在此处给outter赋了一个变量名f
def foo():
    x=111111111111111111111111111111111111
    f()                         在此处虽然调用了inner也更改了x的值,但是根据作用域关系x已经固定了所以不可改变
foo()

为函数体传值的两种方式

1.直接以参数的形式传入

def foo(name):
    print('hello %s' %name)     使用%s用于接收用户要传入的值

foo('egon')
foo('egon')                     用户输入的参数会传到函数foo里
foo('egon')

2.使用闭包函数形式传入

def outter(name):
    name='egon'                定义name
    def foo():
        print('hello %s' %name)从上层name取值赋值给%s
    return foo

f=outter('egon')               转换后直接调用新的变量名f
f()
f()
f()

 

 

扩展:爬虫

pip3 install requests              
问题   实现爬虫功能
import requests                     导入系统
def get():
    response=requests.get(url)
    if response.status_code == 200:   条件
        print(response.text)

解决方案一:
def get(url):
    response=requests.get(url)
    if response.status_code == 200:
        print(response.text)

get('https://www.baidu.com')
get('https://www.baidu.com')          需要重复输入网址
get('https://www.baidu.com')

解决方案二:

def outter(url):
    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')     给函数名传参
cnblogs=outter('https://www.cnblogs.com')

baidu()                                    简化调用
cnblogs()

  

posted @ 2018-09-26 18:31  BlackLinks  阅读(115)  评论(0编辑  收藏  举报