zoukankan      html  css  js  c++  java
  • 四,程序流程控制之函数

    函数

    为什么需要函数?

    思考以下代码:

     if cpu使用率 >80%:
            连接邮箱
            发送邮件
            关闭邮箱
        if 内存使用率 >80%:
            连接邮箱
            发送邮件
            关闭邮箱
        if 硬盘使用率 >80%:
            连接邮箱
            发送邮件
            关闭邮箱

    可以看见,每个条件判断内的代码块都是一样的内容,如果现在需要修改其中一条,则每个相同的代码块都要修改,如果重复的代码块有更多,那会非常不方便,容易出问题,所以定义了函数,去代表这些重复的内容,每次我们需要用到这个代码块的时候只需要去调用就可以了

    1,函数的概念

    函数是一段具有特定功能的代码块,可以重复使用,以函数名来表示,通过函数名来完成调用。

    函数也可以看作是一段子程序,需要的的时候调用,不用在每个需要执行的地方去重复编写代码。每次使用函数时可以传入不同的参数,以对不同的数据进行处理;函数执行后,可以反馈相应的处理结果。

    函数是一种抽象功能。

    2,Python中的函数定义

    Python中函数用def关键字来定义,语法格式如下

    def 函数名(参数列表):

      函数体代码块

      return(返回值列表)

    调用的时候直接用   函数名(实际参数)   来实现

    def func():

      print('123')

    func()

    结果为123

    3,函数的调用过程

    程序调用函数一共要经过4个步骤:

    1,程序在函数调用处暂停执行

    2,在调用函数时将实参赋值给形参

    3,执行函数体代码块

    4,执行完毕后给出返回值,回到调用前暂停处继续执行

    4,函数的参数

    定义函数时()里的参数叫形参(形式参数),它只是一个变量名,供函数体调用。

    调用函数时,()里的参数叫做实参(实际参数),它是实际的数据,会传递给形参,供函数体执行。

    4.1形参

    定义函数时,形参根据功能不同,可以定义几种类型。

    4.1.1必须参数

    在定义函数时,如果要求必须传入的参数,就叫做必须参数。

    直接定义在函数名()中的参数就是必须参数。

    def ad(x,y):

      print(x+y)

    ad(1)

    结果会报错,指出少传了一个y的实参

    4.1.2默认参数

    在定义函数时,某些形参一开始会有默认值,可以不用接收实参,这个时候就可以定义默认参数。

    在函数名()中,以  变量名=默认值  的形式定义的形参就是默认参数。

    注意:默认参数必须放在必须参数后面。若传了实际参数给默认形参,则会覆盖默认值。

    4.1.3不定参数

    在定义函数时,有时会不确定会传多少个参数,这个时候就可以定义不定参数。

    不定参数根据传递的实参不同分为两种:

    位置不定参

    在函数名的()中,在形参前加星号*,则可以定义位置不定参,通常会将它定义为*args

    它用来接收调用函数时,以位置传递过来的超过形参数量的剩下的实参。

    注意:不定参必须定义在默认参数后面

    def func(a,*args):

      print(args)

    func(1,2,3,4)

    结果为(2,3,4)

    位置不定参会接收除了第一个之外剩下的所有实参,并以元组的形式返回

    关键字不定参

    在函数名的()中,在形参前加双星号**,则可以定义关键字不定参,通常会将它定义为**kwargs

    它用来接收函数调用时,以关键字参数传递过来的超过形参数量的剩下的实参。

    注意:不定参必须定义在默认参数后面

    def func(a,**kwargs):

      print(kwargs)

    func(a=1,b=2,c=3,d=4)

    结果为{'b':2,'c':3,'d':4}

    关键字不定参会接收除了第一个以外剩下的所有实参,并以字典的形式返回

    4.2实参

    调用函数时,传递实参有两种方式

    4.2.1位置参数

    传递参数时,默认会按照形参的位置一一对应,这种实参传递方式也叫位置参数。

    def power(x,y):

      print(x**y)

    power(2,3)  结果为8

    power(3,2)  结果为9

    实参按照形参的位置一一对应传入,所以结果会有区别

    4.2.2关键字参数

    调用函数时,参数按照  形参名=实参  的形式传递的参数叫做关键字参数。

    这是不用考虑参数的位置。

    注意:关键字参数要放在位置参数后面

    使用关键参数调用上面的函数

    power(x=3,y=2)  9  

    power(y=2,x=3)  9

    power(3,y=2)  9

    power(y=2,3)  报错

    4.2.3*,**在传递实参时的用法

    *解包

    在传递实参时,可以通过*对迭代对象进行解包。

    def func(a,b,*args):

      print(a,b,args)

    l = [1,2,3,4,5,6]

    func(*l)

    结果为1 2 (3,4,5,6),这里func(*l)相当于func(1,2,3,4,5,6)

    **解包

    在传递实参时,可以通过**对字典进行解包

    def func(a,b,**kwargs):

      print(a,b,kwargs)

    t = {'a':1,'b':2,'c':3,'d':4}

    func(**t)

    结果为1 2 {'c':3,'d':4},这里func(**t)相当于func(a=1,b=2,c=3,d=4)

    4.3返回值

    函数还有一个重要的功能,就是返回结果

    Python中函数以关键字 return 来返回结果并退出函数,程序回到调用函数处继续往下执行

    return可以将0个,1个,多个函数运算完的结果,返回给函数被调用处的变量

    函数可以没有返回值,也就是可以没有return语句,这是函数返回None

    return会将多个返回值以元组的形式返回

    注意:函数被调用执行函数体时,只要遇到return,就马上停止退出函数,返回到函数被调用处往下执行

    5,lambda函数

    与三元运算类似,lambda函数用来定义简单的,能够在一行内表达的函数,语法格式如下

    lambda arg1,arg2,...:表达式

    f = lambda x,y: x + y

    res = f(1,2)

    print(res)

    结果为3

    6,变量作用域

    Python中一个变量能被访问的范围就叫做作用域,根据作用域的大小,分为全局变量和局部变量

    6.1全局变量

    Python是解释型语言,解释器在执行一个Python程序时会在计算机内存中申请一块内存来运行这个程序,全局变量在这块内存空间中都可以被访问和修改

    直接定义在函数外的变量就是全局变量,在程序运行的全过程有效

    6.2局部变量

    相对应的,在函数里面定义的变量就是局部变量,它只在函数里有效,一旦函数执行完毕,它就不存在了

    6.3global关键字

    有时我们需要在函数内部修改全局变量

    使用global关键字可以在函数内部修改全局变量

    a = 1

    def func():

      global a  #声明a为全局变量

      a += 1

    func()

    print(a)

    结果为2

    7,python的内置函数

    Python解释器一共提供了70多个内置函数。

    import builtins

    print(dir(builtins))

    结果小写的都是内置函数

    常用内置函数

    abs()  返回数字的绝对值。参数可以是整数或浮点数。如果参数为复数,则返回其大小。如果x定义__abs__(),则 abs(x)返回x.__abs__()

    all(可迭代)  没理解  

    bin()  将整数转换为以“0b”为前缀的二进制字符串。结果是有效的Python表达式

    chr()  接收一个字符的unicode整数,返回这个字符

    dir(对象)  尝试返回该对象的有效属性列表。

    divmod(a,b)  使用两个(非复数)数字作为参数,并在使用整数除法时返回一对包含其商和余数的数字。

    enumerate(可迭代对象,start = 0)  返回一个枚举对象。iterable必须是序列, 迭代器或其他支持迭代的对象。__next__()enumerate()返回的迭代器的方法 返回一个元组,该元组包含一个计数(从start开始,默认为0),以及通过对iterable进行迭代而获得的值。

    简单说就是循环这个可迭代对象,给每一个元素前加序号

    help(对象)  调用内置的帮助系统。

    hex()  将整数转换为以“ 0x”为前缀的小写十六进制字符串。

    id(对象)  返回该对象内存中的地址

    input()  用户输入,以字符串形式返回

    isinstance(object,classinfo)  接收一个对象和一个类,如果对象是这个类的对象或者这个类的子类(直接,间接)的对象则返回True,否则返回False。

    issubclass(class,classinfo)  如果classclassinfo的子类(直接,间接)则返回True,否则返回False。

    iter()  返回一个迭代器对象,如果对象不支持迭代则抛出异常。

    len()  返回对象的长度(项目数)。参数可以是序列(例如字符串,字节,元组,列表或range)或集合(例如字典,集合)。

    map()  返回一个迭代器,该迭代器将函数应用于iterable的每个项目,并产生结果。

    max()  返回可迭代的最大项目或两个或多个参数中的最大一个。

    如果提供了一个位置参数,则它应该是可迭代的。返回迭代器中最大的项。如果提供了两个或多个位置参数,则返回最大的位置参数。

    min()  返回可迭代的最小项或两个或多个参数中的最小项。

    如果提供了一个位置参数,则它应该是可迭代的。返回iterable中的最小项。如果提供了两个或多个位置参数,则返回最小的位置参数。

    oct()  将整数转换为以“ 0o”为前缀的八进制字符串。结果是有效的Python表达式。

    ord()  返回一个字符的unicode码的十进制整数。

    pow(x,y)  返回x的y次幂。

    reversed()  返回一个反向迭代器

    round()  返回数字舍入到小数点后的n位精度。如果ndigits省略或为None,则返回与其输入最接近的整数。

    sorted(iterable**,key = Nonereverse = False* )

    iterable中的项目返回一个新的排序列表。

    有两个可选参数,必须将其指定为关键字参数。

    key指定一个自变量的函数,该函数用于从iterable中的每个元素中提取一个比较键(例如key=str.lower)。默认值为None(直接比较元素)。

    reverse是一个布尔值。如果设置为True,则对列表元素进行从大到小的排序。

    sum(迭代)  求和

    zip()  制作一个迭代器,聚合每个可迭代对象中的元素。

  • 相关阅读:
    讯时新闻系统再探
    三顾讯时对讯时新闻发布系统的艰难突破
    MsSQL注入猜解数据库技术
    提取中国IP段信息
    翻译杂感 via刘未鹏
    学习密度与专注力
    Cross Compilation Toolchains
    RHEL/CentOS 6.0使用第三方软件库(EPEL与RPMForge、RPMFusion软件库)
    一个很好的shell配置文件
    Cloud Computing
  • 原文地址:https://www.cnblogs.com/wuxiaofan/p/13047521.html
Copyright © 2011-2022 走看看