• python笔记Ⅵ--函数、函数的参数


    一、函数简介

        函数也是一个对象(对象是内存中专门用来存储数据的一块区域)。函数可以用来保存一些可执行的代码,并且可以在需要时,对这些语句进行多次的调用。

    创建函数:

    def 函数名([形参1,形参2,...形参n]):
                代码块

    函数名必须要符合标识符的规范:可以包含字母数字下划线,但是不能以数字开头

        函数中保存的代码不会立即执行,需要调用函数代码才会执行。定义函数一般都是要实现某种功能的。   

    调用函数:

            函数对象()

    例1:

    1. # 定义一个函数
    2. def fn() :
    3. print('这是我的第一个函数!')
    4. print('hello')
    5. print('今天天气真不错!')
    6. # 打印fn
    7. print(fn) 0x03D2B618>
    8. print(type(fn)) <class 'function'>

    其中,fn是函数对象  fn()调用函数;

               print是函数对象 print()调用函数。

    例2:

    1. # 定义函数时指定形参
    2. def fn2(a , b) :
    3. # print('a =',a)
    4. # print('b =',b)
    5. print(a,"+",b,"=",a + b)
    6. # 调用函数时,来传递实参
    7. fn2(10,20)
    8. fn2(123,456)

    二、函数的参数

        在定义函数时,可以在函数名后的()中定义数量不等的形参, 多个形参之间使用 , 隔开。

    1、形参(形式参数):定义形参就相当于在函数内部声明了变量,但是并不赋值。

         定义形参时,可以为形参指定默认值,指定了默认值以后,如果用户传递了参数则默认值没有任何作用;如果用户没有传递,则默认值就会生效。

    2、实参(实际参数)
          如果函数定义时,指定了形参,那么在调用函数时也必须传递实参,实参将会赋值给对应的形参,简单来说,有几个形参就得传几个实参

    1. # 定义一个函数
    2. # 定义形参时,可以为形参指定默认值
    3. # 指定了默认值以后,如果用户传递了参数则默认值没有任何作用
    4. # 如果用户没有传递,则默认值就会生效
    5. def fn(a = 5 , b = 10 , c = 20):
    6. print('a =',a)
    7. print('b =',b)
    8. print('c =',c)

    (1)实参的传递方式: 

      ① 位置参数:就是将对应位置的实参复制给对应位置的形参。

      第一个实参赋值给第一个形参,第二个实参赋值给第二个形参......

    fn(1 , 2 , 3)

      ② 关键字参数:可以不按照形参定义的顺序去传递,而直接根据参数名去传递参数

    1. fn(b=1 , c=2 , a=3)
    2. print('hello' , end='') # 自动换行

    注意:位置参数和关键字参数可以混合使用。混合使用关键字和位置参数时,必须将位置参数写到前面。

    fn(1,c=30) # 1赋值给a

    例1:

         函数在调用时,解析器不会检查实参的类型。也就是说,实参可以传递任意类型的对象

    1. def fn2(a):
    2. print('a =',a)
    3. # 函数在调用时,解析器不会检查实参的类型
    4. # 实参可以传递任意类型的对象
    5. b = 123
    6. b = True
    7. b = 'hello'
    8. b = None
    9. b = [1,2,3]
    10. fn2(b)
    11. fn2(fn) # 这里函数传递的参数可以是fn()函数,这时a =

     例2:

    1. def fn4(a):
    2. # 在函数中对形参进行重新赋值,不会影响其他的变量
    3. # a = 20
    4. # a是一个列表,尝试修改列表中的元素
    5. a[0] = 30
    6. print('a =',a,id(a))
    7. c = 10
    8. c = [1,2,3]
    9. # fn4(c)
    10. # fn4(c.copy()) # 浅复制,这里传递的是c对应列表的副本
    11. # fn4(c[:]) # 切片,从头到尾的把值留下
    12. # print('c =',c,id(c))

    注意:

     ① 在函数中对形参进行重新赋值,不会影响其他的变量,所以c还是10。

     ② 如果形参执行的是一个对象,当我们通过形参去修改对象时,会影响到所有指向该对象的变量。

    3、不定长参数

    (1)在定义函数时,可以在形参前边加上一个 * ,这样这个形参将会获取到所有的实参,它将会将所有的实参保存到一个元组中。

     ① *a 会接受所有的位置实参,并且会将这些实参统一保存到一个元组中(装包)

    1. def fn(*a):
    2. print("a =",a,type(a))

     ② 带星号的形参只能有一个。带星号的参数,可以和其他参数配合使用。

    1. def fn2(a,b,*c):
    2. print('a =',a)
    3. print('b =',b)
    4. print('c =',c)
    5. fn2(1,2,3,4,5)

      第一个参数给a,第二个参数给b,剩下的都保存到c的元组中。

     ③ 可变参数不是必须写在最后,但是注意,带*的参数后的所有参数,必须以关键字参数的形式传递。

    1. def fn2(a,*b,c):
    2. print('a =',a)
    3. print('b =',b)
    4. print('c =',c)
    5. fn2(1,2,3,4,c=5)

      第一个参数给a,剩下的位置参数给b的元组,c必须使用关键字参数

     ④ 所有的位置参数都给a,b和c必须使用关键字参数。

    1. def fn2(*a,b,c):
    2. print('a =',a)
    3. print('b =',b)
    4. print('c =',c)
    5. fn2(1,2,3,b=4,c=5)

     ⑤ 如果在形参的开头直接写一个*,则要求我们的所有的参数必须以关键字参数的形式传递。

    1. def fn2(*,a,b,c):
    2. print('a =',a)
    3. print('b =',b)
    4. print('c =',c)
    5. fn2(a=3,b=4,c=5)

     ⑥ *形参只能接收位置参数,而不能接收关键字参数。

    1. def fn3(*a) :
    2. print('a =',a)
    3. fn3(b=1,d=2,c=3) # 会报错

    (2)**形参可以接收其他的关键字参数,它会将这些参数统一保存到一个字典中,字典的key就是参数的名字,字典的value就是参数的值。

     ①  **形参只能有一个,并且必须写在所有参数的最后

    1. def fn3(b,c,**a) :
    2. print('a =',a,type(a))
    3. print('b =',b)
    4. print('c =',c)
    5. fn3(b=1,d=2,c=3,e=10,f=20)

    (3)参数的解包(拆包)

       ① 传递实参时,也可以在序列类型的参数前添加 * ,这样他会自动将序列中的元素依次作为参数传递。这里要求序列中元素的个数必须和形参的个数的一致

    1. def fn4(a,b,c):
    2. print('a =',a)
    3. print('b =',b)
    4. print('c =',c)
    5. # 创建一个元组
    6. t = (10,20,30)
    7. fn4(*t)

    ② 通过 ** 来对一个字典进行解包操作。

    1. # 创建一个字典
    2. d = {'a':100,'b':200,'c':300}
    3. # 通过 **来对一个字典进行解包操作
    4. fn4(**d)

  • 相关阅读:
    项目部署与上线
    超详细的Linux环境如何搭建禅道
    Heap (mathematics)
    【环境搭建】linux docker-compose安装mysql5.7
    数据结构初阶:队列
    ai学习前瞻-python环境搭建
    苹果Mac电脑L2TP连接公司内部网络失败解决方案
    JavaWeb在线问题.Linux服务器磁盘Disk核查
    SHELL中的数组及其相关操作
    电子学会2023年9月青少年软件编程(图形化)等级考试试卷(一级)真题,含答案解析
  • 原文地址:https://blog.csdn.net/gaoxiaochan/article/details/126651126