变量作用域

修改全局变量

声名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)

可变和不可变类型

原则:看数据能不能被修改,如果可以直接修改覆盖原值就是可变,如果不能被修改就是不可变
可变:列表、字典、集合
不可变:整型、浮点、字符串、元组