Python从零单排系列(三)---Python函数

调用、定义Python函数

Posted by Movesan on February 27, 2017 -  Views

Python从零单排系列(一)—初识Python
Python从零单排系列(二)—Python基础
Python从零单排系列(四)—面向对象编程
Python从零单排系列(五)—模块化以及相关库
Python从零单排系列(六)—异常处理
Python从零单排系列(七)—函数式编程
Python从零单排系列(八)—Python高级特性


引言

每种语言都会接触到关于函数的概念,在Java中,将函数叫做方法。函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。它能提高应用的模块性,和代码的重复利用率。

函数也是相当于程序骨骼的作用了,下面来了解下Python中函数的用法。


函数的定义

定义一个函数的语法如下:

1
2
3
def functionname( parameter1, parameter2, parameterN, ... ):
   function_suite
   return [expression]

其中规则如下:

  • 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号()
  • 任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数,参数可有可无
  • 函数内容以冒号起始,并且缩进
  • return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None

下面为一个简单的Python函数实例,将字符串打印输出:

1
2
def printStr( str ):
   print str

与Java方法不同的是,Python中可以返回多个值,其实就是一个tuple,只是写法上可以省略:

1
2
3
4
def square(a, b):
    a = a * a
    b = b * b
    return a,b

函数的调用

函数定义完后,就可以在其他地方调用执行:

1
2
3
str = "Hello Python"

printStr(str)

以上实例输出结果:

1
Hello Python

调用square()函数返回多值:

1
2
3
4
5
a = 3
b = 4

x,y = square(3, 4)
print x,y

输出结果为:

1
9 16

参数传递

与Java相比,Python函数有个特点就是有很多参数传递形式。Python中的函数参数类型分为以下几种类型:

  • 必选参数
  • 默认参数
  • 不定长参数
  • 关键字参数

必选参数

必选参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样。 调用printStr()函数,你必须传入一个参数,不然会出现语法错误:

1
2
#调用printStr函数
printStr()

以上实例输出结果:

1
2
3
4
Traceback (most recent call last):
  File "test.py", line 11, in <module>
    printStr();
TypeError: printStr() takes exactly 1 argument (0 given)

默认参数

调用函数时,缺省参数的值如果没有传入,则被认为是默认值。下例会打印默认的age,如果age没有被传入:

1
2
3
4
5
6
7
8
9
#可写函数说明
def printinfo( name, age = 35 ):
   print "Name: ", name
   print "Age ", age
   return

#调用printinfo函数
printinfo( "miki", 50 )
printinfo( "miki" )

以上实例输出结果:

1
2
3
4
Name:  miki
Age  50
Name:  miki
Age  35

不定长参数

你可能需要一个函数能处理比当初声明时更多的参数。这些参数叫做不定长参数,和上述2种参数不同,声明时不会命名。基本语法如下:

1
2
3
def functionname([formal_args,] *var_args_tuple ):
   function_suite
   return [expression]

加了星号(*)的变量名会存放所有未命名的变量参数。选择不多传参数也可。如下实例:

1
2
3
4
5
6
7
8
9
10
11
12
# 可写函数说明
def printinfo( arg1, *vartuple ):
   "打印任何传入的参数"
   print "输出: "
   print arg1
   for var in vartuple:
      print var
   return

# 调用printinfo 函数
printinfo( 10 )
printinfo( 70, 60, 50 )

以上实例输出结果:

1
2
3
4
5
6
输出:
10
输出:
70
60
50

关键字参数

关键字参数和函数调用关系紧密,函数调用使用关键字参数来确定传入的参数值。

使用关键字参数允许函数调用时参数的顺序与声明时不一致,因为 Python 解释器能够用参数名匹配参数值。

下例能将关键字参数顺序不重要展示得更清楚:

1
2
3
4
5
6
7
8
#可写函数说明
def printinfo( name, age ):
   print "Name: ", name
   print "Age ", age
   return

#调用printinfo函数
printinfo( age=50, name="miki" )

以上实例输出结果:

1
2
Name:  miki
Age  50

另一种形式的关键字参数:

1
2
3
4
5
6
def func(**dict):
    print type(dict)
    print dict

func(a=1,b=9)
func(m=2,n=1,c=11)

dict是一个字典,收集所有的关键字,传递给函数func。为了提醒Python,参数dict是包裹关键字传递所用的字典,在dict前加 * *。

参数组合

在Python中定义函数,可以用必选参数、默认参数、可变参数和关键字参数,这4种参数都可以一起使用,或者只用其中某些,但是请注意,参数定义的顺序必须是:必选参数、默认参数、可变参数和关键字参数。

比如定义一个函数,包含上述4种参数:

1
2
def func(a, b, c=0, *args, **kw):
    print 'a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw

在函数调用的时候,Python解释器自动按照参数位置和参数名把对应的参数传进去。

1
2
3
4
5
6
7
8
>>> func(1, 2)
a = 1 b = 2 c = 0 args = () kw = {}
>>> func(1, 2, c=3)
a = 1 b = 2 c = 3 args = () kw = {}
>>> func(1, 2, 3, 'a', 'b')
a = 1 b = 2 c = 3 args = ('a', 'b') kw = {}
>>> func(1, 2, 3, 'a', 'b', x=99)
a = 1 b = 2 c = 3 args = ('a', 'b') kw = {'x': 99}

最神奇的是通过一个tuple和dict,你也可以调用该函数:

1
2
3
4
>>> args = (1, 2, 3, 4)
>>> kw = {'x': 99}
>>> func(*args, **kw)
a = 1 b = 2 c = 3 args = (4,) kw = {'x': 99}

所以,对于任意函数,都可以通过类似func(*args, **kw)的形式调用它,无论它的参数是如何定义的。


内置函数

Python内置了很多有用的函数,我们可以直接调用。可直接从Python的官方网站查看文档:

https://docs.python.org/2/library/functions.html

也可以在交互式命令行通过help(functionname)查看具体函数的帮助信息。


要下班了?扫一扫,地铁上阅读 :)

生活只有眼前的苟且,哪有诗和远方 :(