Python语言基础7
局部变量、全局变量、参数、返回值、拆包、可变、不可变类型、函数使用注意事项
1.局部变量
局部变量,就是在函数内部定义的变量
其作用范围是这个函数内部,即只能在这个函数中使用,在函数的外部是不能使用的
因为其作用范围只是在自己的函数内部,所以不同的函数可以定义相同名字的局部变量
局部变量的作用,为了临时保存数据,需要在函数中定义变量来进行存储
当函数调用时,局部变量被创建,当函数调用完成后,需要先进行内存回收(销毁变量),这个变量就不能够使用了
局部变量: 定义在函数内部的变量
作用域(变量的使用范围): 在函数的内部
2.全局变量
在程序设计过程中,并不建议使用全局变量,因为会大量占用内存空间不释放, 而且全局变量在使用过程中,任何人都可以访问,不安全,会破坏程序的封装性。不符合面向对象的封装思想。
全局变量: 定义在函数外部的变量
作用域: 整个模块内部,既能在一个函数中使用,也能在其他的函数中使用
当函数内出现局部变量和全局变量相同名字时,函数内部中的 变量名 = 数据 此时理解为定义了一个局部变量,而不是修改全局变量的值
如果在函数中出现global 全局变量的名字 那么这个函数中即使出现和全局变量名相同的变量名 = 数据 也理解为对全局变量进行修改,而不是定义局部变量
如果在一个函数中需要对多个全局变量进行修改,那么可以使用global 进行全局声明
可以使用一次global对多个全局变量进行声明
global a, b
还可以用多次global声明都是可以的
global a
global b
3. 参数
<1>. 位置参数
位置参数调用函数(实参和形参的个数相同, 位置要一一对应)
关键字参数调用函数(不关心其位置 只要把形参名写对即可)
<2>.缺省参数
在形参中默认有值的参数,称之为缺省参数
调用函数时,缺省参数的值如果没有传入,则取默认值。
在调用函数的时候 如果缺省参数的的位置 传入了对应的实参, 那么实参会把缺省参数的默认值给
覆盖
注意:
带有默认值的参数一定要位于参数列表的最后面
如果某个形参为缺省参数, 那么其后面的参数必须都是缺省参数
<3>. 不定长参数
有时可能需要一个函数能处理比当初声明时更多的参数, 这些参数叫做不定长参数,声明时不会命名。
不定长参数元组(不定长位置参数)
格式: def 函数名(*args): (备注 args名字可以自定义)
加了星号(*)的变量args会存放所有未命名的变量参数,args为元组
不定长参数元组是一个缺省参数 形参的默认值为空的元组
不定长参数字典(不定长关键字参数)
格式: def 函数名(**kwargs): (备注 kwargs名字可以自定义)
而加**的变量kwargs会存放命名参数,即形如key=value的参数, kwargs为字典.
不定长参数字典是一个缺省参数 形参的默认值为空的字典
注意:
def 函数名(*, a, b):
*后的参数a和b必须是关键字参数
在调用一个不定长参数元组的时候 实参是来自于一个字符串 列表 或者 元组
不需要程序员通过下标取值 直接使用 *字符串名或者列表名或者元组名 即可
my_list = [1,2,3]
func1(*my_list)
在调用一个不定长参数字典的时候 实参是来自于一个字典,**字典名即可
my_dict = {"name": "小明"}
func2(**my_dict)
函数参数:
位置参数(正常形参), 缺省参数, 不定长参数(元组*args, 字典**kwargs)
函数的定义参数顺序:
位置参数, 缺省参数, 不定长参数元组(缺省参数和不定长参数元组*args的位置
可以互换), 不定长参数字典
缺省参数在*args后面
如果很多个值都是不定长参数,那么这种情况下,可以将缺省参数放到
*args的后面, 但如果有**kwargs的话,**kwargs必须是最后的
4.函数返回值
如果一个函数中有写 return 返回值 标识着这个函数为有返回值的函数
如果一个函数中有写多个return 如果有一个return已经被执行了 那么这个函数就会结束了,因此后面的return没有什么用处
return除了能够将数据返回之外,还有一个隐藏的功能:结束函数。如果执行了return 就标识着函数的调用结束 (return后面的代码将不再执行)
return后面可以是元组,列表、字典等,只要是能够存储多个数据的类型,就可以一次性返回多个数据
如果return后面有多个数据,只需要把多个数值使用,(逗号)隔开返回即可,那么默认为元组类型
5.拆包
拆包时要注意,需要拆的数据的个数要与变量的个数相同,否则程序会异常
除了对元组拆包之外,还可以对字符串、列表、字典等拆包
对字典拆包时取出来的是key,而不是键值对
a, b = (11, 22)
a,b,c = '你好吗'
a, b = [11, 22]
a, b = {"m":11, "n":22} # 取出来的是key,而不是键值对
6.可变、不可变类型
所谓可变类型与不可变类型是指:数据能够直接进行修改,如果能直接修改那么就是可变,否则是不可变
可变类型有: 列表、字典、集合
不可变类型有: 数字、字符串、元组
7.set、list、tuple
set是集合类型
set、list、tuple之间可以相互转换
使用set,可以快速的完成对list中的元素去重复的功能
8.函数使用注意事项
无参数、有返回值
注意:
一个函数到底有没有返回值,就看有没有return,因为只有return才可以返回数据
在开发中往往根据需求来设计函数需不需要返回值
函数中,可以有多个return语句,但是只要执行到一个return语句,那么就意味着这个函数的调用完成
有参数、无返回值
注意:
在调用函数时,如果需要把一些数据一起传递过去,被调用函数就需要用参数来接收
参数列表中变量的个数根据实际传递的数据的多少来确定
函数名不能重复
如果在同一个程序中出现了多个相同函数名的函数,那么在调用函数时就会出现问题,所以要避免名字相同
还有一点 不仅要避免函数名之间不能相同,还要避免 变量名和函数名相同的,否则都会出现问题
调用函数
调用的方式为:
函数名([实参列表])
调用时,到底写不写 实参
■ 如果调用的函数 在定义时有形参,那么在调用的时候就应该传递参数
■ 调用时,实参的个数和先后顺序应该和定义函数中要求的一致
■ 如果调用的函数有返回值,那么就可以用一个变量来进行保存这个值
作用域
在一个函数中定义的变量,只能在本函数中用(局部变量)
在函数外定义的变量,可以在所有的函数中使用(全局变量)