命名空间
-
全局命名空间,记录整个文件的变量,函数体等
-
func()函数调用的时候,会开辟一个局部命名空间,存放函数里的变量,函数运行结束,就收回
-
内置命名空间:python源码提供的内置函数,input(),print()
-
空间加载到内存的先后顺序:内置,全局,局部
-
取值顺序,就近原则LEGB:局部,全局,内置(单项不可逆)
作用域
- 全局作用域:包括内置名称空间,全局名称空间
- 局部作用域:局部名称空间(可以从全局作用域获取变量,是引用,但是不能改变)
date = 'Monday'
def func():
print(date)
func()
date = 'Monday'
def func():
date='sss' #这里只是在局部作用域 又创建了一个date变量,区别于全局的date
print(date)
func()
count = 1
def func():
count+=1 #解释器认为你在局部已经定义了一个count ,结果没找到,就报错
print(count) #return UnboundLocalError: local variable 'count' referenced before assignment
func()
高阶函数
def func():
count = 1
def inner(): #函数func()里面定义一个inner()函数
print(count)
inner()
func()
内置函数
- globals() locals()
a=1
b=2
def func():
name = 'Tom'
age = 25
print(globals()) #全局作用域,调
print(locals())
参数补充
def func(name,list1=[]): #默认参数是可变数据类型,那么调用多少次的函数,这个默认参数都是同一个
list1.append(name)
return list1
r1 = func('tom')
print(r1) #return ['tom']
r2 = func('Jerry')
print(r2) #return ['tom', 'Jerry']
def func(a,list=[]):
list.append(a)
return list
print(func(10)) #return [10] list用默认的
print(func(20,[])) #return [20] list用新的
print(func(100)) #return [10, 100] list继续用默认的
- 把print位置变化一下
def func(a,list=[]):
list.append(a)
return list
r1 = func(10)
r2 = func(20,[])
r3 = func(100)
print(r1) #return [10, 100],这里只不过是最后才打印的
print(r2) #return [20]
print(r3) #return [10, 100]
count= 1
def func():
print(count) #这里先引用,下面才定义count
count = 3
func() #return UnboundLocalError: local variable 'count' referenced before assignment
global
- 在局部作用域生命一个全局变量
name = 'tom'
def func():
name = 'jerry'
print(name) #return jerry
func()
print(name) #return tom
name = 'tom'
def func():
global name #global在局部声明一个全局变量
name = 'jerry'
print(name) #return jerry
func()
print(name) #return jerry
#nonlocal
#不能操作全局变量
count = 1
def func():
nonlocal count
count+=1
func() #return SyntaxError: no binding for nonlocal 'count' found
#局部作用域,内层函数对外层函数的局部变量进行修改
def func1():
count=1
def func2():
nonlocal count
count+=1
print(count) #return 1
func2()
print(count) #return 2
func1()
函数名的应用
- 函数名加()可以执行次函数
- 函数名是个变量
def func():
print(11)
print(func,type(func)) #return <function func at 0x03638778> <class 'function'>
def func():
print(1)
f1=func
f2=f1
f2() #return 1
def func1():
print(1)
def func2():
print(2)
func2=func1
func2() #return 1
- 函数名可以作为容器类数据类型的元素
def func1():
print(1)
def func2():
print(2)
def func3():
print(3)
l1=[func1,func2,func3]
for i in l1:
i() #return 返回1,2,3
- 函数名可以作为函数的参数
def func():
print(1)
def func1(x):
x()
func1(func) #return 1
- 函数名可以作为函数的返回值
def func():
print(1)
def func1(x):
return x
result = func1(func)
result() #return 1
补充
#新特性 格式化输出
name = 'tom'
msg = f'hello {name}'
print(msg)
#可以加表达式
dic = {'name':'jerry','age':25}
msg = f'my name is {dic["name"]}'
print(msg)
#
count = 7
print(f'最终结果是{count**2}') #return 49
#
def sum(a,b):
return a+b
print(f'最终结果是 {sum(10,20)}') #return 30
迭代器
- 内部含有__iter__方法的对象,是可迭代对象。
- str list tuple dict set range 句柄 都是可迭代对象
- 获取一个对象的所有方法,并且以字符串的形式表现