函数的高阶特性——Python学习笔记04

来源:互联网 发布:terminal mac 编辑:程序博客网 时间:2024/06/07 03:25

在Python中,代码越少越好,越简单越好,开发效率越高。

切片

对经常取指定索引范围的操作,用循环十分繁琐,因此,Python提供了切片(Slice)操作符,可以简化操作。Python中的切片相当于其他语言针对字符串提供的截取函数(如:substring)
L[0:3]表示:从索引0开始取,直到索引3为止,但不包括索引3。即索引0,1,2
如果第一个索引是0 ,可以省略。
同样支持倒数切片,如:

>>>L =[a, b, c, d]>>>L[-2:] c, d>>>L[-2:-1]c

前10个数,每两个取一个:

>>>L = list(range(100))>>>L[:10:2][0, 2, 4, 6, 8]

所有数,每5个取一个:

>>>L[::5][0, 5, 10, 15, 20, 25, 30, 35, **, **, **, **, 60, 65, 70, 75, 80, 85, 90, 95]

什么都不写,只写[:]就可以复制一个list:

>>>L[:][1, … 99]

tuple也可以用切片操作,不过结果仍是tuple:

>>>(0, 1, 2, 3, 4, 5)[:3](0, 1, 2)

字符串’xxx’也可以看成是一种list,每个元素就是一个字符。因此,字符串也可以用切片操作,只是操作结果仍是字符串:

>>>’ABCDE’[:2]‘AB’>>>’ABCDEFG’[::2]‘ACEG'

Python中的切片相当于其他语言针对字符串提供的截取函数(如:substring)。


迭代

如果给定一个list或tuple,我们可以通过for循环来遍历这个list或tuple,这种遍历我们称为迭代(Iteration)。
在Python中,迭代是通过for … in来完成的。
其for循环不仅可以作用在list或tuple上,还可以作用在其他可迭代对象上,无论有无下标,都可迭代。
如dict,默认情况下,dict迭代的是key。如果要迭代value,可以用for value in d.values(),如果要同时迭代key和value,可以用for k, v in d.items()
如何判断一个对象是否为可迭代对象,方法是通过collection模块的Iterable类型判断:

>>>from collections import Iterable>>>isinstance(‘ABC’, Iterable)    # 查看该str是否可迭代True

如果要对list实现类似Java的下标循环,可以通过Python内置的enumerate函数把list变成索引-元素 对,这样就可以在for循环中同时迭代索引和元素本身:

>>> for a, b in enumerate(['A', 'B', 'C']):    print(a,b)0 A1 B2 C

在上面的循环中同时引用了两个变量,在python 中是很常见的:

>>>for a, b in [(1, 2), (2, 3), (3, 4)]:    print(a, b)1 22 33 4

列表生成式

列表生成式是Python内置的非常简单却强大的可以用来创建list的生成式。
写列表生成式时,把要生成的元素x * x放到前面,后面跟for循环,就可以把list创建出来。
for循环后面还可以加上if判断。
还可以使用两层循环,可以生成全排列:

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

运用列表生成式,可以写出非常简洁的代码。
例如,列出当前目录下的所有文件和目录名,可以通过一行代码实现:

>>>import os>>>[d for d in os.listdir(‘.’)]['.emacs.d', '.ssh', '.Trash', 'Adlm', 'Applications', 'Desktop', 'Documents', 'Downloads', 'Library', 'Movies', 'Music', 'Pictures', 'Public', 'VirtualBox VMs', 'Workspace', 'XCode’]

for 循环可以同时使用两个甚至多个变量,因此,列表生成式也可以使用两个变量来生成list:

>>>d = {‘x’:’A’, ‘y’:’B’, ‘z’:’C’}>>>[q + ‘=‘ + w for q, w in d.items()]['x = A', 'y = B', 'z = C’]

也可以把一个list中所有的字符变成小写:

>>>L =[‘Hello’, ‘World’, ‘IBM’, ‘Apple’]>>>[x.lower() for x in L][‘hello’, ‘world’, ‘ibm’, ‘apple’]

生成器

在Python中,一边循环一边计算的机制,称为生成器(generator)。
创建一个generator的方法很多,有一种简单的方法是,只要把一个列表生成式的[]改成(),就创建了一个generator:

>>> L = [x * x for x in range(1,11)] #L是一个list>>> L[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]>>> g = (x * x for x in range(1, 11)) #g是一个generator>>> g<generator object <genexpr> at 0x105473728>

可以通过next()函数获取generator的下一返回值,直至计算到最后一个元素,没有更多的元素时会抛出StopIteration的错误。
其实正确的方法是使用for循环,因为generator也是可迭代对象:

>>>print(g)[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

如果推算的算法比较复杂,用类似列表生成式的for循环无法实现时,可以通过函数的方式实现。
斐波拉契数列可以用函数打印出来:

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

注意,赋值语句:

a, b = b, a+b

相当于:

t = (b, a + b) # t是一个tuplea = t[0]b = t[1]

但不必显式写出临时变量t就可以赋值。
定义generator的另一种方法就是通过改动上面的函数,包含yield的函数就是一个generator。

要把上面的函数改成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和函数的执行流程不一样。

函数是按顺序执行,遇到return语句或最后一行函数语句就返回。
而变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。
把函数改成generator后,我们基本上不会用next()来获取下一个返回值,而是直接使用for循环来迭代:

for n in fib(6):    print(n)

但是在for循环调用generator时,拿不到generator的return语句的返回值。如果要拿到,必须捕获StopIteration错误,返回值包含在StopIteration的value中。

问题:打印出杨辉三角

# -*- coding: utf-8 -*-def triangles():    L = [1]    while True: #进入持续循环        yield L        L.append(0) #1) 利用尾部插入0来控制第一位和最后一位值始终为1;                    #2) 同时也是为了保证每一行的数值个数正确,因为后面有用到len(L)                    #    来确定每次生成L的最终长度。        L = [L[i - 1] + L[i] for i in range(len(L))]
#while的执行分解为简单的步骤:while True:    yield L    L.append(0)    length = len(L)    new_L = []    for i in range(length):        new_L.append(L[i-1]+L[i])    L = new_L#第一次打印出的步骤: 不进行循环L = [1]#第二次打印的步骤:while True:    yield L             L = [1, 0]    length = 2    for i in [0, 1]:    new_L.append(L[-1] + L[0]) #第一次循环为1     new_L.append(L[0] + L[1])  #第二次循环为1    L = new_L = [11]#第三次打印步骤:while True:         yield L                L= [1, 1, 0]    length = 3    for i in [0, 1, 2]:    new_L.append(L[-1] + L[0]) #第一次循环为1    new_L.append(L[0] + L[1])  #第二次循环为2    new_L.append(L[1] + L[2])  #第三次循环为1    L = new_L = [1, 2, 1]#第四次打印步骤:while True:    yield L    L = [1, 2, 1, 0]    length = 4    for i in [0, 1, 2, 3]:    new_L.append(L[-1] + L[0]) #第一次循环为1    new_L.append(L[0] + L[1])  #第二次循环为3    new_L.append(L[1] + L[2])  #第三次循环为3    new_L.append(L[2] + L[3])  #第四次循环为1    L = new_L = [1, 3, 3, 1]...

打印出前10行杨辉三角:

n = 0for t in triangles():        print(t)        n = n+1        if n == 10:                break

迭代器

集合数据类型(list, tuple, dict, set, str等)和generator(包括带yield的generator function)这些可以直接作用于for循环的对象统称为可迭代对象:Iterable。
可以使用isinstance()判断一个对象是否是Iterable对象:

>>>from collections import Iterable>>>isinstance(‘ABC’, Iterable)True

可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator,如生成器generator。
可使用isinstance()判断一个对象是否是Iterator对象:

>>>from collections import Iterator>>>isinstance((x * x for x in range(10)), Iterator)True

生成器都是Iterator对象,但list,dict,str虽然是Iterable,却不是Iterator。
可以使用iter()函数把这些Iterable变成Iterator:

>>>isinstance(iter({}), Iterator)True>>>isinstance(iter(‘ABC’), Iterator)Ture

Python的Iterator对象表示的是一个数据流,这个数据流可以看作一个有序序列,但我们不能不知道序列的长度。Iterator的计算是惰性的,只有需要返回下一个数据时它才会计算,它们表示一个惰性计算的序列。
Python的for循环本质上就是通过不断调用next()函数实现的。

阅读全文
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 房东在我租房期间贴房子出租怎么办 额头上毛孔大 还有些黑怎么办 孩子学跳舞老师压的疼怎么办 步步高点读机电池坏了怎么办 电脑连接受限制或无连接怎么办 电脑无线网受限制或无连接怎么办 电脑网络受限制或无连接怎么办 3 证书报考大专证书丢了怎么办 广工期末考试被老师警告了怎么办 我在农村不当队长我能力不够怎么办 我在农村不当队长我当代表怎么办 北京本地人社保中间断了一年怎么办 我想把大哥的孩子带出国要怎么办 美国有亲戚想让孩子出国怎么办 连接温控器的线断了怎么办 植发后好多原生发都脱落了怎么办 4岁宝宝支体能力差怎么办 当与游客发生矛盾时员工怎么办 顾客与同事发生矛盾你该怎么办 当一个人犯下的过错难以原谅怎么办 开车把别人撞成植物人了该怎么办 结婚证丢了孩子上不上学了怎么办 办房产证前加户主姓名怎么办手续 孩子上学户口跟房产不在一起怎么办 我家小孩被别的家长打了怎么办 要是小孩骗家长说老师打他怎么办 孩子在学校被家长打小孩怎么办 小孩在学校被老师打淤青家长怎么办 小孩和家长一吵架就说死怎么办 王者荣耀号被别人家长联接了怎么办 儿子12岁总是跟大人顶嘴怎么办 课堂上有学生和你顶嘴你怎么办 小孩看到大人吵架就哭了 怎么办 五年级的孩子叛逆爱发脾气怎么办 6个月孩子多动怎么办呀 小孩被大人打了很生气该怎么办 小孩在学校调皮被老师打了怎么办 四岁宝宝咳嗽半个月了怎么办 三岁宝宝咳嗽半个月了还不好怎么办 孩子在幼儿园不听话天天罚站怎么办 孩子个性太强脾气太倔不听话怎么办