• 学习python的day9之函数


    一、函数基础

    函数就是将一段具有独立功能的代码整合到一个整体并命名,在需要的位置调用这个名称即可完成对应的需求。

    函数在开发过程中,可以更高效的实现代码重用。

    1.定义函数

    语法:

    def 函数名(参数):

      代码

    def a():
        print('hello')
    a()
    '''
    输出:
    hello
    '''

    注意:

    在不同的需求中,参数可有可无。

    函数必须先定义后使用。

    如果没有调用函数,函数内部的代码不是执行

    2.返回值(return)

    作用:

    负责返回函数值

    退出当前函数:导致return下方的所有代码(函数体内部)不执行

    def a():
        return 's'
        print('ssa')
    print(a())
    '''
    输出:
    s
    '''

    3.函数说明文档

    作用:保存函数解释 说明的信息

    help(函数名)

    def sum1(a,b):
        '''
        求和函数
        :param a:第一个值
        :param b: 第二个值
        :return: 两数之和
        '''
        return a+b
    help(sum1)
    
    '''
    输出:
    Help on function sum1 in module __main__:
    
    sum1(a, b)
        求和函数
        :param a:第一个值
        :param b: 第二个值
        :return: 两数之和
    '''

    4.嵌套调用

    注意函数A()不能嵌套调用在它后面定义的函数

    def A():
        print('hello')
    
    def B():
        print('word')
        A()
    B()
    
    '''
    输出:
    word
    hello
    '''

    函数的参数:函数调用到时候可以传入真实数据,增大函数使用的灵活性

    形参:函数定义时书写的参数(非真实数据)

    实参:函数调用时书写的参数(真实数据)

    二、函数提高

    1.变量作用域

    变量作用域指定是变量生效的范围,主要分为全局变量和局部变量

    1)局部变量:

    局部变量是定义在函数体内部的变量,只在函数体内部生效

    作用:在函数体内部,临时保存数据,即当函数调用完成之后,销毁局部变量

    2)全局变量:

    全局变量指在函数内部、外部都生效的变量

    2.修改全局变量

    语法:global 变量

    a = 100
    b = 50
    def A():
        a = 200
        print(a)
        global b
        b = 300
        print(b)
    A()
    print(a)
    print(b)
    '''
    输出:
    200
    300
    100
    300
    '''

    3.返回值做参数传递

    def A():
        return 100
    def B(a):
        print(a)
    B(A())
    '''
    输出:
    100
    '''

    4.函数的多返回值

    因为函数遇到return会退出该函数,所有不能像下面那样写

    def A():
        return 100
        return 200
    result =A()
    print(result)
    '''
    输出:
    100
    '''

    应该这么写

    def A():
        return 100,200
    result =A()
    print(result)
    '''
    输出:
    (100,200)
    '''

    return返回多个返回值时,默认返回元组

    return后面可以直接书写元组、列表、集合、字典,返回多个值

    5.函数的参数

    1)位置参数

    def A(name,age,sex):
        print(f'你的名字时{name},年龄是{age},性别是{sex}')
    A('zhang',18,'')
    '''
    输出:
    你的名字时zhang,年龄是18,性别是男
    '''

    注意:传递和定义参数的位置及个数必须一致。

    2)关键字参数

    函数调用,通过“键=值”形式加以指定。可以使函数更加清晰、容易使用,同时清除了参数的顺序需求。

    def A(name,age,sex):
        print(f'你的名字时{name},年龄是{age},性别是{sex}')
    A('zhang',age=18,sex='')
    A('zhang',sex='',age=18)
    A('zhang',18,sex='')
    A(name='zhang',age=18,sex='')
    '''
    输出:
    你的名字时zhang,年龄是18,性别是男
    你的名字时zhang,年龄是18,性别是男
    你的名字时zhang,年龄是18,性别是男
    你的名字时zhang,年龄是18,性别是男
    '''

    注意:如果有位置参数时,位置参数必须在关键字参数的前面,但关键字参数之间不存在先后顺序

    3)缺省参数(默认参数)

    缺省参数也叫默认参数,用于定义函数,为参数提供默认值,调用函数时可不传入该默认参数的值

    注意:所有位置参数必须出现在默认函数前,包括函数定义和调用

    def A(name,age,sex=''):
        print(f'你的名字时{name},年龄是{age},性别是{sex}')
    A('zhang',age=18,)
    A('zhang',18,sex='')
    '''
    输出:
    你的名字时zhang,年龄是18,性别是男
    你的名字时zhang,年龄是18,性别是女
    '''

    注意:在函数调用时,给默认参数传值则修改默认参数值,否则使用这个默认值

    4)不定长参数

    不定长参数也叫可变参数。用于不确定调用的时候会传递多少个参数(不传参也可以)的场景。此时,可以

    用包裹(packing)位置参数,或包裹关键字参数,来进行参数传递,会显得非常方便。

    4.1)包裹位置传递

    def A(*args):
        print(args)
    A('tom')
    A('sam',18)
    
    '''
    输出:
    ('tom',)
    ('sam', 18)
    '''

    注意:传进的所有参数都会被args变量收集,它会根据传进参数的位置合并为一个元组(tuple),args是元组类型,这就是包裹位置传递

    4.2)包裹关键字传递

    def A(**kwargs):
        print(kwargs)
    A(name='tom')
    A(name='sam',age=18)
    
    '''
    输出:
    {'name': 'tom'}
    {'name': 'sam', 'age': 18}
    '''

    包裹关键字传递返回的是一个字典

    综上:无论是包裹位置传递还是包裹关键字传递,都是一个组包的过程。

    5.元组拆包

    def A():
        return 100,200
    num1,num2 = A()
    print(num1)
    print(num2)
    '''
    输出:
    100
    200
    '''

    6.字典拆包

    在调用带有多值参数的函数时,如果希望:

      ○将一个 元组变量, 直接传递给 args

      ○将一个 字典变量, 直接传递给 kwargs

    就可以使用拆包, 简化参数的传递, 拆包 的方式是 :

      ○在 元组变量前, 增加一个 *

      ○在 字典变量前, 增加两个*

    不在元组和字典变量前增加*

    def demo(*args, **kwargs):
        print(args)
        print(kwargs)
    gl_nums = (1, 2, 3)
    gl_dict = {"name": "小明", "age": 18}
    demo(gl_nums, gl_dict)
    '''
    输出:
    ((1, 2, 3), {'name': '小明', 'age': 18})
    {}
    '''

    在元组和字典变量前增加*

    def demo(*args, **kwargs):
        print(args)
        print(kwargs)
    gl_nums = (1, 2, 3)
    gl_dict = {"name": "小明", "age": 18}
    demo(*gl_nums, **gl_dict)
    '''
    输出:
    (1, 2, 3)
    {'name': '小明', 'age': 18}
    '''

    由此可以发现,没拆包前,字典会在一个元组中被返回,拆包后,才会返回一个字典

    7.交换变量的值

    第一种

    a, b = 1, 2
    c=a
    a=b
    b=c

    第二种

    a, b = 1, 2
    a, b = b, a

    8.引用

    在python中,值靠引用来传递的

    id()可以求变量指向的地址

    a = 12
    print(id(a))
    '''
    输出:
    140703664052224
    '''

    引用可以当作实参传递

    不可变类型的数据被改变之后,会为数据再开辟一个地址空间,所以内存地址会变

    可变类型数据被改变之后,不会为数据开辟地址空间,所以内存地址不改变

    9.可变类型和不可变类型

    所谓可变类型与不可变类型是指:数据能够直接修改,如果能直接修改就是可变,否则就是不可变

    可变类型:列表、字典、集合

    不可变类型:整型、浮点型、字符串、元组

  • 相关阅读:
    一个Package Load Failed问题的解决方法

    .NET相关的最好东西--全球最新评价
    一年了...
    MSBuild 的简单入门
    开发基于.NET Compact Framework的程序时, 常遇到的问题(2) 为什么在Visual Studio 2003调试程序时不能通过ActiveSync连接PDA
    如何:显示用逗号分隔的项集合(摘自MSDN)
    每日一句(2008.10.8)
    每日一句(2008.10.16)
    男人这辈子
  • 原文地址:https://www.cnblogs.com/scheduled/p/13838021.html
Copyright © 2020-2023  润新知