三元运算
a = 1 b = 5 c = a if a>b else b #变量 = 条件返回True的结果 if条件 else 条件返回False的结果 print(c)
必须要有结果。
必须要有if和else。
只能是简单的情况。
函数进阶
a = 1 def func(): print(a) func() def func(): a = 1 func() print(a)
命名空间(三种)和作用域
内置命名空间: python解释器
就是python解释器一启动就可以使用的名字存储在内置命名空间中
内置的名字在启动解释器的时候被加载进内存里
全局命名空间:我们写的代码但不是函数中的代码
是在程序从上到下被执行的过程中依次加载进内存的
放置了我们设置的所有变量名和函数名
局部命名空间:函数
就是函数内部定义的名字
当调用函数的时候 才会产生这个名称空间
随着函数执行的时候 这个命名空间就消失了
在局部: 可以使用全局、内置命名空间中的名字
在全局:可以使用内置命名空间中的名字,但是不能用局部使用
在内置:不能使用局部和全局命名空间的名字
在正常情况下,直接使用内置的名字
意思就是在局部调用:局部命名空间->全局命名空间->内置命名空间
当我们在全局定义了和内置名字空间中同名时,会使用全局的名字
当自己有的时候,就不找上级要
如果自己没有就找上一级要 上一级没有再找上一级 如果内置在没有 就报错
多个函数应该拥有多个独立的局部命名空间,不互相共享
func ==> 函数的内存地址()
函数名()函数的调用
函数的内存地址()函数的调用
作用域
全局使用global
全局作用域 作用在全局 内置和全局都属于全局作用域
局部作用域 作用在局部 函数(局部名字空间属于局部作用域)
局部使用local
global 永远打印全局的名字(能不用就不用)
local 输出什么 根据local所在的位置
a = 1 def func(): global a a += 1 func() print(a)
对于不可变数据类型,在局部可以查看全局作用域中的变量,
但是不能直接修改。
如果想要修改,需要在程序的一开始添加global声明,
如果在一个局部(函数)内声明了一个globa变量,
那么这个变量在局部的所有操作将对全局的变量有效。
a = 1 b = 2 def func(): x ='aaa' y ='bbb' print(locals()) func() print(globals) a = 1 b = 2 def func(): x ='aaa' y ='bbb' print(locals()) #print(globals) #func() print(globals) print(locals) #本地的
函数的嵌套:最多三层
内部函数可以使用外部函数的变量
def outer(): a = 1 def inner(): b = 2 print(a) print('inner') def inner2(): print(a,b) #不可变数据类型的修改 print('inner2') inner2() inner() outer() def outer(): a = 1 def inner(): b = 2 print(a) print('inner') def inner2(): nonlocal a #声明了一个上层局部变量 a += 1 print(a,b) print('inner2') inner2() inner() print('**a**:',a) outer() print('全局:',a)
nonlocal 只能用于局部变量 找上层中离当前函数最近一层的局部变量
声明了nonlocal的1内部函数的变量修改会影响到 离当前函数最近一层的局部变量
对全局无效
对局部 也只是对最近的一层有影响
def func(): print(123) func() #函数名就是内存地址 func2 =func #函数名可以赋值 func2 l = [func,func2] #函数名可以作为容器类型的元素 print(1) for i in l: i() def func(): print(123) def wahaha(f): f() wahaha(func) #函数名可作为函数的参数 def func(): print(123) def wahaha(f): f() return f #函数名可以作为函数的返回值 qqxing = wahaha(func) qqxing()
函数名就是第一类对象
闭包
嵌套函数,内部函数调用外部函数的变量
def outer(): a = 1 def inner(): print(a) print(inner.__closure__) 有cell就是闭包 outer() def outer(): a = 1 def inner(): return inner inn = outer() inn() #在外部使用内部的函数,就是闭包 # 闭包的使用方法 import urllib #模块 from urllib.request import urlopen ret = urlopen('http://www.xiaohua100.cn/index.html').read() print(ret) def get_url(): url = 'http://www.xiaohua100.cn/index.html' def inner(): ret = urlopen(url).read() print(ret) return inner get_func = get_url() get_func()