Python函数名用法

名称空间

# 名称空间
      其实就是存放变量名与变量值绑定关系的地方 类似于民政局、警察局....
  # 名称空间的分类
      1.内置名称空间
      python解释器提前给我们定义好的
        len()  print()  open()
      2.全局名称空间
        在py文件中编写的代码运行产生的名字都会存到全局名称空间
        name = 'jason'  # 变量名name存入空间名称空间
        def index():  # 函数名index存入全局名称空间
            pass
        if True:
            a = 111  # 变量名a存入全局名称空间
        for i in range(10):  #  变量名 i 存入全局名称空间
            pass
        while  True:
            b = 222  # 变量名b存入全局名称空间
      3.局部名称空间
          函数体代码运行产生的都是局部名称空间
        def  index():
            name = 'jason'  # name存入局部名称空间
# 存活周期
    1.内置名称空间
      python解释器运行  产生
      python解释器关闭  销毁
    2.全局名称空间
      py文件开始运行  产生
      py文件运行结束  销毁
    3.局部名称空间
      函数体代码开始运行  产生
      函数体代码运行结束  销毁

名字的查找顺序

'''
    名称空间是用来存放名字与值绑定关系的地方
    那么问题来了  如果我要查找一个名字  到底去哪个名称空间  是否有先后顺序
  '''
  # 在查找名字的时候 一定要先搞清楚自己在哪个空间
  1.如果在局部名称空间
  	局部名称空间 >>> 全局名称空间 >>> 内置名称空间
  2.如果在全局名称空间
  	全局名称空间 >>> 内置名称空间
  # 想办法让三个名称空间中都有相同的名字
  len = '我是全局名称空间中的len'
  def index():
      len = '我是局部名称空间中的len'
      print(len)
  index()  # 调用函数 函数体就会执行 就会产生局部名称空间
  print(len)

      x = 111
    """如果函数没有被调用 那么不要去管函数体代码有多复杂 先跳过"""
    def f1():
        x = 222
        def f2():
            x = 333
            def f3():
                print(x)  # 检测语法的时候 发现f3的局部名称空间将来会有x 所以查找的时候就跟f3的局部名称空间要(特例 可以忽略)
                x = 444 
                # print(x)
            f3()
        f2()
    f1()

    '''局部名称空间之间如果不是嵌套关系 那么互不干涉!!!'''
    def index1():
        name = 'jason'
    def index2():
        age = 18
        print(name)  # 报错
    index1()
    index2()

作用域

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

global与nonlocal关键字

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

    l1 = [111, 222, 333]
    def index():
        l1.append(444)
    index()
    print(l1)
    """
    如果想要在局部修改全局的不可变类型
        需要提前加关键字global申明
    如果想要在局部修改全局的可变类型
        不需要加关键字global申明
    """
    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)
    print(l1)
    index()

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

函数名的多种用法

Author:Jason
   def index():
      print('from function index')
  # 用法1:函数名可以当做变量名赋值
   print(index)
   res = index  # 让res也指向函数体代码
   print(res)
   res()  # 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()

   # 用法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()

  """在学习函数的时候 前期一定要细心 死咬概念  定义调用"""
  def my_max(a,b):
      '''返回两个数中的较大值'''
      if a > b:
          return a
      return b
  # print(my_max(100,999))

  def many_max(a,b,c,d):
      '''返回四个数中的最大值'''
      res = my_max(a,b)  # 两两先比
      res1 = my_max(res,c)  # ...
      res2 = my_max(res1,d)  # ...
      ...

    # 函数的定义
def all_func(cmd):
    def register():
        print('注册功能')
    def login():
        print('登录功能')
    def transfer():
        print('转账功能')
    if cmd == '1':
        register()
    elif cmd == '2':
        login()
    elif cmd == '3':
        transfer()
    else:
        print('哈哈哈 偷懒了  没有用刚刚的功能字典')

all_func('1')
all_func('2')
"""
函数的学习会让我们的代码逻辑更加清晰 更加便于维护
"""
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lamb!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值