函数基础知识3

今日内容概要

  • 名称空间

  • 名字的查找顺序

  • 作用域

  • global与nonlocal关键字

  • 函数名对象

  • 函数的嵌套

     

今日内容详细

一、名称空间

# 名称空间
  其实就是存放变量名与变量值绑定关系的存储位置的地方  类似于在警察局的信息报备
   
# 名称空间的分类
 1.内置名称空间
   是“python解释器”提前给我们定义好、用于存储一些本身内部带有代码的功能词 eg:len() print() open()
 2.全局名称空间
    在“python文件”中编写的代码运行产生的名字都会存到全局名称空间中
     name = 'jason'  # 变量名name存入全局名称空间
     def index():    # 函数名index存入全局名称空间
           pass
 3.局部名称空间
    在“函数体代码”运行产生的都是局部名称空间
     def index():
           name ='jason'  # name对于变量名来说,name       就会存入局部名称空间
           
  三者之间的存活周期
  1.内置名称空间
   python解释器运行 产生
   python解释器关闭 销毁
  2.全局名称空间
   py文件开始运行 产生
   py文件运行结束 销毁
  3.局部名称空间
   函数体代码开始运行 产生
   函数体代码运行结束 销毁
   

 

 

      

二、名字的查找顺序

。。。。。
名称空间是用来存放变量名与变量值之间绑定关系的地方
如果要查找一个名字 去哪个名称空间去找 找的时候是否有   先后顺序?
 
# 查找名称空间的时候 一定要搞清楚自己目前在哪个空间
1.如果在局部名称空间
  局部名称空间>>>>>全局名称空间>>>>>内置名称空间
2.如果在全局名称空间
  全局名称空间>>>>>内置名称空间
# 如何让三个名称空间中都有相同的名字呢?
len ='我是全局名称空间中的名字'
def index():
    len = '我是局部名称中的名字'
    print(len)  
index() # 调用函数 函数体代码就会执行 会产生局部名称空间
print(len)
 
x = 111
  如果函数没有被调用 那么不要去管函数体代码有多复杂 先跳过
def f1():
x = 222
def f2():
x = 333
def f3():
x = 444
print(x)
f3()
f2()
  f1()
局部名称空间之间如果不是嵌套关系 那么互不干涉!!!!
比如:
def index():
    name = 'jason'
def index2():
age = 18
print(name)   # 独立的局部与局部之间互不干涉 否则报错
  index1()
  index2()
# 在上描述嵌套中需要注意的是:在检测语法的时候 发现f3的局部名称空间有X时,就会先找局部体代码之前的同等空间的x,如果没有或在体代码之后 都会往外去找,找到了一个就可以了

 

 

三、作用域

# 作用域就是名称空间能够作用的范围(相当于数学中的定义域一样)
内置名称空间
  程序任意阶段任意位置均可使用(全局有效)
全局名称空间
  程序任意阶段任意位置均可使用(全局有效)
局部名称空间
  一般情况下只有在各自名称空间中有效(局部有效)
   ''''''也可以通过一些手段打破规则''''''
   

 

 

四、global与nonlocal关键字

''''''global关键字:局部修改全局不可变类型''''''
x = 111
def index():
   #x = 222 # 并不是在修改全局的x 而是在局部空间中创建了一个新的x
   global x  # 申明 修改的是全局x而不是产生新的x
   x = 666
index()
# 如果想要在局部名称空间中修改全局名称开年中的名字 那么需要使用关键字申明
print(x)  # 111 # 666

l1 = [111,222,333]
def index():
   l1.append(444)
index()
print(l1)   # [111, 222, 333, 444]

结论:
如果想要在局部修改全局的不可变类型
 需要提前加关键字global申明
如果想要在局部修改全局的可变类型
  不需要加关键字global申明
# 局部名称空间嵌套中 局部内存修改局部外层 可变类型需要申明用nonlcoal
def index():
   x = 111  # 在index的局部产生一个x=111
   l1 = [11, 22, 33]
   def f1():
       # x = 222 # 在f1的局部产生一个x=222
       # print(x)
       # 局部名称空间嵌套 内层修改外层
       nonlocal x
       x = 333
       l1.append(44)
   f1()
   print(x)  # 333
   print(l1)  # [11, 22, 33, 44]
index()

局部名称空间嵌套的情况下 内层如果想要修改外层
 情况1数据是不可变类型
   需要使用关键字nonlocal
 情况2数据是可变类型
不需要使用关键字nonlocal
   

 

 

五、函数名的多种用法

def index():
   print('from function index')
用法1:函数名可以当做变量名赋值
#print(index)
res = index  #让res指向函数体代码
   # print(res)
res() # from function index = index()

用法2:函数名还可以当成函数的实参
def index():
   print('from index')
def func(a):
   print('from func')
   print(a)
   a()
func(index)

# 用法3:函数名还可以当做函数的返回值
def func():
   print('from func')
   return index
def index():
   print('from index')
res =func() # res接收函数名
print(res)  #指向的是index函数的内存地址
res()  # 相当于index() 运行完毕后得 # from index

# 用法4:函数名可以作为容器类型的元素
'''容器类型:内部可以存档多个元素的数据类型>>>>:列表、字典、元组.....
def index():
  print('from index')
l1 = [11, 22, 33, 44, index]
print(l1)
l1[-1]() # index()

注册登录功能:
def register():
  print('注册功能')
def login():
  print('登录功能')
def transfer():
  print('转账功能')
def withdraw():
  print('提现功能')
def check_order():
  print('查看账单')
def shopping():
  print('购物功能')
def check_account():
  print('查看余额')
   
# 定义一个功能存放区
func_dict = {
  '1':register,
  '2':login,
  '3':transfer,
  '4':withdraw,
  '5':check_order,
  '6':shopping,
  '7':check_account

while True:
  print("""
  1.注册功能
  2.登录功能
  3.转账功能
  4.提现功能
  5.查看账单
  6.购物功能
  7.查看余额
  """)
  choice = input('请输入您想要执行的功能编号>>>:').strip()
  if choice in func_dict:
      # 获取键对应的值(函数名)
      func_name = func_dict.get(choice)
      # 执行函数
      func_name()
  else:
      print('功能编号不存在')
  # 当功能比较多的是 频繁的编写elif很麻烦
  # if choice == '1':
  #     register()
  # elif choice == '2':
  #     login()
  # elif choice == '3':
  #     transfer()
  # elif choice == '4':
  #     withdraw()
  # elif choice == '5':
  #     check_order()
  # elif choice == '6':
  #     shopping()
  # else:
  #     print('请输入正确的功能编号')

 

 

六、函数的嵌套

# 函数的嵌套调用
是指多个函数相互嵌套使用
如何看函数嵌套:在学习函数的时候 前期一定要细心 死咬概念 定义调用
def index():
   func()
   print('from index')
def func():
   index()
   print('from func')
func()
哈哈哈,会出现一个像死循环一样的东西
例题2:
def my_max(a,b):
   '''返回两个数中的最大值'''
   if a > b:
       return a
   return b
print(my_max(99,100))  # 100

def many_max(a,b,c,d):
   '''返回四个数中的最大值'''
   res = my_max(a,b)  # 思路是先两两对比 然后再和剩下的再对比
   res1 = my_max(res,c)  # ...
   res2 = my_max(res1,d)  # ...
  ...

函数嵌套的定义
  函数的学习会让我们的代码逻辑更加清晰 更加便于维护与更改一些功能

 

 

 

posted @ 2022-03-17 22:28  一颗平凡的小石头  阅读(157)  评论(0)    收藏  举报