Python之列表生成式 生成器 异步I/O模型epoll 递归函数 函数式编程的定义 高阶函数
本篇主要介绍 列表生成式 生成器 递归函数 函数式编程的定义 高阶函数
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 生成器的特点
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 i
2.4. 手动实现生成器
3. 通过yield实现单线程的并发运算
# 异步I/O模型epoll
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函数条件的元素过滤掉)