25 函数总结 重点

总结

  • 自定义函数
    • 基本函数结构(98%)
    • 高级
      • 参数
      • 闭包

函数的参数传递的是什么?

【内存地址=引用 or 值】

v = [11,2,33,4]

def func(arg):
    print(id(arg)) # 列表内存地址
    
print(id(v)) # 列表内存地址
func(v)

# 传递的是内存地址。

*args和**kwargs的作用

  • 返回值

    • 常见数据类型可以返回

    • 函数也可以返回

      def func():
          def inner():
              pass
          return inner 
      
      v = func()
      
    • 特殊

      • 默认没返回就是None
      • return 1,2,3 等价于 return (1,2,3,4,)

    执行函数

    • 函数不被调用,内部代码永远不执行。

      def func():
          return i
      func_list = []
      for i in range(10):
          func_list.append(func)
      
      print(i) # 9
      v1 = func_list[4]()
      v2 = func_list[0]()
      
      func_list = []
      for i in range(10):
          # func_list.append(lambda :x) # 函数不被调用,内部永远不执行(不知道是什么。)
          func_list.append(lambda :i) # 函数不被调用,内部永远不执行(不知道是什么。)
      
      print(func_list)
      
      func_list[2]()=
      

      执行函数时,会新创建一块内存保存自己函数执行的信息 => 闭包

      def base():
          return i 
      
      def func(arg):
          def inner():
              return arg
          return inner
      
      base_list = [] # [base,base,]
      func_list = [] # [由第一次执行func函数的内存地址,内部arg=0 创建的inner函数,有arg=1的inner函数 ]
      for i in range(10): # i = 0 ,1
          base_list.append(base)
          func_list.append(func(i))
          
      # 1. base_list 和 func_list中分别保存的是什么?
      """
      base_list中存储都是base函数。
      func_list中存储的是inner函数,特别要说的是每个inner是在不同的地址创建。
      """
      # 2. 如果循环打印什么?
      for item in base_list:
      	v = item() # 执行base函数
          print(v) # 都是9
      for data in func_list:
          v = data()
          print(v) # 0 1 2 3 4 
      

总结:

  • 传参:位置参数 > 关键字参数
  • 函数不被调用,内部代码永远不执行。
  • 每次调用函数时,都会为此次调用开辟一块内存,内存可以保存自己以后想要用的值。
  • 函数是作用域,如果自己作用域中没有,则往上级作用域找。
posted @ 2024-09-26 06:15  jhchena  阅读(3)  评论(0编辑  收藏  举报