函数基础 2------总结

可变长参数

*形参

后约定俗称args,简称为(*args ),作用是会将溢出的位置实参全部接受,然后按照存储 元组 的行式,把元组赋值给*后边的参数。

def fa(*args):

    #retrun *args不能直接返回,会提示语法错误。
    #print(*args)可以直接打印.打印时*可以加也还可以不加。

* 实参

作用是会将*之后的参数循环取出,打散成位置实参,以后只要遇到实参中带有*的,他就是位置实参,应该马上打散成位置实参去看。

def f(x,y,z,*args):
    print(x,y,z,*args)
    
f(1,*(2,3),4,5,6)

#打印结果为:1,2,3,(4,5,6)

注:上述代码块中的*(2,3)是被打散成了位置实参,分给了“y,z”,而*args将实参中剩余的“4,5,6”给集合成一个元组,为(4,5,6)

**形参

形参中的**会将溢出的关键字实参全部接收,然后存储字典的行式,然后把字典赋值给**后的参数,需要注意的是:**后的参数约定俗称为kwargw,即简称为(**kwargw)

def f(**kwargw):
    print(kwargw)   #打印时**不可以加,打印出来的值为字典格式

**实参

实参中的**会将后边参数的值循环取出,打散成关键字实参,哟吼但凡碰到是惨重带**的,他就是关键字实参,应该马上打散成关键字实参去看。

def func(x, y, z, **kwargs):
    print(x, y, z, kwargs)

func(1, 3, 4, **{'a': 1, 'b': 2})

# 输出为:1 3 4 {'a': 1, 'b': 2}

函数的调用

对象:python中一切皆对象(字典,列表,元组,集合,布尔值,所有对象都可以做以下四件事)

1.引用

def f1():
    print('hello')
 
f2 = f1  #如果f1加()会直接引用函数
f1()   # 可以调用函数
f2()   #也可以调用函数

2.作为容器类型

def f1(x,y):
    if x > y:
        return x
    else:
        return y

it = [f1(20,30),40,50,60]

print(it[0])

#输出结果为30,函数可以在列表内做元素来使用,取值的方法与列表取值一至

3.作为函数的实参

def f1():
    return 1010

def f2(f3):
    return f1

print(f2(f1))
print(f1)

#<function f1 at 0x000002434B62AB70>
<function f1 at 0x000002434B62AB70>

当f1做实参的时候运行f2函数,不会去运行函数f1()

4.作为函数的返回值

def f1():
    return 1010

def f2(x):
    return f1()

print(f2(10))     
#输出结果为 1010,当f2运行的时候f1()会作为返回值,来运行f1()函数

函数嵌套

定义:函数内再定义一个函数。

def f1():
    print('hello')
    
    def f2():
        print('nihao')
 内部定义的函数外部不能使用。       

名称空间

名称空间定义

专门用来存储名称的

名称空间的分类

内置名称空间:python解释器自带内置方法(print/len/list......)

全局名称空间:除了内置和局部都叫全局

局部名称空间:函数内部定义的都叫局部

名称空间的执行(生成)顺序

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

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

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

注:定义函数的时候,只检测语法,不执行代码

名称空间的搜索顺序

先从当前位置寻找,找不到再按照顺序寻找,不会逆向寻找

1.在局部:局部 -->> 全局 -->> 内置 -->> 报错

(return返回的值在全局名称空内)

2.在全局:全局 -->> 内置 -->> 报错

全局作用域与局部作用域

1.全局作用域的x 和局部作用域的x 没有半毛钱关系.

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

例1:全局作用域
x = 10
def f1():
    x = 20

f1()
print(x)    #输出结果为 10,因为print(x)实在全局作用域进行的只在全局作用域搜索

例2局部作用域
x = 10
def f1():
    y = 20
    print(x)   #输出结果为 10,搜索路径为:局部-->全局-->内置-->报错

f1()
print(x)   #输出结果为 10,是在全局作用域下搜索的

例3:全局与局部作用域
x = 10
def f1():
    x = 20
    print(1,x)   #输出结果为(1,1=20)

f1()
print(2,x)      #输出结果为(2,10)

例4:返回值后搜索
x = 10
def f1():
    return x

f1()
print(x)     #输出结果为 10

global与nonlocal

global:打破 (全局作用域的x 和局部作用域的x 没有半毛钱关系) 这条规则,会使global以下的部分变成局部作用域.

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

it = [10]

def f1():
    it[0] =11
f1()
print(it)    #输出值为 11

# 所有可变数据类型都可以打破上述一切规则

例1:
def f1(i,it=[]):
    it.append(i)
    print(it)
    
for i in range(10):
   f1(i)

#输出
[0]
[0, 1]
[0, 1, 2]
[0, 1, 2, 3]
[0, 1, 2, 3, 4]
[0, 1, 2, 3, 4, 5]
[0, 1, 2, 3, 4, 5, 6]
[0, 1, 2, 3, 4, 5, 6, 7]
[0, 1, 2, 3, 4, 5, 6, 7, 8]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

注:形参具有描述意义

例2:
def f1(i,it):
    it.append(i)
    print(it)
    
for i in range(10):
   f1(i,[])

#输出
[0]
[1]
[2]
[3]
[4]
[5]
[6]
[7]
[8]
[9]

注:实参具有实际意义

原文地址:https://www.cnblogs.com/whkzm/p/11563047.html