Python 中的高级特性

切片
在一个list或者tuple取得一个元素很容易,比如:
这样是低效率的方法,如果有n 个元素呢?一个个这样取就会很慢且很蠢,不过好在Python提供了切片(Slice)操作符,能大大简化这种操作
记住倒数的第一位数是 -1
通过这种方法我们可以轻松的将字符串里面的空格清除,例如要清除 Hello World Hello World 中的空格,我们可以这样:
值得注意的是 tuple也是可以进行切片的,但是切片后仍然是tuple,不可变的
字符串也可以进行切片,比如 'ABCDEFG',我们对它进行切片 'ABCDEFG'[:3] 返回的是 ABC 也可以跳一个字符 'ABCDEFG'[::2] 返回的是 ACEG
迭代
如果给定一个 list或者 tuple我们可以用 for来循环打印,这个就是迭代。不过在Python中并不仅仅只有这两个可以迭代, dict 也可以进行迭代。
不过默认情况下, dict迭代的是 key,而不是 value,如果要对value进行迭代,可以使用 for value in dict.values(),要同时迭代 key 和 value,可以使用 for k, v in dict.items()
当然,字符串也是可迭代的对象:
利用Python的迭代,我们可以实现一个简单的寻找一个 列表里面的最大值和最小值:
| |
列表生成式
如果我们要生成 1-100的数我们可以使用 list(range(1,101)) ,但是如果我们想生成 [1x1, 2x2, 3x3, ..., 100x100] 要怎么做,很多人会想到使用循环,但是这样太麻烦了,我们可以这样:
| |
写列表生成式之前把要生成的元素 x * x放在前面,这样非常迅速就能生成出我们想要的列表。
我们也能使用两层循环,比如
它也可以用 lower() 把列表里面的字母改成小写,例如:
在这个例子里面,我们使用 if isinstance(s,str) 来判断是不是字符串,如果不是就跳过,当然不加这个判断就会报错
生成器
通过列表生成式我们可以轻松的创建一个列表,但是内存始终是有限的,如果列表元素可以通过某种方法推演出来,是不是就极大的节省了内存?
在python这种机制叫做生成器(generator),只需要把列表生成式里面的 [] 改成 () 就行了
两种的区别就是 l 会生成一段列表,而 g 会生成 <generator object <genexpr> at 0x1022ef630>
要打印出 g的值可以使用 next() ,不过我们不会经常使用这样的方式,常常用 for 进行迭代,generator也是可迭代对象,因为用 next() 后,如果后面的元素已经没有了,就会出现 StopIteration 报错
例如:
这是一个斐波拉契数列,除第一个和第二个数外,任意一个数都可由前两个数相加得到
我们使用 fib(6) 就可以生成前6个数,这离生成器只剩下一步之遥,我们只需要把 print(b) 改成 yield(b)
我们使用 fib(6) 就会返回 <generator object fib at 0x104852ce0>
如果我们要打印出 fib(6) 怎么办呢?答案肯定是用 for循环
或者用 next(),但是需要生成一个generator对象:
但是这样我们会拿不到返回值,我们可以使用 break 语句解决
参考资料 廖雪峰的Python教程 PDF 下载链接