……
目录:
一;格式
二;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全局变量,可以带回在函数内部进行各种操作后的变量,有指针那味了。