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

数组在实际开发中应用的特别广泛,所以对于这一类型的数据,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 nyield b
        a,b=b,a+b
        n=n+1


>>> fib(8)
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 "", line 1, in <module>
StopIteration

5.迭代器

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

你可能感兴趣的:(python)