zoukankan      html  css  js  c++  java
  • Python之高级特性

    一.切片
    L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack']
    取出前三个元素 , 笨方法就是通过下标一个一个获取 [L[0], L[1], L[2]]
    Python做好了封装
    可以通过切片就行快速获取
    L[0:3] 进行获取 还可以倒着来 比如L[-2,-1]
    取出前几个 L[:N]
    后几个L[N:]
    前几个每几个取一个L[:N:X]
    所有数每几个取一个L[::X]
    其中字符串也可以进行切片 例如C#的substring(N,X) 当然tuple也肯定可以.
    二.迭代
    给list或者tuple进行遍历 我们叫做迭代
    如何判断一个对象是否可迭代呢 通过isinstance关键字
    >>> isinstance('abc', Iterable) # str是否可迭代
    True

    如果要对集合实现类似JAVA那样的下标循环怎么办?
    Python内置了一个enumerate函数可以将list变成 索引-元素对,这样就可以for循环迭代索引和元素本身
    for i ,value in enumerate(['a','b','c'])
    print(i,value)
    如果要循环多个tuple可以这么搞
    >>> for x, y in [(1, 1), (2, 4), (3, 9)]:
    ... print(x, y)
    ...
    1 1 2 4 3 9
    练习 :使用迭代找到list中最大和最小的数,并返回一个tuple
    def findmaxandmin(L):
    if L!=[]:
    max = L[0]
    min = L[0]
    for i in L:
    if i>max:
    max = i
    elif i<min:
    min = i
    return(min,max)
    else:
    return (None,None)
    >>> a = findmaxandmin([7,11,17,4,8])
    >>> print(a)
    (4, 17)
    三.列表生成式
    列表生成式即list comprehensions,是python非常简单却非常强大的可以用来创建list的生成式
    举个例子: 要生成list [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]可以用list(range(1, 11)):
    但如果要生成[1x1, 2x2, 3x3, ..., 10x10]怎么做?方法一是循环:
    L = []
    for x in range(1,11):
    L.append(x*x)
    但是这种方式有点呵呵了..让我们看一种高级的写法
    [x * x for x in range(1, 11)]
    [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
    这种方式是列表生成式用处的最好体现.
    [x + n for x in 'ABC' for n in 'FGH']
    ['AF', 'AG', 'AH', 'BF', 'BG', 'BH', 'CF', 'CG', 'CH']
    呵呵..还有这种骚操作...
    for 循环的后面还可以加上if判断
    >>> [x * x for x in range(1, 11) if x % 2 == 0]
    [4, 16, 36, 64, 100]
    比如查看当前目录的文件
    import os
    >>> [d for d in os.listdir('.')]
    ['DLLs', 'Doc', 'include', 'Lib', 'libs', 'LICENSE.txt', 'NEWS.txt', 'python.exe', 'python3.dll', 'python37.dll', 'pythonw.exe', 'Scripts', 'tcl', 'Tools', 'vcruntime140.dll']
    for循环可以循环多个变量,例如 d = {'x':'A','y':'a','E':'C'} for x,v in d.items():print(k,'=',v)
    但是不够简洁,我们这个时候就还可以使用列表生成式.. [k +'='+v for k,v in d.items()] 结果 : ['x=A', 'y=a', 'E=C']
    比如将一组字符串转换为小写 L = ['ASFAS','Acaac'] >>> [v.lower() for v in L] 结果 : ['asfas', 'acaac']
    反正用处多多了,再见了列表生成式...
    四.生成器
    通过列表生成式,我们可以直接创建一个列表,但是,但是收到内存限制,列表容量肯定是有限的,而且创建100万个元素,不仅占据了很大的内存空间,而且我们们就仅仅用那几个元素.那后面绝大的空间就白白浪费了.所以.如果列表元素根据那种算法推算出来,这样就可以去掉不必要的元素,从而节省大量内存,在Python中,这种 "一边循环一边计算的机制" 叫做 "generator".
    创建generator的方法和列表生成器差不多,就是把中括号变成括号 [列表生成式] ----(生成器)
    示例:
    >>> [x*x for x in range(1,10)] ##这是列表生成式
    [1, 4, 9, 16, 25, 36, 49, 64, 81]
    >>> g = (x*x for x in range(10)) ##这是生成器
    >>> g
    <generator object <genexpr> at 0x000001E4C1D82318>
    但是我们应该怎么去访问里面的元素的呢.. Python让我们通过next关键字 一个一个去里面找
    >>> next(g)
    0
    >>> next(g)
    1
    >>> next(g)
    4
    >>> next(g)
    9
    >>> next(g)
    16
    >>> next(g)
    25
    >>> next(g)
    36
    >>> next(g)
    49
    >>> next(g)
    64
    >>> next(g)
    81
    >>> next(g)
    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    StopIteration
    generator保存的是算法,每次调用next(n),就会计算出n的下一个元素.直到最后一个元素.没有更多的元素时,抛出StopIteration的错误.
    不过!!!,这太变态,正确的方式应该是通过for循环,因为generator是可迭代对象.
    isinstance(g,Iterable) --》true
    >>> for i in g:
    print(i)
    所以我们创建了一个generator后,基本上永远都不会用到next() ,二十通过for循环去迭代它,并不需要关心StopIteration的error
    网上的一个斐波拉契数
    用函数表示
    def fib(max):
    n, a, b = 0, 0, 1
    while n < max:
    print(b)
    a, b = b, a + b
    n = n + 1
    return 'done'
    其中赋值的操作 n,a,b = 0,0,1相当于 t = (0,0,1) #t就是个tuple, n = t[0] a = t[1] b = t[2]
    其中斐波拉契数就非常类似generator 我们需要如何修改呢 : 直接将print 改成yield.
    五.迭代器
    我们已经知道,可以直接用于for循环的数据类型有以下几种:
    一类是集合类型:list、tuple、dict、set、str 等
    一类是generator,包括生成器与带tyield的generator function
    可以被迭代的对象统称叫做Iterable
    可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。
    可以使用isinstance()判断一个对象是否是Iterator对象:
    有趣的是生成器都是Iterator对象,但list、dict、str虽然是Iterable,但不是Iterator...
    把Iterable转换为Iterator转换为可以用到iter()函数 (L = (1,2,3) Liter = iter(L))

  • 相关阅读:
    【NOIP2016提高A组8.12】奇袭
    【NOIP2016提高A组8.12】礼物
    tarjan算法
    【NOIP2016提高A组8.12】总结
    【NOIP2016提高A组8.11】自然数
    【NOIP2016提高A组8.12】通讯
    【NOIP2016提高A组8.11】种树
    【NOIP2016提高A组8.11】钱仓
    【NOIP2016提高组A组7.16】大鱼海棠
    【NOIP2012模拟8.20】Memory
  • 原文地址:https://www.cnblogs.com/ZaraNet/p/9545051.html
Copyright © 2011-2022 走看看