Python笔记-高级特性

1、迭代

如果给定一个list或tuple,我们可以通过for循环来遍历这个list或tuple,这种遍历我们称为迭代(Iteration)。

如果要迭代value,可以用for value in d.values(),如果要同时迭代key和value,可以用for k, v in d.items()

如果要对list实现类似Java那样的下标循环怎么办?Python内置的enumerate函数可以把一个list变成索引-元素对,这样就可以在for循环中同时迭代索引和元素本身:

for i,value in enumerate(['a','b','c']):
    print(i,value)
    
索引-元素对

 

#迭代查找一个list(随机数生成一个list)的最大值与最小值,并返回一个tuple

import random

def getRandomList():
    ranList=[]
    for i in range(10):
        ranList.append(random.choice(range(101)))
    print('生成的随机list为',ranList)
    return ranList
def find_min_max(ranList):
    minNums=maxNums=ranList[0]
    for x in ranList:
        if x<minNums:
            minNums=x
    maxNums=max(ranList)
    return (minNums,maxNums)
#dict={'max':maxNums,'min':minNums}
print(find_min_max(getRandomList()))

2、列表生成式

练习:如果list中既包含字符串,又包含整数,请讲str类型数据转换为小写

l = ['Hello', 'World', 18, 'Apple', None]
print('原list:',l)
#此方法自动筛除了非str类型元素
print([x.lower() for x in l if isinstance(x,str)] )
#改进版
L=[]
for element in l:
    if isinstance(element,str)==True:
        L.append(element.lower())
    else:
        L.append(element)
print(L)

3、生成器

在Python中,一边循环一边计算的机制,称为生成器:generator。

 斐波拉契数列用列表生成式写不出来,但是,用函数把它打印出来却很容易:

def fib(x):
    n,a,b=0,0,1
    while n<x:
        print(b)
        a,b=b,a+b
        n=n+1
    return
>>> fib(6)
1
1
2
3
5
8
'done'

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

也就是说,上面的函数和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'

这就是定义generator的另一种方法。如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator:

4、迭代器

未完待续......

posted @ 2019-04-11 21:56  假如年少有为  阅读(163)  评论(0编辑  收藏  举报