Chinaunix首页 | 论坛 | 博客
  • 博客访问: 828018
  • 博文数量: 91
  • 博客积分: 2544
  • 博客等级: 少校
  • 技术积分: 1885
  • 用 户 组: 普通用户
  • 注册时间: 2006-12-12 09:08
文章存档

2016年(10)

2014年(2)

2013年(4)

2012年(23)

2011年(23)

2010年(13)

2009年(14)

2007年(2)

分类: Python/Ruby

2012-02-29 21:51:15

python基础(3)-函数
 
1, 函数的特性
(1)在python中没有返回值的函数,返回的是none
(2)python中函数可以返回一个值会对象,例如: return 'a',123,[4,5]
(3)若函数返回多个对象,那么函数就把这些对象当成一个元组返回,(2)实际上返回的是('a',123,[4,5])
(4)函数要先定义后使用
(5)函数可以作为参数,字典或列表中的元素使用
 
 
2,创建函数
.基本语法
def fun_name(arg1,arg2...):
    "function document string"   #函数文档字符串
    fun_body
#函数文档字符串可以用 fun_name.__doc__属性来访问,所以写函数要养成写函数注释的习惯
 
 
#定义一个函数
def myfun(host, port):
    'comment of the function'
    do_connect(host, port)
 
.函数的返回值
#函数可以返回多个值,此时把返回值当成一个元组对待。
#若函数没有返回值,其实是返回一个None,也就是C语言的NULL
 
3,调用函数
.基本函数调用是在函数名后面加一个圆括号()
if condition :
    fun_name()
 
.位置参数
#也就是调用函数时的标准参数,位置参数必须以被调用函数中定义的准确顺序来传递
#在没有默认参数下,传入的参数的数目必须和申明的参数数目相同
如:myfun('ss', 80)  #正确
    myfun(80)        #错误
 
.关键字参数
#可以不按照函数参数的位置顺序调用函数,而是直接制定函数关键字的值
def net_conn(host, port):
    do_connect_suite
 
调用:net_conn('ivy', 80)
调用2:net_conn(port=8080,host='ivy')
 
.默认参数
#在不给函数传递参数时,若有默认参数,函数认为传递的是默认参数
def net_conn(host, port=80,stype='tcp'):
   do_connect(host, port, TCP)
 
可以做如下调用:
法1:net_conn('ivy')   #使用默认端口和协议
法2:net_conn('ivy', 8000)  #使用默认协议tcp
法3:net_conn(port=8000, host='ivy1',stype='udp')  #使用关键字参数和位置无关
法4: net_conn('ivy', stype='udp')  #使用默认的port
 
.元组可变长参数
(1)在参数名前面添加*,表示把该参数当成一个元组对待;且该参数的个数未知。
(2)所有形式参数,必须在非正式(可变)参数之前,例:fun(name, old=30, *sub)
例如:
def fun2(*tuple):
    for item in tuple:
        print 'value is item ', item
 
使用:
t=['aa', 'bb', 'cc']
fun2(*t)  #此时fun2把t当成一个元组
 
输出:
value is item aa
value is item bb
value is item cc
 
fun2(t)   #此时fun2把t当成一个整体
 
输出:
value is  ('aa', 'bb', 'cc')
 
.字典可变长参数
(1) 参数前面添加**表示把该参数当成一个字典传给函数
(2)
定义:
dd={'k1':'v1', 'k2':'v2'} 
def fun3(**args):
    for item in args.keys():
        print '%s->%s'%(item, args[item])   
使用:
fun3(**dd)    #注意参数前面一定要添加**
 
输出:
k2->v2
k1->v1
 
.如何改变函数参数的值??
 
4,函数式编程
 
.匿名函数和lambda
(1)用lambda来创建匿名函数,而不需要以标准的方式来申明
(2)lambda返回一个可调用的函数对象
创建匿名函数:
lambda [arg0,arg1,...,argN]: expression
相当使用def定义函数,只是把函数名去掉:
def fun(arg0,arg1,...argN):
    expression
 
例:
f = lambda x,y=2: x+y 
调用:f(1,2)
 
相当于:
def fun(x,y=2): return x+y
调用:fun(1,2)
 
lambda x,y,z: x+y+z
相当于: def fun(x,y,z): return x+y+z
 
.内建函数
map(fun, seq1[,seq2,...seqN])
#将函数fun作用于seq序列的每一个元素,并用一个列表来提供返回值;
#若fun为空,就返回一个含有N个元素的列表。
 
filter(func, seq)
#将函数func作用于给定序列的seq的每一个元素
#并返回一个使func返回值为True的元素的序列
 
reduce(func, seq[,init])
#?
 
.变量作用域
(1)定义在一个函数内的变量具有局部作用域,函数调用结束局部变量被释放
(2)在一个模块中,最高级的变量有全局作用域,该变量知道模块运行结束才被释放
(3)在过程中申明的变量为局部变量,过程结束,变量释放
(4)在搜索一个标识符时,先从局部作用域开始搜索,然后再从全局作用域开始搜索
(5)局部变量可能会“隐藏”或者覆盖一个全局变量,因为函数先从局部作用域开始搜索的
例如:
global_str=‘this is global str’
def fun():
    local_str='sss'
 
.global 语句
#可用global语句来申明一个全局变量
global arg1[,arg2...arg3]
 
 
 
5, 函数的参数
5.1 python中函数的参数若是可改变类型,函数会改变该参数的值
def del_list(list1):
   if len(list1):
      del list1[0]

a=[1,2,3,4]
del_list(a)   # 此时a=[2,3,4]


 
 
 
待续...
 
阅读(3352) | 评论(1) | 转发(1) |
给主人留下些什么吧!~~

桔色花朵2012-03-02 03:08:58

python中没有返回值却有好多参数啊!