• Python的高级特性之切片、迭代、列表生成式、生成器


    切片

    切片就是获取一个list、tuple、字符串等的部分元素
     1 l = range(100) 
     2 #取[0,5)元素 
     3 print(l[:5]) #[0, 1, 2, 3, 4] 
     4 #在[0,99]中每隔10个元素取一个 
     5 print( l[::10]) #[0, 10, 20, 30, 40, 50, 60, 70, 80, 90] 
     6 #取最后五个元素 
     7 print( l[-5 : ]) #[95, 96, 97, 98, 99] 
     8 
     9 str = "www.genekang.com" 
    10 #也可以用来截取字符串 
    11 print( str[4:8]) #gene
    迭代
    如果给定一个list或tuple,我们可以通过for循环来遍历这个list或tuple,这种遍历我们成为迭代(Iteration)
     
     1 myList = ['a', 'b', 123, 'abc']
     2 
     3 #对一个list进行迭代
     4 
     5 for k in myList:
     6 
     7     print k
     8 
     9 #Python内置的enumerate函数可以把一个list变成索引-元素对
    10 
    11 # 0 a
    12 
    13 # 1 b
    14 
    15 # 2 123
    16 
    17 # 3 abc
    18 
    19 for i,k in enumerate(myList):
    20 
    21     print i,k

    除了list之外,dict迭代的是key。如果要迭代value,可以用for value in d.itervalues(),如果要同时迭代key和value,可以用for k, v in d.iteritems()

    如何判断一个对象是可迭代对象呢?方法是通过collections模块的Iterable类型判断:

    >>> from collections import Iterable
    >>> isinstance('abc', Iterable) # str是否可迭代
    True
    >>> isinstance([1,2,3], Iterable) # list是否可迭代
    True
    >>> isinstance(123, Iterable) # 整数是否可迭代
    False
    列表生成式
    列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式
     1 #计算1-10中偶数的平方
     2 
     3 ll =range(1,11)
     4 
     5 print [x*x for x in ll if x % 2 ==0 ]
     6 
     7  
     8 
     9 #还可以双层循环
    10 
    11 print [i + j for i in "ab" for j in "cd"] #['ac', 'ad', 'bc', 'bd']
    12 
    13  
    14 
    15 #列表生成式也可以使用两个变量来生成list
    16 
    17 d = {'x': 'A', 'y': 'B', 'z': 'C' }
    18 
    19 print [k + ':' + v for k,v in d.iteritems()] #['y:B', 'x:A', 'z:C']
    生成器
    在Python中,这种一边循环一边计算的机制,称为生成器(Generator),相当于java中的迭代器(iterator)
    要创建一个generator,有很多种方法。第一种方法很简单,只要把一个列表生成式的[]改成(),就创建了一个generator
     
     1 用函数实现一个斐波那契数列
     2 
     3 #1 1 2 3 5 8 
     4 
     5 def fib(max): 
     6 
     7     n,a,b = 0,0,1 
     8 
     9     while(n<max): 
    10 
    11         print b 
    12 
    13         a , b = b , a+b 
    14 
    15         n = n+1 

    仔细观察,可以看出,fib函数实际上是定义了斐波拉契数列的推算规则,可以从第一个元素开始,推算出后续任意的元素,这种逻辑其实非常类似generator。

    也就是说,上面的函数和generator仅一步之遥。要把fib函数变成generator,只需要把print b改为yield b就可以了:

     1 def fib(max):
     2 
     3     n,a,b = 0,0,1
     4 
     5     while(n<max):
     6 
     7         yield b
     8 
     9         a , b = b , a+b
    10 
    11         n = n+1
    12 
    13 for x in fib(6):
    14 
    15     print x
  • 相关阅读:
    类的加载顺序
    自定义形状类
    java的参数传递
    复数相加+equels、hashcode、clone<二>
    复数相加+equels、hashcode、clone<一>
    命令行程序
    计算阶乘
    控制程序的流程
    java运算符
    强制类型转换细节解析
  • 原文地址:https://www.cnblogs.com/6tian/p/4088719.html
Copyright © 2020-2023  润新知