我来自北方 跨过山与海 驻足你门外

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(动态默认参数)
这四种参数可以任意的使用

加载顺序:

  1. 内置命名空间
  2. 全局命名空间
  3. 局部命名空间(函数被执行的时候)

取值顺序:

  1. 局部命名空间
  2. 全局命名空间
  3. 内置命名空间

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

命名空间分类:

  1. 内置命名空间--> 存放python解释器为我们提供的名字, list, tuple, str, int这些都是内置命名空间
  2. 全局命名空间--> 我们直接在py文件中, 函数外声明的变量都属于全局命名空间
  3. 局部命名空间--> 在函数中声明的变量会放在局部命名空间

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 表示在局部作用域中, 调用父级命名空间中的变量.
如果父级命名空间中没有这个变量名,就继续向上查找.最多找到最外成的函数就结束了

posted @ 2019-07-17 21:15  SkyRabbit  阅读(260)  评论(0编辑  收藏  举报
您的浏览器不兼容canvas