Python学习笔记三:高级特性

学习资源:廖雪峰Python教程

教程链接点击此处

重点记录与c,java有区别的知识点,红色部分重点注意。


三、高级特性


1.切片(Slice)


取list或tuple前n个数,也就是索引 0至(n-1) 的元素,或者取后n个数,也就是索引 (L-n)至(L-1) 或 -1至-n,L为list或tuple的长度,tuple类似:
L = list(range(100)) #创建一个0-99的list

print(L[0 : 3]) #从索引0开始取,直到索引3为止,但不包括索引3,即0,1,2
print(L[ : 3]) #如果第一个索引是0,可以省略

print(L[1 : 3]) #取索引1至索引3的元素,即1,2

print(L[-2 : -1]) #从索引-2开始取,直到索引-1为止,且包括索引-2,即98,99
print(L[-2 : ]) #类似的,索引-1可以省略

print(L[-5 : -2]) #从索引-5开始取,直到索引-2为止,且包括索引-5,即95,96,97,98

print(L[ : 10 : 2]) #索引0到索引10,但不包括索引10的元素,每两个取一个,即0,2,4,6,8
print(L[ : : 5]) #所有的元素,每五个取一个,即0,5,10,15...
print(L[ : ]) #原样赋值一个list


2.迭代( Iteration)

①通过for...in循环来遍历list,tuple之类的 可迭代对象,这种遍历称为迭代(Iteration)

②通过collections模块的Iterable类型判断一个对象是不是可迭代对象
from collections import Iterable

print(isinstance(123, Iterable)) #整数是否可迭代?False
print(isinstance('abc', Iterable)) #str是否可迭代?True
print(isinstance([1, 2, 3], Iterable)) #list是否迭代?True
print(isinstance((1, 2, 3), Iterable)) #tuple是否可迭代?True
print(isinstance({'a' : 1, 'b' : 2, 'c':3}, Iterable)) #dict是否可迭代?True
print(isinstance(set([1, 2, 3]), Iterable)) #set是否可迭代?True

③Python内置的enumerate函数可以把一个list变成索引-元素对,这样就可以 同时迭代索引和元素本身:
for i, value in enumerate(['A', 'B', 'C']):
    print(i, value)


3.列表生成式(List Comprehentions)

①列表生成式(List Comprehensions)是Python内置的非常简单却强大的可以用来创建list的生成式
L1 = list(range(0, 10)) #生成一个0-9的list
L2 = [x * x for x in range (0, 10)] #生成list[0, 1, 4, 9, ..., 81]
L3 = [x * x for x in range (0, 10) if x % 2 == 0] #筛选出仅偶数的平方生成list[4, 16, 36, 64]
L4 = [m + n for m in 'abc' for n in 'xyz'] #两层循环生成全排列['ax','ay', ... ,'cy', 'cz']
print(L1)
print(L2)
print(L3)
print(L4)

②for..in循环实际上 可以同时使用两个甚至多个变量,如dict的items()可以同时迭代key和value:
d = {'a' : 1, 'b' : 2,'c' : 3}
for k,v in d.items():
    print(k, '=', v) #输出a=1 b=2 c=3
因此,列表生成式也 可以使用多个变量来生成list
d = {'a' : 'A', 'b' : 'B', 'c' : 'C'}
L = [k + '=' + v for k, v in d.items()]
print(L) #输出['a=A', 'b=B', 'c=C']


4.生成器(generator)

①一遍循环一遍计算的机制。通过不断next(generator)获得元素
②创建一个generator的方法一:将列表生成式的 [] 号改成 () 号
L = [x * x for x in range(10)] #L是一个list
g = (x * x for x in range(10)) #g是一个generator
for n in g:
    print(n) #generator可迭代

③定义generator的另一种方法,如果一个函数定义中包含关键字 yield,那么这个函数不再是一个普通函数,而是一个generator:
def fib(max):
    n, a, b = 0, 0, 1
    while n < max:
        yield b
        a, b = b, a + b #相当于t = (b, a + b)
                        #       a = t[0]
                        #       b = t[1]
                        #t是一个tuple
        n = n + 1
    return 'done'

for n in fib(5): #这里的fib(5)就是一个generator对象
    print(n)
在变成generator的函数中, 每次遇到yield都会返回,再次next()执行的时候,从上次的yield语句处继续执行。如上面fib函数中,对fib(5)进行迭代遍历是,每次遇到yield b就返回当前b的值,依次是1,1,2,3,5

④用for...in循环调用generator时,拿不到generator的return语句的返回值。如果想要拿到返回值,必须捕获StopIteration错误,返回值包含在StopIteration的value中:
def fib(max):
    n, a, b = 0, 0, 1
    while n < max:
        yield b
        a, b = b, a + b #相当于t = (b, a + b)
                        #       a = t[0]
                        #       b = t[1]
                        #t是一个tuple
        n = n + 1
    return 'done'

g = fib(5) #构建generator对象
while True:
    try:
        x = next(g) #依次向后遍历generator
        print(x)
    except StopIteration as e: #捕获函数的返回值
        print('Generator return value', e.value)
        break

⑤注意:对于函数改成的generator来说,遇到yield返回一个值,遇到return或者最后一行语句,整个指令结束
调用函数时,获得的是函数的return:a = abs(-2)
调用函数改成的generator时, 获得的是一个generator对象:g = fib(5)


5.迭代器

①可以直接作用于for...in循环的数据类型有
集合数据类型: str、tuple、dict、list、set等
generator:包括 生成器带yield的generator function
称为 可迭代对象:Iterable
可以使用isinstance()判断一个数据类型是否是Iterable对象

from collections import Iterable

print(isinstance(123, Iterable)) #整数是否可迭代?False
print(isinstance('abc', Iterable)) #str是否可迭代?True
print(isinstance([1, 2, 3], Iterable)) #list是否迭代?True
print(isinstance((1, 2, 3), Iterable)) #tuple是否可迭代?True
print(isinstance({'a' : 1, 'b' : 2, 'c':3}, Iterable)) #dict是否可迭代?True
print(isinstance(set([1, 2, 3]), Iterable)) #set是否可迭代?True

②可以被next()函数调用并不断返回下一个值的对象称为 迭代器:Iterator
可以用isinstance()判断一个对象是否是Iterator对象:
from collections import Iterator

print(isinstance((x for x in range(10)), Iterator)) #生成器是不是Iterator对象?True
print(isinstance([], Iterator)) #list是不是Iterator对象?False
print(isinstance({}, Iterator)) #dict是不是Iterator对象?False
print(isinstance('abc', Iterator)) #str是不是Iterator对象?False 
生成器都是iterator对象,list、dict、str等虽然是iterable,但不是iterator

③把list、dict、str等Iterable变成iterator可以用iter()函数:
from collections import Iterator

print(isinstance(iter([]), Iterator)) #将list转化为iterator,Ture
print(isinstance(iter('abc'), Iterator)) #将str转化为iterator,Ture

④Iterator对象表示的是一个数据流,iterator对象可以被next()函数调用并不断返回下一个数据,直到没有数据是抛出StopIteration错误。可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个数据,所以Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算。Iterator甚至可以表示一个无限大的数据流,例如全体自然数














  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值