• Python函数篇(1)-函数中的形参与实参(已更新)


    1:什么是函数

      函数其实就是带名字的代码块,用于完成一些具体的工作。如果我们在写一段程序的时候,需要多次用到同样的一个功能,如果每次都要重复写相同的代码,不仅会增加我们的代码量,更会让我们写出的代码让别人看起来觉得很low,而如果我们把功能作为一个代码块封装在一个函数里,每次仅需要调用这个函数,是不是就很方便了?这就是函数的意义所在

    1.1 函数的定义方式  

      函数的定义使用def关键字,如下:

    def user():                        def 关键字后面加函数名定义函数,定义以冒号结尾
        """内部代码块"""                使用三引号来构成文档字符串,用来解释该函数的主要功能,这是一个很好的编码习惯  
        print("Hello World")       函数体,用来写该函数需要完成的功能的代码
    user()                 使用函数名()的方式调用函数

     1.2 向函数传递参数信息

      在定义函数的时候,可以在函数的()内加入变量,在调用函数的时候就可以给函数传入对应的值,以上个例子稍作修改:

    def user(username):
        """内部代码块"""
        print("Hello World,"+username)    在定义函数的时候传入变量username,在调用该函数的时候就可以通过传值来让函数实现相应的功能
    user("尼古拉斯赵四")
    输出结果:
    Hello World,尼古拉斯赵四

    2 形参和实参

      从名字就可以看出,实参是一个实实在在存在的参数,是实际占用内存地址的,而形参只是意义上的一种参数,在定义的时候是不占内存地址的,如在上面例子中,username就是一个形参,尼古拉斯赵四是我在调用函数时传入的一个实参,它的值被存储在形参username中。

      函数的调用中,可能存在多个实参,在给函数传递参数的时候只要有两种方式,位置实参和关键字实参,每个实参都由变量名和值组成,实参还可以是列表、字典

      1.位置实参

      在调用函数的时候,必须将每个实参都关联到函数定义中的每一个形参,最简单的关联方式就是基于实参的顺序。

    def func(x,y,z):              首先在定义函数的时候传入3个形参x,y,z
        print(x,y,z)
    func(3,2,1)           在调用该函数时,通过位置实参的方式,将实参映射到形参,一一对应,即x=3,y=2,z=1
    运行结果:
    3 2 1

      需要注意一点的就是,如果使用位置实参的方式传值,传入的实参个数必须与形参相同,否则运行程序会报。

      2.关键字实参

      关键字实参是通过关键字-值的方式,关键字实参的方式就不需要考虑函数调用过程中实参的顺序。同一个参数不能传两个值

    def func(x,y,z):
        print(x,y,z)
    func(x=1,y=2,z=3)             通过关键字=值的方式,将实参与形参关联映射,不需要考录形参的顺序,顺序也可以改变,即y=2,z=3,x=1 ,运行的结果不会发生改变
    运行结果:
    1 2 3

      3.既有顺序,又有关键字

    def func(x,y,z):
        print(x,y,z)
    func(1,y=2,z=3)               在两种方式混用的时候,顺序实参必须要放在关键字实参之前,否则会程序报错,如 1,y=2.3  y=2 1,3这种方式都不可行
    运行结果:
    1 2 3

      4.默认值   

      在定义函数的时候,也可以指定形参的默认值,如果在调用函数时给函数提供了实参时,Python将使用指定的实参值,否则的,将自动调用形参的默认值。因此,如果给形参指定了默认值后,在调用时可以不用给它传值,使用默认值可以简化函数的调用。如:

    def func(x,y=2):             定义函数的时候在这里给形参设置了默认值y=2
        print(x,y)
    func(1)             在调用此函数时,只传入了一个实参,y的值就会使用默认值
    运行结果:
    1 2

      还可以在调用的时候,更改默认值 ,如

    def func(x,y=2):
        print(x,y)
    func(1,3)                    在调用该函数的时候,给设置了默认值的形参y再次赋值,这运行结果会使用新传入的实参值
    运行结果:
    1 3

      在使用形参默认值的时候需要注意:在形参列表中必须先列出没有默认值的形参,再列出有默认值的形参。这让Python依然能够正确的解读位置实参。

    def func(x=2,y):
        print(x,y)
    func(1)                        这种情况程序是不允许运行的

      即:在函数调用过程中,可以混合使用位置实参,关键字实参和默认值参数,但是其中相关的规则一定要遵循,否则一定会导致程序的运行出错。

      当提供的实参多于或少于函数定义时所提供的形参时,程序会报错,这时只要根据报错信息正确修改即可。

      5.列表和字典

      当不确定需要传入的值是多少时,在定义形参的时候,可以使用*args(列表),**kwargs(字典)来表示。

    def func(*args,**kwargs):        使用*args代表列表。**kwargs代表字典,这种形式可以在调用函数的时候传入多个实参
        print(args)
        print(kwargs)
    func(*[1,2,3,4,5],**{"y":1})     如果想要传入的值以列表或字典的形式显示出来,就需要在元素前加上*或**
    运行结果:

    (1, 2, 3, 4, 5)
    {'y': 1}

    3 函数的返回值

      函数不是直接显示输出的,相反,它会处理一些数据并返回一个或一组值。在函数中用return语句将值返回到调用函数的代码行,返回值能将程序大部分繁重的工作移交到函数中去完成,从而简化主程序。

      下面是一个简单的程序,接收姓氏和名称,返回完整的人名信息

    def name(first_name,last_name):
        """返回人的姓名"""
        full_name=first_name+" "+last_name
        return full_name
    print(name("尼古拉斯","赵四"))
    运行结果:
    尼古拉斯 赵四

      函数可以返回任何类型的值,包括字典、列表这样较复杂的数据结构。还是上面的例子,返回一个表示人的字典

    def name(first_name,last_name,):
        """返回人的姓名"""
        full_name={"first":first_name,"last":last_name}
        return full_name
    print(name("尼古拉斯","赵四"))
    运行结果为:
    {'first': '尼古拉斯', 'last': '赵四'}

      函数传递列表,传递列表在函数中很有用,在列表中包含数字、名字甚至更复杂的对象,下面举一个例子:

    def func(names):
        """向列表中的所有用户问号"""
        for i in names:
            print("Hello"+" "+i+"!!")
    func(["刘能","赵四","尼古拉斯"])
    运行结果:
    Hello 刘能!!
    Hello 赵四!!
    Hello 尼古拉斯!!

      函数还可以结合while循环,下面是我自己写的一个很简单的例子,用户输入姓氏和名字,最终输出完整的一句话。

    def name(first_name,last_name,):
        """返回人的姓名"""
        full_name=first_name+last_name
        return full_name
    
    while True:
        print("
    please tell me your name ")
        f_name=input("first name:")
        l_name=input("last name:")
        print("
     Hello"+name(f_name,l_name)+"!")            输入姓氏和名字,通过name函数整合后,输出结果

       

  • 相关阅读:
    编码 原码 反码 补码
    java垃圾收集器与内存分配策略
    MYSQL 索引 性能优化
    jvm内存溢出性能调优
    JVM内存模型
    线程相关
    Java 设计模式
    synchronized 与 volatile
    ActivityGroup相关--getLocalActivityManager() 以及intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)用法
    [Android] Activity 重复使用
  • 原文地址:https://www.cnblogs.com/Chen-Zhipeng/p/7940902.html
Copyright © 2020-2023  润新知