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]
待续...