zoukankan      html  css  js  c++  java
  • 函数

    1. 函数基础概念


     

      1.1 定义: 实现具体功能的一段代码

      1.2 格式 : def 函数名(形参):

      1.3 作用 : 提高代码复用性,减少重复

      1.4 调用 : 函数名() 定义是不会执行,调用时开始执行,执行完成后回到调用行

      1.5 文档说明 : 定义函数下一行三引号之间的内容.可使用help(函数名)查看

      1.6 获取函数名 : 函数名.__name__

     

     

     

    2. 局部变量与全局变量


     

      2.1 内置命名空间 : python解释器一启动就可以使用的名字存储在内置空间中,在启动python解释器时就加载到内存.如print(),input()等等

      2.2 局部变量:

        a. 定义:在函数内部定义的变量

        b. 特点: 只能在函数内部使用,不能在函数外使用

      2.3 全局变量:

        a.定义: 在函数外定义的变量

        b. 特点: 可以在不同的函数内部使用,或在函数外部使用

      2.4. 修改全局变量:

        a. 使用关键字global声明

        b. global关键字本质上是要修改全局变量的内存地址

          01: 对于可变类型的数据来说,可在原有内存地址上修改,可以不加global

          02: 对于不可变类型的数据来说,无法在原有内存地址上修改,修改时会改变内存地址,必须加global

          03: 对于全局变量,无论可变或不可变类型,只要是重新赋值,都需加上global

     

    num2 = 1  # 定义一个全局变量
    
    def func1():
    num = 1 # 定义一个局部变量 global num2 # 修改全局变量 num2 = 2 return num def func2(): num = func1() print(num2) print('func2', num) func2()

     

     

      2.5 多个函数共享数据的方法

         a. 全局变量: 可在不同函数中使用

         b. 函数中使用return返回值

     

     

     

    3. 函数返回值

     


     

     

     3.1 没有返回值(默认返回None)

        a. 不写return : 函数内部的代码执行完毕自动结束

        b. 只写return : 结束一个函数

        c. return None

     3.2 返回一个值 : 函数结束了且返回一个值

        3.3. 返回多个值

         a. 可以把多个值放到一个列表,元组,字典中通过return一起返回

         b. 使用一个值接收时返回一个列表,也可使用多个变量接收

     

    def return1():
        return {'hello': 2, 'world': 3}
    
    a, b = return1()
    print(a, b)

     

     

     3.3 函数返回值特点:

          a. 函数中如果使用return返回值时 ,只能返回一个结果,函数就结束了

          b. 当函数含有返回值,调用时会返回一个结果,可使用变量保存

        c. 如果函数没有返回值,我们使用变量接收时会返回一个None

        d. 当函数执行到return时,函数会结束,后续代码不再执行

     3.4 有没有参数看小括号里面,有没有返回值看return

     

     

     

    4. enumerate的使用


     

      4.1 作用: 在遍历的时候获取下标

      4.2 使用方法:

     

    for index, value in enumerate():
              print(index, value)

     

     

    5. 函数的嵌套

     


     

      5.1 定义: 在函数中嵌套一个函数

      5.2 闭包 : 内部函数调用外部函数的变量

     

    def outer():
        a = 1
        def inner():
            print(a)
        return inner
    
    inn = outer()
    inn()

     

     

    6. 函数的参数


     

      6.1 调用函数传参的方法

        a. 按照位置参数传参 :强调传入参数的位置与定义函数时的形参位置保持一致,参数数量一致

        b. 按照关键字参数传参:强调关键字的名字与函数定义时形参的名字保持一致,不要求位置

        c. 前面使用位置方式,后面使用关键字方式传参,位置参数在前,关键字参数在后,如果前面使用关键字参数,后面也只能使用关键字参数

      6.2 缺省参数

        a. 定义: 形参设置了默认值

        b. 特点: 如果给缺省参数传值了,那么就使用传入的值,否则就使用默认的值

        c. 普通参数结合缺省参数的使用:缺省参数后面可以再有缺省参数,不能有普通参数

     

    def sum_num(num1, num2=10):
        sum = num1 + num2
        return sum

     

      6.3 不定长参数

        a. 定义: 不确定参数的个数

        b. 分类:

          01. 不定长位置参数(*args) : 当调用函数的时候,所有位置参数都会传给args,然后把args封装成一个元组

          02. 不定长关键字参数(**kwargs) : 当调用函数的时候,所有的关键字参数都会穿给kwargs然后封装成一个字典

      6.4 传参方法:

        a. 调用函数的时候按照位置参数的方式传参

        b. 不定长参数,结合缺省参数使用

          01. 缺省参数需放到不定长位置参数(*args)的后面

          02. 不定长关键字参数(**kwargs)需放在最后面

        c. 顺序: (name, *args, sex='nan', **kwargs)

     

    def show_name(*args, **kwargs):
        print(args)
        for i in args:
            print(i, end='  ')
        print('')
        print(kwargs)
        for j in kwargs.values():
            print(j, end='  ')
    
    show_name(23, 45, 'fd', name='lisi', age='25')

      

      6.5 拆包

        a. 对元组进行拆包(*my_tuple),表示把元组里的每一个元素按照位置参数的方法传参

        b. 对字典进行拆包{**my_dict},表示把子字典里的每一个键值对按照关键字参数进行传参

        c. 对元组和字典进行拆包(*my_tuple){**my_dict}不能单独使用,只能结合带有不定长参数的函数使用

     

    def tast1(*args, **kwargs):
        print('test1', args, kwargs)
    
    
    def tast2(*args, **kwargs):
        print('tast2', args, kwargs)
        tast1(*args, **kwargs)
    
    tast2('hello', True, name='scy', age=16)

      

     

     

    7. 可变于不可变类型


     

      7.1 可变类型: 可在原有内存空间的基础上修改数据(增/删/改),修改后数据内存地址不发生改变.列表,字典,集合

        a. 修改保存的数据的方式:

          01. 在原有内存空间的基础上修改

          02. 通过重新赋值修改,内存地址会发生变化

      7.2 不可变类型 : 不允许在原有内存地址的基础上修改数据,通过重新赋值修改后内存地址会发生变化,元组,字符串.数字

        a. 想要修改保存的数据,可通过重新赋值来完成

     

    my_list = [1, 2]
    print(my_list, id(my_list), hex(id(my_list)))
    my_list.append(3)
    print(my_list, id(my_list), hex(id(my_list)))
    my_list = [1, 2, 3]
    print(my_list, id(my_list), hex(id(my_list)))

     

     

     

    8. 引用与引用传递


     

      8.1 引用

        a. 定义: 程序中数据在内存中的一个地址,简称内存地址

        b. 程序中所有的数据都保存在内存中,变量保存其实就是保存内存中的一个地址,后续根据地址在内存中获取数据

        c. 数据在内存中以十六定制的类型保存,函数id获取的内存地址为十进制,可通过hex()将其转换为十六进制

      8.2 引用传递

        a. 在python里面,所有赋值操作都是引用传递,赋值的是一个内存地址

        b. 函数传参也是按照引用进行传递的

        c. += :本意为在原有内存地址的基础上修改数据,如果数据类型不可变,则系统会重新开辟一块内存空间存储结果,数据的内存地址也将改变

        d. = : 表示赋值操作,无论是可变或不可变类型,数据的内存地址都会改变

     

     

     

       9. 递归函数


     

      9.1 定义: 在函数内部调用自己

      9.2 递归函数必须要有递归结束的条件,否则会出现无限循环,程序奔溃

      9.3 获取默认的递归次数: sys.getresursionlimit()

      9.4 更改默认的递归次数: sys.setresursionlimit(num)

      9.5 写递归的方式

        a. 写出临界条件

        b. 找出这一次和上一次的关系

        c. 假设当前函数已能用,调用自身计算上一次的结果,再求出本次的结果

     

     

     

    10. 匿名函数


     

      10.1. 定义 : 没有名字的函数可以称为匿名函数,或者使用lambda关键字定义的函数

      10.2. 特点 :

        a. 匿名函数可以简化代码

        b. 匿名函数只能写一行代码

        c. 匿名函数结果不需要return关键字返回

      10.3. 格式: lambda 形参1,形参2: 匿名函数代码实现

     

    sum = lambda a, b: a * b
    result = sum(2, 5)
    print(result)

     

     

      10.4. 匿名函数只能实现简单的功能操作,不能实现复杂的比如 循环 if

      10.5. 在python里面可以使用一个变量保存一个函数

      10.6. 应用: 匿名函数可以作为参数传递给另一个函数,此时不需要加小括号

     

    def calc_num(func):
        num1 = 1
        num2 = 2
        result = func(1, 2)
        return result
    
    result = calc_num(lambda num1, num2: num1 * num2)
    print(result)

     

     

    11. 高阶函数


     

      11.1 定义: 函数的参数是一个函数类型(常结合匿名函数使用)或函数的返回值是一个函数类型

      11.2. 当想调用函数内部的函数时,需在外部函数将内部函数返回,返回值是一个函数,可以用一个变量接收,此时该变量就是一个函数,调用时使用变量名()即可

      11.3 内置高阶函数,使用前需导入functools模块

        a. functools.reduce(函数名, 容器名) : 根据函数的功能,对容器内的数据进行计算

         注意点 : reduce接收的函数类型必须要有两个参数

     

    import functools
    
    my_list = [1, 4, 67, 34]
    def sum_num(num1, num2):
        return num1 + num2
    result = functools.reduce(sum_num, my_list)
    #
    result = functools.reduce(lambda num1, num2: num1 + num2, my_list) 使用匿名函数
    print(result)

     

     

        b. filter(函数名, 容器名) :根据函数内功能对容器内数据进行筛选,获取数据时需将结果转换为列表

         filter :遍历容器内的每一个数据,把每一个数据交给指定的函数进行比较,判断是否传入数据

     

    my_dict = [{'name': 'scy', 'age': 18}, {'name': 'yjj', 'age': 15}]
    result = filter(lambda dict: dict['age'] > 15, my_dict)
    print(list(result))

     

     

  • 相关阅读:
    在autolayout中加入每个view的weight
    iOS 拨打电话
    20141211笔记(UIImageView 设置内容的Mode的方法UICollectionViewCell Custom的方法ios modal segue code)
    UILabel总结(转载)
    Error:duplicate files during packaging of APK app/build/output/apk
    《UNIX-Shell编程24学时教程》读书笔记Chap3,4 文件,目录操作
    《UNIX-Shell编程24学时教程》读书笔记Chap1,2 Shell基础,脚本基础
    《UNIX-Shell编程24学时教程》读书笔记chap7 变量
    《软件调试的艺术》读书笔记
    ubuntu环境准备
  • 原文地址:https://www.cnblogs.com/scy645670291/p/10874104.html
Copyright © 2011-2022 走看看