3-python 函数篇

来源:互联网 发布:怎么查看网络是否稳定 编辑:程序博客网 时间:2024/06/05 23:06

1. 函数组成元素介绍 :

1.1 语句块关键字 : def

def test():    print "hello world";

1.2 返回值 return 介绍 :

def test():    print "hello world";    return 10;

函数带有return 语句的时候, 程序运行到 return 则结束,并且将指定的值返回给调用者。

如果函数中没有 return, 或者类似 return ; 的语句的时候, 函数返回 Node.

函数可以返回多个值 :

def test():    return 5, 23;

这样可以返回多个值,但本质上是一个元组。

1.3 函数 参数 介绍 :

函数一般可以传参进去, 定义时候直接在函数名后面的括号中定义 形参 即可。

def test(name,arg):    print "hello : " + name + "!";    return arg;

调用时候可以直接使用如 : a=test("test",123); 的形式调用。

2. 特殊形式的函数参数 :

2.1 指定形参的方式调用:

函数中可以指定形参来调用函数, 这样可以不用按照函数定义形参的顺序来传值。

def test(name,arg):    print "hello : " + str(name) + "!";    return arg;a=test(arg="test",name=123);print a;

2.2 默认参数 :

定义函数参数的时候可以使用默认值,如果函数参数使用了默认值, 则当不传参给它的时候, 参数将赋值一个指定默认值。

def test(name,arg=0):    print "hello : " + str(name) + "!";    return arg;a=test(name="test");print a;

当出现多个参数的时候, 默认参数定义必须从右向左。

2.3 可变参数:

  • 元组形式的可变参数:
def test(*val):    print len(val);    for i in range(0,len(val)):        print val[i]test(1,2,3,4,5);

如上所示的使用 * + 参数名 ,可以接受多个不确定长度的参数,最终结果会将传递的值通过元组的形式存放到 val 中去。

以上的赋值相当于 : val=(1,2,3,4,5);

  • 字典形式的可变参数:
def test(**val):        print val;        for key in list(val.keys()):            print key + " : " + str(val[key]);test(name="saligia",value=13, boolean=True, null=None);

如上所示的使用 ** + 参数名 ,可以接受多个不确定长度的参数,最终结果会将传递的值通过字典的形式存放到 val 中去。

以上的赋值相当于 : {'boolean': True, 'null': None, 'name': 'saligia', 'value': 13}

  • 元组反转 :

元组反转实在传递函数参数的时候,可以将元组拆分成多个值来传递给参数:

def test(name,value):    print "name : " + name ;    print "value : " + value;args=("name","value");test(*args);

如上这样使用 *args 传递参数时候就相当于 test("name","value")

  • 字典反转 :
def test(name,value):    print "name : " + name ;    print "value : " + value;args={'name':'saligia','value':'13'};test(**args);

3. main 函数 :

python 代码的执行不依赖于 main() 函数, python 代码从没有缩进的代码开始执行。

为了区分主执行文件还是被调用的文件,Python引入了一个变量 __name__ , 当文件是被调用时, __name__ 的值为模块名,当文件被执行时,__name____main__.

这个特性,为测试驱动开发提供了极好的支持,我们可以在每个模块中写上测试代码,这些测试代码仅当模块被Python直接执行时才会运行,代码和测试完美的结合在一起。

def fibo(num):    val=[0,1];    for i in range(0,num):        if i >= len(val) :            val.append(val[i-1] + val[i-2]);    return val;if __name__ == "__main__" :  print fibo(10);

4. 高阶函数

变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数 – 回调。

def add(x,y):    return x+y;def call(a,b,fun):    return fun(a,b);if __name__ == '__main__':  func=add  print call(15,20,func);

4.1 map/reduce 函数

4.1.1 map 函数

map 函数是对列表中的每一个值都调用指定的 func , 结果构成一个新的集合。

def filt(arg):    if arg > 5:        return 1;    else :        return 0;if __name__ == '__main__':  arr=range(10);  print map(filt, arr);#  [0, 0, 0, 0, 0, 0, 1, 1, 1, 1]

4.1.2 reduce 函数

reduce 是归并函数, 定义函数接受两个参数,返回一个值,通过这种迭代最终将一个 Iterator 编程一个值:

reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)

实例 :

def filt(x,y):    if y > 5:        return x+y;    else :        return x+0;if __name__ == '__main__':  arr=range(10);  print reduce(filt, arr);

4.2 filter

filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。

def func(x):    return x>5;if __name__ == '__main__':  arr=range(10);  print filter(func, arr);   ## [6, 7, 8, 9]

4.3 sorted 排序函数 :

sorted 用来给列表排序 :

arr=[10,13,1,5,3,0];print sorted(arr);

sorted()函数也是一个高阶函数,它还可以接收一个key函数来实现自定义的排序,key指定的函数将作用于list的每一个元素上,并根据key函数返回的结果进行排序。

def lower(args):   return str(args).lower();if __name__ == '__main__':  arr=["Hello","abc",12,4,5,"Rst","year","Hear","zookeeper"];  print sorted(arr, key=lower);## [12, 4, 5, 'abc', 'Hear', 'Hello', 'Rst', 'year', 'zookeeper']

要进行反向排序,不必改动key函数,可以传入第三个参数reverse=True

def lower(args):   return str(args).lower();if __name__ == '__main__':  arr=["Hello","abc",12,4,5,"Rst","year","Hear","zookeeper"];  print sorted(arr, key=lower, reverse=True);

4.4 返回函数 :

高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回。

def get_add(*args):    def func():        val = 0;        for num in args :            val = val + int(num);        return val ;    return func;if __name__ == '__main__':    f=get_add(1,2,3,4,5,5);    print f();

闭包调用问题 :

案例 :

def count():    fs = []    for i in range(1, 4):        def f():             return i*i        fs.append(f)    return fsf1,f2,f3 = count()print f1()     # 9print f2()     # 9print f3()     # 9

函数的调用发生在执行时, 所以当 return fs 的时候 i 等于 3 , i 为全局变量, 所以调用 f() 返回 9。

解决办法是将全局变量编程函数内部的局部变量。

def count():    fs = []    for i in range(1, 4):        def f(num):            def g():                return num*num            return g;        fs.append(f(i))    return fsf1,f2,f3 = count()print f1()       # 1print f2()       # 4print f3()       # 9

4.5 匿名函数 :

lambda 关键字表示匿名函数:

lambda x : x*x;

关键字lambda表示匿名函数,冒号前面的x表示函数参数。

匿名函数有个限制,就是只能有一个表达式,不用写return,返回值就是该表达式的结果。

func=lambda x : x*x;print func(10)

匿名函数也可以作为返回值:

def build(x, y):    return lambda: x * x + y * y
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 给孩子开家长会怎么办 读初三很难受怎么办 初三了英语很差怎么办 数学考30分怎么办 小学生阅读理解能力差怎么办 小学一年级数学差怎么办 小学一年级数学很差怎么办 初中生脸上长斑怎么办 初中生脸上长痘怎么办 初中成绩不好高中怎么办 农村老人去城里怎么办 留守儿童想妈妈怎么办 教师档案丢失了怎么办 转正定级表丢失怎么办 娃娃写作业慢怎么办 写作业眼睛疼怎么办 发生火灾怎么办大班教案 大班健康发生火灾怎么办 学生上课不提问怎么办 入户通知单丢了怎么办 打架后还来找事该怎么办 着火了怎么办教案视频 电脑一小半黑屏怎么办 绝地求生闪退怎么办 win7没浏览器了怎么办 浏览器被删除了怎么办 把快捷方式删了怎么办 ie文件找不到了怎么办 ie文件不存在了怎么办 大学素质分不够怎么办 素拓学分不够怎么办 大学毕业之前素拓分拿不满怎么办 武汉幼儿医保卡怎么办 养老院护工欺老人怎么办 皮肤毛孔粗大有痘印痘坑怎么办 额头上毛孔大怎么办 额头皮肤毛孔大怎么办 脸部粗糙毛孔大怎么办 脸上有痘印毛孔粗大怎么办 毛孔粗大痘印怎么办 教官12123一直加载怎么办