首页 > 其他分享 >函数的对象和装饰器概念

函数的对象和装饰器概念

时间:2023-05-29 15:35:12浏览次数:23  
标签:index 函数 对象 res func print 装饰 def

名称空间的作用域

名称空间

作用域:

  变量能够作用的范围

1. 内置的名称空间

  在程序的任何阶段任何位置都可以使用(全局有效)

2. 全局的名称空间

  在程序的任何阶段任何位置都可以使用(全局有效)

3. 局部的名称空间

  在函数内部有效(局部有效)

 

global和nonlocal关键字的使用

global

在函数的内部不能直接修改外部的变量

  1. 在函数的内部修改外部的不可变的数据类型需要使用global关键字声明。

  2. 在函数的内部修改外部的可变类型的数据不需要使用global关键字的声明

name_list = ['kevin', 'jason', 'tank']

def index():
    name_list.append('tony')

index()
print(name_list)  # 111 222

nonlocal

nonlocal的使用:

  1. 在函数内部的局部修改外部的局部的不可变类型的数据使用关键字nonlocal关键字声明

  2. 在函数内部修改外部的局部的可变类型的护具不需要使用关键字nonlocal声明

#######################nonlocals
def outer():
    name_list = ['kevin', 'tank']

    def inner():
        name_list.append('tony')
        print('inner')

    inner()
    print(name_list)  # 1  2  ['kevin', 'tank', 'tony']

outer()

 

函数对象(函数名)

函数名的使用有四种用法

1. 函数名可以当成变量名来使用

def index():  # index它是属于全局的
    print('index')
"""函数名就是函数的内存地址"""
# print(globals())  # 'index': <function index at 0x00000123F32BE310> value值就是函数的内存地址
# print(index)
# index() # 直接调用函数
a = index
a()  # index()

2. 函数名也可以当成函数的实参

def index():
    print('from index')
def func(func_name):
    # func_name----->index
    print('from func')
    func_name() # 相当于是index()
func(index)

3. 函数名也可以当成函数的返回值

def index():
    print('from index')
def func():
    print('from func')
    # return index()  # None
    return index
res=func()  # res是函数的内存地址
res()  # index()
print(res)

4. 函数名也可以当成容器类型的元素

def index():
    print('from index')


# l = [1, 2, 3, index()]
l = [1, 2, 3, index] # [1, 2, 3, <function index at 0x0000021226FCE310>]
print(l)
l[3]()  # 调用index函数

案例:把注册、登录功能封装成函数版本

def register():
    print('register')


def login():
    print('login')


def transfer():
    print('login')


def withdraw():
    print('login')


def shopping():
    print('login')
def shopping1():
    print('login')

func_dict = {
    '1': register,
    '2': login,
    '3': transfer,
    '4': withdraw,
    '5': shopping,
    '6': shopping1
}
while True:
    print("""
        1. 注册功能
        2. 登录功能
        3. 转账功能
        4. 提现功能
        5. 购物功能
    """)
    choice = input('请输入你的选择:').strip()
    if choice in func_dict:
        # func_name = func_dict.get(choice)
        # func_name()
        func_dict.get(choice)()

函数的嵌套调用

函数之间相互调用,函数里面调用函数

# 1. 定义一个函数,功能是比较两个数的大小
def my_max(a, b):
    if a > b:
        return a
    return b

# res = my_max(1, 10)
# print(res)

# 2. 定义一个函数,比较4个数的大小
def many_max(a, b, c, d):
    res = my_max(a, b)  # res是a和b中的最大的
    res1 = my_max(res, c)  # res1就是abc中的最大值
    res2 = my_max(res1, d)  # res2就是abcd中的最大值
    print(res2)
    return res2
ret=many_max(1, 2, 3, 4)
print(ret)

函数的嵌套定义(了解)

# 给外部的用户暴露出来一个接口,告诉他都有什么功能
def all_func(type):
    def login():
        print('login')

    def transfer():
        print('login')

    def withdraw():
        print('login')

    def shopping():
        print('login')

    def shopping1():
        print('login')

    if type == 1:
        login()
    elif type == 2:
        transfer()
    elif type == 3:
        withdraw()
    elif type == 4:
        shopping()


all_func(1)
all_func(2)
all_func(3)

闭包函数

1. 什么是闭包函数?

# 闭:就是函数内部定义函数,至少两层函数
def outer():
    def inner():
        pass
# 包:内部的函数使用外部函数名称空间的名字
'''只有同时满足以上两个条件才能称之为闭包函数'''
# 闭包函数有什么用?使用场景?
# 闭包函数其实是给函数传参的第二种方式!
# 方式1:
# def index(username):
#     print(username)
#
#
# index('kevin')
# 比较两个数的大小---------->使用闭包函数该一下


def outer(a, b):
    # a = 1
    # b = 10

    def my_max():
        if a > b:
            return a
        return b

    return my_max


res=outer(2, 20)  # my_max的内存地址,res----->my_max
print(res())  # my_max()
print(res())  # my_max()
print(res())  # my_max()
res1 = outer(3, 30)
print(res1())
print(res1())
print(res1())
'''一次传值,多次调用'''


# 爬虫:爬取网页上的数据
# 爬取百度首页的数据
import requests # 把你刚才安装的模块导入到我们的py文件中
def outer(url):
    # url = ''
    def get_content():
        res=requests.get(url)
        with open('bbb.html', 'wb') as f:
            f.write(res.content)
    return get_content
# get_content('http://www.baidu.com')
# get_content('http://www.jd.com')


res=outer('http://www.baidu.com') # get_content
res() # get_content()
res() # get_content()
res() # get_content()
res() # get_content()
res() # get_content()
res1 = outer('http://www.jd.com')
res1()
res1()
res1()
res1()
res1()

装饰器(难点、重点)

'''

装饰器这个是十点是我们之前学的:名称空间、闭包函数、函数嵌套调用等知识点汇总而来的知识点。

'''什么是装饰器?

器:就是工具

装饰:给被装饰的对象添加额外的功能

装饰器的核心思想:

  就是在不改变被装饰对象内部的代码和原有调用方式的基础之上再添加额外的功能

# 背景知识
def index():
    print("from index")
index()
# 现在让你统计index函数执行完毕之后的执行时间

# 时间模块
import time  # 内置模块,可以直接拿来使用

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


# 1. 在函数执行之前打印一个时间点
start_time = time.time()
index()

# 2. 在函数执行完毕之后在打印一个时间点
end_time = time.time()

# 3. 两者的差就是函数的执行时间
print("index函数一共执行了:%s秒" % (end_time - start_time))

 

标签:index,函数,对象,res,func,print,装饰,def
From: https://www.cnblogs.com/zfq132/p/17440601.html

相关文章

  • 面向对象设计领域中的参数多态,包含多态,过载多态和强制多态
    参数多态参数多态是指在面向对象编程中,方法的参数可以接受不同类型的对象,并根据实际传递的对象类型来执行不同的操作。它是多态的一种应用形式,通过参数的多态性,可以实现灵活的代码设计和重用。使用场景:当方法需要操作的对象类型不确定时,可以使用多态来接受不同类型的对象,减少......
  • c语言,函数的址传递例子
    编码如下:#include<stdio.h>voidswap(int*x,int*y){inttmp;tmp=*x;*x=*y;*y=tmp;};intmain(){inta=4;intb=5;printf("befer\n");printf("a=%d\n",a);printf("b=%d\n",b);swap(&am......
  • 装饰器模式
    一、定义装饰器模式动态地给一个对象增加一些额外的职责。就增加功能而言,装饰器模式比生成子类更为灵活。二、UML类图三、示例需求:假设开一个奶茶店,奶茶种类繁多,如红豆奶茶,布丁奶茶,珍珠奶茶,红豆珍珠奶茶等,并根据不同配料计算价格,并且根据每个客户的要求,每种奶茶又可以加糖或......
  • MYSQL round()函数
    在mysql中,round函数用于数据的四舍五入,它有两种形式:1、round(x,d) ,x指要处理的数,d是指保留几位小数这里有个值得注意的地方是,d可以是负数,这时是指定小数点左边的d位整数位为0,同时小数位均为0;2、round(x) ,其实就是round(x,0),也就是默认d为0;下面是几个实例1、查询: selectro......
  • MySQL中时间函数NOW()和SYSDATE()的区别
    mysql中日期函数还是比较常用的。主要有NOW()和SYSDATE()两种,虽然都表示当前时间,但使用上有一点点区别。NOW()取的是语句开始执行的时间,SYSDATE()取的是动态的实时时间。因为NOW()取自mysql的一个变量”TIMESTAMP”,而这个变量在语句开始执行的时候就设定好了,因此在整个语句......
  • JacaScript 中函数的参数
    在JavaScript中,函数的参数有以下几种:1.普通参数(PositionalParameters):这是最常见的函数参数类型,定义时在函数括号内指定参数名称即可。调用函数时需要传入相应的参数值,按照定义时的顺序对应传入。例如:```javascriptCopycodefunctiongreet(name,message){con......
  • Hive的用户自定义函数实现步骤与流程
    参考答案:1、如何构建UDF?用户创建的UDF使用过程如下:第一步:继承UDF或者UDAF或者UDTF,实现特定的方法;第二步:将写好的类打包为jar,如hivefirst.jar;第三步:进入到Hive外壳环境中,利用addjar/home/hadoop/hivefirst.jar注册该jar文件;第四步:为该类起一个别名,createtemporaryfunctionmylen......
  • 聊聊Python内函数的参数
    引:基于函数的定义与调用两个阶段,函数的参数也由此分为两块:形式参数和实际参数 形参与实参介绍函数的参数分为形式参数和实际参数,简称形参和实参:形参即在定义函数时,括号内声明的参数,形参本质就是一个变量名,用来接收外部传来的值;实参即在调用函数时,括号内传入的值,值可以是常......
  • JavaScript函数传参原理详解——值传递还是引用传递
    讨论JavaScript的传参原理之前,我们先来看一段曾经让笔者困惑了一段时间的代码vartestA=1;vartestB={};functiontestNumber(example){example=2;}functiontestObj(example){example.test=1;}testNumber(testA);testObj(testB);console.log(testA);//......
  • MyBatis源码之getMapper获取代理对象
    MyBatis源码之getMapper获取代理对象下面这句话意思非常明了,就是通过传入接口类型对象,获取接口代理对象。IUserDaouserDao1=sqlSession1.getMapper(IUserDao.class);具体的过程如下:一、首先,调用SqlSession的实现类DefaultSqlSession的getMapper方法,其实是在该方法内调用con......