函数2

函数

image

1.关键字介绍

# global关键字
x=1
def fun():
     x=2
fun()
print(x)  # 1

# x=1
l = [1,2]
def fun():
    # 使用global关键字声明要在局部名称空间里对全局变量x进行修改
    # global x
    # x=2
    l.append(33)
# fun()
# print(x)  # 2
fun()
print(l)  # [1, 2, 33]
'''当在局部要对全局的变量进行修改时:
    若为不可变类型,则需要用global关键字声明
    若为可变类型,则可以直接进行操作
'''
# nonlocal关键字
def fun():
    x=1
    def index():
        x=2
    index()
    print(x)
fun()  # 1

def fun():
    # x=1
    l = [1,23]
    def index():
        # 使用nonlocal关键字声明要在内部局部名称空间对外部名称空间里的变量x进行修改
        # nonlocal x
        # x=2
        l.append(33)
    index()
    print(l)
# fun()  # 2
fun()  # [1, 23, 33]
'''当在内部局部空间要对外部局部空间的变量进行修改时:
    若为不可变类型,则需要用nonlocal关键字声明
    若为可变类型,则可以直接进行操作
'''
# global关键字是在局部空间来改变全局空间的变量
x=1
def fun():
    global x
    x=100


fun()
print(x)
# nonlocal是在内部局部空间对外部局部空间里的变量进行修改
def fun():
    x = 1
    def index():
        nonlocal x
        x=100

    index()
    print(x)
fun()

image

2.函数对象

image

# 函数对象简单来说就是函数名
# 1、函数名可以被其他变量名引用(函数名可以赋值给其他变量)
def fun():
    print('这是一个函数')

a = fun  # 函数名一旦加括号就是函数调用
a()  # 实际上就是在调用fun函数
# 2、函数名可以作为其他函数的参数
def fun():
    print('这是一个函数')
def index(x):
    a=x()
index(fun)  # 这是一个函数
def fun(x):
    a = x()

def index():
    name = 'jason'
    print(name)

fun(index)  # jason
# 3、函数可以作为其他函数的返回值
def fun():
    def index():
        print('这是一个函数')
    return index()
fun()  # 这是一个函数
# 4、函数名可以作为元素存放在可变数据类型里
def register():
    print('这是注册界面')
def login():
    print('这是登录界面')
def modify():
    print('这是修改界面')
def delete():
    print('这是删除界面')


function_dic = {'1': register,
                '2': login,
                '3': modify,
                '4': delete
                }
while True:
    print('''
        1,注册界面
        2,登陆界面
        3,查看界面
        4,删除界面
    ''')
    choice = input('请输入你想要操作的功能编号')
    if choice in function_dic:
        fun_name = function_dic.get(choice)
        fun_name()
    else:
        print('功能暂未开放')

image

3.函数的嵌套调用

# 函数的嵌套调用
# 函数体内部调用其他函数
# 比大小
def fun(x,y):
    if x > y:
        return x
    return y
def max_fun(x,y,z,m):
    res1 = fun(x,y)
    res2 = fun(z,res1)
    res3 = fun(m,res2)
    return res3
a = max_fun(1,2,3,4)  # 当return有返回值时,必须要有变量接收才有效果
print(a)

4.函数的嵌套定义

# 函数的嵌套定义
# 函数体内部定义其他函数
# 可以将其他函数隐藏起来,只暴露一个简单的接口
def fun():
    def register():
        print('这是注册界面')
    def login():
        print('这是登录界面')
    def modify():
        print('这是修改界面')
    def delete():
        print('这是删除界面')
    function_dic = {'1': register,
                    '2': login,
                    '3': modify,
                    '4': delete
                    }
    while True:
        print('''
            1,注册界面
            2,登陆界面
            3,查看界面
            4,删除界面
        ''')
        choice = input('请输入你想要操作的功能编号:')
        if choice in function_dic:
            fun_name = function_dic.get(choice)
            fun_name()
        else:
            print('功能暂未开放')

fun()

image

5.闭包函数

# 闭包函数
# 闭:定义在函数内的函数
# 包:在函数的局部名称空间使用了外部函数局部名称空间里的参数
# 只有同时满足上诉两个条件才能被叫做闭包函数
def fun(msg):
    # m = msg
    def index():
        print('这是闭包函数',msg)
    return index
a = fun('快快乐乐每一天')
a()  # 这是闭包函数 快快乐乐每一天
a()  # 这是闭包函数 快快乐乐每一天
a()  # 这是闭包函数 快快乐乐每一天
a()  # 这是闭包函数 快快乐乐每一天
a()  # 这是闭包函数 快快乐乐每一天
# 函数传参的两种方式
# 方式一,通过定义函数时填入参数,每次定调用时传入实参进行调用
def fun(name):
    print(f'我的名字是{name}')

fun('jason')  # 我的名字是jason
# 方式二:通过闭包函数传参,且传过一次值以后,以后可以重复调用函数来输出相同的内容
def fun(name):
    def msg():
        print(f'我的名字是{name}')
    return msg

a = fun('jason')
a()  # 我的名字是jason
def fun(x,y,z):
    print(x,y,z)
list = [1,2,3]
fun(*list)
# 利用闭包函数爬取网站
import requests
url = 'https://www.baidu.com'
def outer(url):
    def get_content():
        # 爬取百度首页数据
        res = requests.get(url)
        if res.status_code == 200:
            with open(r'xxx.html','wb') as f:
                print('*'.center(30))
                f.write(res.content)
    return get_content

res = outer('https://www.baidu.com')
res()
res()
res()
res1 = outer('https://www.jd.com')
res1()
res1()
res1()
res1()

image

6.初见装饰器

# 装饰器
# 装饰器就是利用闭包函数的特点来完成的
# 器:就是工具的意思
# 装饰:在不改变装饰对象的内部代码和原有的调用方式的前提下,给被装饰对象增加功能
# 且该功能可扩展性强,在遇到有相同附加功能的函数时,都可以采用调用装饰器可以大大减少代码量,提高代码的可读性
# 装饰器原则
# 开放封闭原则
# 开放:对扩展开放
# 封闭:对修改封闭
# 例,计算代码运行所需要的时间
def index():
    print('from index')


index()
# 统计index函数的执行时间


import time

print(time.time())  # 1637036293.0609405
# 获取的结果叫时间戳(运行代码的那一刻距离1970-1-1所经历的秒数)
time.sleep(3)  # 让程序原地等待3秒
print('睡饱了')


def index():
    time.sleep(3)
    print('from index')


# 统计index函数的执行时间
# 在函数运行之前统计一次时间
start_time = time.time()
index()
# 在函数运行完毕之后再次统计
end_time = time.time()
# 计算差值
print(end_time - start_time)

image

posted @ 2021-11-16 21:16  PyLy  阅读(121)  评论(0)    收藏  举报

念两句诗

入我相思门,知我相思苦,长相思兮长相忆,短相思兮无穷极。
【唐代】李白