【Python入门】-- 函数进阶

文章详细介绍了Python中的变量作用域,包括局部变量和全局变量的使用。接着讨论了多函数的程序执行流程,如共享全局变量和通过返回值传递数据。函数的参数部分涵盖了位置参数、关键字参数、缺省参数和不定长参数的概念。此外,还讲解了拆包、交换变量值以及引用和可变、不可变类型的差异。
摘要由CSDN通过智能技术生成

目录

一、变量作用域

1. 局部变量

2. 全局变量

二、多函数的程序执行流程

三、函数的多返回值

四、函数的参数

1. 位置参数

2. 关键字参数

3. 缺省参数

4. 不定长参数

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

1. 拆包

2. 交换变量值

六、引用

1. 了解引用

2. 引用当作实参传递

七、可变和不可变类型


一、变量作用域

变量作用域指的是变量生效的范围,主要分为两类:局部变量全局变量

1. 局部变量

局部变量:定义再函数体内部的变量,即只在函数体内部生效,在函数外部访问则报错。

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

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

testA()  # 100
print(a)  # 报错

2. 全局变量

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

# 定义全局变量a
a = 100
def testA():
    print(a)

def testB():
    print(a)

testA()  # 100
testB()  # 100
print(a) # 100

二、多函数的程序执行流程

一个程序往往由多个函数组成,并且多个函数共享某些数据。

  • 共用全局变量
def test1():
    # 声明a为全局变量
    global a
    a = 200
    print(a)

def test2():
    print(a)

test1()  # 200
test2()  # 200
  • 返回值作为参数传递
def test1():
    return 100
def test2(num):
    print(num)
# 将test1的返回值保存在变量result中
result = test1()
# 将test1的返回值(变量result)作为test2的参数传递
test2(result)

三、函数的多返回值

思考:如果一个函数有多个返回值,该如何书写呢?

def test():
    return 100,200
result = test()
print(result)  # (100, 200)  --默认返回一个元组

注意:return a,b的写法,返回多个数据的时候,默认是元组类型。

四、函数的参数

1. 位置参数

位置参数:调用函数时,根据函数定义的参数位置来传递参数。传递和定义参数的顺序及个数必须一致。

def testA(name,age,gender):
    print(f'您的姓名是{name},年龄是{age},性别是{gender}')
testA('小明',20,'男')   # 您的姓名是小明,年龄是20,性别是男

2. 关键字参数

关键字参数:函数调用,通过“键=值”形式加以指定,可以让函数更加清晰、容易使用,同时也清除了参数的顺序需求。

注意:函数调用时,如果有位置参数,位置参数必须在关键字参数的前面,但关键字参数之间不存在先后顺序。

def testA(name,age,gender):
    print(f'您的姓名是{name},年龄是{age},性别是{gender}')
testA('小明',20,'男')
testA('张三', gender='男', age=18)  # 您的姓名是张三,年龄是18,性别是男

3. 缺省参数

缺省参数:也叫默认参数,用于定义函数,为参数提供默认值,调用函数时可不传该默认参数的值。

注意:1.所有位置参数必须出现在默认参数前,包括函数定义和调用。

2.函数调用时,如果缺省参数传值则修改默认参数值,否则使用这个默认值。

def testA(name,age,gender='男'):
    print(f'您的姓名是{name},年龄是{age},性别是{gender}')
testA('张三',18)  # 您的姓名是张三,年龄是18,性别是男
testA('李四',18,'女')  # 您的姓名是李四,年龄是18,性别是女

4. 不定长参数

不定长参数,也叫可变参数。用于不确定调用的时候会传递多少个参数的场景。

  • 包裹位置传递

注意:传递的所有参数都会被args变量收集,它会根据传进参数的位置合并为一个元组(tuple),args是元组类型,这就是包裹位置传递。

def testA(*args):
    print(args)
testA()  # ()
testA('张三')  # ('张三',)
testA('张三',18)  # ('张三', 18)
  • 包裹关键字传递
def testB(**kwargs):
    print(kwargs)
testB(name='张三',age=18,gender='男')  # {'name': '张三', 'age': 18, 'gender': '男'}

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

1. 拆包

  • 拆包:元组
def testA():
    return 100,200
a1,a2 = testA()
print(a1)  # 100
print(a2)  # 200
  • 拆包:字典
d1 = {'name':'张三','age':18,'gender':'男'}
a1,a2,a3 = d1
# 对字典进行拆包,取出来的是字典的key
print(a1)  # name
print(a2)  # age
print(a3)  # gender
print(d1[a1])  # 张三
print(d1[a2])  # 18
print(d1[a3])  # 男

2. 交换变量值

a,b = 10,20
a,b = b,a
print(a)   # 20
print(b)   # 10

六、引用

1. 了解引用

在Python中,值是靠引用来传递的。

我们可以用id()来判断两个变量是否为同一个值的引用。可以将id值理解为那块内存的地址标识。

# 1.int类型
a = 1
b = a
print(a)   # 1
print(b)   # 1
print(id(a))  # 2140104818928
print(id(b))  # 2140104818928

a = 2
print(a)   # 2
print(b)   # 1  --说明int类型为不可变类型
print(id(a))  # 2140104818960
print(id(b))  # 2140104818928


# 2.列表类型
aa = [10,20]
bb = aa
print(aa)   # [10, 20]
print(bb)   # [10, 20]
print(id(aa))  # 1355272677248
print(id(bb))  # 1355272677248
# 修改a的值
aa.append(30)
print(aa)   # [10, 20, 30]
print(bb)   # [10, 20, 30]  # 说明列表为可变类型
print(id(aa))  # 2989832071040
print(id(bb))  # 2989832071040

2. 引用当作实参传递

def testA(a):
    print(a)
    print(id(a))
b = 10
testA(b)   

---运行结果---
10   
2466967192080

七、可变和不可变类型

  • 可变类型:

                       列表

                       字典

                       集合

  • 不可变类型:

                       整型

                       浮点型

                       字符串

                       元组

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值