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

  • 一类是集合数据类型,如listtupledictsetstr等;
  • 一类是generator,包括生成器和带yield的generator function。

可以使用isinstance()判断一个对象是否是Iterable对象。

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

生成器都是Iterator对象,但listdictstr虽然是Iterable,却不是Iterator

listdictstrIterable变成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 高级特性的主要内容,如果未能解决你的问题,请参考以下文章

Python实用笔记 (11)高级特性——迭代器

深入java虚拟机-jvm高级特性和实战

Java入门 - 高级教程 - 03.泛型

Java入门 - 高级教程 - 03.泛型

MySQL从入门到精通高级篇(三十)记一次mysql5.7的新特性derived_merge的坑

MySQL从入门到精通高级篇(三十)记一次mysql5.7的新特性derived_merge的坑