Python入门-03 高级特性
Posted 快乐崇拜234
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python入门-03 高级特性相关的知识,希望对你有一定的参考价值。
正文在下面,先打个广告:
切片
类似于java里的split
废话不多说,上代码
a = list(range(20))
print(a)
print(a[0:10])
print(a[2:10])
print(a[:10]) # 前面是0可以省略
print(a[:]) # 完整复制一份
print(a[-10:-3]) # 允许倒着数,不过倒着数最后一个索引是-1.正在数第一个索引是0
结果:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
[10, 11, 12, 13, 14, 15, 16]
list和tuple、字符串都可以这样操作
迭代
a = [1,2,3,4]
for i in a:
print(i)
# enumerate 将list变成索引-value的格式,可以方便查看索引
for i, value in enumerate(a):
print('a[', i, ']=', value)
a = (1,2,3,4)
for i in a:
print(i)
a = "a":"aa", "b":"bb", "c":"cc"
for x, y in a.items():
print(x, '=', y)
for i in 'abcd':
print(i)
for x, y in [(1, 1), (2, 4), (3, 9)]:
print(x, y)
#校验类型,是否支持迭代
from collections import Iterable
print(isinstance('', Iterable))
print(isinstance((), Iterable))
列表生成式
print([x*x for x in range(10)])
print([x*x for x in range(10) if x%2==0]) # if过滤
a = "a":"aa","b":"bb"
print([key + '=' + value for key ,value in a.items()])
#全排列
print([m+n for m in 'abc' for n in 'ABC'])
结果:
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
[0, 4, 16, 36, 64]
['b=bb', 'a=aa']
['aA', 'aB', 'aC', 'bA', 'bB', 'bC', 'cA', 'cB', 'cC']
##生成器
当数据量特别大的时候,创建list或tuple就会占用很大的内存,生成器
generator
正好解决这个问题,一边循环,一边计算
####简单实现方式
print([x for x in range(10)]) # 列表生成式
print((x for x in range(10))) # 生成器generator
结果:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
<generator object <genexpr> at 0x0000000000A4C570>
可以使用for迭代器来进行遍历数据:
a = (x for x in range(10));
for i in a:
print(i)
将函数定义为生成器
著名的斐波拉契数列(Fibonacci),除第一个和第二个数外,任意一个数都可由前两个数相加得到:
1, 1, 2, 3, 5, 8, 13, 21, 34, …
斐波拉契数列用列表生成式写不出来,但是,用函数把它打印出来却很容易:
# 打印出斐波拉契数列的前N个数
#0,1,1,2,3,5,8,13
def fibonacci(n):
index = 0;
a = 0
b = 1
while index < n:
print(b);
temp = a;
a = b;
b = temp + b;
index = index + 1
fibonacci(10)
下面将函数fibonacci
变成generator,只需要把print(b)
改为yield b
就可以了:
# 打印出斐波拉契数列的前N个数
#0,1,1,2,3,5,8,13
def fibonacci(n):
index = 0
a = 0
b = 1
while index < n:
yield (b)
temp = a
a = b
b = temp + b
index = index + 1
print(fibonacci(10))
print([i for i in fibonacci(10)])
for i in fibonacci(10):
print(i)
可见输出结果为:<generator object fibonacci at 0x00000000006CC570>
,是一个生成式。可以用
for i in aa: print(i)
这种方式迭代输出
这里,最难理解的就是generator和函数的执行流程不一样。函数是顺序执行,遇到
return
语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用next()
的时候执行,遇到yield
语句返回,再次执行时从上次返回的yield
语句处继续执行。
迭代器
这些可以直接作用于for
循环的对象统称为可迭代对象:Iterable
。
- 一类是集合数据类型,如
list
、tuple
、dict
、set
、str
等; - 一类是
generator
,包括生成器和带yield
的generator function。
可以使用isinstance()
判断一个对象是否是Iterable
对象。
可以被next()
函数调用并不断返回下一个值的对象称为迭代器:Iterator
。
生成器都是Iterator
对象,但list
、dict
、str
虽然是Iterable
,却不是Iterator
。
把list
、dict
、str
等Iterable
变成Iterator
可以使用iter()
函数:
from collections import Iterator,Iterable
print(isinstance("asdfas", Iterator))
print(isinstance(iter("asdfas"), Iterator))
print(isinstance("asdfas", Iterable))
print(isinstance([], Iterable))</pre>
结果;
False
True
True
True
以上是关于Python入门-03 高级特性的主要内容,如果未能解决你的问题,请参考以下文章