函数的名称空间概念

函数的名称空间概念

函数重要参数的补充

def func(*args,**kwargs):
    print(args)
    print(kwargs)

1.*在实参中的作用
l1 = [1, 2, 3, 4, 5, 6, 7]
func(*l1)  # 当*在实参中与列表使用就会将列表中的每一个数值拆开依次再将这些数值存入一个元组中
"""
(1, 2, 3, 4, 5, 6, 7)
{}
"""
str1 = 'joseph'
func(*str1)  # 当*在实参中与字符串使用时会将那个字符串中的每一个字符取出同样也是存入一个元组中
"""
('j', 'o', 's', 'e', 'p', 'h')
{}
"""
dic = {'name':'joseph', 'age':21}
func(*dic)  # 当*在实参中与字典结合使用时只会与字典中的k值打交道,所以取出的也是k值并将这两个k值也放入一个
元组中
"""
('name', 'age')
{}
"""
2.**在实参中的作用的作用
dic1 = {'user_name':'joseph', 'hobby':'read'}
func(**dic1)## 在实参中**与字典的结合使用则会将字典的每个值都输出
"""
()
{'user_name': 'joseph', 'hobby': 'read'}
"""
func(name='joseph', age=21)  # 当我们将关键字实参调用到上方函数中也会被转为字典形式输出
"""
()
{'name': 'joseph', 'age': 21}
"""

命名关键字参数

1.当*args与形参结合使用
def func(a, b, *args):
    print(a, b)
func(1, 2)
"""
1 2
"""
func(a=1, b=2)
"""
1 2
"""
func(1, b=2)
"""
1 2
"""
2.形参在*args后的使用
def func(a, b, *args, c):
    print(a, b, args, c)
func(1, 2, 3, 4, 5, 6, 7)  # 报错因为前面的*args就会将所有的位置实参全部接收而c却用不到了所以需要遵守
			  简单的放前面男的放后面的规则
func(1, 2, 3, 4, 5, c=520)  # 中间通过args的都会转为一个元组的形式
"""
1 2 (3, 4, 5) 520
"""
3.形参在*和**之后联合使用
def func(a, b, *args, c, **kwargs):
    print(a, b, args, c, kwargs)
func(1, 2, 3, 4, 5, c=520, name='joseph')
"""
1 2 (3, 4, 5) 520 {'name': 'joseph'}
"""

名称空间的概念

1.变量名与数值之间的关系(回忆)
	我们当时学变量名简单的理解了一下变量名与数值之间的绑定关系,如果我们将一个变量名删除那么其实就是将
	他与数值之间的绑定关系删除本身数值是没有被删除的,而是会被我们的分代回收处理掉,而我们删除变量名与
	绑定关系的操作其实是在在名称空间删除的
1.空间名称的分类
	1.1内置名称空间
		内置名称空间在我们打开python解释器的瞬间就会被执行一遍并保存到我们的内置名	称空间中不受
		外界因素影响,例如我们的  int()  str() dict()等
   1.2全局名称空间
		全局名称空间中就是我们子啊运行py文件所创造的变量名,函数,类名等都会被存到	全局名称空间
		中,例如我们最常用的  name   age   hobby等
 """     普通代码中我们所定义的变量名
        分支结构中的变量名
        循环结构红的变量名
        函数中的函数名
        定义类中的类名等
"""        
	1.3局部名称空间
    	在局部也就是函数内部所产生的名字才会被放入局部名称空间中
         例如内置空间中的  name,age如果存储的话并不会与外界发生冲突,因为不是在一个存储空间中
1.名称空间的存活周期
	内置名称空间
    	当我们打开python解释器时就会自动创造一个空间用来存储我们的内置名称,而只有当我们将python解释器关
	闭的时候这个空间才会被关闭
   全局名称空间
	当我们打开一个py文件时我们就会创造一个全局名称空间但是这个空间暂时是空的只有我们在编写一
	些变量名等的名称才会被存入全局名称空间,我们将py文件关闭时这个全局名称空间才会被关闭
	局部名称空间
      当我们定义一个函数并使用时我们才会创造一个专属于这个函数的名称空间,进行存储这个函数空间的变量名等,
	每调用一个函数那么就会创造一个独立的局部名称空间,当这个函数不再执行的时候那么就会关闭这个局部名称空间

名字的查找顺序

"""我们在查找名称在哪个空间时必须先找到自己的程序现在正处于哪个名称空间"""
1.当我们在全局名称空间的时候
	只能从全局名称空间到内置名称空间中寻找需要的名字
    全局名称空间	>>>:	内置名称空间
2.当我们在局部名称空间的时候
	首先从局部名称空间来寻找我们需要的名称如果找不到那么再到全局名称空间去寻找如果全局名称空间中也没有
	的话那么才会到内置名称空间中寻找
    局部名称空间	>>>:	全局名称空间	>>>:	内置名称空间
3.我们在寻找名称的时候只能按照顺序去寻找名称并不能逆向寻找
	  局部	>>>:	全局	>>>:	内置	

作用域与查找案例

  • 作用域

1.内置名称空间
	在python解释器中都可以使用
2.全局名称空间
	在当前py文件中都可以使用
3.局部名称空间
	只有在各自函数名称空间中才可以调用
  • 案例

1.我们各自局部名称空间中都可以存储各自所独有的名称,互为整体不可侵犯座椅在调用别的局部内存空间中的数据时就会直接报错
def func():
    name = 'joseph'
    age = 21
    print(hobby, gender)  # 报错
def part():
    hobby = 'read'
    gender = 'male'
    print(name, age)  # 报错

func()
part()
2.嵌套案例
	函数嵌套中每一个函数中都含有自己独有的局部名称空间
	究极嵌套关于野生程序员怎样写代码:就是这样哈哈哈
name = 'joseph'  #1
def nest1():  # 3
    name = 'jason'  # 4
    def nest2():  # 7
        name = 'alex'  # 8
        def nest3():  # 11
            name = 'kevin'  # 12
            def nest4():  # 15
                name = 'oscer'  # 17
                print(name)  # 16
            nest4()  # 13
            print(name)  # 14
        nest3()  # 9
        print(name)  # 10
    nest2()  # 5
    print(name)  # 6
nest1()  # 2
print(name)  # 18
"""
oscer
kevin
alex
jason
joseph
"""

global和nonlocal关键字

1.global的使用方法
	在函数中global可以影响到全局变量
flower = 99
def branch():
    global flower
    flower = 520
    print(flower)
branch()
print(flower)
"""
520
520
"""
1.在局部空间修改
l1 = [1, 2, 3, 4, 5]
k = '$joseph$'

def func():
    global k
    res = k.strip('$')
    print(res)
    print(s)
    l1.append(321)
    l1.append(999)

func()
print(l1)
"""
joseph
$joseph$
[1, 2, 3, 4, 5, 113123, 666, 321, 999]
"""
3.nonlocal的使用改变局部
def all():
    num = 99
    l1 = [1, 2, 3, 4]
    def nest():
        num = 520
        l1.append(666)
        def only():
            nonlocal num
            num = 521
            l1.append(999)
            print(num)
            print(l1)
        only()
        print(num)
        print(l1)
    nest()
    print(num)
    print(l1)
all()
"""
521
[1, 2, 3, 4, 666, 999]
521
[1, 2, 3, 4, 666, 999]
99
[1, 2, 3, 4, 666, 999]
"""

函数的的多种用法

1.函数名的可变更性
def num(a, b):
    return a+b
func = num
func(4+6)
"""
10
"""
2.函数名当作容器类型的元素
def func():
    print('func')
l1 = [1, 2, 3, 4, func]
print(l1)
l1[-1]()
"""
[1, 2, 3, 4, <function func at 0x0000016C643061F0>]
from func
"""
3.函数也可以作为一个参数传入另一个函数
def func():
    print('func')
def index(a):
    print(a)
index(520)
name = 'joseph'
index(name)
index(func)
"""
520
joseph
<function func at 0x000001C1161361F0>
"""
4.函数的返回值可以是一个函数
def func():
    print('func')
def num():
    return func
res = num()
print(res)
res()
"""
<function func at 0x0000021A672B7700>
func
"""
posted @ 2022-07-04 19:10  Joseph-bright  阅读(47)  评论(0编辑  收藏  举报