zoukankan      html  css  js  c++  java
  • 函数、参数、局部函数and函数内变量修改、嵌套函数

    一、函数

    函数的定义:将一组语句的集合通过一个函数名封装起来 ,想要执行这个函数,只需要调用函数名即可。

    函数的三种类型:1.无参函数,2.有参函数.(函数体需要外部传递进来信息的)3.空函数

    函数的特性:1.减少重复的代码  2.使程序变得可扩展  3.使程序变得易维护

    def sayhi(a,b):
        res = a + b
        print(res)
        
    sayhi(5,10)

    二、参数

    2.1 形参(在函数定义时定义的参数,相当于变量名)和实参(在调用函数时传入的值,相当于变量值)

    def sayhi(a,b):  # (a,b)形参(占位)
        res = a + b
        print(res)
        
    sayhi(5,10)  # (5,10) 实参(实际存在的值)

    2.2 默认参数(在函数定义阶段,就已经为形参赋值【本质上是内存地址】的参数),默认参数不要定义成可变类型!!!

    默认参数可填可不填;但要按顺序传;但必须放在末尾!!!

    def stu_infor(name,age,country='CN'):
        print(name,age,country)
    
    stu_infor('jake',22,)
    stu_infor('BOB',24,'JP')
    stu_infor('ASD',12,'KM')

     可变长参数

    如果形参中出现*变量名,传递的参数就可以不再是固定个数,传过来的参数都会打包成元组

    方式一:
    def stu_info(name,*args,): print(name,args) stu_info('jake',45,23,32,11) >>>>jake (45, 23, 32, 11) # 后面的数字都会传递给args
    方式二:
    def stu_info(name,*args,): print(name,args) stu_info('jake',*[45,23,32,11])

    2.3关键参数(在定义函数时,*后定义的参数)

    可以不按顺序传,这时就会用到关键参数,只需要指定参数名就可以,但是必须放在位置参数之后!

    def stu_infor(name,age,country='CN'):
        print(name,age,country)
    
    stu_infor(name='jake',age=23,country='JP')

     2.4 非固定参数

    def stu_info(name,*args,**kwargs):
        print(name,args,kwargs)
    
    stu_info('jake',22,'100w',addr='北京', num=1231214124212)
    
    >>>>>>jake (22, '100w') {'addr': '北京', 'num': 1231214124212}
    def stu_info(name,*args,**kwargs):
        print(name,args,kwargs)
    
    d = {'addr':'北京','num':'12312312424'}
    stu_info('jake',22,'100w',**d)
    
    # >>>>>>jake (22, '100w') {'addr': '北京', 'num': '12312312424'}

    三、函数的返回值

      定义: 函数外部的代码,想要获取函数的执行结果,使用return语句返回结果

          return会结束函数,后面的代码不会运行;如果未指定return就返回None.

    def stu_info(name,age,**kwargs):
        print(name,age,kwargs)
        if age > 22:
            return False
        else:
            return True
    stu = stu_info('JAKE',24,cuontry='JP')
    print(stu)
    
    >>>>>>>>JAKE 24 {'cuontry': 'JP'}
    >>>>>>>>False

        函数只能返回一个值;如果需要返回多个值,使用逗号分隔开,返回时回事一个元祖的类型,这个元祖代表的是一个值!

    四、函数的局部变量

      定义:在函数内部的变量,可以在函数内部修改(在局部创建)变量。

    name = "jake"  # 函数外部,全局变量
    def change_name():
        name = 'Bob'  # 函数内部,局部变量
        print(name,id(name))
    change_name()
    print(name,id(name))
    
    >>>>>>Bob 2448164753624
    >>>>>>jake 2448163922360

      1.在函数内部可以调用全局变量

      2.如果同一个变量在全局和局部都有,那么调用的顺序应当是由内而外的

    4.1 函数内部修改全局变量

    name = "jake"  # 函数外部
    def change_name():
        global name  # 不建议使用
        name = 'Bob'  # 函数内部
        print(name,id(name))
    change_name()
    print(name,id(name))
    
    >>>>>>Bob 2691644231896
    >>>>>>Bob 2691644231896

    4.2 在函数内部修改数据

      列表,字典,集合,元祖 是可以被修改的,而字符串这种是不可以被修改的。

    name_list = ["jake",'Bob','rain']
    def change_name():
        del name_list[2]
        name_list[1] = 'Amy'
        print(name_list,id(name_list))
    change_name()
    print(name_list,id(name_list))
    
    >>>>['jake', 'Amy'] 1908083114504
    >>>>['jake', 'Amy'] 1908083114504
    # 整体的列表内存地址并没有被修改,修改的是列表内部元素的的内存地址!!!

    五、嵌套函数

    5.1.函数内部可以再次被定义,2.要想执行函数就需要被调用

    def func1():
        print('JAKE')
        def func2():
            print('Bob')
        func2()
    func1()

    为函数传参的两种方式:

    方式一:直接把函数需要的参数定义成形参

    方式二:利用闭包函数传参

    def func():
        x = 4
        def func2():
            print(x)
        return func2
    res = func()
    print(res)
    res()

    5.2函数之间调用的逻辑关系

    (一层一层往外面找,函数内部没有的话,就会找全局变量!!!)

    age = 11
    def func1():
        age =22
        print(age)
        def func2():
            age = 33
            print(age)
        func2()
    func1()
    
    >>>22
    >>>33
    age = 11
    def func1():
        age =22
        print(age)
        def func2():
    
            print(age)
        func2()
    func1()
    
    >>>22
    >>>22
    age = 11
    def func1():
    
        print(age)
        def func2():
    
            print(age)
        func2()
    func1()
    
    >>>11>>>11
    age = 11
    def func1():
        def func2():
            print(age)
        age = 22
        func2()
    func1()
    
    >>>22
    age = 11
    def func1():
        global age
        def func2():
            print(age)
        func2()
        age = 22  # 此处修改了全局函数!!!
    func1()
    print(age)
    
    >>>11
    >>>22  
    age = 11
    def func1():
        global age
        def func2():
            print(age)
        age = 22  # 修改了全局变量
        func2()
    func1()
    print(age)
    
    >>>22
    >>>22
  • 相关阅读:
    LeetCode Generate Parentheses
    MVC中从Controller像View层传值
    IOS_多线程_ASI_AFN_UIWebView
    @PathVariable,@RequestParam, @RequestBody
    sql语句
    连表删除例子
    java中VO的使用(组成复杂的实体类)
    MyBatisPLus入门项目实战各教程目录汇总
    java常用函数
    复杂查询 new EntityWrapper<>()
  • 原文地址:https://www.cnblogs.com/Holmes-98/p/14284505.html
Copyright © 2011-2022 走看看