在C#中没有独立的函数存在,只有类的(动态或静态)方法这一概念,它指的是类中用于执行计算或其它行为的成员。在Python中,你可以使用类似C#的方式定义类的动态或静态成员方法,因为它与C#一样支持完全的面向对象编程。你也可以用过程式编程的方式来编写Python程序,这时Python中的函数与类可以没有任何关系,类似C语言定义和使用函数的方式。此外,Python还支持函数式编程,虽然它对函数式编程的支持不如LISP等语言那样完备,但适当使用还是可以提高我们工作的效率。
本章主要介绍在过程编程模式下Python中函数的定义和使用方法,关于在面向对象编程中如何使用函数,我们将在下一章再讨论。此外,我还会简要介绍Python中的函数编程功能。
3.1 函数的定义
函数定义是最基本的行为抽象代码,也是软件复用最初级的方式。Python中函数的定义语句由def关键字、函数名、括号、参数(可选)及冒号:组成。下面是几个简单的函数定义语句:
1 #-*- coding: utf-8 -*-2 #定义没有参数、也没有返回值的函数3 defF1():4 print'hello kitty!'5 #定义有参数和一个返回值的函数6 defF2(x,y):7 a=x+y8 returna9 #定义有多个返回值的函数,用逗号分割不同的返回值,返回结果是一个元组10 defF3(x,y):11 a=x/y12 b=x%y13 returna,b
可能你已经注意到了,Python定义函数的时候并没有约束参数的类型,它以最简单的形式支持了泛型编程。你可以输入任意类型的数据作为参数,只要这些类型支持函数内部的操作(当然必要时需要在函数内部做一些类型判断、异常处理之类的工作)。
3.2 函数的参数
3.2.1 C#与Python在函数参数定义方面的差别
C#中方法的参数有四种类型:
(1) 值参数不含任何修饰符
(2) 引用型参数以ref 修饰符声明(Python中没有对应的定义方式)
(3) 输出参数以out 修饰符声明(Python中不需要,因为函数可以有多个返回值)
(4) 数组型参数以params 修饰符声明
Python中函数参数的形式也有四种类型:
(1) f(arg1,arg2,...) 这是最常用的函数定义方式
(2) f(arg1=value1,arg2=value2,...,argN=valueN) 这种方式为参数提供了默认值,同时在调用函数时参数顺序可以变化,也称为关键字参数。
(3) f(*arg) arg代表了一个tuple,类似C#中的params修饰符作用,可以接受多个参数
(4) f(**arg) 传入的参数在函数内部是保存在名称为arg的dict中,调用的时候需要使用如f(a1=v1,a2=v2)的形式。
可以看出,Python函数参数定义与C#相比,最大的两个区别是支持关键字参数和字典参数。