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]
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值