python语法与函数_python语法基础(4)_函数与函数参数

函数

关键字def

1.写法格式

函数名 ():

函数体

#例子如下

func():

函数体

2.函数返回值

关键字return

return的内容返回函数的调用

return下方代码不执行,可以终止函数,不可以终止终止循环

return 返回多个内容的时候是元祖形式

return 没有写返回值的时候是None 不写返回值时也是None

3.参数

形参:是指函数定义中括号里面的参数

实参:函数的调用括号里的是实参

传参:是将实参传递给形参的过程

混合参数:位置参数和关键字参数在一起的

优先级

位置参数>关键字参数

4.三元运算符

变量=条件成立 条件判断 条件不成立 结果

def a(a,b):

return a if a>b else b

print(a(1,2))

5.动态参数

*args是万能位置参数

def func(a,b,*args):

print(a,b,args) #args传递的参数是元祖类型

func(1,2,3,45,['SkyRabbit'])

#结果如下

1 2 (3, 45, ['SkyRabbit'])

def func(a,b,**kwargs,):

print(a,b,kwargs) #args传递的参数是字典类型

func(3,4,args=16,cs=5)

#结果如下

3 4 {'args': 16, 'cs': 5}

位置参数>动态参数>默认参数(关键字参数)>动态关键字参数

万能传参:动态位置参数,动态关键字参数

6.空间

内置空间 例子print() input()

全局空间 在当前py文件需要开辟的空间存放在全局空间

局部空间 函数中开辟的空间就是局部空间

加载顺序

内置空间>全局空间>局部空间

取值顺序

局部空间>全局空间>内置空间

7.作用域

全局作用域:内置空间+全局空间

局部作用域: 局部空间

8.函数嵌套

不管子啊什么位置,只要函数名+()就是调用此函数

函数调用执行后,函数体中开辟的空间就自动销毁了

9.修改变量

global关键字 声明修改,全局变量

nonlocal 关键字 在外层函数中,在修改局部空间的变量值,空间不涉及全局空间,只修改距离它最近一层,直到找到最外层函数.

10函数注释

查看函数的注释

格式如下

函数名 : doc

查看函数的名字

格式如下

函数名: name

第一类对象-特点

1.可以当做值被赋值给变量

2.当做元素,存放在容器中

3.函数名可以当做函数的参数

4.函数名可以当做函数的返回值

格式化用途

1.支持F

2.表达式

3.函数调用

4.数字计算

字典取值

匿名函数

匿名函数 lambda

lambda 形参:返回值 - lambda x:x

形参可以不写,返回值必须写 返回值只能是一个数据类型

匿名函数的名字叫做 lambda

函数参数-动态参数

形参的第三种:动态参数

动态参数分为两种:

形参的顺序: 位置参数 , 动态参数 , 默认参数

位置参数 > *args(动态位置参数) > 默认值参数 > **kwargs(动态默认参数)

这四种参数可以任意的使用

加载顺序:

内置命名空间

全局命名空间

局部命名空间(函数被执行的时候)

取值顺序:

局部命名空间

全局命名空间

内置命名空间

我们给存放名字和值的关系的空间起一个名字叫: 命名空间. 我们的变量在存储的时候就 是存储在这片空间中的.

命名空间分类:

内置命名空间--> 存放python解释器为我们提供的名字, list, tuple, str, int这些都是内置命名空间

全局命名空间--> 我们直接在py文件中, 函数外声明的变量都属于全局命名空间

局部命名空间--> 在函数中声明的变量会放在局部命名空间

1.动态接受位置参数

首先我们来回顾下位置参数

def eat(a,b,c):

print('我想吃%s%s%s'%(a,b,c))

eat('大米饭','中米饭','小米饭')

2.在参数位置用*表示接受任意参数

def eat(a,b,c):

print('我想吃%s%s%s'%(a,b,c))

eat('大米饭','中米饭','小米饭')

3.动态接收参数的时候要注意: 动态参数必须在位置参数后面

def eat(*args,a,b):

print('我想吃',args,a,b)

eat('大米饭','中米饭','小米饭')

结果:

TypeError: eat() missing 2 required keyword-only arguments: 'a' and 'b'

# eat函数在调用的时候发现缺少俩个位置参数没有进行传递

#正确操作

def eat(a,b,*args):

print('我想吃',args,a,b)

eat('大米饭','中米饭','小米饭')

结果:

我想吃 ('小米饭',) 大米饭 中米饭

动态接收参数的时候要注意:动态参数必须在位置参数后面

4.默认值参数呢?

def eat(a,b,c='白菜',*args):

print('我想吃',a,b,c,args)

eat('豆腐','粉条','猪肉','大葱')

结果:

我想吃 豆腐 粉条 猪肉 ('大葱',) # 我们定义好的白菜没有生效,被猪肉给覆盖了

我们发现默认值参数写在动态参数前面,默认值的参数是不会生效的

def eat(a,b,*args,c='白菜'):

print('我想吃',a,b,args,c)

eat('猪肉','粉条','豆腐','大葱')

结果:

我想吃 猪肉 粉条 ('豆腐', '大葱') 白菜 # 这样默认参数就生效了

5.动态接收关键字参数

def func(**kwargs):

print(kwargs)

func(a=1, b=2, c=3)

结果:

{'a': 1, 'b': 2, 'c': 3}

动态关键字参数最后获取的是一个dict字典形式

顺序的问题, 在函数调用的时候, 如果先给出关键字参数, 则整个参数列表会报错.

def func(a,b,c,d):

print(a,b,c,d)

func(1,2,c=3,4)

结果:

File "D:/python_object/path2/test.py", line 806

func(1,2,c=3,4)

SyntaxError: positional argument follows keyword argument

关键参数必须要放在位置参数后边,由于实参是这个顺序,所以形参接收的时候也是这个顺序.

也就是说位置参数必须在关键字参数前面.动态接收关键字参数也要在后面

6.如果想接收所有的参数:

def func(*args,**kwargs):

print(args,kwargs)

func(1,23,5,a=1,b=6)

#动态参数还可以这样传参:

lst = [1,4,7]

# 方法一

def func(*args):

print(args)

func(lst[0],lst[1],lst[2])

# 方法二

def func(*args):

print(args)

func(*lst)

# 在实参的位置上用*将lst(可迭代对象)按照顺序打散

# 在形参的位置上用*把收到的参数组合成一个元祖

7.字典也可以进行打散,不过需要**

dic = {'a':1,'b':2}

def func(**kwargs):

print(kwargs)

func(**dic)

gloabal、nonlocal

global 表示. 不再使用局部作用域中的内容了. 而改用全局作用域中的变量

nonlocal 表示在局部作用域中, 调用父级命名空间中的变量.

如果父级命名空间中没有这个变量名,就继续向上查找.最多找到最外成的函数就结束了

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值