Python廖雪峰教程学习笔记:Day5

前言

养成一个好的习惯只需要坚持21天,Day5

高级特性

  • 切片
  • 迭代
  • 列表生成器
  • 生成器

切片

取一个list和tuple的部分元素可以用切片快速实现。
在这里插入图片描述
L为一个list,L[0:3]表示从索引0开始取到索引3为止,但不包括索引3,即索引0,1,2三个元素。
如果第一个索引是0,还可以省略为L[:3],运行结果和L[0:3]一样。
如果索引从1开始,取出两个元素则可以写作L[1:3],运行结果如下:
在这里插入图片描述
由list列表元素的存取可以使用-1作为最后一个元素的索引,这里也支持倒数切片,但要记住倒数第一个元素的索引是-1。
在这里插入图片描述
首先创建一个0-99的数列,可以取前10个数、后10个数、前10个数每两个取一个、所有数每隔5个取一个:
在这里插入图片描述
字符串也可以看作是一个list,从而进行切片操作。
在这里插入图片描述
练习
利用切片操作,实现一个trim()函数,去除字符串首尾的空格,注意不要调用str的strip()方法:

def trim(s):
    if len(s)==0:
        return s     
    while s[0]==' ':
        s=s[1:]
        if len(s)==0:
            return s         
    while s[-1]==' ':
        s=s[:-1]
        if len(s)==0:
            return s       
    return s

在这里插入图片描述

迭代

如果给定一个list或tuple,我们可以通过for循环来遍历这个list或tuple,这种遍历我们称为迭代(Iteration)。Python中,迭代是通过for...in来完成的,只要是可迭代对象,无论有没有下标都可以进行迭代,比如list、dict以及字符串等等。
在这里插入图片描述
默认情况下,dict迭代的是key。如果要迭代value,可以用for value in d.values(),如果要同时迭代keyvalue,可以用for k, v in d.items()
如何判断一个对象是否是可迭代对象,可以通过通过collections模块的Iterable类型判断:
在这里插入图片描述
Python内置的enumerate函数可以把一个list变成索引-元素对,这样就可以在for循环中同时迭代索引和元素本身:
在这里插入图片描述
练习
请使用迭代查找一个list中最小和最大值,并返回一个tuple:

def findMinAndMax(L):
    if L == []:
        return(None,None)
    else:
        (min,max)=(L[0],L[0])
        for x in L:
            if x > max:
                max = x
            elif x < min:
                min = x
    return (min,max)

列表生成式

列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式。灵活运用列表生成式可以大大简化代码实现。
举个栗子,要生成list[1,2,3,4,5,6,7,8,9,10]可以使用list(range(1,11)):
在这里插入图片描述
如果要生成[1x1, 2x2, 3x3, ..., 10x10],可以使用列表生成式一句实现:
在这里插入图片描述
在这里插入图片描述
if...else
例如输出1到10中的偶数:
在这里插入图片描述
在一个列表生成式中,for前面的if ... else是表达式,而for后面的if是过滤条件,不能带else。即如果for在if之前,则后面不能加else;如果if在for之前,则后面必须加else。
在这里插入图片描述
练习
把list中的字符串变成小写字符串

L1 = ['Hello', 'World', 18, 'Apple', None]
L2 =[s.lower() for s in L1 if isinstance(s, str)]
print(L2)

运行结果:

['hello', 'world', 'apple']

生成器

通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。在Python中,可以使用生成器:generator实现一边循环一遍计算的机制。
如何创建一个generator呢?
首先把一个列表生成式的[]改成(),就创建了一个generator:
在这里插入图片描述
next(g)可以打印出生成器中的元素,直到最后一个。
generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。
在这里插入图片描述
练习
斐波拉契数列(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

运行示例:
在这里插入图片描述
在这里插入图片描述

def triangles():
    L = [1]                                                         
    while True:
        yield L                                         
        L = [L[x]+L[x+1] for x in range(len(L)-1)]       
        L.insert(0,1)                                   
        L.append(1)                                  
        if len(L)>10:                   
            break
n = 0
results = []
for t in triangles():
    results.append(t)
    n = n + 1
    if n == 10:
        break

for t in results:
    print(t)

if results == [
    [1],
    [1, 1],
    [1, 2, 1],
    [1, 3, 3, 1],
    [1, 4, 6, 4, 1],
    [1, 5, 10, 10, 5, 1],
    [1, 6, 15, 20, 15, 6, 1],
    [1, 7, 21, 35, 35, 21, 7, 1],
    [1, 8, 28, 56, 70, 56, 28, 8, 1],
    [1, 9, 36, 84, 126, 126, 84, 36, 9, 1]
]:
    print('测试通过!')
else:
    print('测试失败!')

运行结果:
在这里插入图片描述

发布了5 篇原创文章 · 获赞 14 · 访问量 663

猜你喜欢

转载自blog.csdn.net/Comme_moik/article/details/104311099