Python第二周学习总结

本文介绍了Python中的高级特性,包括如何使用切片操作获取list或tuple的部分元素,以及字符串的迭代方式。此外,详细阐述了列表生成式、生成器的概念和用法,如通过for循环和if条件生成定制列表,以及如何利用yield实现自定义的迭代逻辑。最后,讨论了迭代器的原理和如何将不同数据类型转化为可迭代对象。
摘要由CSDN通过智能技术生成

高级特性

切片

取list或tuple部分元素,字符串'xxx'也可看成一种list。

切片(slice)操作符。

1.L[0:3]表示从索引0开始取,直到索引3为止,但不包括索引3。即索引0,1,2。3个元素。

   也可写成L[:3]。

2.L[-3:]表示取倒数第二、第一个元素。即L[-2]、L[-1]。

3.L[:10:2]表示前10个数,每两个取一个。

4.只写[:]就可以原样复制list。

迭代

迭代是通过for...in来完成。

对比:c代码

for (i=0; i<length; i++) {
    n = list[i];
}

1.dict迭代的是key,可用for key in        :

2.要迭代value,可用for value in d.values()

3.同时迭代key和value,可用for k,v in d.items()

字符串也是可迭代对象。

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

from collections.abc import Iterable

5.enumerate函数可以把一个list变成索引-元素对,可同时迭代索引和元素本身。

for i, value in enumerate(['A', 'B', 'C']):

列表生成式

1.生成list[1,2,3,4,5,6,7,8,9,10]可用list(range(1,11))。

2.把要生成的元素放到前面,后面跟for循环,就可把list创建出来。

3.for循环后面还可加if判断。

eg:

 [x * x for x in range(1, 11) if x % 2 == 0]

两层循环:

 [m + n for m in 'ABC' for n in 'XYZ']
['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']

4.for循环可以同时使用两个甚至多个变量来生成list。

d = {'x': 'A', 'y': 'B', 'z': 'C' }
[k + '=' + v for k, v in d.items()]
['y=B', 'x=A', 'z=C']

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

 [s.lower() for s in   ]

6.关于if...else

①:不能在最后的if加上else:跟在for后面的if是一个筛选条件,不能带else。

②:if写在for前面必须加else:for前面的部分是一个表达式,它必须根据计算出一个结果。

for前面的if ... else是表达式,而for后面的if是过滤条件,不能带else

生成器

一边循环一边计算的机制,称为生成器:generator。1.保存的是算法,2.作用:节省大量的空间

创建一个generator的方法:一、只要把一个列表生成式的[]改成()。

L = [x * x for x in range(10)]
L
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
g = (x * x for x in range(10))
g
<generator object <genexpr> at 0x1022ef630>

创建Lg的区别仅在于最外层的[]()L是一个list,而g是一个generator。

②要一个一个打印出generator的每一个元素:可以通过next()函数获得generator的下一个返回值。

> next(g)
0
>>> next(g)
1
>>> next(g)
4
>>> next(g)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

                                                              !!! 也可以通过for循环:generator也是可迭代对象 。

>>> g = (x * x for x in range(10))
>>> for n in g:
...     print(n)
... 
0
1
4

如果推算的算法比较复杂,用类似列表生成式的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'

fib函数实际上是定义了斐波拉契数列的推算规则,可以从第一个元素开始,推算出后续任意的元素。     

                                           二、一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator函数,调用一个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函数和普通函数的执行流程:

1.普通函数是顺序执行,遇到return语句或者最后一行函数语句就返回。

>>> r = abs(6)
>>> r
6

2。变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。

>>> g = fib(6)
>>> g
<generator object fib at 0x1022ef948>

odd不是普通函数,而是generator函数。

调用generator函数会创建一个generator对象,多次调用generator函数会创建多个相互独立的generator

调用next()每次都返回1:odd()会创建一个新的generator对象,,对generator分别调用next()当然每个都会返回第一个值。

迭代器

可以直接作用于for循环的数据类型:

一:集合数据类型,如listtupledictsetstr等;

二:generator,包括生成器和带yield的generator function。

1.可以直接作用于for循环的对象统称为可迭代对象:Iterable。也可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator

2.可用isinstance()判断一个对象是否是Iterable对象。

3.生成器都是Iterator对象,但listdictstr虽然是Iterable,却不是Iterator

4.把listdictstrIterable变成Iterator可以使用iter()函数。

5.Python的for循环本质上就是通过不断调用next()函数实现的,例如:

for x in [1, 2, 3, 4, 5]:
    pass

实际上完全等价于:

# 首先获得Iterator对象:
it = iter([1, 2, 3, 4, 5])
# 循环:
while True:
    try:
        # 获得下一个值:
        x = next(it)
    except StopIteration:
        # 遇到StopIteration就退出循环
        break
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值