2021-5-11函数进阶

2021-5-11函数进阶

函数的参数

1. 位置参数和关键字参数

根据实参的提供是不同将实参分为位置参数和关键字参数

  1. 位置参数:调用函数的时候让实参和形参在位置上一一对应
  2. 关键字参数:调用函数的时候以’形参名=值’的形式确定形参对应的实参
  3. 位置参数和关键字参数混用:位置参数必须在关键字参数前面,同时必须保证每个参都会有一次赋值
def func1(x,y,z):
    print(f'x:{x},y:{y},z:{z}')

位置参数

func1(10,20,30)
func1(10,30,20)

关键字参数

func1(x=10,y=20,z=30)
func1(z=30,x=10,y=20)

混用

func1(10,20,z=30)
func1(10,z=30,y=20)
### func1(x=10,20,z=30)    位置参数不能放在关键字参数后面  # SyntaxError: positional argument follows keyword argument

# func1(10,20,x=30)       # TypeError: func1() got multiple values for argument 'x'

2.参数默认值

定义函数的时候可以直接在形参后面用=给形参赋默认值。

有默认值的参数在调用的时候可以不用传参

如果有的参数有默认值有的没有,有默认值的参数必须放在没有默认值参数的后面

def func2(x=10,y=20,z=30):
    print(f'x:{x},y:{y},z:{z}')

func2(100)
func2(z=300)

def func3(z,x=10,y=20):
    print(f'x:{x},y:{y},z:{z}')

func3(100)
func3(z='abc')

print(10,20,end='\n',sep=',')

3. 参数类型说明

无默认值参数的类型说明 - :类型名

有默认值的参数,默认值的类型就是参数对应的类型

def func4(x:str,y=''):
    x.split('\n')
    x.replace('you','me')

4. 不定长参数

  1. 带*的不定长参数:在某个形参前加*,那么这个形参就是一个不定长参数,它可以接收任意多个实参;
    带*的参数本质就是一个元组,对应的实参是元组中的元素
    注意:带*的不定长参数对应的实参必须用位置参数传参

  2. 带**的不定长参数:在某个形参前加**,那么这个形参就是一个不定长参数,它可以接收任意多个实参;
    带**的参数本质就是一个字典,对应的关键字参数就是字典中的键值对
    注意:**的不定长参数对应的实参必须使用关键字参数传参

    def func5(*x):
    print(x)


func5()
func5(10)
func5(10,20)
func5(1,2,3,4,5)

1)定长参数在*的不定长参数前,定长和不定长都使用位置参数传参

def func6(char,*nums):
    print(char,nums)

func6('+')
func6('-',1,22,3,8,4,4,6,1)

2) 定长在*的不定长参数后,*后面的定长参数必须使用关键字参数传参

def func7(*nums,char):
    print(f'nums:{nums},char:{char}')

func7(10,20,char='*')

def func8(*,a,b,c):
    print(f'a:{a},b:{b},c:{c}')

print(func8(a=10,b=20,c=30))

3) **的使用 - 关键字参数

def func9(**x):
    print(x)

func9(x=10)
func9(a=10,b=20,s=30,t=59)

4)定长参数在**的不定长前,定长既可以用位置参数也可以用关键字参数

def func10(x,**y):
    print(f'x:{x},y:{y}')

func10(10,a=10,b=20)
func10(x=100,m=1,n=2)

5)定长参数不能放在**对应不定长参数后面

# def func11(**x,y):
#     pass

6)带的不定长参数和带**的不定长参数可以一起用,带的必须放在带**的前面

def func11(*args,**kwargs):
    print(args,kwargs)

func11()
func11(10)
func11(10,29,9)
func11(a=2)
func11(a=10,b=20)
func11(1,20,a=10)

函数的返回值

1. 返回值

返回值的作用就是将函数内部的数据传递到函数外部

2. 怎么确定函数返回值 - 怎么将函数内容的数据传递到外部

在函数体中用return关键字来返回返回值(一个函数只有一个返回值)
什么时候需要返回值:如果函数的功能产生了新的数据,将新的数据返回。

3. 怎么获取函数返回值

获取函数调用表达式的值就是获取函数返回值
函数调用表达式 - 调用函数的语句
函数调用表达式的值就是函数返回值,函数返回值能做的事情,函数调用表达式都可以做

4. 函数调用过程

第一步:回到函数定义的位置
第二步:传参(用实参给形参赋值,这个时候要保证每个参数都有值)
第三步:执行函数体
第四步:执行完函数体的时候确定函数返回值
(看执行函数体的时候有没有遇到return如果遇到return,
return后面的值是什么,
函数返回值就是什么,
并且在遇到return的时候函数直接结束。
如果没有遇到return,函数返回值是None)
第五步:回到函数调用的位置(这个时候函数调用表达式的值才是函数的返回值)

python的函数只有一个返回值

变量的作用域

根据变量的作用域不同,将变量分为全局变量和局部变量两种

1. 全局变量

没有定义在函数里面或者类里面的变量就是全局变量;
全局变量的作用域:从定义开始到程序结束的任何位置都可以使用

2. 局部变量

定义在函数里面的变量就是局部变量(形参也是局部变量);
局部变量的作用域:从定义开始到函数结束

3. 函数调用过程就是压栈的过程

调用函数的时候,系统会自动在栈区间为这个函数创建一个临时栈区间,用来保存在函数中产生的数据(局部变量)。
当函数调用结束,这个临时栈区间会自动释放(释放之前会将返回值传递到临时栈区间的外部)

4. global

在函数中修改一个全局变量的值或者在函数定义一个全局变量

global 变量名
使用变量

def func3():
    num = 40    # 不是在修改全局变量num的值,而是定义一个新的局部变量
    print(f'函数内部num:{num}')

    global m
    m = 200         # 在函数中修改一个全局变量的值,需要先用global进行说明
    print(f'函数内部m:{m}')

    global n
    n = 'abc'
func3()
print(f'函数外部num:{num}')
print(f'函数外部m:{m}')
print(f'函数外部n:{n}')
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值