美文网首页
day9-函数2

day9-函数2

作者: 2333_11f6 | 来源:发表于2018-11-15 17:39 被阅读0次

    9.1 函数的调用

    函数在声明时不会执行函数体,只有在调用函数的时候才会执行函数体

    • 函数的调用过程(重点!)

    a.物理过程
    1.回到函数声明位置
    2.用实参给形参赋值(传参),需要保证每个形参都有值。
    3.执行函数体
    4.获取返回值
    5.回到函数调用位置,接着往后执行

    b.函数调用过程是一个压栈的过程
    当函数调用时,系统会自动地在内存中的栈区间开辟空间,存储函数调用过程中产生的数据(这里的数据包括参数和在函数中声明的变量)。当函数调用完成后,对应的内存空间会自动销毁。

    def exchange(a1, b):          # 同名会有灰色波浪线
        a1, b = b, a1
        print('函数中:', a1, b)
    
    
    a, b = 10, 20
    exchange(a, b)              # 函数中: 20 10
    print('函数外:', a, b)    # 函数外: 10 20
    

    9.2 函数的参数

    • 1.根据实参分为位置参数和关键字参数

    a.位置参数
    让实参位置和形参位置一一对应

    def fun1(a, b, c):
        print('a:%d b:%d c:%d' % (a, b, c))
    
    
    fun1(10, 20, 66)  # a:10 b:20 c:66
    

    b.关键字参数
    实参以”形参名=值“的形式来传参

    fun1(c=66, a=10, b=20)  # a:10 b:20 c:66
    

    c.位置参数和关键字参数混合使用
    前提:保证每个参数都有值且位置参数要放在关键字参数前。

    fun1(10, c=66, b=20)  # a:10 b:20 c:66
    
      1. 从函数声明角度又有:参数默认值,不定长参数,参数类型说明

    a.参数默认值
    声明函数时,可以给参数设置默认值,语法:参数名 = 默认值
    设置默认值的参数需要放在未设置默认值参数的后面。
    注意:
    设置默认值可给参数赋一个默认值,也常用于说明需要传入参数的类型

    # 声明函数,并给参数c赋默认值1
    # 有的参数有默认值,有的参数没有;有默认值的参数一定要放在后面。
    def fun2(a, b, c=1):
        print(a, b, c)
    
    
    # 如果函数声明时参数有默认值,调用函数时,有默认值的参数可不赋值
    fun2(10, 20)  # 10 20 1
    
    • 3.不定长参数
      不定长参数:声明函数时,函数的参数不确定。

    a.在声明函数时,参数名前加一个*,会将这个参数变成元组,来获取多个参数的值。通过位置参数调用

    # 声明一个函数,功能是求多个数的和
    def my_sum(*num):
        print(sum(num))
    
    
    # 调用参数是不定长参数的时候,不定长参数对应的位置,可以传任意个实参
    my_sum(1, 2, 3, 3, 5, 7, 8, 9, 40)   # 78 集合才是无序可变且不重复
    

    b.在声明函数时,参数名前加两个*,会将这个参数变成字典,来获取多个实参的值。必须使用关键字参数

    def fun4(**kwargs):
        print(kwargs)           # 字典
    
    
    # fun4(1, 2, 4)  位置参数调用,报错
    # 如果是调用不定长参数,调用时关键字可以随便命名。
    fun4(a=1, b=3, c=8, j=9)          # {'a': 1, 'b': 3, 'c': 8, 'j': 9}
    

    c.(*args, **kwargs) - 用来表示不定长参数,调用时更灵活,可用位置参数也可用关键字参数或两者一起传参数。
    *注意:
    *args 必须放在 **kwargs之前,应为前者为位置参数,后者为关键字参数。

    def func5(*args, **kwargs):
        print(args, kwargs)
    
    
    func5()                                # () {}
    func5(6, 7, 8)                         # (6, 7, 8) {}
    func5(a=6, b=7, c=8)                   # () {'a': 6, 'b': 7, 'c': 8}
    func5(6, 7, 8, a=6, b=7, c=8)          # (6, 7, 8) {'a': 6, 'b': 7, 'c': 8}
    
    # 练习:求多个数的和,要求调用函数时可以多样性(位置,关键字)
    
    
    def my_sum(*args, **kwargs):
        sum1 = 0
        for key in kwargs:
            sum1 += kwargs[key]
        print(sum(args)+sum1)
    
    
    my_sum()                               # 0
    my_sum(6, 7, 8)                        # 21
    my_sum(a=6, b=7, c=8)                  # 21
    my_sum(6, 7, 8, a=6, b=7, c=8)         # 42
    
    • 4.参数类型说明
      参数类型说明只是对参数类型进行提示,并不能限制参数类型。可弹出语法提示。

    a.设置默认值

    b.参数名:类型名
    注意:类型说明除了说明类型外,还可以做相应类型对应的语法提示。

    def func7(a: str, b=''):   # 都能给类型说明
        print(a, b)
    
    
    func7(1, '2')          # 只能提示,不能限制。
    

    9.3 函数的返回值

    • 1.返回值

    a.函数的返回值就是return关键字后面表达式的值,就是函数调用表达式的值。

    b.python中所有函数都有返回值,默认为None。
    return - 关键字;用来返回返回值;结束函数(当函数在执行过程中遇到了return就会结束函数),如果函数体中没有return,函数会在函数体执行完成后将None作为返回值。
    函数调用表达式 - 就是调用函数的语句(如:func1(1, 2));当函数调用完成后,函数调用表达式的结果就是函数返回值。
    看一个函数返回值,就是看return后面的值,没有return则为None。

    def func1(m, n):
        print(m, n)
        # 将100作为函数func1的返回值
        return 100        # return - 关键字    100 - 返回值
    
    
    def func2(m, n):
        return m + n
    
    
    def func3(m, n):
        return              # 相当于return None;将None作为返回值
        print()             # 执行不到
    
    
    func2(1, 2)          # 3,需要被接收或直接使用
    
    print(func1(1, 2))    # None 即返回值
    

    返回值作用:就是将函数内产生的数据传递出来,防止在函数调用完成后被销毁。
    什么时候使用返回值:如果实现函数功能后需要获取产生的数据则需要返回。

    • 2.同时返回多个值

    python中支持返回多个值,实质是以元组形式返回。元组的功能它都有。
    return 返回值1,返回值2,返回值3...

    # 求多个数的和以及平均值
    def func7(*args):
        # sum1 = 0
        # for item in args:
        #     sum1 += item
        sum1 = sum(args)
        aver = sum1/len(args)
        return sum1, aver
    
    
    sum1, aver = func7(1, 2, 3, 4, 5)             # 常用
    print('和为%d,平均值为%.2f' % (sum1, aver))   # 和为15,平均值为3.00
    print('和为%d,平均值为%.2f' % func7(1, 2, 3, 4, 5))  # 和为15,平均值为3.00
    

    9.4 返回值的应用

    返回值能做的事情,函数调用表达式都可以做。

    #1.用函数调用表达式给变量赋值
    def func1():
        return 'hello'
    
    
    str1 = func1()
    
    # 2.通过函数调用表达式使用相应的方法。
    def func2():
        return [1, 2, 3]
    
    
    item1 = func2()[0]         # 1
    item2 = func1()[0]         # h
    item3 = func2().append(3)  # None,获取的是append函数的返回值
    
    list1 = func2()
    list1.append(3)
    print(list1)                 # [1, 2, 3]
    
    
    # 3.将函数调用表达式作为容器的元素,函数的参数,函数的返回值
    
    
    def func3():
        return 100
    
    
    def func4(x):
        print(x)
    
    # 作为函数实参
    func4(func3())       # 100
    re = func4(func3())  # 返回None之前要打印一次func3()
    print(re)
    
    # 作为列表元素
    # 作为字典的key和value
    # 作为函数返回值
    

    9.5 匿名函数

    匿名函数还是函数,除了声明语法以外,函数其他语法匿名函数都支持。

    • 匿名函数声明

    语法:

    函数名(变量名) = lambda 参数列表:返回值

    说明:
    函数名 - 变量名
    lambda - 关键字
    参数列表 - 和普通函数参数列表作用和要求是一样的,但此处至少要1个参数
    返回值 - 相当于普通函数return关键字后面的表达式。
    注意:匿名函数中冒号后的语句属于函数体。在声明时不会执行
    匿名函数调用和普通函数一模一样。

    # 匿名函数求两数和
    
    my_sum = lambda x, y: x + y
    
    print(my_sum(1, 2))
    print(my_sum(y=2, x=3))  # 5 关键字参数
    
    # sort()函数定制
    
    # 写一个函数,求两数中最大值
    my_max = lambda x, y: max(x, y)
    print(my_max(1, 2))                # 2
    
    • 补充:python中的3目运算符

    c语言: 条件语句?值1:值2 - 条件语句为True则整个表达式结果为值1,反之。

    python中三目: 值1 if 条件语句 else 值2 - 条件语句为True则整个表达式结果为值1,反之。

    x, y = 10, 20
    max1 = 10 if x > y else y
    print(max1)
    
    # 写一个匿名函数,获取字典中指定key对应的值
    dict1 = {'a': 1}
    my_get_value = lambda key, dict2: dict2.get(key)
    
    print(my_get_value('a', dict1))
    

    相关文章

      网友评论

          本文标题:day9-函数2

          本文链接:https://www.haomeiwen.com/subject/exzyfqtx.html