python的高级特性

在python中,代码是越少越好,越简单越好。
因此就有了python常用的高级特性。

  • 切片(Slice)
    切片操作符,用于经常取指定索引范围的操作。
    好处就是减少使用循环

eg:

list切片

L[0:3]表示从索引0开始取,直到索引3为止,但不包括索引3
如果第一个索引是0还可以省略。

list切片

倒数切片。-1是倒数第一个元素的索引。

切片不但可以取相邻的,还可以每两个取一次,或者每5个取一次。

list切片

tuple也是一种list,唯一区别是tuple不可变。因此,tuple也可以用切片操作,只是操作的结果仍是tuple

tuple切片

字符串切片:

字符串切片

小练习:
利用切片操作,实现一个trim()函数,去除字符串首尾的空格

def trim(s):
    if(s[:1]==' '):
        s = trim(s[1:])
    elif(s[-1:]==' '):
        s = trim(s[0:-1])
    return s
运行结果
  • 迭代(Iteration)
    给定一个list或tuple,可以通过for循环来遍历这个list或tuple,这种遍历我们称为迭代(Iteration).
    在python中,迭代是通过for……in完成的。

a.迭代list

迭代list

下标循环,Python内置的enumerate函数可以把一个list变成索引-元素对

迭代list:索引-元素对

b.迭代字符串

字符串迭代

c.迭代dict

迭代dict
同时迭代key和value

d.判断一个对象是否可迭代
通过collections模块的Iterable类型判断

判断类型是否可以迭代

IDLE界面不需要导入
在dos界面需要导入

from collections import Iterable

小练习:
请使用迭代查找一个list中最小和最大值,并返回一个tuple

def findMinAndMax(L):
    if L != []:
        max = L[0]
        min = L[0]
        for l in L:
            if max < l:
                max = l
            if min > l:
                min = l
        return (min, max)
    else:
        return (None, None)
运行结果
  • 列表生成式
    列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式。

例如,生成list[1,2,3,4,5,6,7,8,9,10]

list(range(1,11))

生成[1x1, 2x2, 3x3, ..., 10x10]

生成list

for循环后面还可以加上if判断,这样我们就可以筛选出仅偶数的平方

生成条件list

还可以使用两层循环,可以生成全排列:

全排列

把一个list中所有的字符串变成小写:

字符串变小写

小练习:
判断list是否都是字符串,并将首字母变成小写,生成list

练习

运用列表生成式,可以快速生成list,可以通过一个list推导出另一个list,而代码却十分简洁。

  • 生成器
    通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。
    所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。

把一个列表生成式的[]改成(),就创建了一个generator

生成器和列表生成式的区别

generator保存的是算法,每次调用next(g),就计算出g的下一个元素的值,直到计算到最后一个元素,没有更多的元素时,抛出StopIteration的错误。

使用for循环,不但可以避免抛出StopIteration的错误,而且很方便。generator也是可迭代对象

for循环迭代生成器

如果推算的算法比较复杂,用类似列表生成式的for循环无法实现的时候,还可以用函数来实现。

例如著名的斐波拉契数列(Fibonacci)除第一个和第二个数外,任意一个数都可由前两个数相加得到:

1, 1, 2, 3, 5, 8, 13, 21, 34, ...

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项:

运行结果

上述函数离generator还差一步:
要想把fib()函数变成generator,只需要把print(b)改成yield b就可以了。

def fib(max):
    n, a, b = 0, 0, 1
    while n < max:
        yield b
        a, b = b, a + b
        n = n + 1
    return 'done'

如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator

生成器

函数是顺序执行,遇到return语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。

生成器

小练习:
杨辉三角定义如下:

          1
         / \
        1   1
       / \ / \
      1   2   1
     / \ / \ / \
    1   3   3   1
   / \ / \ / \ / \
  1   4   6   4   1
 / \ / \ / \ / \ / \
1   5   10  10  5   1

把每一行看做一个list,试写一个generator,不断输出下一行的list

def yhTri(n):
    l,index = [1],0
    while index < n:
        yield l
        l = [1] + [l[i] + l[i + 1] for i in range(len(l) - 1)] + [1]
        index += 1
运行结果

现在知道能用for循环的数据类型有以下几种
一类是集合数据类型:list,tuple,dict,str
一类是generator包括生成器和带yield的generator function。
些可以直接作用于for循环的对象统称为可迭代对象:Iterable

你可能感兴趣的:(python的高级特性)