内容并不完全靠谱,仅供参考
#-----------------------函数【一】--------------------------
def boy():
print('树德小学,袁维娜')
boy()
# 基本函数
#res:树德小学,袁维娜
def boy():
print('真光中学,蔡一梦') print(boy())
#把函数作为对象传入print中。print所输出的
#是函数return的对象,because 没有return对象。
#因此最后print输出结果为None
Res:
None
#-----------------------函数【二】--------------------------——————
改变全局变量
a=[100,200]
def pet():
a.remove(200)
print(a) 注意在基本函数中可以引用a这里的a,函数默认是global(即全局)
pet() 即函数中只能引用全局变量
print(a)
#res:
#[100]
#[100]
基本函数反面实列【1】:
a=[100,200]
def pet():
a.remove(200)
a+=[100] ---错误语法: 这里的a 是一个局部变量为什么呢 因为python默认x+=y的语法中x是局部变量
print(a) ----那如何将局部变量变成全局变量呢?python引进了另一个函数global 该方法声明x+=y中的x
pet() 是全局变量,而不是局部变量
print(a)
res:
local variable 'a' referenced before assignment
基本函数真实案列【1】:
a=[100,200]
def pet():
a.remove(200)
global a global a 此时 python认为基本函数中a+=【10000000】 中的a不是局部变量而是全
a+=[10000000] 局变量
print(a)
pet()
print(a)
#res:
# [100, 10000000]
# [100, 10000000]
【内嵌函数】
a='地' #a 在这里是全局变量
def girl(): #() 是环境信息 相对les()而言girl()是外部函数
print('天')
p='盖' #p在girl()函数中是局部变量
def les(): les()相对girl()而言是内部函数
#p不是局部变量,p是girl()的局部变量相对les()而言就是全局变量
#函数中的任何区域都可以引用外部函数外的变量-----girl()函数外的变量a
print(a)
print('王',p,sep='!') 执行过程:
les() #开始执行外部函数girl(),执行girl()的过程中,进入内部函数les()
girl() #执行les(),执行完les(),外部函数girl()函数结束。
print(girl) #打印girl外部函数的内存空间 ‘本质上无实际意义’ --<functiongirl at 0x01A7CDB0>--
内嵌函数就像是函数中的调用函数。如此理解:相当于调用了les()
Res:
天
地
王!盖 举例说明:
ab='宝'
def newhalf():
print('河')
p='塔' #<内部函数类似与调用函数>
gay(p)
def gay(p):
print(ab)
print('镇',p,sep='!')
res: 河
宝
镇!塔
① <内部函数,外部函数引用函数外变量>
代码实列:
y='海贼王' 注意外部函数的变量是全局变量,该变量可以在外部函数,内部函数中引用。
def girl(s=None):
# global y
# y+=100
def les():
print(y)
les()
girl()
print(y)
res:
海贼王
海贼王
海贼王
海贼王
——————————【global and nolocal】————————————————
② global
y='海贼王'
def girl(s=None):
global y 继续提醒:global的作用是在外部函数中修改函数外的变量
y+='路飞'
print(y)
def les(y):
print(y)
y+='100'
print(y) 总结:从中可以看出要想改变函数外的变量只能通过global一种方式。
将函数外的变量作为内存环境引入函数中叶无法改变函数外的变量
les(y)
girl()
print(y)
res:
海贼王路飞
海贼王路飞
海贼王路飞100
海贼王路飞
③ nolocal
y='海贼王'
def girl(s=None):
global y
y+='路飞'
print(y)
x=y
def les(y):
print(y)
nonlocal x
x+='索隆' 注意如果使用global x则是错误语法。 global只能用在外部函数中,在内部函数中想修改全局变量使用x+=y的语法要使用nolocal。内部函数想修改函数外变量,只能通过传参的方式。
y+='100'
print(y)
print(x)
les(y)
girl()
print(y)
res:
海贼王路飞
海贼王路飞
海贼王路飞100
海贼王路飞索隆
海贼王路飞
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
【闭包】前传-------作用域:
作用域是程序运行时变量可被访问的范围,定义在函数内的变量是局部变量,局部变量的作用范围只能是函数内部范围内,它不能在函数外引用。
定义在模块最外层的变量是全局变量,它是全局范围内可见的,当然在函数里面也可以读取到全局变量的。
而在函数外部则不可以访问局部变量。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
【闭包】前传--------缘由
何为闭包,就是要明白闭包的在函数中的作用,为何要使用闭包。了解这个了,就能明白闭包的组成和关键要素。
Python中规定,在内部函数中只能引用全局变量---(函数外变量)
但是不能修改函数外变量,
在内部函数想修改函数外变量,只能通过在内部函数中传参的方式修改。
【即传入内存环境 或 环境变量】但这里传入的环境变量是内部函数的局部变量
局部变量无法再函数外中被引用,为了能引用内部函数的局部变量,
此时产生了产生了新的算法:闭包
a【闭包】后传--------算法实战
y='yellow'
def girl(s=None):
global y
y+='red'
print(y)
x=y
def les(y):
print(y)
nonlocal x
x+='black'
y+='100'
print(y)
print(x)
return y
return les(y) 在内部函数外一定要return 内部函数,要想调用return的
print(girl()) 内部函数内容一定要在内部函数里面return局部变量
print(y,'--------------------------')
res: 注意要点:永远要知道闭包的目的就一个在函数外引用的内部函数的局部变量
yellowred
yellowred
yellowred100
yellowredblack
yellowred100
yellowred--------------------------
【简单的装饰器】-----【简单的语法糖】
简而言之:@a就是将 b 传递给a(),并返回新的 b = a(b)
print(1) 关于装饰器与语法糖,通过调试方法来一探究竟。
def newhalf(qf): 执行函数:【1】输出1---【2】输出5---【3】进入@newhalf----
print(2) 与装饰器对应的函数 【4】进入newhalf(qf)中---【5】输出2--【6】return qf()
【7】进入@newhalf---【8】输出3--【9】输出butterfly
return qf() 【10】进入return qf()---【11】进入@newhalf--【12】输出4
print(5)
@newhalf==cowgirl=newhalf(cowgirl) --------------语法糖 | 整体是装饰器
def cow_girl(): 被装饰的函数 |
print(3) 装饰器 |
print('butterfly') |
print(4)
Res: 好通过以上的了解,现在把装饰器变成闭包函数。
1 从中了解装饰器算法的本质。
5
2
3
butterfly