函数

Posted hj59988326

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了函数相关的知识,希望对你有一定的参考价值。

函数基础(二)

可变长参数

指的是在调用函数时,传入的参数个数可以不固定

调用函数时,传值的方式无非两种,一种是位置实参,另一种是关键实参,因此形参也必须得有两种解决方法,以此来分别就收溢出的位置实参与关键字实参

可变长形参之*

def sum_self(*args):
    res = 0
    for num in args:
        res +=num
    return
res = sum_self(1,2,3,4)
print(res)


 # 形参中的*会将溢出的位置实参全部接收,然后存储元组的形式,然后把元组赋值给*后的参数。需要注意的是:*后的参数名约定俗成为args。

可变长实参之*

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


func(1, *(1, 2), 3, 4)  #  1,1,2,3,4


 # 实参中的*,*会将*后参数的值循环取出,打散成位置实参。以后但凡碰到实参中带*的,它就是位置实参,应该马上打散成位置实参去看。

可边长形参之**

def func(**kwargw):
    print(kwargw)


func(a=5)

 # 形参中的**会将溢出的关键字实参全部接收,然后存储字典的形式,然后把字典赋值给**后的参数。需要注意的是:**后的参数名约定俗成为kwargs。

可变长实参之**

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


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

函数对象

python中一切皆为对象

一:引用

s = 10

s1 = s

二:容器元素

s = 10

lt = [s]

三:作为函数的实参

s = 10

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

四:作为函数的返回值

def f1():
    return s
s2=f1(s)

函数的套用

一:函数的嵌套定义

函数内部定义的函数,无法在函数外部使用内部定义的函数。

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


f2()  
 # NameError: name 'f2' is not defined
 # 函数内部定义的函数,无法在函数外部使用内部定义的函数。

二:函数的嵌套调用

def s1(x,y):
    if x > y:
        print(x)
    else:
        print(y)
        
def s2(a,b,c,d)
    a1 = s1(a,b)
    a2 = s1(c,d)
    return s1(a1,a2)

a3=(1,2,3,4)
print(a3)

名称空间和作用域

名称空间

就是在内存中有一块内存存储变量名与变量间的绑定关系的空间,而这个空间称为名称空间

一:内置名称空间

内置名称空间:存放Pyhton解释器自带的名字,如int、float、len

生命周期:在解释器启动时生效,在解释器关闭时失效

二:全局名称空间

全局名称空间:除了内置和局部的名字之外,其余都存放在全局名称空间,如下面代码中的x、func、l、z

生命周期:在文件执行时生效,在文件执行结束后失效

x = 1


def func():
    pass


l = [1, 2]

if 3 > 2:
    if 4 > 3:
        z = 3

三:局部名称空间

局部名称空间:用于存放函数调用期间函数体产生的名字,如下面代码的f2

生命周期:在文件执行时函数调用期间时生效,在函数执行结束后失效

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

f1() 

四:加载顺序

五:查找顺序

作用域

域指的是区域,作用域即作用的区域。

一:全局作用域

全局有效,全局存活,包含内置名称空间和全局名称空间。

# 全局作用域
x = 1


def bar():
    print(x)


bar()
 # 1

二:局部作用域

局部作用域:局部有小,临时存储,只包含局部名称空间。

# 局部作用域
def f1():
    def f2():
        def f3():
            print(x)
        x = 2
        f3()
    f2()


f1()

 # 2

三:注意点

需要注意的是:作用域关系在函数定义阶段就固定死了,与函数的调用无关。

# 作用域注意点
x = 1


def f1():  # 定义阶段x=1
    print(x)


def f2():
    x = 2
    f1()


f2()

 # 1

补充知识点

一:global关键字

x = 10

def f1():
    gloabl x         #  global x , 修改全局
    x = 20
    
f1()
print(x)

 # 20  
 # 修改全局作用域中的变量。

二:nonlocal

x = 1


def f1():
    x = 2

    def f2():
        #         nonlocal x
        x = 3

    f2()
    print(x)


f1()
 # 2
 # 修改局部作用域中的变量。  

三:注意点

  1. 在局部想要修改全局的可变类型,不需要任何声明,可以直接修改。
  2. 在局部如果想要修改全局的不可变类型,需要借助global声明,声明为全局的变量,即可直接修改。

以上是关于函数的主要内容,如果未能解决你的问题,请参考以下文章

测开之函数进阶篇・第五篇《递归函数纯函数匿名函数偏函数》

8InfluxDB常用函数聚合函数,count()函数,DISTINCT()函数,MEAN()函数,MEDIAN()函数,SPREAD()函数,SUM()函数

Kotlin函数式编程 ② ( 过滤函数 | predicate 谓词函数 | filter 过滤函数 | 合并函数 | zip 函数 | folder 函数 | 函数式编程意义 )

Kotlin函数式编程 ② ( 过滤函数 | predicate 谓词函数 | filter 过滤函数 | 合并函数 | zip 函数 | folder 函数 | 函数式编程意义 )

1.19.9.函数概览函数引用精确函数引用模糊函数引用函数解析顺序精确函数引用模糊函数引用自定义函数准备工作概述开发指南函数类求值方法标量函数表值函数聚合函数

Kotlin函数式编程 ① ( 函数式编程简介 | 高阶函数 | 函数类别 | Transform 变换函数 | 过滤函数 | 合并函数 | map 变换函数 | flatMap 变换函数 )