本篇主要介绍 列表生成式 生成器 递归函数 函数式编程的定义 高阶函数
1.列表生成式
列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式
示例: # 1~20,所有偶数的平方 print [ i*i for i in range(0,20,2)] print [ i*i for i in range(0,20) if i %2 == 0]
#将列表中的字符全部转化为小写 print [i.lower() for i in li if isinstance(i, str)]
1.1. 判断数据类型是否为可迭代数据类型 In [25]: from collections import Iterable In [26]: isinstance('hello',Iterable) Out[26]: True 1.2. 枚举方法,显示为索引-元素对 shopinfo = [('Iphone',1000), ('book',200), ('fentiao',3500)] for i,v in enumerate(shopinfo): print i,v 2..生成器generator
2.1 生成式的定义
通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。
所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器。
要创建一个generator,有很多种方法。第一种方法很简单,只要把一个列表生成式的[]改成(),就创建了一个generator。
还可以使用关键字yield
所以,我们创建了一个generator后,基本上永远不会调用next()方法,而是通过for循环来迭代它。
generator非常强大。如果推算的算法比较复杂,用类似列表生成式的for循环无法实现的时候,还可以用函数来实现。比如,著名的斐波拉契数列(Fibonacci)。
2.2 生成器的特点
1). 列表生成式受到内存的限制,列表容量是有限的; 2). 列表生成式如果只需要前几个元素,浪费内存空间。 2.3. 访问生成式: - for循环 - g.next()方法 l = [i for i in range(1000)] # 列表生成式 g = (i for i in range(1000)) # 生成器 g.next() for i in g: print i2.4. 手动实现生成器
定义一函数fib,实现斐波那契数列(Fibonicci):
3. 通过yield实现单线程的并发运算
4.. 递归函数
4.1 递归与循环在编程模型和思维模型上最大的区别则在于:
循环是在描述我们该如何地去解决问题。
递归是在描述这个问题的定义。
###求一个整数的阶乘
def fact(n): if not isinstance(n,int): print 'input int num' if n == 1: return 1 return fact(n-1)*n print fact(3) 4.2 递归的特点 1). 在写递归函数时要有一个明确的结束条件; 2). 在递归时,问题规模要越来越小; 3). 递归函数效率不高,函数调用是通过栈的数据结构实现的, 4). 每调用依次,栈就会多一层,最多999层,否则会出现栈溢出。 5. 函数式编程 函数式编程是一种编程模型,他将计算机运算看做是数学中函数的计算,并且避免了状态以及变量的概念。
在函数式编程中,函数是基本单位,是第一型,他几乎被用作一切,包括最简单的计算,甚至连变量都被计算所取代。在函数式编程中,变量只是一个名称,而不是一个存储单元,这是函数式编程与传统的命令式编程最典型的不同之处。
f(x) = y ,那么这个函数无论在什么场景下,都会得到同样的结果,这个我们称之为函数的确定性。
函数式编程取消了赋值模型,则使数学模型与编程模型完美地达成了统一
6.. 高阶函数 6.1定义:一个函数接收另一个函数作为参数,这种函数就称之为高阶函数
6.1 map()
map()函数接收两个参数,一个是函数,一个是序列,map将传入的函数依次作用到序列的每个元素,并把结果作为新的list返回。
6.3 reduce():reduce函数也有两个参数,一个是函数,另一个是列表,返回值为对list的每一个元素反复调用函数f,得到最终结果,以下函数为连乘;
6.4 filter():filter函数接受函数参数f和列表参数lst,f对lst元素进行判断,返回lst的元素中调用f函数结果为true的元素组成的列表(将不满足f函数条件的元素过滤掉)