python 函数深入

函数

  • 变量得作用域
  • 多函数程序执行流程
  • 函数得返回值
  • 函数得参数
  • 拆包和交换两个变量得值
  • 引用
  • 可变和不可变类型

一、变量作用域

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

  • 局部变量
    所谓局部变量是定义在函数体内部得变量,即只在函数体内部得变量
def testa():
    a=100
    print(a)
testa()
print(a) #报错

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

  • 全局变量
a=100
print(a)
def teata():
    print(a)

teata()

修改全局变量

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

    print(a)
def teatb():
    a=200
    print(a)

teata()
teatb()
"""
100
100
200
"""

修改全局变量 使用关键字 global

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

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

teata()
teatb()
print(a)
"""
100
100
200
200
"""

二多函数程序执行流程

一般在实际开发过程中,一个程序往往由多个函数组成,并且多个函数共享某些数据,如下所示:

  • 共用全局数据
#定义全局变量
num=0
def test1():
    global num
    num=100

def test2():
    print(num)

test1()
test2() #100
  • 返回值作为参数传递
def test1():
    return 50

def teat2(num):
    print(num)

#保存test1得返回值
result=test1()

#将函数返回值所在变量作为参数传递到teat2
teat2(result)

三、函数得返回值

思考:如果一个函数如些两个return,程序如何执行

def retur_num():
    return 1
    return 2

result=retur_num()
print(result) #1

答 只执行第一个return,原因是return可以退出当前函数,导致return下方代码不执行。

思考 如果一个函数要有多个返回值,该如何书写代码

def retur_num():
    #return 1,2
    #teturn 后面可以直接书写元组,字典,列表
    return [1,2]


result=retur_num()
print(result) #(1, 2)

四函数得参数

4.1位置参数

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

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

user('tom',20,'男')    
#您得名字tom,年龄20,性别男

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

4.2关键字参数

函数调用通过‘键=值’来加以制定,可以让函数更加清晰、容易使用、同时也清楚了参数得顺序需求

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

# user('tom',20,'男')
# #您得名字tom,年龄20,性别男

user('小米',gender='男',age=16)
user('小米',age=66,gender='男')
#您得名字小米,年龄16,性别男

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

4.3缺省参数

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

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

# user('tom',20,'男')
# #您得名字tom,年龄20,性别男

user('小米',20)
user('小米',66,gender='女')
"""
您得名字小米,年龄20,性别男
您得名字小米,年龄66,性别女
"""

注意:函数调用时,如果为缺省参数传值则修改默认参数值;否则使用这个默认值。

4.4不定长参数

不定长参数也叫可变参数,用于不确定调用得时候会传递多少个参数(不传递也可以)得场景。此时,可用包裹(packing)位置参数,或者包裹(packing)关键字参数,来进行参数传递,回显得非常方便。

  • 包裹位置参数
def user(*args):
    print(args)



user('小米',20)
user('小米')
"""
('小米', 20)
('小米',)
"""

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

  • 包裹关键字传递
def user(**kwargs):
    print(kwargs)

# user('tom',20,'男')


user(name='小米',age=20, id=110)
user(name='小米',age=66,gender='女')
"""
{'name': '小米', 'age': 20, 'id': 110}
{'name': '小米', 'age': 66, 'gender': '女'}
"""

五,拆包和交换变量值

5.1拆包

  • 拆包:元组
def return_num():
    return 100,200
num1,num2=return_num()
print(num1)
print(num2)
"""
100
200
"""
  • 拆包:字典
dict1 = {'name':'小米','age':66}
a,b=dict1
print(a)
print(b)
"""
name
age
"""
print(dict1[a])
print(dict1[b])
"""
小米
66
"""

交换变量得值

需求:有变量a=10和b=20,交换两个变量得值

  • 方法一
    借助第三变量
c=0
a=10
b=20

c=a
a=b
b=c
print(a)
print(b)
  • 方法二

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

六、引用

6.1了解引用

在python语言中值都是考引用来传递得。
我们可以通过id来判断两个变量是否为同一个值引用。我们可以将id值理解为那块内存得地标识

a=1
b=1
print(b)
print(id(a)) #140709588734784
print(id(b))  #140709588734784
a=2
print(b) #1

在列表中

#列表
aa=[10,20,30]
bb=aa
print(id(aa))
print(id(bb))
aa.append(30)

print(bb)
print(id(aa))
print(id(bb))
"""
2756781695560
2756781695560
[10, 20, 30, 30]
2756781695560
2756781695560
"""

6.2引用当作实参

代码如下

def test1(a):
    print(a)
    print(id(a))
    a += a
    print(a)
    print(id(a))

#int
b=100
test1(b)
#列表
c=[10,20]
test1(c)
“”“
100
140709647785888
200
140709647789088
[10, 20]
2491374002760
[10, 20, 10, 20]
2491374002760”“”

注意:如果以(test 或test1等等)命名可能出错,具体原因不清楚
fixture ‘xxx’ not found的问题

在python中数据得传递通过引用

七 可变和不可变类型

所谓得可变类型和不可变类型是指;数据能够直接修改,如果能够直接修改那么就是可变,否则就是不可变。

可变类型

  • 列表

  • 字典

  • 集合
    不可变类型

  • 整形

  • 浮点型

  • 字符串

  • 元组

发布了60 篇原创文章 · 获赞 6 · 访问量 7442

猜你喜欢

转载自blog.csdn.net/qq_43061290/article/details/104126883