zoukankan      html  css  js  c++  java
  • 【2020Python修炼记15】Python语法入门—函数的基本使用

    【目录】

    一、什么是函数

    二、为何要有函数

    三、如何使用函数

    (一)定义函数

    (二)调用函数

    (三)函数返回值

    一、什么是函数

    为了方便重复使用某些需要的代码功能,因此创造了很多代码工具,给它们命名为‘函数’。 

    在程序中,具备某一功能的‘工具’——函数

                      ‘事先准备工具’的过程——函数的定义

                      ‘拿来就用’——函数的调用

     

    函数的分类:

    #1、内置函数
    为了方便我们的开发,针对一些简单的功能,python解释器已经为我们定义好了的函数,即内置函数。

    对于内置函数,我们可以拿来就用而无需事先定义,如 len(),sum(),max()

    #2、自定义函数
    很明显内置函数所能提供的功能是有限的,这就需要我们自己根据需求,事先定制好我们自己的函数来实现某种功能,

    以后,在遇到应用场景时,调用自定义的函数即可。

    二、为何要有函数

    为了解决以下程序代码问题:

    #1、代码的组织结构不清晰,可读性差

    #2、遇到重复的功能只能重复编写实现代码,代码冗余

    #3、功能需要扩展时,需要找出所有实现该功能的地方修改之,无法统一管理且维护难度极大

    三、如何使用函数

    函数的使用分为定义阶段调用阶段,

    定义函数时只检测语法,不执行函数体代码,

    函数名加括号即函数调用,只有调用函数时才会执行函数体代码

    定义函数发生的事情

    1、申请内存空间保存函数体代码

    2、将上述内存地址绑定函数名

    3、定义函数不会执行函数体代码,但是会检测函数体语法

    调用函数发生的事情

    1、通过函数名找到函数的内存地址——print(func)

    2、然后加括号就是在触发函数体代码的执行 ——func()

    (一)定义函数——三种方式

    函数的使用必须遵循’先定义,后调用’的原则。

    函数的定义就相当于 事先将函数体代码保存起来,然后将内存地址赋值给函数名,函数名就是对这段代码的引用,这和变量的定义是相似的。没有事先定义函数而直接调用,就相当于在引用一个不存在的’变量名’。

    def 函数名(参数1,参数2,...):
        """文档描述"""
        函数体
        return
    •  def: 定义函数的关键字;
    • 函数名:函数名指向函数内存地址,是对函数体代码的引用。函数的命名应该反映出函数的功能;
    • 括号:括号内定义参数,参数是可有可无的,且无需指定参数的类型;
    • 冒号:括号后要加冒号,然后在下一行开始缩进编写函数体的代码;
    • """文档描述"""  描述函数功能,参数介绍等信息的文档,非必要,但是建议加上,从而增强函数的可读性;
    • 函数体:由语句和:达式组成;
    • return 值:定义函数的返回值,return是可有可无的。

    1、方式一:无参函数

     # 示范1——先定义函数,后调用函数

    def bar(): #定义函数 bar(), bar=函数的内存地址
        print('from bar')
    
    def foo():
        # print(bar) # 输出的是函数的内存地址 <function bar at 0x0000021D5885A0D0>
        bar() #调用函数bar()
        print('from foo')
    
    foo() #调用函数foo()

     # 示范2——定义函数的部分,放在调用语句之后,但是在调用函数执行之前

    def foo():
        bar() #此处还未调用函数bar(),只是判断是否有语法错误
        print('from foo')
    # 定义函数 bar()
    def bar():  # bar=函数的内存地址
        print('from bar')
    
    foo() #调用函数bar()

    # 示范3———定义函数的部分,放在调用语句之后,且在调用函数执行之后,此时会出错哦

    def foo():
        # print(bar)
        bar()
        print('from foo')
    
    foo()
    
    def bar():  # bar=函数的内存地址
        print('from bar')
        
    
    NameError: name 'bar' is not defined


    2、方式二:有参函数——参数是函数的调用者向函数体传值的媒介

    函数——工厂

    参数——原材料

    返回值——产品

    def my_min(x,y):
        res=x if x < y else y
        return res

    3、方式三:空函数——函数体代码为 pass,代表什么都不做

    定义空函数通常是有用的,因为在程序设计的开始,往往是先想好程序都需要完成什么功能,

    然后把所有功能都列举出来用pass充当函数体“占位符”,这将使得程序的体系结构立见,清晰且可读性强。

    之后我们便可以统筹安排编程任务,有选择性的去实现函数体功能来替换掉pass,从而提高开发效率。

    栗子】:编写一个ftp程序,我们可能想到的功能有用户认证,下载,上传,浏览,切换目录等功能,可以先做出如下定义,再有选择性地实现函数体代码——

               

    def auth_user():
        """user authentication function"""
        pass
    
    def download_file():
        """download file function"""
        pass
    
    def upload_file():
        """upload file function"""
        pass
    
    def ls():
        """list contents function"""
        pass
    
    def cd():
        """change directory"""
        pass

    4、三种定义函数方式的使用场景:

    (1)无参函数

    def interactive():
        name=input('username>>: ')
        age=input('age>>: ')
        gender=input('gender>>: ')
        msg='名字:{} 年龄:{} 性别'.format(name,age,gender)
        print(msg)
    
    interactive()
    interactive()
    interactive()
    interactive()

    (2)有参函数

    def add(x,y): # 参数-》原材料
        # x=20
        # y=30
        res=x + y
        # print(res)
        return res # 返回值-》产品
    
    # add(10,2)
    res=add(20,30)
    print(res)

    (3)空函数

    参考上一小节内容中的【栗子】——编写一个ftp程序 

    (二)调用函数——

    按照在程序出现的形式和位置,可将函数的调用形式分为三种:

    1、语句的形式:只加括号调用函数

    interactive()
    add(1,2)

    2、表达式形式

    def add(x,y): # 参数-》原材料
        res=x + y
        return res # 返回值-》产品
    赋值表达式
    res=add(1,2)
    print(res)
    数学表达式
    res=add(1,2)*10
    print(res)

    3、函数调用可以当做参数

    res=add(add(1,2),10)
    print(res)

    (三)函数返回值

    1、return

    #若需要将函数体代码执行的结果返回给调用者,则需要用到return。

    #return的返回值无类型限制,且可以将多个返回值放到一个元组内。

    # return是函数结束的标志,即函数体代码一旦运行到 return,会立刻终止函数的运行;

    函数内可以有多个return,但只执行一次函数就结束了,并且会将 return后的值当做本次运行的结果返回。

    #PS:

    结束程序的执行的力度:

    exit > return > break > 条件为假

    (1)返回None:函数体内的return后无值或直接省略return,则默认返回none

    return
    return None


    def
    func(): pass res=func() print(res) # 返回值None


    (2)有return,返回一个值

    def func():
        return (10)
    res=func()
    print(res) # 返回值为10


    (3)有return,返回多个值——逗号分隔开多个值,默认返回元祖

    def func():
        return (10,'cc',[1,2])
    res=func()
    print(res,type(res)) # 返回值为元祖(10, 'cc', [1, 2])

    参考资料:

    https://www.cnblogs.com/linhaifeng/articles/7531972.html

    https://zhuanlan.zhihu.com/p/108808009

  • 相关阅读:
    RE
    【LeetCode】198. House Robber
    【LeetCode】053. Maximum Subarray
    【LeetCode】152. Maximum Product Subarray
    【LeetCode】238.Product of Array Except Self
    【LeetCode】042 Trapping Rain Water
    【LeetCode】011 Container With Most Water
    【LeetCode】004. Median of Two Sorted Arrays
    【LeetCode】454 4Sum II
    【LeetCode】259 3Sum Smaller
  • 原文地址:https://www.cnblogs.com/bigorangecc/p/12509083.html
Copyright © 2011-2022 走看看