def func1():
name = "nezha"
def func2():
print("inner") # 内层函数,对外层函数的变量(非全局变量)的引用,叫闭包,这里没有闭包
data = {"action":func2}
print(func2.__closure__) # None
return data # 外层函数有返回对内层函数的引用,在外层函数结束,外层函数就不会在内存消失

#
func1()['action']()
print(func1) # <function func1 at 0x00000217ECBD8B70>


在函数的形参中,有默认参数,并且默认参数的数据类型为 容器类数据类型时 ,在函数的调用过程中,如果使用默认值 ,那们始终使用默认值 创建的那一个 同一个对象




nonlocal : 仅用于父子函数,这里的父子是指函数定义时,这的嵌套关系。而不指,两个分开定义的函数,嵌套调用关系:
def func1():
    flag_l = True
    func2()              # 这里仅是嵌套调用,func1 与 func2 并不是父子函数
    print(flag_l)

def func2():
    flag_l = False
    print(flag_g)
    return flag_l
func1()

下面是父子函数的举例:
def func1():
x = 5
def func2():
y = 10
print(x + y) # 15
func2()
print(x) # 5
func1()


def func1():
x = 5
def func2():
y = 10
x = 20 #本地局部变量
print(x + y) # 30
func2()
print(x) # 5
func1()

def func1():
x = 5
def func2():
y = 10
nonlocal x # 声明使用父级函数变量(非全局变量)
x = 22
print(x + y)
func2()
print(x)
func1()
 

 



shoppingCart = {} # global 用来声明 整型 与 字符串类型 ,对于可变数据类型,比如列表,函数可以直接修改



* 打散 用法
lis = [1,3,5,7]
print(*lis)  # 1 3 5 7

 






def min_max(*args): # 定义函数时,加星号 是聚合的作用,一颗星,聚合实参中的所有位置参数,为元组
max1 = max(*args) # 函数调用时,加星号,是打散的作用,一颗星,把对象打散成实参的位置参数,二颗星,是打散成 关键字参数
min1 = min(*args)
return {'max':max1,'min':min1}
print(min_max(11,23,18))

print("分隔线".center(100,'&'))
def min_max(*args):
max1 = max(args) # max(),min()函数,参数支持可迭代对象
min1 = min(args)
return {'max':max1,'min':min1}
print(min_max(11,23,18))

函数中的形参是 默认参数 时的陷井:
5.2,下面代码打印的结果分别是_________,________,________.
def extendList(val,list=[]):
    list.append(val)
    return list
'''
def calc(a,b,c,d=1,e=2):
    return (a+b)*(c-d)+e
print(calc(1,2,3,4,5)) # 2
# print(calc(1,2)) # 报错,位置参数,必须传参数,且一一对应
print(calc(e=4,c=5,a=2,b=3))  # 24 实参 关键字参数,没有顺序
print(calc(1,2,3))   # 8 实参的位置参数,必须一一对应,
print(calc(1,2,3,e=4))  # 10 # 形参的默认参数,实参没有传参,则采用默认值,否则覆盖
#print(calc(1,2,3,d=5,4)) # 报错,实参 混合传参,关键字参数,必须在位置参数之后
'''
5.2,下面代码打印的结果分别是_________,________,________.
def extendList(val,list=[]):
    list.append(val)
    return list
list1 = extendList(10)
list2 = extendList(123,[])
list3 = extendList('a')

print('list1=%s'%list1)
print('list2=%s'%list2)
print('list3=%s'%list3)
'''
def extendList(val,list=[]):
    list.append(val)
    return list
list1 = extendList(10)  #
list2 = extendList(123,[])
list3 = extendList('a')
list4 = extendList(456,[])
print('list1=%s' %list1) # [10,'a] 
print("list2=%s" % list2) # [123]
print("list3=%s" %list3) # [10,'a']
print("list4=%s" %list4) # [456]
 当默认参数是 可变数据类型时, 如果默认参数,在函数调用时 实参 传参 不覆盖默认值,则凡是采用默认参数 默认值的调用,共有一个对象;
但是,如实参传参,覆盖,那怕值一样,在函数执行时,创建新的对象

 



posted on 2018-08-17 19:57  yellwonfin  阅读(190)  评论(0)    收藏  举报