函数定义: 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的返回值