变量作用域

多函数程序执行流程

函数的返回值

函数的参数

拆包和交换两个变量的值

引用

可变和不可变类型

一、变量的作用域

局部变量和全局变量

局部变量:在函数体内部,临时保存数据,即当函数调用完成后,则销毁局部变量

def test1():
    a = 100
    print(a)

test1()

全局变量:指的是在函数内,外都能生效的变量

a = 100
print(a)

def test1():
    print(a)


def test2():
    print(a)


test1()
test2()

修改全局变量,使用global声明这个变量是全局的,然后再取修改

a = 100
print(a)


def test1():
    print(a)


def test2():
    # a = 200  # 修改的a是局部变量,因为再函数调用后又打印了一次a,发现还是100,说明全局变量没有变
    # 使用关键字声明这个变量是全局的
    global a
    a =200
    print(a)


test1()
test2()
print(a)
# 输出
# 100
# 100
# 200
# 200

二、多函数程序执行流程

number = 0


def test1():
    global number
    number = 100


def test2():
    print(number)


test1()
test2()

三、函数的返回值

3.1函数的返回值可以作为另外一个函数的入参

def test1():
    return 40


result = test1()


def test2(num):
    print(num)
    

test2(result)

3.2 一个函数返回多个返回值的写法,可以是元组、列表、字典

return a, b

返回的是一个元组

def nums():
    # return 1, 3
    # return (1, 3)
    # return [1, 3]
    return {'name':'test', 'age':23}


res = nums()
print(res)
# 输出(1, 3)
# 返回的是一个元组
# 输出[1, 3]
# 输出 {'name':'test', 'age':23}
# 当返回的多个数据是 元组,返回的也是元组,当多个数据是列表,返回的还是列表,是字典的时候,返回的是字典

四、函数的参数

4.1位置参数:调用函数时根据函数定义的参数位置来传递参数

def user(name, age, gender):
    print(f'名字是{name},年龄是{age},性别是{gender}')


user('test1', 20, '男')
# 输出名字是test1,年龄是20,性别是男

注意:传递和定义参数的顺序及个数必须一致

4.2关键字参数

函数调用,是通过“键”=“值”的形式加以指定的,关键字参数之间不存在位置先后顺序。

def user_info(name, age, gender):
    print(f'姓名是{name},年龄是{age},性别是{gender}')


user_info(age=20, gender='男', name='test1')
# 输出姓名是test1,年龄是20,性别是男

用关键字参数的时候,关键字参数先后顺序可以不一致

4.3缺省参数

缺省参数也叫默认参数,用于定义函数,为参数提供默认值,调用函数时可不传该默认参数的值,所有位置参数必须出现在默认参数前,包括函数定义和调用

def user_info(name, age, gender='男'):
    print(f'姓名是{name}, 年龄是{age}, 性别是{gender}')


# user_info('test', 23)
# 输出 姓名是test, 年龄是23, 性别是男
user_info('test1', 44, gender='女')
# 输出 姓名是test1, 年龄是44, 性别是女

4.4不定长参数

用于不确定调用的时候会传递多少个参数(不传参也可以),可以用包裹(packing)位置参数,或者包裹关键字参数,来进行参数传递。

包裹位置传递,所有传进的数据都被args收集,然后返回一个元组

def user_info(*args):
    print(args)


user_info('test1', 20)
user_info('test2')
user_info()
# 输出
# ('test1', 20)
# ('test2',)
# ()

包裹关键字传递,当用关键字传递数据,但是不确定个数的时候,可以使用**kwargs,返回的是字典

def user_info(**kwargs):
    print(kwargs)


user_info(name='test1', age=23, gender='男')
# 输出{'name': 'test1', 'age': 23, 'gender': '男'}

无论是包裹位置传递,还是包裹关键字传递,都是组包的过程

五、拆包和交换两个变量的值

5.1拆包

拆包:元组,返回两个值,用两个变量分别接收

def num():
    return 100, 200


res_num1, res_num2 = num()
print(res_num1)
print(res_num2)

拆包:字典,字典拆包,拆后得到的是key值,然后通过key值,获取value

dict1 = {'name': 'test', 'age': 23, 'gender': '男'}


# 用字典拆包,拆后得到的都是key的值,然后通过key的值,获取value
a, b, c = dict1
print(a)
print(b)
print(c)

print(dict1[a])
print(dict1[b])
print(dict1[c])

5.2交换变量

方法一,借助中间变量

def num():
    a = 10
    b = 20
    c = 0
    c = a
    a = b
    b = c
    print(a)
    print(b)


num()

方法二

# 方法二
a, b = 1, 2
a, b = b, a
print(a)
print(b)

六、引用

在python中,数据的传递是通过引用传递的,简单理解引用可以当做一个变量名,可以作为实参传递

七、可变和不可变类型

所谓可变类型与不可变类型是指:数据能够直接进行修改,是否修改的是原数据,如果能直接修改那么就是可变,否则就是不可变的

可变类型:

列表

字典

集合

不可变类型:

整型

浮点型

字符串

元组

八、总结:

1、变量作用域

全局:函数体内外都能生效, global

局部:函数内部生效

2、函数多返回值写法

return 表达式1, 表达式2

3、函数的参数

位置参数 :形参和实参的个数与书写顺序必须保持一致

关键字参数: 写法 key =value,形参和实参的书写顺序可以不一致

缺省参数:缺省参数就是默认参数 ,写法key = value

不定长位置参数:收集所有位置参数,返回一个元组,用*args

不定长关键字参数:收集所有关键字参数,返回的是一个字典 ,用**kwargs接收

4、引用:python中,数据的传递是通过引用传递的