2016年度WEB开发实验室第四次Seminar.

主讲人:马名骏

课件下载: python高级特性.pdf (下载548)

Python 高级特性

什么是python高级特性?

其宗旨是:

用最少的代码实现最多的功能,一行代码能解决的,绝不写两行!

切片

1、什么是切片?

python提供的切片操作符,是用来选取指定范围内指定内容的。可以大大简化我们的代码量。

来个思考题:

已知有一组list:[1,2,3,4,5],如何取出前三位元素?如何取出后三位元素?

如果你使用切片操作符,只需两步:

L = [1,2,3,4,5]
print(L[0:3])	#输出前三位数

print(L[::2])	#每隔一位数输出
print(L[:])	        #拷贝list
print(L[-1:])     #获取最后一位数
print(L[::-1])    #将list中元素倒序排列

切片操作符中的第一个数(冒号之前)表示切片开始的位置,第二个数(冒号之后)表示切片到哪里结束,第三个数(冒号之后)表示切片间隔数。

2、切片的适用范围

切片的适用范围十分广泛,不只是list,tuple、字符串等都可以使用,它替代了循环操作,极大简化了python截取部分内容的操作方式。【2016年度Seminar】(四)Python 高级特性-数字人文技术实验室 【2016年度Seminar】(四)Python 高级特性-数字人文技术实验室

迭代

1、什么是迭代?

如果给定一个list或tuple,我们可以通过for循环来遍历这个list或tuple,这种遍历我们称为迭代。

例如求10的阶乘所用的for循环即可视为一种迭代。

array = range(10) 
res = 1 
for i in array: 
	res = res * (i+ 1)
print(res)

除了list这种数据类型,只要是可迭代对象,都可以进行迭代,比如dict:

d = {‘club’:‘FCB’,‘country’:‘China’}
for key in d:
    print(key)

默认情况下,dict迭代的是key。如果要迭代value,可以用for value in d.values(),如果要同时迭代key和value,可以用for k, v in d.items()。

d = {'club':'FCB','country':'China'}
for k,v in d.items():
    print(k,v)

items() 方法把dict对象转换成了包含tuple的list,我们对这个list进行迭代,可以同时获得key和value。

字符串也是可迭代对象,因此也可以使用for循环:

for ch in 'ABC':
    print(ch)

2、什么是“可迭代的对象”?

一般,我们常常将哪些能够用for来一个一个读取元素的对象,就称之为可迭代的对象。那么for也就被称之为迭代工具。所谓迭代工具,就是能够按照一定顺序扫描迭代对象的每个元素(按照从左到右的顺序)。

3、如何一个对象是否是可迭代对象?

通过collections模块的Iterable类型判断:

>>> from collections import Iterable
>>> isinstance('abc', Iterable) # str是否可迭代
True
>>> isinstance(123, Iterable) # 整数是否可迭代
False

列表生成式

1、什么是列表生成式?

列表生成式,是Python内置的非常简单却强大的可以用来创建list的生成式。

举个例子:生成list[1, 2, 3, 4, 5, 6, 7, 8],可以使用list(range(1, 9))。

那如何生成[1*1,2*2,3*3…8*8]?

[x * x for x in range(1, 9)]即可

【2016年度Seminar】(四)Python 高级特性-数字人文技术实验室

2、如何只生成偶数的平方?

for循环后面加上if判断,这样我们就可以筛选出仅偶数的平方。【2016年度Seminar】(四)Python 高级特性-数字人文技术实验室

使用两层循环就可以实现全排列:

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

for循环可以同时使用两个甚至多个变量,那么相应的,列表生成式也可以使用两个变量来生成list:

>>> d = {'club':'FCB','country':'China'}
>>> [k + '=' + v for k, v in d.items()]

3、使用lower()与upper()方法:

lower()方法把大写字母转换成小写字母,upper()把小写字母转化成大写字母。

【2016年度Seminar】(四)Python 高级特性-数字人文技术实验室

生成器

1、什么是生成器?

在Python中,一边循环一边计算的机制,称为生成器:generator。

2、如何创建一个生成器?

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

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

我们可以直接打印出list的每一个元素,但我们怎么打印出generator的每一个元素呢?

可以通过next()函数获得generator的下一个返回值:

>>> next(g)
0
>>> next(g)
1
>>> next(g)
4

generator保存的是算法,每次调用next(g),就计算出g的下一个元素的值,直到计算到最后一个元素,没有更多的元素时,抛出StopIteration的错误。

但是不断next(g)太麻烦,不符合咱们懒的目的,所以可以使用for循环。【2016年度Seminar】(四)Python 高级特性-数字人文技术实验室

通过for循环来迭代它,并且不需要关心StopIteration的错误。

定义generator的另一种方法。如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator。

再举个例子,斐波那契数列:

def fib(max):
    n, a, b = 0, 0, 1
    while n < max:
        print(b)
        a, b = b, a + b
        n = n + 1
    return 'done'

转换成generator:

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

函数是顺序执行,遇到return语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。

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

迭代器

1、什么是迭代器?

可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。

迭代是一种操作,迭代器是一类对象。

可以使用collections模块来判断一个对象是否是Iterator对象:

>>> from collections import Iterator
>>> isinstance((x for x in range(10)), Iterator)
True
>>> isinstance([], Iterator)
False

生成器都是Iterator对象,但list、dict、str虽然是可迭代对象,却不是Iterator。

把list、dict、str等变成Iterator可以使用iter()函数:

>>> isinstance(iter([]), Iterator)
True
>>> isinstance(iter('abc'), Iterator)
True

2、小结:

  • 凡是可作用于for循环的对象都是可迭代对象;
  • 凡是可作用于next()函数的对象都是迭代器( Iterator )类型;
  • 集合数据类型如list、dict、str等是Iterable但不是Iterator,因为它们不能使用next()来输出,不过可以通过iter()函数获得一个Iterator对象。
  • Python的for循环本质上就是通过不断调用next()函数实现的

参考网站:

http://www.liaoxuefeng.com/