函数的进阶

5.3参数

1.基本参数知识

  • 任意参数

  • 任意类型
    def func(a1,a2,a3):
    print(a1,a2,a3)

    func(1,"asdf",True)
    

2.位置传参(调用函数并传入参数)【执行】

def func(a1,a2,a3):
    print(a1,a2,a3)
    
func(1,3,4)#a1=1,a2=3,a3=4

3.关键字传参【执行】

def func(a1, a2):
    print(a1, a2)

func(a2=99,a1=2)

# 关键字传参数和位置传参可以混合使用(位置传入的参数 > 关键字参数在后 = 总参数个数)
def func1(a1, a2, a3):
    print(a1, a2, a3)

# func(1, 2, a3=9)
# func(1, a2=2, a3=9)
# func(a1=1, a2=2, a3=9)
# func(a1=1, 2,3) # 错误

4.默认参数【定义】

def func(a1,a2,a3=9,a4=10):
    print(a1,a2,a3,a4)

func(11,22)
func(11,22,10)
func(11,22,10,100)
func(11,22,10,a4=100)
func(11,22,a3=10,a4=100)
func(11,a2=22,a3=10,a4=100)
func(a1=11,a2=22,a3=10,a4=100)

5.万能参数【也叫打散】

- *args

  • 可以接受任意个数的位置参数,并将参数转换成元组。
    • 调用函数无*
      def func(*args):
      print(args)

      func(1,2,3,4)#带列表,集合,字典,结果出来都是元祖
      
    • 调用函数有*
      def func(*args):
      print(args)

      func(*(1,2,3,4))
      func(*[1,2,3,4])#结果直接是元祖(1,2,3,4)
      
    • 只能用位置传参
      def func(*args):
      print(args)

      func(1)

      func(1,2)

      func(1,2) # args=(1, 2)
      func((11,22,33,44,55)) # args=((11,22,33,44,55),)
      func(*(11,22,33,44,55)) # args=(11,22,33,44,55)

- **kwargs

- 可以接受任意个数的关键字参数,并将参数转换成字典。
  - 调用函数无 **
        def func(**kwargs):
            print(kwargs)
        
        
        func(k1=1,k2="alex")
  - 调用函数有**
        def func(**kwargs):
            print(kwargs)
        func(**{'k1':'v2','k2':'v2'}) # kwargs={'k1':'v2','k2':'v2'}
  • 只能用关键字传参

  • 综合应用:无敌 + 无敌 => 真无敌
    def func(args,**kwargs): print(args,kwargs)
    # func(1,2,3,4,5,k1=2,k5=9,k19=999)func(
    [1,2,3],k1=2,k5=9,k19=999)func([1,2,3],**{‘k1’:1,‘k2’:3})func(111,222,[1,2,3],k11=‘alex’,**{‘k1’:1,‘k2’:3})
    def old(a, b, c, *args, **kwargs):
    print(a, b, c) # 5 2 1
    print(args) # ()
    print(kwargs) # {‘y’: 3, ‘q’: 1, ‘w’: 3}

    old(5, c=1, b=2, y=3, q=1, w=3)
    

- 参数相关重点:

1.定义函数
    def func1(a1,a2):
        pass 
    
    def func2(a1,a2=None):
        pass 
    
    def func3(*args,**kwargs):
        pass 
    
2.调用函数
 位置参数>关键字参数

5.4作用域

名称空间

  • 加载顺序
    1.内置空间
    2.全局空间
    3.局部空间
  • 取值顺序
    1.局部空间
    2.全局空间
    3.内置空间

作用域

  • 1.全局作用域 内置空间+全局空间

  • 2.局部作用域 局部空间

  • py文件:全局作用域

  • 函数:局部作用域
    a = 1
    def s1():
    x1 = 666
    print(x1)
    print(a)
    print(b)

    b = 2
    print(a)
    s1()
    a = 88888
    def s2():
        print(a,b)
        s1()
    
    s2()
    
    • 一个函数一个作用域
      def func():
      x = 9
      print(x)
      func()
      print(x)

    • 作用域中查找数据规则:优先在自己的作用域找数据,自己没有就去 “父级” -> “父级” -> 直到全局,全部么有就报错。注意:父级作用域中的值到底是什么?
      x = 10
      def func():
      x = 9
      print(x)

      func()
      
    • global
      声明全局变量,如果全局中存在就使用,不存在就会创建
      def func():
      global a
      a = 3
      func()
      print(a) # 3

      count = 1
      def search():
      global count
      count = 2
      search()
      print(count) # 2
      对可变数据类型(list,dict,set)可以直接引用不用通过global。

    • nonlocal
      在局部作用域中,对父级作用域(或者更外层作用域非全局作用域)的变量进行引用和修改,并且引用的哪层,从那层及以下此变量全部发生改变。如果找不到就会报错
      def add_b():
      b = 42
      def do_global():
      b = 10
      print(b)
      def dd_nonlocal():
      nonlocal b
      b = b + 20
      print(b)
      dd_nonlocal()
      print(b)
      do_global()
      print(b)
      add_b() # 10 30 30 42

5.5函数的嵌套

  • 第一种
    def max2(x,y):
    m = x if x>y else y
    return m

    def max4(a,b,c,d):
        res1 = max2(a,b)
        res2 = max2(res1,c)
        res3 = max2(res2,d)
        return res3
    
    max4(23,-7,31,11) # 31
    
  • 第二种
    def f1():
    print(“in f1”)
    def f2():
    print(“in f2”)
    f2()

    f1() # in f1  in f2
    ###########
    def f1():
        def f2():
            def f3():
                print("in f3")
            print("in f2")
            f3()
        print("in f1")
        f2()
        
    f1() # in f1  in f2  in f3
    

练习题

#!/usr/bin/env python
# -*- coding:utf-8 -*-

# x = 10
# def func():
#     x = 9
#     print(x)
#     def x1():
#         x = 999
#         print(x)
#
# func()



# x = 10
# def func():
#     x = 9
#     print(x)
#     def x1():
#         x = 999
#         print(x)
#     x1()
#
# func()


# x = 10
# def func():
#     x = 9
#     print(x)
#     def x1():
#         x = 999
#         print(x)
#     print(x)
#     x1()
#
# func()

# x = 10
# def func():
#     x = 8
#     print(x)
#     def x1():
#         x = 999
#         print(x)
#     x1()
#     print(x)
#
# func()


# x = 10
# def func():
#     x = 8
#     print(x)
#     def x1():
#         print(x)
#     x1()
#     print(x)
#
# func()



# x = 10
# def func():
#     x = 8
#     print(x)
#     def x1():
#         print(x)
#     x = 9
#     x1()
#     x = 10
#     print(x)
#
# func()

#
# x = 10
# def func():
#     x = 8
#     print(x)
#     def x1():
#         print(x)
#
#     x1()
#     x = 9
#     x1()
#     x = 10
#     print(x)
#
# func()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值