Python学习记录——십칠 函数第二部分

变量作用域

局部变量只作用于函数体内部,在外部调用就会出错,因为外部不存在这个数据。其作用:在函数体内部,临时保存数据,即当函数调用完成后,则销毁局部变量

全局变量函数内外都可作用。

局部变量的改变,可以在函数体内部再次赋值变量。而全局变量需要先用global关键字声明a是全局变量,再重新赋值,才会生效。

a = 100

print(a)

def testA():
    print(a)

def testB():
    global a
    a = 200
    print(a)

testA()
testB()
testA()

100
100
200
200

多函数程序执行流程

公用全局变量

glo_num = 0

def test1():
    global glo_num
    glo_num = 100

def test2():
    print(glo_num)

print(glo_num)
test1()
test2()
print(glo_num)

0
100
100
返回值作为参数传递

def test1():
    return 50

def test2(num):
    print(num)

result = test1()
test2(result)

50

num就是一个形参。

返回值

def return_num():
    return [100, 200]
    #return 1
#return后可写元组,列表,字典,返回多个值


result = return_num()
print(result)

[100, 200]

参数

位置参数

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

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

user_info(20, 'TOM', '男')

您的姓名是20, 年龄是TOM, 性别是男

个数和传入的个数不一致会报错。顺序也要和定义一致,虽然程序不报错,但是却是一个个对应下来,会导致数据无意义

关键字参数

函数调用,通过“键=值”形式加以指定。可以让函数更容易被使用

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

user_info('Paul', gender = '男', age = '36')

您的姓名是Paul, 年龄是36, 性别是男

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

缺省参数

也叫默认参数,用于定义参数,为参数提供默认值,调用函数时可不传该默认参数的值,所有位置参数必须在缺省参数前,包括函数定义和调用。,因为这个缺省参数是关键字参数写法。函数调用时,如果实参里没有缺省参数,那就使用默认值,否则就修改这个默认值(此句参考下面)

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

user_info('Paul', 36)
user_info('Lilly', 25, '女')


您的姓名是Paul, 年龄是36, 性别是男
您的姓名是Lilly, 年龄是25, 性别是女

不定长参数

也叫可变参数。用于不确定调用的时候会传递多少个参数(不传参也可以)的时候。此时,可用包裹(packing)位置或关键字参数来进行参数传递。如果此时不用不定长参数,使用位置,关键字参数会报错,因为个数不一致会出问题。

位置参数

def user_info(*args):
    print(args)

user_info('Paul', 25)
user_info('Paul')
user_info()

('Paul', 25)
('Paul',)
()

传入的参数都被args变量收集,根据传进参数的位置合并为一个元组,args是元组类型

关键字参数

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

user_info(name = 'Paul', age = '37')
user_info()

{'name': 'Paul', 'age': '37'}
{}

返回字典形式

拆包和交换变量值

拆包

元组

def return_num():
    return 34, 345
num1, num2 = return_num()
print(num2)
print(num1)
print(num1, num2)

345
34
34 345

如果只用一个变量接受,它就会打印出元组

字典

d1 = {'name': 'Paul', 'age': 18}
a, b = d1

print(a)
print(b)
print(d1[a])
print(d1[b])

name
age
Paul
18

交换变量值

用第三个变量来暂时存储,以及一个直接交换赋值

a, b = 1, 2
a, b = b, a
print(a)
print(b)

2
1

引用

用id()来显示某个数据的地址

不可变类型

a = 1
b = a
print(b)
print(id(a))
print(id(b))

a = 2
print(b)
print(id(a))
print(id(b))

1
1706169925872
1706169925872
1
1706169925904
1706169925872

数据1开辟空间后,拥有了地址,随后起了变量名a,a被赋值给b,b也有了1和这个地址,也就是1和它的地址同时有两个变量名。再出现一个数据2,赋值给a,也就是a这个变量名不再是代表1和地址了,而是代表2了;此时b还是代表1和地址。int类型是不可变类型
可变类型

aa = [10, 20]
bb = aa
print(bb)
print(id(aa))
print(id(bb))

aa.append(30)
print(bb)
print(id(aa))
print(id(bb))

[10, 20]
1668671582848
1668671582848
[10, 20, 30]
1668671582848
1668671582848
列表是可变类型。aa改变后,改的是原数据,原数据改了,bb也跟着改了。但是地址不变。

引用当作实参

def test1(a):
    print(a)访问打印形参看是否有数据
    print(id(a))访问形参的id

    a += a

    print(a)
    print(id(a))
改变形参的数据,查看这个形参并打印id,看id值是否相同
b = 100
test1(b)

c = [11, 22]
test1(c)

调用函数,可变和不可变两种类型依次当做实参传入

100
1976634772816
200
1976634776016
[11, 22]
1976636125824
[11, 22, 11, 22]
1976636125824

有数据打印出来则证明引用可以当作实参传递。整数类型前后地址不同,列表类型前后地址不变。

可变和不可变类型

可变:列表,字典,集合。可以直接修改原数据

不可变:整型,浮点型,字符串,元组
 

结束。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值