s22day4笔记

今日大纲:

03, 名称空间,作用域,取值顺序等。
04,函数的嵌套。
05,内置函数 globals() locals()
06,,关键字global,nonlocal
07,函数名的应用。
08,闭包。
09,装饰器初识。
10,装饰器的进阶。(内置函数.)

'''
名称空间:当程序运行时,代码从上之下一次执行,他会将变量与值的关系存储在一个空间中,
这个空间叫做名称空间,命名空间,全局名称空间。
当程序遇到函数时,他会将函数名存在内存中,函数体莫不关心。
当函数执行时,内存会临时开辟一个空间,存放函数体里面的代码(变量,代码等),
函数外面访问不到临时空间的内容,随着函数的执行完毕,临时名称空间会释放掉,
向这个临时开辟的空间叫临时名名称空间,也叫局部名称空间。

python 中名称空间分三种:
内置名称空间。
全局名称空间。
局部名称空间。
作用域:
全局作用域:
内置名称空间。
全局名称空间。
局部作用域
局部名称空间。

加载顺序:
内置名称空间 ---> 全局名称空间(当程序执行时) ---> 局部名称空间(当函数调用时)

取值顺序:单向不可逆
局部名称空间(当函数调用时) -->全局名称空间(当程序执行时) -->内置名称空间

'''
# name = 'alex'
# age = 12
#
# def func1():
# name1 = 'wusir'
# print(666)
# func1()
# def func1():
# pass
# func1()
# name = 'alex'
# def func1():
# pass
#
# func1()
# print(name)


# def func2():
# name1 = 'alex'
# print(name1)
# func2()
# print(name1)

# 函数的嵌套

# def func1():
# print(666)
#
# def func2():
# func1()
# print(333)
#
# def func3():
# func2()
# print(222)
# print(111)
# func3()
# print(555)

# def func1():
# name = 'alex'
# print(name)
# def func2():
# name1 = '太白'
# print(333)
# print(444)
# func2()
# func1()


'''
globals() 返回一个字典,字典里面的内容是全局作用域的内容。
locals():返回一个字典,当前位置 的所有变量。
'''

name = 'alex'
age = 1000
sex = '男'

# def func1():
# name1 = 'oldboy'
# age = 10000
# print(globals())
# print(locals())
#
# func1()
# print(globals())
# print(locals())
def func1():
name1 = 'oldboy'
age = 10000
def func2():
name2 = 'wusir'
age2 = 25
print(globals())
print(locals())
func2()
func1()

'''
取值顺序:单向不可逆
局部名称空间(当函数调用时) -->全局名称空间(当程序执行时) -->内置名称空间
引用
'''
# UnboundLocalError: local variable 'count' referenced before assignment
#global
# 1 引用并改变一个全局变量#
# 2 在局部作用域声明一个全局变量
# count = 1
# def func1():
# global count
# count = count + 1
# count = count + 100
# print(count)
# func1()
# print(count)
# print(globals())


# def func1():
# global name
# name = 'alex'
# print(name)
# func1()
# print(name)

#nonlocal
#1 不能操作全局变量
# ,从哪层引用的该变量,从那层开始全部改变。
# local variable 'count' referenced before assignment
# def func1():
# count = 1
# def inner():
# nonlocal count
# count = count + 3
# print(count)
# def inner2():
# pass
# inner()
# print(count)
# func1()

# 取值:引用而不是改变
# 取值是从小到大取值 LEGB
# 想改变上层空间的变量 要用到global nonlocal

# 对于可变的数据类型 list dict set 不用global nonlocal
# list = []
# def func1():
# list.append(666)
# func1()
# print(list)

# 如果默认参数是一个可变的数据类型,那么他在内存中永远是一个。
# def extendList(val,list=[]):
# list.append(val)
# return list
# list1 = extendList(10)
# print('list1=%s'%list1) # [10,]
# list2 = extendList(123,[])
# print('list2=%s'%list2) # [123,]
# list3 = extendList('a')
# print('list3=%s'%list3) #[10,'a']

# print('list1=%s'%list1)
# print('list2=%s'%list2)
# print('list3=%s'%list3)

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# def func1():
# print(666)
# #1 打印函数名
# print(func1) # <function func1 at 0x000000000258F9D8>

# 2 函数名可以作为容器类数据的元素
# def func1():
# print(111)
#
#
# def func2():
# print(222)
#
# def func3():
# print(333)
#
# l1 = [func1, func2, func3]
# for i in l1:
# i()

# 3 函数名可以作为函数的参数

# def func1():
# print(111)
#
#
# def func2(x):
# print(x)
# x()
# print(222)
#
# func2(func1)

# 3 函数名可以作为函数的返回值

# def func1():
# return 111
#
#
# def func2(x): # x = func1
# print(222)
# return x
#
# ret = func2(func1) # func1
# print(ret())
# print(ret)

# def func3(x):
# print(x)
# return x
# # a = 2
# # func1 = <function func1 at 0x000000000258F9D8>
# func3(func1)
# def func1():
# print(1111)
# return 111
# f1 = func1
# f2 = f1
# f3 = f2
# print(f3)
# f3()
#向这样的函数名 有一个叫法 :第一类对象

#!/usr/bin/env python
# -*- coding:utf-8 -*-

'''
闭包:内层函数对外层函数非全局变量的引用,就叫做闭包
'''
# def wrapper():
# name = 'alex'
# def inner():
# print(name)
# inner()
# wrapper()

# name = 'alex'
# def wrapper():
# def inner():
# print(name)
# inner()
# print(inner.__closure__) # None
# wrapper()

# 通过函数名.__closure__
# name = 'alex'
# def wrapper(x):
# x = name
# def inner():
# print(x)
# inner()
# print(inner.__closure__) # <cell at 0x0000000000130C48: str object at 0x0000000001E8A260>
# wrapper(name)

"""
如果 python 解释器遇到了闭包,他有一个机制,
这个闭包不会随着函数的结束而释放。
"""

from urllib.request import urlopen

def index():
url = "http://www.xiaohua100.cn/index.html"
def get():
return urlopen(url).read()
return get

# xiaohua = index() # get
# content = xiaohua()
# content1 = xiaohua()
# content2 = xiaohua()
# print(content.decode())

猜你喜欢

转载自www.cnblogs.com/zzp1991/p/9116821.html