-
-
- 函数输入输出的本质
- 可变类型与不可变类型
- 局部变量与全局变量
- 作用域
- 代码结构
- 函数的参数/返回值
- +=
- 缺省参数
- 不定长参数(多值参数)
- 元组和字典的拆包
- 递归函数
函数输入输出的本质
函数的传参/返回值本质是:传地址值.即变量的引用
可变类型与不可变类型
不可变类型: 不能修改内存中数据的变量(原内容不可修改)
可变类型:可以修改内存中的数据的变量(原内容可修改)
可变类型的数据修改
修改内存中的数据,不修改引用:通过变使用方法来实现 (通过下标[index]来修改也只是修改内部数据)
修改引用:变量名 使用赋值符 给一个新的数据.
不可变类型调用方法: 因其内容不能修改,所以是生成一个新的内容
字典的key只能使用不可变类型的数据:
在字典设置键值对时,会首先对key进行hash来决定如何在内存中保存,可变类型不可以hash,所以key只能是不可变类型
hash:
相同的内容,hash得到相同的结果
不同的内容,hash得到不同的结果
可变类型为什么不可以hash: 因为可变类型内存中的内容可以修改,导致内容修改前后的hash结果不一样.
局部变量与全局变量
局部变量:在函数内部定义的变量,只能在函数内部使用(外部,另一个函数都不能使用)
作用: 临时保存 变量需要使用的 数据
生命周期: 函数被调用时创建(诞生),函数执行结束后被系统回收(死亡)
全局变量:在函数外部定义,能被函数内部访问,但是不能被修改
为何不能被修改:限制能力,不能修改变量的应用
查找变量引用的位置: ctrl + 鼠标左键(变量)
全局变量的命名:全局变量名字前应该加:g_ 或 gL_
作用域
L_E_G_B:
local : 本地
enclose :封套(嵌套)
global : 全局
builtin :内置
代码结构
shebang-->import导入-->全局变量-->定义函数-->执行代码
函数的参数/返回值
什么时候需要参数:函数内部处理的数据不确定个数,将外界的数据以参数传入,以免破坏数据
什么时候需要返回值:函数执行完成后,需要向外界汇报执行结果时.
多个返回值: 会默认返回一个元组.
拆包: 多个变量接收一个元组,进行拆包 应用:a,b = (b,a) -->a,b=b,a 等号右边是一个元组,只是把小括号省略了
不可变和可变的参数:
赋值语句:只要针对参数使用赋值语句,会在函数内部修改局部变量的引用,不会影响的外部变量的引用
调用方法:不会修改引用; 可变类型会修改内存中的数据,不可变类型则是生成一个新的数据
+=
针对列表变量,+= 本质上是默认调用extend()方法,会改变原列表的内容
缺省参数
定义:定义一个函数时,给某个参数指定一个默认值
什么时候使用缺省:某个值很常用,可以设置为缺省,简化函数调用
定义的位置:在普通参数后面
有多个缺省参数的函数调用: 需要指定参数名(命名参数)
不定长参数(多值参数)
一个函数接收的参数不确定,使用多值参数
分类:
*: 接收元组 *args
**:接收字典(带等号的参数) **kwargs
元组和字典的拆包
函数参数传入字典和元组时,需要使用拆包,简化参数传递
元组变量前:*
字典变量前:**
demo(*gl_nums,**gl_dict)
递归函数
特点:函数内部,自己调用自己
注意点:
递归出口:传入参数满足一个条件时,函数不在执行
调用自己
每次传入的参数要不同! 这样才能抵达递归出口
考虑每轮要向上一轮返回什么东西