python 函数装饰器

列表生成式

通俗理解使用for循环快速生成列表
列表推导式,目的是快速创建一个列表

列表推导式语法
my_list=[value for value in range(1,6)]
print(my_list)

my_list=[value*2 for value in range(1,6)]
print(my_list)

实现双层循环

my_list=[(x,y) for value in range(1,6) for y in range(1,4)]
print(my_list)

实现判断

my_list=[value for value in range(1,6) if value%2==0]
print(my_list)

引用

程序中的数据在内存中的地址,简称内存地址

a=10  #a 存储的是10在内存中的一个地址
b=a   # b存储的是a保存的内存地址,现在a和b存储的内存地址是同一个

id(a)获取的是内存地址是一个十进制的数据
print("a保存的数据内存地址:",id(a))
print("b保存的数据内存地址:",id(b))b
hex(a)获取的是内存地址是一个十六进制的数据
print("a保存的数据内存地址:",hex(a))
print("b保存的数据内存地址:",hex(b))b


#a保存的数据内存地址: 10771808
#b保存的数据内存地址: 10771808
#a保存的数据内存地址: 0xa
#b保存的数据内存地址: 0xa

可变类型和不可变类型

可变类型:可以在原有数据的基础上对数据进行修改:添加,删除,修改数据,修改后内存地址不变
不可变类型:不能在原有数据的基础上对数据进行修改,当然直接赋值一个新值,那么内存地址会发生改变

可变类型:列表,集合,字典,对数据修改后内存地址不变
不可变类型:字符串,数字,元组,不能在原有数据的基础上对数据进行修改

my_list=[1,5,6]
print(my_list,id(my_list))
my_list[0]=2
print(my_list,id(my_list))

[1, 5, 6] 140219880850632
[2, 5, 6] 140219880850632
my_set={4,5}
print(my_set,id(my_set))
my_set.add("55")
print(my_set,id(my_set))

{4, 5} 140671855459240
{'55', 4, 5} 140671855459240

不可变数据

my_str="hello"
print(my_str,id(my_str))
my_str[0]="a"  ##不可以这样使用  TypeError: 'str' object does not support item assignment

my_str="word"
print(my_str,id(my_str))

hello 139830844866040
word 139830844865816

在这里插入图片描述

global 的使用-扩展

定义全局变量
不可变类型的全局变量

g_num=10
print("函数外 ",id(g_num))
def modify():
    global g_num # 变量是不可变类型全局变量,表示要修改全局变量的内存地址
    g_num=1
    print("modify:",g_num)
    print("函数内 :",id(g_num))
modify()

函数外  10771808
modify: 1
函数内 : 10771520

可变类型的全局变量、

g_num=[3,5]
print("函数外 ",id(g_num))
def modify():
	#如果只是修改数据,在这可以不需要加上global
    g_num[0]=3 
    print("modify:",g_num)
    print("函数内 :",id(g_num))
modify()

函数外  139753170761032
modify: [3, 5]
函数内 : 139753170761032

可变类型,加global 表示内存地址要发生改变

g_num=[3,5]
print("函数外 ",id(g_num))
def modify():
    global g_num 
    g_num=[1,2]
    print("modify:",g_num)
    print("函数内 :",id(g_num))
modify()

这是外部全局变量和内部局部变量 ,是两个变量所以地址不同

g_num=[3,5]
print("函数外 ",id(g_num))
def modify():
    g_num=[1,2]
    print("modify:",g_num)
    print("函数内 :",id(g_num))
modify()

公共运算符的操作

“+” 运算符可以完成列表、元组、字符串的拼接


my_list1=[1,3]
my_list2=[5,6]
result=my_list2+my_list1
print(result)


my_tule1=(1,3)
my_tule2=(5,6)
result=my_tule1+my_tule2
print(result)

“*” 运算符,可以完成列表、元组、字符串的复制

my_str="*" *30
print(my_str)

******************************

元组、列表、集合三种可以相互转换

my_list=[1,3]
my_tuple=(4,5,6)
my_set={4,5}

#把列表转成集合
result=set(my_list)
print(result,type(result))

#把元组转成集合
result=set(my_tuple)
print(result,type(result))

#把列表转成元组
result=tuple(my_list)
print(result,type(result))

#把集合转成元组
result=tuple(my_set)
print(result,type(result))

#把集合转列表
result=list(my_set)
print(result,type(result))

#把元组转成列表
result=list(my_tuple)
print(result,type(result))

函数的文档说明

help(函数名) 可以查看函数的功能

偏函数

通俗理解指明函数的参数偏爱某个值


def add(a,b):
      return a+b;     
add(3,5)
add(4,7)

以上两个是我们正常调用,那么如果我们知道一个已知的参数a= 100,我们如何利用偏函数呢?

from functools import partial as pto

def add(a,b):
    print("a",a,"b",b)
    return a+b  
puls = pto(add,b=100)  #更改b的偏好值
puls = pto(add,100)  #更改a的偏好值
result = puls(9)
print(result)

result的结果就是109。

在这里偏函数表达的意思就是,在函数add的调用时,我们已经知道了其中的一个参数,我们可以通过这个参数,重新绑定一个函数,就是pto(add,100),然后去调用即可。

对于有很多可调用对象,并且许多调用都反复使用相同参数的情况,使用偏函数比较合适

——————————————————_————————————
而对于有关键字参数的情况下,就可以不按照原函数的参数位置和个数了。下面再看一个例子,讲的是如何进行不同的进制转换。

from functools import partial
 
bin2dec = partial( int, base=2 )
print bin2dec( '0b10001' )  # 17
print bin2dec( '10001' )  # 17
 
hex2dec = partial( int, base=16 )
print hex2dec( '0x67' )  # 103
print hex2dec( '67' )  # 103

返回函数

def fun1(n):
    def fun2(x):
        return pow(x,n)
    return fun2

pow2=fun1(2)
print(pow2)
print(pow2(9))

<function fun1.<locals>.fun2 at 0x7fddae797950>
81

高阶函数

高阶函数:当一个函数的参数可以接收另外一个函数,或者还可以返回一个函数,那么这个函数就是高阶函数。

闭包函数

再嵌套函数的情况下,内部函数使用了外部函数的变量或者参数,
并把内部函数返回,那么返回的内部函数可以称为闭包

def out():
    print("hello world in foo")
    name="python"
    def inner():
        print(name)
        print("hello world in bar")
    return inner
 
f1=out()
f1()

闭包的应用场景,可以根据参数生成不同的返回参数
通过闭包可以生成不同的函数
闭包的好处可以根据条件生成不同的函数
在这里插入图片描述

装饰器

装饰器本质上就是一个函数,可以给原函数的功能进行扩展,这样的好处是:不改变原函数的定义和调用的前提下操作

def show():
    print("AAAA")
#装饰器--通过闭包完成装饰器
def decorator(new_func):
    def inner():
        print("-"*10)
        new_func()
    #返回的函数是闭包
    return inner

show=decorator(show)
show()

----------
AAAA

使用装饰器可以用下面的函数

    
def decorator(new_func):
    def inner():
        print("-"*10)
        new_func()
    return inner
@decorator #在使用@decorator的时候装饰器的代码就会执行
#等价于show=decorator(show)
def show():
    print("AAAA")
# show=decorator(show)
show()

装饰带有参数的函数

注意每个函数都的传值

def decorator(new_func):
    def inner(num1,num2):
        print("-"*10)
        new_func(num1,num2)
    #
    return inner
@decorator
def show(num1,num2):
   print(num1+num2)
# show=decorator(show)
show(1,2)

有返回值的函数

def decorator(new_func):
    def inner(num1,num2):
        print("-"*10)
        return new_func(num1,num2) #注意这里需要返回函数的值,否者结果为None
    return inner
@decorator
def show(num1,num2):
    print(num1+num2)
	return num1+num2
# show=decorator(show)
result = show(1,2)
print(result)
3

实现了有参数有返回值的函数和有参数返回值为None的函数

def decorator(func):
    def inner(num1,num2):
        print("计算结果如下:")
        return func(num1,num2)
    return inner
@decorator  ##有参数有返回值
def show1(num1,num2):
   result=num1+num2
   return result
# show=decorator(show)
result=show1(1,2)
print(result)

@decorator  #右参数无返回值
def show2(num1,num2):
   print(num1+num2)
# show=decorator(show)
result=show2(1,6)
print(result)

通用的装饰器

def decorator(func):
    def inner(*args,**kwargs):
        print("计算结果如下:")
        #这里是对不定长参数进行拆包
        return func(*args,**kwargs)
    return inner
@decorator
def show1(num1,num2):
    result=num1+num2
    return result
# show=decorator(show)
result=show1(1,2)
print(result)

@decorator
def show2(num1,num2):
   print(num1+num2)
# show=decorator(show)
result=show2(1,6)
print(result)

@decorator
def show3():
   print("我是一个无参数无无返回的函数")

传参数的装饰器

    
def get_decorator(char):
	def decorator(func):
		def inner():
			print("-"*10)
			func()
		return inner
	return decorator
#把@get_decorator后面的操作相当于执行了一个函数,返回了一个装饰器
@get_decorator("B")  #有参数的装饰器
def show():
	print("11111")
show()

函数用了多个装饰器

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值