您的位置:首页 > 编程语言 > Python开发

Python之列表生成式 生成器 异步I/O模型epoll 递归函数 函数式编程的定义 高阶函数

2017-07-10 21:30 1006 查看
本篇主要介绍  列表生成式  生成器  递归函数 函数式编程的定义 高阶函数

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 i

2.4. 手动实现生成器



定义一函数fib,实现斐波那契数列(Fibonicci):



 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函数条件的元素过滤掉)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: