python 函数高级特性

来源:互联网 发布:新加坡apache国际集团 编辑:程序博客网 时间:2024/05/16 08:51

迭代

可以通过 for 循环来遍历这个 list 或 tuple,这种遍历我们称为迭代(Iteration)
只要是可迭代对象,无论有无下标,都可以迭代,比如 dict就可以迭代:

迭代的类型

判断可迭代对象

方法是通过 collections 模块的 Iterable 类型判断

In [1]: from collections import Iterable##字符串In [2]: isinstance('he',Iterable)Out[2]: True##列表In [3]: isinstance([1,2,3],Iterable)Out[3]: True##整型数In [4]: isinstance(22,Iterable)Out[4]: False##集和In [5]: isinstance({1,2,3},Iterable)Out[5]: True##字典In [6]: isinstance({'na':1,'asd':'we'},Iterable)Out[6]: True##元组In [7]: isinstance((1,2,3),Iterable)Out[7]: True

字典的迭代

默认情况下,dict 迭代的是 key,如果要迭代value则:

In [1]: d = {'name':'cici','age':14}In [2]: from collections import IterableIn [3]: for k,v in d.iteritems():   ...:     print k,v   ...:     age 14name cici

列表的迭代

对 list 实现类似 Java 的下标循环
python内置的枚举方法enumerate,把一个 list 变成索引­元素对

In [4]: for i,value in enumerate([1,2,3,4]):   ...:     print i,value   ...:     0 11 22 33 4

元组的迭代显示

两个变量的迭代显示

In [6]: for x,y in [('a',1),('b',2),('c',3)]:   ...:     print x,y   ...:     a 1b 2c 3

1000以上的迭代

由于python的运算量仅仅是999,一旦大于999则会运算出错甚至使系统卡慢,所以在1000以上的运算就可以使用迭代

In [8]: g = (i*i for i in range(100000))In [9]: g = (i*i for i in range(1000000))In [10]: gOut[10]: <generator object <genexpr> at 0x151d3c0>##确认是否可迭代In [11]: isinstance(g,Iterable)Out[11]: True##迭代显示In [12]: g.next()Out[12]: 0In [13]: g.next()Out[13]: 1In [14]: g.next()Out[14]: 4##显示g的可用In [15]: dir(g)

列表生成式

列表生成式是Python 内置的非常简单却强大的可以用来创建 list的生成式

#!/usr/bin/env python# coding:utf-8_author_ = "lvah"'''@author:fairy@file:liebiao_pinfan.py@contact:xiaojun0118@foxmail.com@time:7/9/1711:00 AM@DESC;'''# 生成[1*1,2*2,3*3,...,7*7]列表# for循环li = []for n in range(1,8):    li.append(n*n)print li# 引出 ——># 列表生成式:# 循环太繁琐,而列表生成式则可以用一行语句代替循环生成上面的 list.print [i * i for i in range(1, 8)]# 1-20,所有偶数的平方# 列表生成式可以嵌套if语句和for语句print [i * i for i in range(0, 20, 2)]print [i * i for i in range(0, 20) if i % 2 == 0]# 列表生成式,返回'123' 'ABC'两个字符串的结合,如下:# ['1A', '1B', '1C', '2A', '2B', '2C', '3A', '3B', '3C']print [i + j for i in '123' for j in 'ABC']# 字典的连接print [k + '=' + v for k, v in {'name': 'hh', 'age': '5'}.items()]# li = ['HELLO','World'] ——> 小写print [a.lower() for a in ['HELLO', 'World'] if isinstance(i,str)]

这里写图片描述

生成器

通过列表生成式,我们可以直接创建一个列表,受到内存限
制,列表容量肯定是有限的
在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的 list,从而节省大量的空间。在 Python 中,这种一边循环一边计算的机制,称为生成器(Generator)

#!/usr/bin/env python# coding:utf-8import time_author_ = "lvah"'''@author:fairy@file:生成器.py@contact:xiaojun0118@foxmail.com@time:7/9/172:03 PM@DESC;'''# 枚举方法,显示为索引-元素shopinfo = [    ('Iphon',1000),    ('book',200),    ('fentiao',3500)]for i,v in enumerate(shopinfo):    print i,v# 在for循环里引用两个变量shopinfo = [     ('Iphon', 1000),     ('book', 200),     ('fentiao', 3500) ]for k, v in shopinfo:     print k, v# 4.手动实现生成器# (Fibonicci):# 数列1,1,2,3,5,8,13,... def fib(mm):     n, a, b = 0, 0, 1     while n < mm:         print b,         a, b = b, a + b         n += 1 fib(5) def hello():     print 'a'     yield 1     print 'b'     yield 2     print 'c'     yield 3 a = hello() a.next() a.next() a.next()# 异步I/Odef consumer(name):    print '%s 准备吃粉条'%name    while True:        fentiao = yield        print ('粉条[%s]做好了,被[%s]吃了')%(fentiao,name)# g = consumer('cici')# g.next()# g.send('ziranwei')def producer(name):    c1 = consumer('Cici')    c2 = consumer('Andy')    c1.next()    c2.next()    print '开始制作粉条晚餐....'    for i in ['凉拌','清蒸']:        time.sleep(1)        print '%s做了两份粉条'%name        c1.send(i)        c2.send(i)producer('Lily')