首页 > 编程语言 >python语言编程能力

python语言编程能力

时间:2023-04-19 10:56:34浏览次数:35  
标签:return 语言 python 编程 funA inner print id def

python语言编程能力

函数默认参数

实例1:

class Test(object):
    def process(self,data=[]):
        data.sort()
        data.append("end")
        return data


test1 = Test()
print(test1.process())//不会重新创建
test2 = Test()
print(test2.process())//不会重新创建
test3 = Test()
print(test3.process(data=["23","ew"]))//非空则重新创建
test4 = Test()
print(test4.process())//不会重新创建

结果输出:

等同于在Test类第一次声明的时候,创建了Test.process.__defaults__对象,这个对象在类声明时候创建,创建后指向一个固定的ref。使用这个类创建对象,不会重新生成这个对象。如果参数是[],不会重新创建,如果非空则重新创建,
同时,默认参数不使用的时候不写成None违反编程规范8.1。

实例2:

def exten_list(val, List=[]):
    print(f'info:{List},id:{id(List)}')
    List.append(val)
    return List


list1 = exten_list(10)
list2 = exten_list(20)
list3 = exten_list("a")
list4 = exten_list(14, [3])
list5 = exten_list("b")
print(f'info:{list1},id:{id(list1)}')
print(f'info:{list2},id:{id(list2)}')
print(f'info:{list3},id:{id(list3)}')
print(f'info:{list4},id:{id(list4)}')

结果输出:

函数的参数默认值:只会在函数声明时初始化一次,之后不会再变;注意,函数声明,只有参数个数相同时,才是同一个声明,所以那些传入参数的调用,不是同一个函数声明了;只有缺省第二个参数的,才是同一类调用

装饰器(作用域)

函数装饰器的工作原理如下:
假设用funA()函数装饰器去装饰funB()函数,如下所示:

#funA 作为装饰器函数
def funA(fn):
    #...
    fn() # 执行传入的fn参数
    #...
    return '...'
@funA
def funB():
    #...

等同于:

def funA(fn):
    #...
    fn() # 执行传入的fn参数
    #...
    return '...'
def funB():
    #...
funB = funA(funB)

实例0:

#funA 作为装饰器函数
def funA(fn):
    print("C语言中文网")
    fn() # 执行传入的fn参数
    print("http://c.biancheng.net")
    return "装饰器函数的返回值"
@funA
def funB()://相当于funB = funA(funB)
    print("学习 Python")

结果输出:

实例1:

def outer(f):
    def inner(*arg, **kargs):
        inner.co += 1
        return f(*arg, **kargs)
    inner.co = 0
    return inner
@outer
def cu():
    pass


if __name__ == "__main__":
    cu()
    cu()
    cu()
    print(cu.co)

结果输出:

return inner不等于return inner(),返回的是函数名,因此cu已经被inner替代了,最终cu.co=inner.co;万物皆对象,函数也是一个对象,因此函数这个对象本身可以访问属性,而且赋值时可以增加一个属性。不过实际意义不大

实例2:

#coding:gbk
def A(func):
    def inner():
        inner.i += 1
        print("i加1,i={0}".format(inner.i))
    inner.i = 0
    print("i赋值")
    return inner
@A
def B():
    pass

@A
def C():
    pass

B()//等价于B() = A(B()),执行inner():
B()
B()
C()
C()
print(id(B), id(B.i))
print(id(C), id(C.i))

结果输出:

B和C分别是俩对象,所以有两个id。(先是装饰器执行,有几个装饰器就执行几遍“i赋值”

多层装饰器

实例1:

def dec_a(function):
    print("aaa")//步骤4
    def inner_func():
        print("bbb")//步骤5
        function()
    return inner_func


def dec_b(function):
    print("ccc") //步骤2
    def inner_func():
        function()
        print("ddd")//步骤7
    return inner_func

@dec_a //步骤3
@dec_b //步骤1

def test():
    print("wegwrtegw")//步骤6

test()

结果输出:

装饰器@等同于函数名从test变成了dec_a(dec_b(test)),执行test等同于执行dec_a.注意即便不执行test()方法,ccc/aaa还是会打印,因为先执行装饰器,从下向上,所以先打印ccc再打印aaa,说明装饰器是在解释器加载函数的时候就完成的。

实例2:

def A(func):
    def _A():
        print ("A now")
        func()
    return _A
    
def B(func):
    def _B():
        func()
        print ("B now")
    return _B
 
@A
@B
def test1():
    print ("do something")
    
test1()

结果输出:

re.match和re.search

实例1:

import re
result_sum = 0
pattern = 'back'
if re.match(pattern, 'backup.txt'):
    result_sum += 1

if re.match(pattern, 'text.txt'):
    result_sum += 2

if re.match(pattern, 'backup.txt'):
    result_sum += 4

if re.match(pattern, 'backup.txt'):
    result_sum += 8

print (result_sum)

结果输出:

标签:return,语言,python,编程,funA,inner,print,id,def
From: https://www.cnblogs.com/bonne-chance/p/17332546.html

相关文章

  • C语言 正确理解二维数组首地址
    在一维数组中,数组名表示的是数组第一个元素的地址inta[10],*p=a;那么二维数组呢inta[3][4],a表示的是元素a[0][0]的地址吗?不是!二维数组就是一维数组,二维数组a[3][4]就是有三个元素a[0]、a[1]、a[2]的一维数组,所以数组a的第一个元素不是a[0][0],而是a[0],所以数组名......
  • 7.Java 网络编程之 Socket
    Java网络编程之Socket一、课程目标网络模型TCP协议与UDP协议区别Http协议底层实现原理。二、什么是网络模型网络编程的本质是两个设备之间的数据交换,当然,在计算机网络中,设备主要指计算机。数据传递本身没有多大的难度,不就是把一个设备中的数据发送给两外一个设备,然......
  • Python OpenCV 3.x 示例:1~5
    原文:OpenCV3.xwithPythonByExample协议:CCBY-NC-SA4.0译者:飞龙本文来自【ApacheCN计算机视觉译文集】,采用译后编辑(MTPE)流程来尽可能提升效率。当别人说你没有底线的时候,你最好真的没有;当别人说你做过某些事的时候,你也最好真的做过。一、将几何变换应用于图像在本......
  • 14.SpringAOP 编程
    SpringAOP编程课程目标代理设计模式Spring的环境搭建SpringIOC与AOPSpring事物与传播行为一、代理模式1.1概述代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理访问目标对象。这样好处:可以在目标对象实现的基础上,增强额外的功能操作。(扩......
  • 不懂自然语言处理技术,怎么才能做一个人工智能产品?
    一、选择第三方NLP开放平台NLP技术沉淀周期过长,投入会很大,选择第三方开放平台想必是小公司最好的选择,推荐三个AI语音开放平台:科大讯飞开放平台;百度AI开放平;搜狗云知音。二、明确技术分工没有NLP技术背景,如何造一款AI产品?上图是引入单个NLP的对接方案,通过任务分解,可以很清楚知道,哪些......
  • 精通 Python OpenCV4:第二部分
    原文:MasteringOpenCV4withPython协议:CCBY-NC-SA4.0译者:飞龙本文来自【ApacheCN计算机视觉译文集】,采用译后编辑(MTPE)流程来尽可能提升效率。当别人说你没有底线的时候,你最好真的没有;当别人说你做过某些事的时候,你也最好真的做过。第2部分:OpenCV中的图像处理在本......
  • Python fitz 'Document' object has no attribute 'convertToPDF'
    最近在自学python有个png转PDF的需求,然后网站找了下。defpng2pdf(name):imgdoc=fitz.open(name)pdfbytes=imgdoc.convertToPDF()#使用图片创建单页的PDFimgpdf=fitz.open("pdf",pdfbytes)imgpdf.save(name[:-4]+'.pdf')......
  • 浅析python中的生成器和迭代器
    一、什么叫生成器?在Python中,一边循环一边计算的机制,称为生成器:generator二、怎么创建生成器1.生成器表达式()生成器表达式返回一个生成器对象,需要用一个变量名来接收g=(x*3forxinrange(5))#打印g,返回一个生成器对象print(g)#<generatorobject<genexpr>at0x000......
  • go语言中如何把数字转换成字节切片并在网络中传输
    客户端:先把数字转换成uint32类型:varpkgLen=uint32(len(data))再定义一个字节切片:varbuf=make([]byte,4)最后通过encoding.binary包中的方法,把无符号数字装载到字节切片中:binary.BigEndian.PutUint32(buf[0:4],pkgLen)这样就可以在网络中发送数字了:conn.Wri......
  • 在Go语言中,如何优化内存使用效率?
    在Go语言中,可以通过以下几种方式来优化内存使用效率:避免使用过多的内存尽可能地避免使用过多的内存是最有效的内存优化方法之一。在编写代码时,应该尽可能地避免使用全局变量和大量的临时变量。同时,可以使用常量、静态变量和缓存等方式来避免频繁地分配和释放内存。及时释放不......