01.变量引用
变量和数据都是保存在内存中的
在python中函数的参数传递以及返回值都靠引用传递
1.1 引用概念
在python中
变量 和 数据 是分开储存的
数据保存在内存的一个位置
变量中保存着数据在内存中的地址
变量中记录数据的地址, 就叫引用
使用id()函数中可以查看变量中保存数据所在的内存地址
1.2 可变类型和不可变类型
列表和字典是可变类型:可变类型的数据变化是调用方法修改数据,并不会影响数据在内存地址
注:字典的key只能使用不可变类型的数据
哈希(hash)
hash函数接受一个不可变类型的数据作为参数
返回结果是一个整数
哈希是一种算法,作用是提取数据的特征码(指纹):相同的内容得到相同的结果。
在python中,设置字典的键值对时,会对key进行hash用来决定如何在内存中保存字典的数据。
键值对的key必须是不可变数据类型,value可以是任意类型数据。
02.局部变量和全局变量
1.局部变量
局部变量是在函数内部定义的变量,只能在函数内部使用。
不同的函数,可以定义相同名字的局部变量,但是彼此之间不会产生影响。
2.全局变量
全局变量 是在函数外部定义的变量,所有函数内部都可以使用这个变量
在python中,不允许直接修改全局变量的值。
如果在函数中需要修改全局变量,需要使用 global 进行声明
注意:在开发时,应该把模块中的所有全局变量定义在所有函数上方,就可以保证所有的函数都能正常的访问到每一个全局变量了。
代码结构示意:
shebang
↓
import模块
↓
全局变量
↓
函数定义
↓
执行代码
全局变量命名:为了避免混淆,有一些公司会要求全局变量前应该增加g_或者gl_的前缀
03.函数参数和返回值
函数根据 有没有参数、有没有返回值,可以相互组合,一共有4种组合方式
1.如果函数 内部处理的数据不确定,就可以将外界的数据以参数传递到函数内部。
2.如果希望一个函数 执行完后,向外界汇报执行结果,就可以增加函数返回值。
04.不可变和可变的参数
只要针对函数使用赋值语句,会在函数内部修改局部变量的引用,不会影响到 外部变量的引用。
缺省参数:定义函数时,可以给某个参数指定一个默认值,具有默认值的参数叫做缺省参数。
将很常见的值设置为参数的缺省值,从而简化函数的调用,例如,对列表排序的方法,reverse的默认值为False,需要降序排序时,reverse = True
提示:(1)在指定缺省参数的默认值时,应该使用最常见的值
为默认值!
(2)必须保证带有默认值的缺省参数 在列表参数末尾,以下是错误的
def info(name, gender=True, title)
(3)调用函数时,如果有多个缺省参数,需要指定函数名,这样解释器才能知道参数的对应关系。
def info(name, ,title=“ ”,gender=True)
info("小明",gender=True)
05.多值参数
有时候可能需要一个函数 能够处理的参数个数不确定,这时候可以使用多值参数
第一种:在参数名前面增加一个* 可以接受元组
第二种:在参数名前面增加两个*可以接收字典
一般给多值参数命名时,习惯使用下面两个名字
1.*args--存放 元组 参数,
2.**kwargs--存放 字典 参数
args是arguments的缩写,有变量的含义,kw是keyword的缩写,kwargs可以记忆 键值对参数。
06.元素和字典的拆包:
元组变量/字典变量传到函数内部时,需要拆包
def demo(*args, **kwargs):
gl_nums = {1, 2, 3} gl_dict = {"name": "小明", "age": 18}
demo(*gl_nums, **gl_dict) # 使用拆包语法,简化元组变量/字典变量传递
07.函数递归
一个函数内部调用自己
特点:1.函数内部的代码是相同的,知识针对参数不同,处理的结果不同
2.当参数满足一个条件时,函数不再执行!(否则陷入死循环)