欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

python学习笔记----高级特性

程序员文章站 2024-03-21 22:39:34
...

数组在实际开发中应用的特别广泛,所以对于这一类型的数据,python内部有一些高级语法可以极大的方便我们来使用数据,元组甚至是字符串等数据。类似于rxjava中的众多操作符。

1.切片

主要作用是获取数据中的某一类数据
语法结构 var[start:end:bound] ,三者都可省略,只保留冒号。
例如:

>>> var=[1,2,3,4,5,6,7,8,9]
>>> print(var[0:5])
[1, 2, 3, 4, 5]
>>> print(var[0:5:2])
[1, 3, 5]
>>> print(var[:5:2])
[1, 3, 5]
>>> print(var[::2])
[1, 3, 5, 7, 9]
>>> 

上面的例子可以简单总结出

  • 取的值包括起始位置,不包括结束位置,和java的subList一样
  • bound表示跳几位,可以省略
  • 起始位置和结束位置省略表示全数组,如果三者都省略表示可以复制一个数组

    同时,数组如果按照倒序来计算,最后一位为-1,所以

>>> print(var[-3:-1])
[7, 8]
>>> print(var[-3:0])
[]
>>> print(var[-1:])
[9]
>>> 

可以发现,如果想取最后一位,不能是[-1:0]而是[-1:]

同时,元组合字符串和数组一样,完全支持以上操作。

2.迭代

python的迭代类似foreach循环,和下标没有关系。不仅是数组,元组,字符串,字典也可以。
语法为 for … in …

2.1

>>> var=[1,2,3,4,5,6,7,8,9]
>>> for cc in var:
    print(cc)
1
2
3
4
5
6
7
8
9
>>> 
>>> a={'a':1,'b':2,'c':3}
>>> for key in a:
    print(key)
a
b
c
>>> for k in a:
    print(k)
a
b
c
>>> for value in a.values():
    print(value)
1
2
3

通过例子很容易理解,字典由于不是链表存储的,可能打印出来的顺序会有不一样。

2.2

由于可迭代的数据类型很多,便于不出错,通过collections模块的Iterable类型判断是否可迭代。

>>> from collections import Iterable as it
>>> isinstance('abc', it) # str是否可迭代
True
>>> isinstance([1,2,3], it) # list是否可迭代
True
>>> isinstance(123, it) # 整数是否可迭代
False

2.3

但是,更多的时候我们还需要下标,该怎么办呢?幸好Python内置的enumerate函数可以把一个list变成索引-元素对,这样就可以在for循环中同时迭代索引和元素本身:

>>> for i, value in enumerate(['A', 'B', 'C']):
...     print(i, value)
...
0 A
1 B
2 C

2.4

上面的for循环里,同时引用了两个变量,在Python里是很常见的,比如下面的代码:

>>> for x, y in [(1, 1), (2, 4), (3, 9)]:
...     print(x, y)
...
1 1
2 4
3 9

多多尝试,慢慢总结。

3.列表生成式

方便生成我们需要的列表,功能十分的强大(注意是中括号)

3.1最简单的range,很多语言都有该操作符

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

3.2 元素再运算,比如n*n的规律列表

>>> [x * x for x in range(1, 11)]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

结合for in语法,将for中的运算语句提到for的前面

3.3甚至后面也可以加判断语句

>>> [x * x for x in range(1, 11) if x % 2 == 0]
[4, 16, 36, 64, 100]

3.4 两个for结合

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

甚至是三个及三个以上for结合使用

3.5两个变量

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

真是简洁强大的语言啊!

4.生成器

如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。

4.1
要创建一个generator,有很多种方法。第一种方法很简单,只要把一个列表生成式的[]改成(),就创建了一个generator:

[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
>>> g = (x * x for x in range(10))
>>> for x in g:
    print(x)
0
1
4
9
16
25
36
49
64
81
>>> 

4.2
下面来看斐波拉切数的生成

>>> def fib(max):
    n,a,b=0,0,1
    while n<max:
        yield b
        a,b=b,a+b
        n=n+1


>>> fib(8)
<generator object fib at 0x02BD1C00>
>>> for x in fib(6):
    print(x)


1
1
2
3
5
8
>>> 

这就是定义generator的另一种方法。如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator,generator的函数在每次调用next()的时候执行,遇到yield语句返回,因为上面的for in实际上调用next()进行执行的。所以会生成了许多数据。
再比如:

def odd():
    print('step 1')
    yield 1
    print('step 2')
    yield(3)
    print('step 3')
    yield(5)

调用:

>>> o = odd()
>>> next(o)
step 1
1
>>> next(o)
step 2
3
>>> next(o)
step 3
5
>>> next(o)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

5.迭代器

可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。
可以使用isinstance()判断一个对象是否是Iterator对象。
for in的实质就是调用next()函数,当然它不会抛异常,和java的迭代器类似。主要知识点上面几点都有提到。