知行合一
Choose a quality life!

函数定义:     def 函数名() :                              函数名的命名规范跟变量一样

                         函数体(平时写的小程序)

                         return  'a','b'                           return的返回值可以有多个,字符串格式用逗号隔开,可以存在小程序中,程序中遇到return会中止执行代码

                                                                    如果return什么都不写 或者 干脆不写return .那么返回的就是None

                                                                    如果return后面写了一个值. 则调用者可以接收一个结果

                                                                    如果return后面写了多个结果, 则调用者可以接收一个tuple, 调用者可以直接解构成      a,b,c = yue()  结构元素添加到列表中

                    函数名()                                    调用函数.函数体会执行

 函数的参数:           参数写在括号内,封装函数括号内变量叫形参,  调用函数括号内叫实参                        碰到实参里面加**号时,先将**号内元素打散成关键字参数数量要与形参一致   

      从实参出发:    位置参数:        一个萝卜一个坑,在传参过程中. 系统会默认按照位置把实参赋值到形参.,碰到实参里面加*号时,先将*号内元素打散成位置参数数量要与形参一致

                           关键字参数:     只要记住每个参数的名字就可以,括号内位置可无序   如:yue(chat="微信", age=18, address="北京") 

                           混合参数:        在使用混合参数的时候, 关键字参数必须在位置参数后面,否则容易出现混乱

      从形参出发:    位置参数:        同上一样

                            默认值参数:     函数声明时候,给出函数参数的默认值    如:def stu_info(name, age, sex='男'):   sex就是默认值

                                                  必须先声明位置参数, 才能声明默认值参数  默认参数的值在定义阶段就定死了,只能定义一次

                                                  在调用的时候可以给出具体的值, 也可以不给值, 使用默认值

      

     可变长度的参数:   会将溢出的位置参数全部接受,然后保存成元组的形式复值给变量,约定俗成都是赋值给args     如:def info(x,y,z,*args)        info(1,2,3,4,5,6,)

                                  会将溢出的关键字实参全部接受,然后保存成字典的形式赋值给变量.约定俗称赋值给kwargs     如:def info(x,y,z,**kwargs)        info(x=1,y=2,z=3,a=4,b=5,c=6)

                                 

def func(*args, **kwargs):      万能接收模式
      print(args, kwargs)

  

     命名空间和作用域:   

1. 内置命名空间: python解释内部运行时的变量函数,                包括int.str.float,list,dic等一些内置好的函数
2. 全局命名空间: 我们在py文件中直接声明出来的变量,函数     
3. 局部命名空间: 在函数内部声明的变量和函数.                        

     作用域:         全局作用域:  包含内置命名空间和全局命名空间. 在整个文件的任何位置都可以使用(遵循从上到下逐行执行)

                              局部作用域:  在函数内部可以使用.

                               globals() 查看全局作用域中的名字                    locals() 查看当前作用域中的名字

     global和nonlocal  

                                global: 把已经解释执行后的全局变量拿到局部来用,变量若发生改变,全局变量也跟着改变,

                                             若全局变量不存在,则会在函数体内就近找到变量升级为全局变量,

                                nonlocal: 把离他最近的一层的变量拿过来,变量发生改变,局部变量也跟着改变

                                                如果变量不存在,则会去找上一层中去找变量,不会找全局

                                

        装饰器函数;

# 需求:1,不改变主程序和调用方式
# 2,为主程序拓展一个打印大家好的功能,放在主程序的前面,后面均可
# 程序拓展的原则:开放封闭原则
# 开放:对功能拓展开放
# 封闭:对修改代码封闭


# 方式一:
# def foo(arg):
# def inn():
# print('你好啊!')
# arg()
# return inn
# func=foo(func)
# func()



# 方式二
# def foo(func):
# def inn(*args,**kwargs):
# print('你好啊!')
# res = func()
# return res
# return inn
# @foo 注意: 装饰器函数要写在主函数的上面,语法糖要写在主函数的上面
# def func():
# # 主程序前可以添加逻辑
# print('这个是主程序!')
# # 主程序后可以添加逻辑
# return '不错'
# ret = func('hah',b=3)
# print(ret)

# 理解:
# 1,调用关系
# 主程序函数名作为参数传入foo函数中,得到的返回值func,
# 这个func指向inn函数的名称空间,其中原主程序函数被封装到inn中,
# func调用时相当于inn调用自身的函数,这样就完成了主程序的封装

# 2,返回值问题
# 主程序的返回值就是inn的返回值,inn的返回值就是func的返回值

                        

                                 

 

 

 

 

 

 

 

     

posted on 2018-07-12 15:35  小米没吃饭  阅读(151)  评论(0编辑  收藏  举报