Python3学习笔记:函数

函数结构

先来看个例子,

if __name__ == '__main__':
    def compare(a,b):
        if a>b:
            print("a>b")
        elif a==b:
            print("a==b")
        else:
            print("a

输出如下:

ab
a>b
a==b

其中 compare为自定义函数,它有两个传参,该方法用于比较输入数据的大小。

Python变量没有声明类型,因此函数的传参和返回值,也没有声明类型。

函数格式为,

    def functionName(param1,param2,...):
        action1
        action2
        ...

注意,“:”不能丢。

函数返回值

Return语句,用于表示跳出函数,之后语句不再执行,或可用于返回结果。函数若无返回,返回默认值none。例如

    c=add(1,2)
    print("c=",c)
    c=compare(0,0)
    print("c=",c)
    
    def func1(a,b):
        print("a=",a)
        return
        print("b=",b)
    func1(2,6)

相应输出为

c= 3
a==b
c= None
a= 2

传值or传址

Python函数的传参,到底是传值呢?还是传址呢?

例1,

    x=1
    print("x=",x)
    def func2(m):
        m=2
    func2(x)
    print("x=",x)

相应输出为

x= 1
x= 1

例2,

    a=[1,2,3]
    print("a=",a)
    def func3(m):
        m.append("123")
    func3(a)
    print("a=",a)

相应输出为

a= [1, 2, 3]
a= [1, 2, 3, '123']

可见,例1为传值,例2为传址。那什么时候传值,什么时候传址呢?

不可变更对象or可变更对象

Python中的对象没有类型,因此,可以将对象看作一个指针对象,该指针对象指向的内容是什么类型,该对象就是什么类型。

Python中的某些类型,值一旦给定就无法修改。若要修改,只能重新创建新的对象。这些类型包括:数字,字符串和元组。除此之外,其它类型都可以在初始化后,对值进行修改。

其实,所有Python函数都可看作是传址。

例如例1,在调用func2时,x将对象地址,复制给m。因为2是数字,为不可变更对象,只能创建一个内容为2的整型对象,将该整型对象的地址赋值给m。func2结束,m的生命周期也结束,因此,x的值没有发生变化。

而例2则不同,在调用func3时,a同样将地址复制给m。由于为队列,是可变更对象,未创建新对象,因此在原有队列基础上append。func3结束时,虽然m的生命周期也结束了,但原地址对应的内容发生变化,所以a的值发生了变化。

再来看个例子,例3

    def func4(m):
        m=[4,9,0]
    b=[12,4,6]
    print("b=",b)
    func4(b)
    print("b=",b)

输出值为

b= [12, 4, 6]
b= [12, 4, 6]

b也是可变更对象,为什么在掉func4后,无任何变化?原因在于,func4中,又创建了一个可变更对象(列表),将其赋值给m,该地址并未返回,因此随m的消亡而消亡,所以b无任何变化。

那么,我们对例3进行修改,

    def func4(m):
        m=[4,9,0]
        return m
    b=[12,4,6]
    print("b=",b)
    b=func4(b)
    print("b=",b)

输出值为

b2= [12, 4, 6]
b2= [4, 9, 0]

区别仅在于"return"

传参类型

传参有多种类型:必须参数,关键字参数,默认参数,变长参数。

必须参数

    def func5(m):
        m+=1
        return m

例如func5中的参数,就是必须填写的,为必须参数。若,直接调用func5()将报错。

默认参数

若对func5中的m,添加默认值,即

    def func5(m=0):
        print("m=",m)
    func5()
    func5(10)

则直接调用func5()时,将使用默认值进行输入,不会报错。此情况为默认参数。

关键字参数

若在func5中,添加参数x,y,即

    def func5(x,y,m=0):
        print("m=",m)
        print("x=",x)
        print("y=",y)
    func5(x=1,m=6,y=2)
    func5(y=4,x=3)

相应输出为

m= 6
x= 1
y= 2
m= 0
x= 3
y= 4

可以使用关键字,来标示输入数据所对应的参数,不必拘泥于参数的顺序。

这里需要指出的是,默认参数之后,只能是默认参数,不能再次出现非默认参数。错误的定义方式如下,

    def func5(m=0,x,y):
        print("m=",m)
        print("x=",x)
        print("y=",y)

这一点与vb.net一致。

变长参数

Python同样支持变长参数,例如,

    def func6(a, *list):
        print("a=",a)
        for b in list:
            print(b)
    func6(1,2,3,4,5)
    func6(10,11)

相应输出为

a= 1
2
3
4
5
a= 10
11

变量作用域

在Python中,func内定义变量a,与func外定义的变量a并不冲突,前者作用域为func内,后者则是func外部。

对于变量的查找顺序,Python会遵循,局部(闭包内)->闭包外->全局->内置,的查找顺序。

你可能感兴趣的:(人工智能,Python3,Python3)