0
点赞
收藏
分享

微信扫一扫

python学习笔记——函数

陆公子521 2022-11-15 阅读 151

……

目录:

一;格式

二;lambda匿名表达式

三;位置参数和关键字参数

四;默认值参数

五;print()函数参数

六;全局变量global

……

python的函数和c语言的函数用法基本上差不多。

当然,也有些微的差别。

……

一;格式

pyhon用def作为自定义函数的关键词,并且不需要像c语言那样申明返回的类型,一个def就搞定了。

比如:

def f(x,y,z):

    return x+y+z

print(f(1,2,3))

会输出:

6

这是一个简单的三个数相加的函数,基本上自定义函数的格式就是这样。

def相当于c语言中的申明返回类型(只不过在python中,无论返回什么类型,都是用def而已),而f相当于c语言中的函数名,而f中的x,y,z则是形参,后面的冒号是python特有的语法规则,而return和c语言一样可以返回值回到主程序。

……

……

二;lambda匿名表达式

lambda可以创建一个匿名函数。

有什么用呢?

好像匿名函数还挺适合用来编写一些简单的函数的。

比如这样:

f=lambda x,y,z:x+y+z

print(f(1,2,3))

同样会输出:

6

这个函数和def那个函数是一样的,只不过看起来更加简洁了。匿名函数的格式基本上是lambda 形参:表达式。然后呢,匿名函数会自动返回表达式的值,比如上面这个例子,就返回了表达式的值是6。

……

……

三;位置参数和关键字参数

调用函数传参是一个很重要的过程,而python在这方面要比c更加灵活。

def f(x,y,z):

    return x+y+z

print(f(1,2,3))

上面这个函数,就是利用位置参数进行传参。f(1,2,3),其中的1对应的是函数中的x,而2对应的是函数中的y,3对应的是函数中的z。这种一一对应的关系,就是位置参数。

但是,还有另外一种传参的方式,也就是关键字传参。

比如这样写:

def f(x,y,z):

    print('x=%d,y=%d,z=%d'%(x,y,z))

f(z=3,y=2,x=1)

会输出:

x=1,y=2,z=3

虽然这一次输入的实参顺序和之前的不一样,但却用关键字来限定了实参所对应的形参,所以f(z=3,y=2,x=1)和f(1,2,3)其实是一样的,没什么区别。

这就是python的相对灵活的地方。

最后,其实位置参数和关键字参数可以混着用,但我觉得没必要,那样搞反而复杂了,所以就不多说了。

……

……

四;默认值参数

可以给形参指定一个默认的参数值。

比如:

def f(x,y,z=100):

    return x+y+z

print(f(1,2))

会输出:

103

这是因为我指定了z=100,所以只需要输入x和y的值,就可以顺利的执行函数了。

不过,只能指定最后一个或者最后几个形参。

错误的指定默认值参数:f(x,y=100,z)或者f(x=100,y,z)

正确的指定默认值参数:f(x,y,z=100)、f(x,y=100,z=100)。

……

……

五;不定长数目参数

可以用*或**来表达不定长数目参数。

*接收的是列表,而**接收的是字典。

比如:

def f(x,*y):

    print(x)

    print(y)

f(1,2,3)

会输出:

1

(2, 3)

可以看到,函数只有两个形参,而输入的却有三个实参。不过y前面加上了以一个*,也就是*y,这表示多余的输入都会被放入一个元祖中。就像这个例子,1被存到了x中,然后还有2和3则是被放到了y这个元祖中。

再举一个字典的例子,比如:

def f(x,**y):

    print(x)

    print(y)

f(1,dog=1,cat=2,horse=3)

会输出:

1

{'dog': 1, 'cat': 2, 'horse': 3}

可以看到,1输入成了x,而后面的数则成为了y中的字典。

刚开始看到的时候,我还以为是c中的指针呢,结果和指针并不是一个东西,区别来看待就好了。

……

……

五;print()函数参数

可以用sep和end来控制print输出的格式。

比如这样一个函数:

x,y,z=1,2,3

print(x,y,z)

print(x,y,z,end='\n\n')

print(x,y,z,sep=',')

会输出:

1 2 3

1 2 3

1,2,3

可以看到,第一行输出是print(x,y,z)的输出结果,其实就是正常的输出,而第二行输出则是加入了end=’\n\n’,这代表着输出结束后,要使用两个空行符号。而最后一行的输出有逗号,则是因为sep可以自定义输出的分割符。

……

……

六;全局变量global

全局变量是个很好用的东西,它能做到和c语言中的指针类似的功能,比如,从函数中返回多个数。(注意,不是用return返回的,而是定义了global 这个全局变量)

 比如这样一段代码:

def f(a,b):

    global x,y

    x=x+1

    y=y+1

    return x+y

x,y=1,2

result=f(x,y)

print(x,y)

print(result)

会输出:

2 3

5

如果没有定义全局变量的话,那么函数中的x和y与主程序中的x,y是没有任何关系的,所以会输出1和2。但由于在函数内定义了global,所以就可以输出加1后的x和y。

我又查了一下x和y的代码。

用这样一段代码:

def f(a,b):

    global x,y

    print(id(x), id(y))

    x=x+1

    y=y+1

x,y=1,2

m,n=1,2

print(id(x),id(y))

f(x,y)

print(id(x),id(y))

上面的代码用id()函数分别输出了地址,可以看到输出这样的结果:

1520792332592 1520792332624

1520792332592 1520792332624

1520792332624 1520792332656

会发现前面两行的地址是一样的,说明在定义了全局变量后,函数内部x和y便指向了1和2,而当x和y进行加1操作并且跳出函数后,带回了+1后的x和y,所以最后一个x和y的id才会和前面两个不一样。

这说明,用global全局变量,可以带回在函数内部进行各种操作后的变量,有指针那味了。

举报

相关推荐

0 条评论