python 嵌套函数 简单讲解

话莫多说,直接上案例
test2中嵌套了一个test,分别使用t1声明test2,用t2调用test2并传入参数"uuuuu",用t3调用test2后再调用其中的test3并传入参数"aaaaaa",最后重复调用t2中的test3并传入"tttttt"和"wwwwwww"

def test2(td):
   print("初始化") 
   def test3(td1 = "get"):
       print("测试数据1:",td1) 
       
       print("测试数据:",td)
   return test3    
t1 = test2
print("~~~~~~~~~~~~~~~~~~~")
t2 = test2("uuuuu")
print("______________________________")
t3 = test2("uuuuu")("aaaaaa")
print("————————————————————————————————")
t2("tttttt")

print("————————————————————————————————")
t2("wwwwwww")

输出结果如下所示 

~~~~~~~~~~~~~~~~~~~
初始化
______________________________
初始化
测试数据1: aaaaaa
测试数据: uuuuu
————————————————————————————————
测试数据1: tttttt
测试数据: uuuuu
————————————————————————————————
测试数据1: wwwwwww
测试数据: uuuuu

         t1 = test2,为t1声明了一个test2对象并赋给t1但是没调用他(也就是没执行其中的代码),t2 = test2("uuuuu")调用了test2并传入了参数
        但是因为test2中最后一句是“return test3”所以是在执行完后,把test3赋给t2,而并没有执行test3对比t3 = test2("uuuuu")("aaaaaa"),这里直接调用了test2然后再调用了test3所以他走完了全程。

        如果此时在使用t2("tttttt")那就是调用test3并传入参数"tttttt",因为t2只是"print("初始化")""return test3"   执行完了,而test3只是声明并赋予给了t2所以可以重复调用t2,达到保存传入test2的数据的情况下重复执行test3,如果此时你使用t3("ppppp")他就会报错,因为t3已经执行完了

正好最近在练习tkinter的事件绑定,于是这不就用上了。(canvas 不能直接绑定按键事件,你可以选择绑到tk上去)

def test(td):
   def test1(event):
       print(event.char) 
       print("测试数据:",td)
   return test1  

root = Tk()

canvas = Canvas(root,height=600, width=800)

root.bind("<KeyPress>", test("拈得银丝做梦引"))

root.mainloop()

这样就可以在保留了传入的"拈得银丝做梦引"数据的同时让按键事件能重复执行

如果不写成嵌套函数直接写成

#event自己不传入数据 

def test(event,td):
       print(event.char) 
       print("测试数据:",td)

root = Tk()

canvas = Canvas(root,height=600, width=800)

root.bind("<KeyPress>", test("拈得银丝做梦引"))

root.mainloop()

——————————————————————————————————————

#event自己传入数据 
def test(event,td):
       print(event.char) 
       print("测试数据:",td)
TestEvent = type("Event", (object,), {"char": "p"})()  

root = Tk()

canvas = Canvas(root,height=600, width=800)

root.bind("<KeyPress>", test(TestEvent ,"拈得银丝做梦引"))

root.mainloop()

 如果此时不传入event的值他就会报错,因为现在你的event就莫得传入值,如果咋们自己弄一个event给他传进去,那么会执行一次,也就是启动那一次,此后就不会执行了

     def test(self,a):
       def get(self):  
         print(a.text())  
       return get

        for a in self.errotxt:
            label = QLabel(self)
            label.setText("字符:"+a)  
            label.mousePressEvent = self.test(label)

            ly.addWidget(label)

这也是嵌套函数的一个用法,当程序运行的时候,会先运行def test(self,a):,然后将一个get声明返回,然后等到你点击label组件的时候,触发mousePressEvent方法的时候,就回去调用get(),然后因为嵌套函数可以在内部保留之前的变量,所以你这时可以继续使用a来调用之前label的方法(可以拿来获得文字呀,改变文字,或者改变背景颜色什么的)

(self是调用的时候默认传入的,所以就没细说了,因为是在另一个class里面运行的,所以默认传入的self就不是QLabel类型的自然就没有.text()方法,所以我选择用一个a来接收一个QLabel,,当然其实你直接重写一个QLadel方法,并在这里调用,会更好,因为那样有更强的自定义性,更灵活,能干的事儿更多

  • 23
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值