函数参数补充

*与**在实参中的作用

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

# func() # ()   # {}
# func([1,2,3,4,5,6]) #([1, 2, 3, 4, 5, 6],)
# l1 = [1, 2, 3, 4, 5, 6]
# func(l1[0],l1[1],l1[2],l1[3],l1[4],l1[5])   #(1, 2, 3, 4, 5, 6) {}
# func(*l1) # (1, 2, 3, 4, 5, 6) {}
# '''func(1,2,3,4,5,6)'''
# s = 'hello'
# func(*s) # ('h', 'e', 'l', 'l', 'o') {}
# d = {'1':'curry','2':18} #('1', '2'){}
# func(*d)
# d1 = {'username':'curry','pwd':123}
# func(**d1) #{'username': 'curry', 'pwd': 123}
'''
*与**在形参中的作用
在形参名前加*:*会把溢出的位置实参存成元组,然后赋值其后的形参名
在形参名前加**:**会把溢出的关键字实参存成字典,然后赋值其后的形参名
*与**在实参中的作用
在实参前加*:*会把其后的值打散成位置实参
在实参前加**:**会把其后的值打散关键字实参
'''

命名关键字参数(冷门了解)

def func(a, b, *args):
   pass
# func(1,2)
func(a=1, b=2)
func(1, b=11)
# '''需要形参在传实参的时候 必须按照关键字参数才可以'''
# 在形参*args的后面
# def func(a,b,*args,c):
# print(a,b,args,c)
# func(1,2,3,4,5,6,7) # 报错
# func(1,2,3,4,5,6,c=123)
# 如果形参中海油**kwargs 那必须在他的前面
# def func(a,b,*args,**kwargs):
#     pass
# func(1,2,3,4,5,6,c=123,)

名称空间

定义:用来存放变量名与数据值之间绑定关系的地方
'''
ps: name = 'curry'
在内存中申请一块内存空间存储curry 然后绑定变量名name 变量名name与值curry的确定关系就会被存储到名称空间中 之后使用名字都是去名称空间中查找并确定对应的数据值
del name
删除的不是数据值 而是变量名以及变量名与数据值之间的绑定关系
'''
名称空间的分类
1、内置名称空间
pyth解释器运行就会创建的空间 写代码过程中可以直接使用的名字都在该空间中
   eg:len()  print()  input()等
2、全局名称空间
py文件运行代码过程中产生的名字都会存入该空间
普通代码里面的变量名
分支结构里面的变量名
循环结构里面的变量名
定义函数的函数名
定义类的类名
3、局部名称空间
函数体/类体代码运行过程中产生的名字都存入该空间
名称空间的存活周期
内置名称空间
  解释器运行(创建)  解释器关闭(销毁)
全局名称空间
  py文件运行(创建)  py文件结束(销毁)
局部名称空间
  函数体代码运行(创建)  函数体代码结束(销毁)

名称空间查找顺序

"""查找名字之前一定要先看自己在哪个名称空间"""
1.当前在全局名称空间
全局名称空间 >>>:   内置名称空间
2.当前在局部名称空间
局部名称空间  >>>:  全局名称空间  >>>: 内置名称空间
名字的查找顺序默认情况下不能颠倒只能是 局部>>>:全局>>>:内置
名称空间的作用域
1.内置名称空间
在程序任意位置都可以使用(全局有效)
2.全局名称空间
在程序任意位置都可以使用(全局有效)
3.局部名称空间
在各自的局部空间可以使用(局部有效)

局部名称空间复杂情况

1、各自局部名称空间默认情况下不能彼此共享名字
def func1():
   name = 'curry'
   print(age)


def func2():
   age = 18
   print(name)


func1()
func2()
# x = 1
#
#
# def func1():
#     x = 2
#     def func2():
#         x = 3
#         def func3():
#             print(x) 例外
#             # x = 4
# print(x)
#         func3()
#     func2()
# func1()

name = 'curry'
def func():
   print(name)
   name = 'curryNB'
func()
函数在定义阶段其实名字的查找顺序就已经固定死了
global与nonlocal关键字
# money = 999

# def func():
#     global money # 声明 局部名称空间中的money操作的是全局的money
#     money = 1000
#     print(money)

"""
正常情况下 局部名称空间里面出现新的名字会在局部名称空间中存储
但是有时候需要在局部名称空间中修改全局名称空间的名字
"""
# func()
# print(money)

# l1 = [1, 2, 3, 4, 5]
# s = '$jason$'

# def func():
   # global s
   # s = 'jason'
   # res = s.strip('$')
   # l1.append(113123)
   # l1.append(666)

# func()
# print(l1)
"""
局部修改全局名称空间中不可变类型的数据 需要使用关键字global声明
如果是可变类型 则无需关键字声明
"""


def func1():
   x = 1
   l1 = [1,2]
   def func2():
       # nonlocal x
       x = 999
       l1.append(666)
   func2()
   print(x)
   print(l1)
func1()
"""
nonlocal 在内存局部名称空间修改外层局部名称空间中的不可变类型
"""
函数名的多种使用方式
def func():
   print('from func')
   
   # 1、函数名也可以被用来多次赋值(函数名与变量名使用一致)
name = func
name()
name1 = name
name1()
2、函数名还可以当做函数的实参
def index(a):
   print(a)
   a()
index(123)
name = 'curry'
index(name)
index(func)

3、函数名还可以当做函数的返回值
def index()
   return func
res = index()
print(res)
res()

4、函数名还可以当做容器类型里面的数据值
l1 = [1,2,3,4,func]
print(l1)
l1[-1]()

def register():
   print('注册功能')

def login():
   print('登录功能')

def check_account():
   print('查看账户余额')

def check_account():
   print('体现功能')

def check_account():
   print('购物功能')

def transfer():
   print('转转功能')

# 提前构造功能字典
func_dict = {'1':register
            '2':login
            '3':check_account
            '4':withdraw
            '5':shopping
            '6':transfer
            }
with True
   print('''
  1.注册功能
  2.登录功能
  3.查看余额
  4.体现功能
  5.购物功能
  6.转账功能
  ''')
   choice = input('>>>:').strip()
   if choice in func_dict
       func_name = func_dict.get(choice)
       func_name()
   else:
       print('没有该功能编号')
posted @ 2022-07-04 21:58  初学者-11  阅读(53)  评论(0编辑  收藏  举报