我可以: 邀请好友来看>>
ZOL星空(中国) > 技术星空(中国) > C/C++星空(中国) > 从C#到Python —— 3 函数及函数编程
返回列表
签到
手机签到经验翻倍!
快来扫一扫!

从C#到Python —— 3 函数及函数编程

171浏览 / 1回复

wiki

wiki

0
精华
15
帖子

等  级:Lv.5
经  验:4170
  • Z金豆: 0

    千万礼品等你来兑哦~快点击这里兑换吧~

  • 城  市:陕西
  • 注  册:2008-07-07
  • 登  录:2015-06-01
发表于 2010-03-30 17:57:53
电梯直达 确定
楼主

在C#中没有独立的函数存在,只有类的(动态或静态)方法这一概念,它指的是类中用于执行计算或其它行为的成员。在Python中,你可以使用类似C#的方式定义类的动态或静态成员方法,因为它与C#一样支持完全的面向对象编程。你也可以用过程式编程的方式来编写Python程序,这时Python中的函数与类可以没有任何关系,类似C语言定义和使用函数的方式。此外,Python还支持函数式编程,虽然它对函数式编程的支持不如LISP等语言那样完备,但适当使用还是可以提高我们工作的效率。

本章主要介绍在过程编程模式下Python中函数的定义和使用方法,关于在面向对象编程中如何使用函数,我们将在下一章再讨论。此外,我还会简要介绍Python中的函数编程功能。

3.1  函数的定义

函数定义是最基本的行为抽象代码,也是软件复用最初级的方式。Python中函数的定义语句由def关键字、函数名、括号、参数(可选)及冒号:组成。下面是几个简单的函数定义语句:

 1 # -*- coding: utf-8 -*-
2 #定义没有参数、也没有返回值的函数
3  def F1():
4 print 'hello kitty!'
5  #定义有参数和一个返回值的函数
6  def F2(x,y):
7 a = x + y
8 return a
9  #定义有多个返回值的函数,用逗号分割不同的返回值,返回结果是一个元组
10  def F3(x,y):
11 a = x/y
12 b = x%y
13 return a,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#相比,最大的两个区别是支持关键字参数和字典参数。

 

3.29更新:根据JeffreyZhao提示,C# 4.0 已经支持命名参数(即关键字参数)和可选参数(即参数默认值),详情可见生鱼片blog上的:《C#4.0新特性:可选参数,命名参数,Dynamic》。在此向两位致谢。

 

3.2.2  关键字参数

关键字参数可以使我们调用含有很多参数、同时一些参数具有默认值的Python函数变得更简单,也是Python实现函数重载的一种重要手段(到类与对象部分再详细说这个问题)。下面的例子说明了如何定义和调用含关键字参数的函数(引自Guido van Rossum《Python入门》,包括后面的几个例子):

1 def parrot(voltage, state='a stiff', action='voom', type='Norwegian Blue'):
2 print "-- This parrot wouldn't", action,
3 print "if you put", voltage, "Volts through it."
4 print "-- Lovely plumage, the", type
5 print "-- It's", state, "!"


可以用如下几种方式调用:

1 parrot(1000)                        # 缺省值
2  parrot(action = 'VOOOOOM', voltage = 1000000) # 关键字,缺省值,次序可变
3  parrot('a thousand', state = 'pushing up the daisies')# 位置参数,缺省值,关键字
4  parrot('a million', 'bereft of life', 'jump') # 位置参数,缺省值


但以下几种调用方式是错误的:

1 parrot()                     # 非缺省的参数没有提供
2  parrot(voltage=5.0, 'dead') # 关键字参数后面又出现了非关键字参数
3  parrot(110, voltage=220) # 参数值重复提供
4  parrot(actor='John Cleese') # 未知关键字

3.2.3  字典参数

如果形参表中有一个形为**name的形参,在调用时这个形参可以接收一个字典,字典中包含所有不与任何形参匹配的关键字参数。例如下面的函数:

1 def cheeseshop(**keywords):
2 for kw in keywords.keys(): print kw, ':', keywords[kw]


就可以象下面这样调用:

1 cheeseshop(client='John Cleese',
2 shopkeeper='Michael Palin',
3 sketch='Cheese Shop Sketch')


结果显示:

client : John Cleese
shopkeeper : Michael Palin
sketch : Cheese Shop Sketch

3.2.4   函数参数调用的顺序

调用Python函数时,参数书写的顺序分别为:非关键字参数,关键字参数,元组参数,字典参数。请记住以下几点规则:

    * 通过位置分配非关键字参数
    * 通过匹配变量名分配关键字参数
    * 其他额外的非关键字参数分配到*name元组中
    * 其他额外的关键字参数分配到**name的字典中
    * 用默认值分配给在调用时未得到分配的参数

一般说来,实参表中非关键字参数在前,关键字参数在后,关键字名字必须是形参名字。形参有没有缺省值都可以用关键字参数的形式调用。每一形参至多只能对应一个实参,因此,已经由位置参数传入值的形参就不能在同一调用中再作为关键字参数。

总之,由于Python的函数参数定义和调用方式太灵活了,所以一开始容易把人搞晕。不过可以慢慢来,你会越来越发现Python的简便所在。


wiki

wiki


精华

帖子

等  级:Lv.5
经  验:4170
发表于 2010-03-30 17:57:57 1楼

您的内容正在火速审核中,请稍等

高级模式
星空(中国)精选大家都在看24小时热帖7天热帖大家都在问最新回答

针对ZOL星空(中国)您有任何使用问题和建议 您可以 联系星空(中国)管理员查看帮助  或  给我提意见

快捷回复 APP下载 返回列表