0920 函数参数与定义域

1.可变长参数

*+形参

调用函数时,有多少个位置实参,就接收多少个参数。

  • *args(约定俗成的),用元组接受多余的位置实参。
def f1(*args):
    print(args)
f1()			#空元组
f1(1)			# (1,)
f1(1,2)			# (1,2)
f1(1,2,3,4,5,6,4,7,5,2)		#(1,2,3,4,5,6,4,7,5,2)	

** + 形参

** kwargs 用字典接受多余的关键字实参

def f1(**kwargs):
    print(kwargs)

f1(x=1)  # 空字典

仅做了解

*+实参

打散列表,然后以位置实参传给位置形参

def f1(a, b, c, e, d, f, g):
    print(a, b, c, e, d, f, g)


lt = [1, 2, 3, 4, 5, 6, 7]
# f1(lt[0],lt[1],lt[2],lt[3],lt[4],lt[5],lt[6])
f1(*lt)  # *lt把列表中的元素打散成位置实参依次传给位置形参

**+实参

打散字典,然后以关键字实参传给位置形参

def f1(z, b):
    print(z, b)


dic = {'z': 1, 'b': 2}  # a=1,b=2
f1(**dic)  # **dic把字典打散成关键字实参然后传给函数f1

2.函数对象

python中一切皆对象

s = 10
print(s)
#  10 

1.引用

s1 = s
# 10

2.容器元素

lt = [s]

3.作为函数的实参

def f1(ssadfsadf):
    print(ssadfsadf)
    
f1(s)

4.作为函数的返回值

def f1(s):
    return s

s2 = f1(s)

字典/列表/元组/集合/布尔值,所有对象都可以做以上四件事情

函数对象 == 函数名

函数名+()实在调用函数。

def f1():
    print('from f1')

1.引用

func = f1
print('f1:', f1)
print('func:', func)

func()
#  可以直接调用函数

2.容器元素

lt = [f1, 1, 2, 3]

print('lt[0]', lt[0])
print('f1', f1)

lt[0]()
#  此时 lt[0] 既是 f1函数

3.作为函数的实参

def f1():
    print('from f1')

def f2(s):
    print('s',s)
    s()
    # s就是f1 函数 所以可以直接调用
f2(f1)
# f1 做了f2的实参

print('f1', f1)

4.作为函数的返回值

def f1():
    print('from f1')
    
def f2(f2_f1):
    return f2_f1

res = f2(f1)


print('res', res)
print('f1', f1)
res()

3.函数嵌套

函数里面有函数

函数内部定义的函数,外部不能用。

def f1():
    print('from f1')

    def f2():
        print('from f2')
        
    return f2

res = f1()
print(res)
res()
'''
from f1
<function f1.<locals>.f2 at 0x000002451C9BCBF8>
from f2
'''

4.名称空间与定义域

名称空间

存储了内置方法的名称

python解释器自带内置方法(print/len/list/str/dict

局部名称空间

函数内部定义的都叫局部

def f1():
    x = 10
#  x 就是局部

全局名称空间

除了内置和局部都叫全局

def f1():
    x = 10
    def f2():
        z = 20
y = 10
lt = [1, 2, 3]
# f1  y  lt 都是全局

名称空间的执行顺序

1.内置名称空间:python解释器启动时就有了

2.全局名称空间:执行文件代码的时候才会有全局

3.局部名称空间:函数调用的时候才会有局部

搜索顺序

先从当前所在位置寻找 ,找不到再按照 局部 =》全局=》内置 =》

作用域

全局作用域

内置名称空间 + 全局名称空间 ==》全局作用域

#  全局作用域的变量与局部作用域的变量没有任何关系
def f1():
    y = 2
    print(1, y)   # 1 2

y = 10
f1()
print(2, y)		#  2 10

print(y)		# 10
'''
'''

局部作用域

局部作用域1的x和局部作用域2 的x没有任何关系
即使局部作用域1和局部作用域2再同一个局部作用域下

def f1():
    def f2():
        def f3():
            x = 1
            print(x)
        x = 2
        f3()
        
    f2()
f1()

# 结果为1

仅做了解

global

可以修改全局作用域中的变量,让global以下的局部的x变成全局的x

x = 10

def f1():
    global x  # 让global以下的局部的x变成全局的x
    x = 20

f1()
print(x)
#  20

nonlocal

nonlocal让x成为顶层函数的局部,不是让他成为全局

压根没有应用情景,尽量不要嵌套函数

x = 10

def f1():
    def f2():
        def f3():
            nonlocal x  # nonlocal让x成为顶层函数的局部,不是让他成为全局  # 压根没有应用情景,尽量不要嵌套函数
            x = 1
        x = 2
        f3()
        print(1, x)      # 1  1
        
	f2()
def f0():
    x  = 3  # f1的nonlocal无法修改
    f1()
f1()
print(2, x)			# 2  10

可变数据类型均可打破以上规则

lt = [10,11]
def f1():
    lt[0] = 22
f1()
print(lt)
#  输出结果为 [22, 11]

posted @ 2019-09-21 14:43  fwzzz  阅读(252)  评论(0编辑  收藏  举报