变量作用域
修改全局变量
声名a为全局变量,再重新赋值,用global关键字把他声名成全局
a = 100
def testB():
global a
a = 200
print(a)
testB()
print(a)
# 这个时候的a就改的是全局
如果在函数里面直接把a = 200,这里修改的不是全局,是定义了一个局部再去访问他
多函数程序执行流程
glo_num = 0
def testA():
global glo_num
glo_num = 100
def testB():
print(glo_num)
print(glo_num) # 0
testA()
testB()
print(glo_num) # 100
返回值作为参数传递
多返回值
用逗号分隔开
return 1,2
用变量接收后,打印出来的是元组
return后可以直接书写元组、列表、字典用来返回多个值
函数参数
位置参数
调用时候根据函数定义的参数位置来传递参数,即传递和定义参数的顺序和个数必须一致
关键字参数
通过键=值的形式指定
关键字参数不存在先后顺序,随便写就可以
位置参数一定要放在位置参数之前
缺省参数
可以直接给形参赋值,他就成为了缺省参数,写实参的时候就不用写这一参数
如果为缺省参数传值了就会覆盖掉
不定长参数
不确定调用的时候需要传递多少参数就用这个
1、包裹位置传递
args:用来接收所有的不定长参数,后面用的时候不写星号
传入参数的个数可以是任意的,即传进的所有参数都会被args变量收集,他会根据传进参数的位置合并为一个元组,也就是说args是元组类型
# 接收所有位置参数
def user_info(*args):
print(args)
user_info('tom')
user_info('tom', 18)
如果参数位置 什么也不写,就会返回空元组
2、包裹关键字传递
用来接受不定长的关键字
无论是包裹位置传递还是包裹关键字传递,都是组包的过程
元组拆包
就是组包的反方向:元组和字典
拆包就是说要返回几个值就拿几个变量来存,如果变量数和返回值个数不一致会报错
字典拆包
对字典拆包,取出来的是字典的key
字典的查找是通过key来找value的
id(变量名)
该函数是取变量地址的函数
变量交换
# 可以用中间变量,也可以用如下方法:
a, b = 1, 2 # 把a =1,b=2
a, b = b, a # 交换
print(a)
print(b)
引用当实参传入
# 引用是否可以当做实参传递
"""
1. 定义函数:有形参
1.1打印形参看是否有数据
1.2访问形参的id
1.3改变形参的数据,查看这个形参并打印id看是否相同
2、调用函数
"""
def test1(a):
print(a)
print(id(a))
a += a
print(a)
print(id(a))
b = 100 # 因为是不可变类型,所以会存两份,id不一样
test1(b)
c = [11, 22] # 可变类型是从原数据进行修改,id一样
test1(c)
可变和不可变类型
原则:看数据能不能被修改,如果可以直接修改覆盖原值就是可变,如果不能被修改就是不可变
可变:列表、字典、集合
不可变:整型、浮点、字符串、元组