python高级特性、函数式编程、面向对象

切片

list和tuple、字符串。

L[:]

L[1:4]

L[-1]

str[::2]



迭代

python的迭代:只要是可迭代对象都可以,和下标没关系。

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

from collections import Iterable

isinstance('abc', Iterable)

isinstance([1,2,3], Iterable)

isinstance(123, Iterable) -- false

对list实现下标循环,使用python的enumerate函数把list变成索引-元素对

for i, value in enumerate(['a', 'b', 'c']):
    print(i, value)
    
0 a
1 b
2 c   


# 同时引用两个变量
for x, y in [(1, 1), (2, 4), (3, 9)]:
    print(x, y)
    
1 1
2 4
3 9


列表生成式 -- List Comprehensions

用来创建list的生成式

list(range(1,11))
[1,2,3,4,5,6,7,8,9,10]

[x * x for x in range(1, 11)]
[1, 4, 9, ...]

# 列表生成式中的if判断,选出符合条件的
[x * x for x in range(1, 11) if x % 2 == 0 ]
[ 4, 16, 36, 64, 100]

[m+n for m in 'abc' for n in 'xyz']
['ax', 'ay', 'az', 'bx', 'by', 'bz', 'cx', 'cy', 'cz']


# 使用列表生成式,列出目录下的所有文件和目录
import os
[d for d in os.listdir('.')]

# 列表生成式使用dict生成list
d = {'x':'a', 'y':'b', 'z':'c'}
[k + '=' + v for k, v in d.items()]
['y=b', 'x=a', 'z=c']


生成器 -- 解决列表生成式的内存溢出问题。

在循环过程中不断推算后续的元素,不必创建完整的list,节省内存。一边循环一边计算 -- 生成器 -- generator

正常的做法是:在创建了一个generator后,使用for来迭代。

定义generator的另一种方法:在函数定义中包含yield关键字。

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的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行从上次返回的yield语句继续执行。
















你可能感兴趣的:(高级操作)