Python第十天

1形参角度

万能参数

*的魔性用法

仅限关键字参数

形参的最终顺序

2名称空间

全局名称空间 局部

加载顺序 取值顺序

作用域

3函数的嵌套

4内置函数 globals   locals

5关键字 nonlocal   global

 

1 形参角度

  万能参数 

  1动态就收的位置参数:*args  约定俗称 

   函数定义时  *代表聚合  他将所有的位置参数聚合成一个元组,

  赋值给了args

  急需要一种形参  可以接受所有的实参

 

def eat(*args):
print('woqingnichi:%s,%s,%s,%s,%s,%s' % (args))

eat('zhengyaogao','zheng','c','d','g','r')

 

#函数计算输入数字的和的功能
def sum1(*args):

sum=0
for i in args:
sum=sum+i

return sum

print(sum1(1,2,3,4,5,6))


  2动态接受的关键字参数 **kwargs
  函数的定义时 **将所有的关键字参数聚合到一个字典中,将这个字典赋值给了kwargs

def func(**kwargs):
print(kwargs)
func(name='sb',age=14,sex='ladyboy')#{'name': 'sb', 'age': 14, 'sex': 'ladyboy'}


形参角度的参数顺序

# def func(*args,a,b,sex='nan'):
# print(a,b)
# func(1,2,3,4)

# def func(a,b,*args,sex='nan'):
# print(a,b)
# print(args)
# print(sex)
# func(1,2,3,4)
# 1 2
# (3, 4)
# nan

# def func(a,b,sex='nan',*args):
# print(a,b)
#
# print(sex)
# print(args)
# func(1,2,3,4)
# #1 2
# 3
# (4,)

这三个中*args参数在位置参数后  关键字参数前  否则结果错误或报错

 

**kwargs必须放在最后

def func(a,b,*args,sex='nan',**kwargs):
print(a,b)
print(args)
print(sex)
print(kwargs)
func(1,2,3,4,name='sb',age=20)
##1 2
(3, 4)
nan
{'name': 'sb', 'age': 20}

形参角度的第四个参数:仅限关键字参数

def func(a,b,*args,sex='nan',c,**kwargs):
print(a,b)
print(args)
print(sex)
print(c)
print(kwargs)
func(1,2,3,4,name='sb',age=20,c='666')

形参角度最终的顺序:位置参数  *args 默认参数  仅限关键字参数  **kwargs

 

*的魔性用法

*在函数调用时  *代表打散 

def func(*args):
print(args)
func([1,2,3],[22,33])
func(*[1,2,3],*[22,33])(1, 2, 3, 22, 33)*代表把列表打散传入动态接受的位置参数中是 形成元组

*放在可迭代对象前面

比较下面这两个函数  结果不同   注意调用时是一个*  还是两个**

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

# func([1,2,3],[22,33])
# func(*[1,2,3],*[22,33])
func({'name':'taibai'},{'age':18})
#执行结果 实参全部传给了*args 并聚合成元组 **kwargs没有实参传入,形成空字典
({'name': 'taibai'}, {'age': 18})
{}

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

# func([1,2,3],[22,33])
# func(*[1,2,3],*[22,33])
func(**{'name':'taibai'},**{'age':18})==func(name='taibai',age='18')
#执行结果 实参全部传给了**kwargs 并聚合成字典 *args 没有实参传入,形成空元组
()
{'name': 'taibai', 'age': 18}

 

*总结:

  在函数定义时  *代表聚合  *args把传入的实参聚合成一个元组  **kwargs把传入的实参聚合成一个字典

在函数调用式  *     **代表打散  *args 代表把传入的可迭代对象打散  最后形成一个元组

  **kwargs代表把传入的实参打散  最后形成一个字典

 

2 名称空间 :命名空间

 

 

 

 内置名称空间:Python源码给你提供的一些内置的函数,如print input

 

python 分为三个空间

  内置名称空间(bulitins.py)

  全局名称空间(当前的py文件)

  局部名称空间(函数  函数执行时才开辟)

名称空间的加载顺序:内置名称空间  全局名称空间   局部名称空间(函数执行时才开辟)

取值顺序(就近原则LEGB):单向不可逆

(从局部开始寻找变量)局部名称空间   局部没有再从全局名称空间   全局没有再从内置名称空间

 

作用域:作用的范围  分为全局作用域  局部作用域

全局作用域:内置名称空间   全局名称空间

局部作用域:局部名称空间

局部作用域可以引用全局作用域的变量  但不能改变全局变量 当Python解释器读取到局部作用域时,发现了你对一个变量进行修改,解释器会认为你在局部已经定义过这个变量了,他就从局部找这个局部变量,就报错了

date='zhouwu'
def func():
print(date)
func() 局部作用域引用全局作用域变量

count=1
def func():
count+=2
print(count)
func() 局部作用域不能改变全局作用域变量 会报错

在函数的嵌套中 内层函数可以引用外层函数的变量 但不能改变外层函数的变量
def func():
count=1
def inner():
print(count)
inner()
func()引用可以

def func():
count=1
def inner():
count+=1
print(count)
inner()
func()改变报错

LEGB: 从内到外顺序 local:l eclose:e global:g bulitin:b

3 函数的嵌套(高阶函数)


# def func1():
# print('in func1')
# print(3)
# def func2():
# print('in func2')
# print(4)
# func1()
# print(1)
# func2()
# print(2)

# def func1():
# print('in func1')
# print(3)
# def func2():
# print('in func2')
# print(4)
# print(1)
# func2()
# print(2)

def func2():
print(2)
def func3():
print(6)
print(4)
func3()
print(8)
print(3)
func2()
print(5)

4内置函数 globals locals
a=1
b=2
def func():
name='sb'
age=73
print(globals())#返回的是字典 字典里面的键值对 :全局作用域的所有内容
print(locals())#返回的是字典 字典里面的键值对:当前作用域的所有内容










 

posted @ 2020-05-03 10:56  daoda  阅读(183)  评论(0)    收藏  举报