一.函数的动态参数java
以前咱们说过了传参, 若是咱们须要给一个函数传参, 而参数又是不肯定的. 或者我给一个函数传不少参数, 个人形参就要写不少, 很麻烦, 怎么办呢. 咱们能够考虑使用动态参数.python
动态参数分红两种:编程
1. *args 动态接收位置参数安全
动态接收参数的时候要注意:动态参数必须在位置参数后面闭包
1 def xue(*language,'a','b'): 2 3 print('我要学:',language,a,b) 4 5 xue('PHP',JAVA,'Python')
若是这个程序不遵循顺序的话就会报错,如上面代码,由于前面传进去的全部位置参数都给*language接收了,a和b永远也接收不了参数编程语言
因此必须改写成以下代码:函数
1 # -*- coding:utf-8 -*- 2 def xue(*language,a,b): 3 print('我要学:',language,a,b) 4 xue('JC','PHP',a='java',b='Python') #必须用关键字指定参数
这个时候a和b就有值了, 可是这样写呢位置参数就不能用了. 因此. 咱们要先写位置参数,而后再用动态参数spa
1 # -*- coding:utf-8 -*- 2 def xue(a,b,*language): 3 print('我要学:',a,b,language) 4 xue('JC','PHP','java','Python') #前两个参数用位置参数来接收,后面的参数用动态参数接收
哪默认值参数呢?3d
这个时候咱们发现全部的默认值都生了. 这个时候若是不给出关键字传参. 那么你的默认值是永远都生效的.code
要记住的顺序: 位置参数, 动态参数*, 默认值参数
2. **kwargs 动态接收关键字参数
在python中能够动态的位置参数, 可是*这种状况只能接收位置参数⽆没法接收关键字参数.
在python中使⽤用**来接收动态关键字参数
1 def xue(**kwargs): 2 print(kwargs) 3 xue(a='Python',b='PHP',c='vb')
这个时候接收到的都是dict(字典)
顺序问题,在函数调用的时候,若是先给出关键字参数,则整个函数都会报错
1 def xue(a,b,c,d): 2 print(a,b,c,d) 3 #关键字参数必须在位置参数前面,不然参数会混乱至报错 4 xue(1,2,c='Python',666)
因此关键字参数必须在位置参数后面. 因为实参是这个顺序. 因此形参接收的时候也是这
个顺序. 也就是说位置参数必须在关键字参数前⾯面. 动态接收关键字参数也要在后面
最终顺序(*):
位置参数 > *args > 默认值参数 > **kwargs
函数的注释:
1 def XUE(JAVA,PHP): 2 """ 3 这个函数是用来总结学的编程语言, 4 :param JAVA: 参数Java是Java语言 5 :param PHP: 参数PHP是PHP语言 6 :return: 返回的是什么东西 7 """ 8 print(JAVA,PHP) 9 return '坚持'
二.命名空间
在python解释器开始执行以后, 就会在内存中开辟一个空间, 每当遇到一个变量的时候, 就把变量名和值之间的关系记录下来, 可是当遇到函数定义的时候, 解释器只是把函数名读入内存, 表示这个函数存在了, 至于函数内部的变量和逻辑, 解释器是不关心的. 也就是说一开始的时候函数只是加载进来, 仅此而已, 只有当函数被调用和访问的时候, 解释器才会根据函数内部声明的变量来进行开辟变量的内部空间. 随着函数执行行完毕, 这些函数内部变量占用的空间也会随着函数执行完毕而被清空
1 def xue(): 2 a = 'YJ' 3 print(a) 4 xue() 5 print(a) #a已经不存在了已经
1. 内置名称空间:存放python解释器为咱们提供的名字, list, tuple, str, int这些都是内置命名空间
2. 全局名称空间:咱们直接在py⽂文件中, 函数外声明的变量都属于全局命名空间
3. 局部名称空间:在函数中声明的变量量会放在局部命名空间
做用域:
1. 全局做用域: 内置+全局
2. 局部做用域: 局部(函数被调用)
三.函数嵌套
函数能够互相的嵌套
1.只要碰见了()就是函数的调用,若是没有()就不是函数的调用
2.函数的执行顺序
四 global和nonlocal关键
global:在局部访问全局中的内容
1 a = 10 # 全局变量自己就是不安全的, 不能随意修改, 闭包 2 def func(): 3 global a # 1. 能够把全局中的内容引入到函数内部 , 2. 在全局建立一个变量 4 # a = 20 5 a += 10 # a = a+10 6 print(a) 7 func() 8 print(a) 9 a = 10
#结果为,20,20
nonlocal:在局部寻找外层函数中离他最近的那个变量
1 a = 10 2 def outer(): 3 a = 'yj' 4 def inner(): # 在inner中改变a的值 5 nonlocal a # 寻找外层函数中离他最近的那个变量 6 a = 20 7 print(a) 8 inner() 9 outer() 10 print(a)