zoukankan      html  css  js  c++  java
  • 初识函数

    一、什么是函数

    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
  • 相关阅读:
    剑指Offer_58_对称的二叉树
    剑指Offer_57_二叉树的下一个结点
    [Vue安装教程]十分钟学会vue 安装
    Flex布局做出自适应页面--语法和案例
    对JS中事件委托的理解
    JS代码中!!的用法,以及代码性能对比
    PHP 深度理解preg_quote()函数
    display的block、none、inline属性及解释
    div背景图片或颜色不显示的解决办法
    MYSQL优化_MYSQL分区技术[转载]
  • 原文地址:https://www.cnblogs.com/li-li/p/9443771.html
Copyright © 2011-2022 走看看