Top

初识函数

一、什么是函数

1,我们到目前为止,已经可以完成一些软件的基础功能了,那么我们来完成这样一个功能:约x,代码如下

    print("拿出手机")
    print("打开陌陌")
    print("找个漂亮的妹子")
    print("问她,约不约啊?")
    print("OK,走你!")

  ok,我们已经完成了对一个功能的描述,那么问题来了,我还想再约一次,怎么办呢?很简单,再写一次就好了,如下代码:

    # 约一次
    print("拿出手机")
    print("打开陌陌")
    print("找个漂亮的妹子")
    print("问她, 约不约啊?")
    print("oK. 走你!")
    # 再来一次
    print("拿出手机")
    print("打开陌陌")
    print("找个漂亮的妹子")
    print("问她, 约不约啊?")
    print("oK. 走你!")

  ok,也很简单,但是,我现在还想约,约个10次8次的,怎么办呢?也简单,加个循环就好了,代码如下:

    while 1:
           print("拿出手机")
           print("打开陌陌")
           print("找个漂亮的妹子")
           print("问她, 约不约啊?")
           print("oK. 走你!")

  哇,终于可以不停的约了,但是呢,想想,这样写出的程序是不是一直在约呀?人呢,要有节制,有需求了再约,这样比较好,所有呢,这样写是不行的,最好是我想什么时候约就什么时候约,说到这里,我们可以这样做,把约会这个事情啊,先计划一下,然后呢安排好流程,在需要约的时候,把这个约会流程拿出来就好了,那么这里,我们可以先定义一个事情或者功能,等到需要的时候直接去用就好了,那么这里定义的东西就是一个函数。

综上总结:函数就是对具有一定功能的代码块的封装。

二、函数的定义,函数名,函数体以及函数的调用

       我们使用def关键字来定义函数,函数的定义语法:

    def 函数名():
            函数体

  这里的函数命名规则和使用变量基本一样,具体参照第一篇博客随笔。

       函数体:就是函数被执行之后要执行的代码。

       下面我来定义一个约x功能:

    def yue():
        print("拿出手机")
        print("打开陌陌")
        print("找个漂亮的妹子")
        print("问她, 约不约啊?")
        print("oK. 走你!")

  哦了,定义完了,但是这个时候去执行,会发现什么都没有发生,因为我只定义了一个函数,但是还没有执行过这个函数。

函数的调用:使用函数名可以调用函数,写法:函数名( ),这个时候函数的函数体会被执行。如下示例:

    #调用yue()函数
    yue()
    # 结果为:
    # 拿出手机
    # 打开陌陌
    # 找个漂亮的妹子
    # 问她,约不约啊?
    # ok.走你!

终于可以约了,如果我还想约呢?多次调用就可以了,很方便。

    # 调用yue()函数
    yue()
    yue()
    yue()
    yue()
    yue()

继续分析,约完了之后你需要得到一个结果吧,比如,约完了得到了一个萝莉,少妇,大妈,总得有个结果,那么这个结果怎么来描述和获得呢?这个就涉及到函数返回值的问题。

三、函数的返回

       执行完函数之后,我们可以使用return来返回结果。

1,函数中遇到return,此函数结束,不再继续执行,具体示例如下:

    def yue():
        print("约你")
        print("约我")
        print("约他")
        return
        print("约谁呀")   #这句话不会被执行
    yue()

2,给函数的调用者一个访问结果,具体如下:

    def yue():
        print("约你")
        print("约我")
        print("约他")
        return "美女一枚"
    girl = yue()
    print(girl)  # 美女一枚

3,函数的返回值可以有多个结果,具体如下:

    def yue():
        print("约你")
        print("约我")
        print("约他")
        return "美女一枚","萝莉一个"
    girl = yue()
    print(girl)   # 结果为:('美女一枚', '萝莉一个')
    print(type(girl))     # tuple

综上总结:

       1,遇到return,此函数结束,函数后面的东西将不会再执行;

       2,return 返回值

关于返回值:

       如果return后什么都不写或者干脆不写return,那么返回的就是None;

       如果return后面写了一个值,则调用者可以接收一个结果;

       如果return后面写了多个结果,则调用者可以接收一个tuple,调用者可以直接解构成多个变量;

OK,完美,可以得到结果了,但是我们约的方式是不是有点问题呢?陌陌现在还能约到么?约不到了吧。改换探探了,那过两天探探也死掉了呢?是不是还会有一个代替品,那你想有一个替代的,你就需要去改一下代码,是不是会太不合适了,最好的方式是不是想用什么约就用什么约?ok,我们可以通过函数的参数来给函数传递一些信息。

四,函数的参数

参数:函数在调用的时候指定具体的一个变量的值,就是参数。语法如下:

    def 函数名(参数列表):
        函数体

首先我们先把代码改一下,能够实现上面的需求,具体如下:

    def yue(chat):
        print("拿出手机")
        print("打开"+chat)
        print("找个漂亮的妹子")
        print("约不约")
    yue("陌陌")
    yue("微信")
    yue("探探")

  搞定了,我们在调用yue( )的时候给chat一个值,然后再执行函数体。

关于参数:

1,形参

       写在函数声明的位置的变量叫形参,形式上的一个完整,表示这个函数需要xxx。

2,实参

       在函数调用的时候给函数传递的值,叫实参,实际执行的时候给函数传递的信息,表示给函数xxx。

3,传参

       给函数传递信息的时候将实际参数交给形式参数的过程被称为传参。

    def yue(chat): # chat 形参
        print("拿出手机")
        print("打开"+chat)
        print("找个漂亮的妹子")
        print("约不约")
    yue("陌陌")  # "陌陌" 实参
    len("字符串")    # "字符串"在这里就是实参
    print("马化腾")   # "马化腾"就是实参
4,参数的分类:

       4.1 首先看实参:有三种:位置参数关键字参数混合参数

       4-1-1:位置参数

约到这里了,有没有想过这个问题,啥样的都约么?哪里的都约么?不一定吧,比如,我在北京,我很寂寞,我喜欢小姐姐,强哥,在哈尔滨,很寂寞,大妈就行了,需求是不一样,而我们现在的函数没有这些功能,那该怎么办呢?很简单,多来几个参数就好了,具体如下:

    def yue(chat, address, age):  # 形参
        print("拿出手机")
        print("打开"+chat)
        print("找个"+address+"附近漂亮的"+str(age)+"岁妹子")
        print("约不约")
    yue("微信", "北京", 18)  # 实参 之 位置参数
    # 结果为:
    # 拿出手机
    # 打开微信
    # 找个北京附近漂亮的18岁妹子
    # 约不约

  分析:在访问yue()的时候,我们按照位置顺序分别把"微信","北京",18赋值给chat,address,age。在传参过程中系统会默认按照位置把实参赋值到形参。

       4-1-2:关键字参数

       位置参数好不好呢? 如果是少量的参数还可以,没有问题. 但是如果函数在定义的时候参数非常多怎么办? 程序员必须记住, 我有哪些参数, 而且还有记住每个参数的位置, 否则函数就不能正常调用了. 那怎么办呢? python提出了一种叫做关键字参数. 我们不需要记住每个参数的位置. 只要记住每个参数的名字就可以了。具体如下:

    def yue(chat, address, age):
        print("拿出手机")
        print("打开"+chat)
        print("找个"+address+"附近漂亮的"+str(age)+"岁妹子")
        print("约不约")
    yue(chat="微信", age=18, address="北京")  # 关键字参数
    # 结果:
    # 拿出手机
    # 打开微信
    # 找个北京附近漂亮的18岁妹子
    # 约不约

  搞定,这样就不需要记住繁琐的参数位置了

       4-1-3:混合参数

       可以把上面的两种参数混合着使用,也就是说在调用函数的时候既可以给出位置参数,也可以指定关键字参数,具体如下:

    # 混合参数
    yue("微信", age=18, address="上海") 
    # 正确.第一个位置赋值给chat, 后面的参数开始指定关键字.

    yue(age="18", "微信", address="广州") 
    # 错误, 最开始使用了关键字参数, 那么后面的微信的位置就串了, 容易出现混乱

  注意:在使用混合参数的时候,关键字参数必须在位置参数后面

综上总结:在实参的角度来看,分为三种:

       1)位置参数

       2)关键字参数

       3)混合参数(位置参数必须在关键字参数前面)

       4.2 从形参角度看,也有三种:位置参数默认值参数动态参数

       4-2-1:位置参数

       按照位置来赋值,到目前为止,我们编写的函数都是这种,具体如下:

    def yue(chat, address, age):
        print("拿出手机")
        print("打开"+chat)
        print("找个"+address+"附近漂亮的"+str(age)+"岁妹子")
        print("约不约")

  4-2-2:默认值参数

       在函数声明的时候,就可以给出函数参数的默认值,在调用的时候可以给出具体的值,也可以不给值,使用默认值。比如,我们录入咱们班学生的基本信息,通过调查发现,我们班大部分学生都是男生,这个时候就可以给出一个sex="男"的默认值。具体如下示例:

    def stu_info(name, age, sex=""):         # sex="男" 是 默认值参数 
        print("录入学生信息")
        print(name, age, sex)
        print("录入完毕")

    stu_info("张强强", 18)
    stu_info("王红", 17, "")
    

注意,必须先声明位置参数,才能声明默认值参数

综上总结:在形参的角度来看,分为三种:

  1)位置参数

  2)默认值参数(大多数传进来的参数都是一样的时候, 一般用默认值参数;默认值参数要写在位置参数之后;用法:不传该实参且相对应的形参设置了默认值)

       3)动态参数(下篇介绍)

 补充:三元表达式(或三目运算符)

    a if a > b else b
    # a>b为真则结果为a,否则结果为b

 

posted @ 2018-08-08 16:40  勇敢的巨蟹座  阅读(266)  评论(0编辑  收藏  举报