2018.12.7 今日所学

今天主要的学习内容

1. 函数参数--动态传参
2. 名称空间, 局部名称空间, 全局名称空间, 作?域, 加载顺序.
3. 函数的嵌套
4. gloabal, nonlocal关键字

一 .动态传参  *   **

动态传参分为两种:

1  .动态接受位置参数

我自己的理解是将你输入的输入全部赋值给你的变量参数  如:

  def func(*content):

    pass

  func(1,2,3,4,5,6,7)

就是上面的将1-7全部给content,最后输入的全部放到一个tuple中

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

def chi(*food, a, b):
  print("我要吃", food, a, b)
chi("大米饭", "小米饭", "黄瓜", "茄子")     # 前两个参数用位置参数来接收, 后面的参数用

动态参数接收

  

上面的代码是错误的, 因为*food 已经接收了所有的数据,a,b永远接收不到信息,系统报错

由此我们得出总结:

顺序 : 位置参数,动态参数* ,默认值参数

2.动态接收关键字参数

在python中我们使用**来接受动态关键字参数

def func(**kwargs):
    print(kwargs)
func(a=1,b=2,c=3)
func(a=1,b=3)


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

  这个时候接收的是一个字典dict

最终我们得到的顺序是:

        位置参数 > *args > 默认值参数 > **kwargs

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

这里如果想要接收所有的参数 ,有一种无敌传参(自己给的名字):

  def func (*args ,**kwargs):

    print(*args,**kwargs)

func()这里用户输入的所有参数都可以拿到并输出

当* ,**在形参的位置 相当于把输入的东西聚合 ,聚合成元组 ,字典

当* ,**在实参位置的时候,把用户输入的东西按照顺序打散

命名空间

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

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

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

加载顺序:  内置命名空间-->全局命名空间 -->局部命名空间

取值顺序:  局部命名空间 -->全局命名空间-->内置命名空间

a=10
def func():
    a=20
    print(a)

func()  #结果为20

  作用域:作用域就是作用范围 ,按照生效范围来看分为 全局作用域 和局部作用域

全局作用域: 包含了全局命名空间和内置命名空间,在整个文件的任何位置都可以使用(遵循从上到下逐个进行)

局部作用域: 在函数内部可以使用

 作用域命名空间:

1. 全局作用域: 全局命名空间+ 内置命名空间   locals() 查看全局作用域内容

2. 局部作用域: 局部命名空间   globals() 查看当前作用域内容 

 函数的嵌套 

1. 只要遇到了()就是函数的调用 ,如果没有()就不是函数的调用

2, 函数的执行顺序

def fun1():
     print(111)
 def fun2():
     print(222)
 fun1()
 
fun2()
print(111)
# 函数的嵌套
def fun2():
     print(222)
     def fun3():
         print(666)
     print(444)
     fun3()
     print(888)

print(33)
fun2()
print(555)    

  关键字global 和nonlocal

我们写一个代码,首先在全局声明一个变量 ,然后在局部调用这个变量,并改变这个变量的值

a=100
def func():
    global a  #这里的global 是把外面的a 引入进来 (用的是外面的a),但是要注意,这里将a修改后,外面的a也相应的发生了改变
    a=28
    print(a)

func()
print(a)

  即 :global表示的不在用局部的内容,改用全局作用域的变量

nonlocal是调用上一级的内容 ,如果找不到,继续往上找,直到找到全局,但是找不到全局

a=10
def func():
    a=20
    def pp():
        nonlcal a  #这里的nonlcal就是调用了上一层的a=20 ,而不是a=10
        print(a)
     pp()      

func()  

 nonlcal和global都是引入外面的内容 ,也同样是修改了外面的内容  

猜你喜欢

转载自www.cnblogs.com/zty1304368100/p/10085483.html
今日推荐