【python3的学习之路八】高级特性

切片

举出一个list的例子

L = list(range(100))

如何取前三个元素?

L[0:3] # 从索引0开始取,直到索引3为止,但不包括索引3。即索引0,1,2,正好是3个元素。
L[:3]  #如果第一个索引是0,还可以省略

其他情况

L[-10:]  # 后10个元素
L[:10:2] # 前10个数,每俩个取一个
L[::5]   # 所有数,每5个取一个
L[:]     # 不变

截取一部分的字符串并与其他字符串拼接

var1 = ‘Hello World!‘

print ("拼接字符串 : ", var1[:6] + ‘Python!‘)

迭代

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

在python中,迭代是通过 for…in 来完成的。

# Python内置的enumerate函数可以把一个list变成索引-元素对,这样就可以在for循环中同时迭代索引和元素本身
for i, value in enumerate([‘A‘, ‘B‘, ‘C‘]):
     print(i, value)

for x, y in [(1, 1), (2, 4), (3, 9)]:
     print(x, y)

因为dict的存储不是按照list的方式顺序排列,所以,迭代出的结果顺序很可能不一样。

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

>>> d = {‘a‘: 1, ‘b‘: 2, ‘c‘: 3}
>>> for key in d:
...     print(key)
...
a
c
b

列表生成式

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

[x * x for x in range(1, 11)]
# [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
[x * x for x in range(1, 11) if x % 2 == 0]
# [4, 16, 36, 64, 100]
[m + n for m in ‘ABC‘ for n in ‘XYZ‘]
# [‘AX‘, ‘AY‘, ‘AZ‘, ‘BX‘, ‘BY‘, ‘BZ‘, ‘CX‘, ‘CY‘, ‘CZ‘]

迭代器

迭代器是一个可以记住遍历的位置的对象。

迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。

迭代器有两个基本的方法:iter() 和 next()。

mylist = [1, 2, 3,  4, 5, 6, 7]
it = iter(mylist)
print(next(it))

把一个类作为一个迭代器使用需要在类中实现俩个方法__iter__()与__next__()。

  • iter()方法返回一个特殊的迭代器对象,这个迭代器对象实现了__next__()方法并通过StopIteration异常标识迭代的完成
  • next()方法会返回下一个迭代器对象
class MyNumbers:
    def __iter__(self):
        self.a = 1
        return self

    def __next__(self):
        x = self.a
        self.a += 1
        return x

myclass = MyNumbers()
myiter = iter(myclass)

print(next(myiter))
print(next(myiter))

StopIteration

StopIteration异常用于标识迭代的完成,防止出现无限循环的情况,在 next() 方法中我们可以设置在完成指定循环次数后触发 StopIteration 异常来结束迭代。

fetch = iter(seq)
while True:
    try:
        i=fetch.next()
    except StopIteration:
        break
    do_something_to(i)

生成器

如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator,yield是生成器实现__next__()方法的关键。

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

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

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

g = (x * x for x in range(10))
for n in g:
    print(n)

yield的功能:

  • 相当于函数封装好__iter__和__next__
  • return只能返回一次值,函数就终止了,而yield内部时一个状态机,维护着挂起和继续的状态

生成器函数

常规函数定义,但是,使用yield语句而不是return语句返回结果。yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次重它离开的地方继续执行。

import sys

def fibonacci(n): # 生成器函数 - 斐波那契
    a, b, counter = 0, 1, 0
    while True:
        if (counter > n):
            return
        yield a
        a, b = b, a + b
        counter += 1
f = fibonacci(10) # f 是一个迭代器,由生成器返回生成

while True:
    try:
        print (next(f), end=" ")
    except StopIteration:
        sys.exit()

3分钟理清可迭代、迭代器、生成器的概念,掌握Python3中迭代器的使用方法

原文地址:https://www.cnblogs.com/CSgarcia/p/9706112.html

时间: 2024-10-21 13:34:43

【python3的学习之路八】高级特性的相关文章

AT&amp;T学习笔记汇编之高级特性

高级特性: SIMD    single instruction multiple  data 单指令多数据 SIMD扩展  Streaming SIMD Extension    (SSE) 流化扩展第二实现  SSE2 第三    SSE3 MMX   对整数执行SIMD操作 64位打包字节,字,双字整数, MMx  0-7    映射到FPU寄存器R0-7 使用FSAVE,FXSAVE指令将FPU寄存器保存到内存中,防止和浮点指令混淆. SSE主要对浮点数执行SIMD操作.128位打包的单

mysql学习之路_高级数据操作

关系 将实体与实体的关系,反应到最终数据表的设计上来,将关系分为三种,一对多,多对多,多对多. 所有关系都是表与表之间的关系. 一对一: 一张表的一条记录一定只对应另外一张表的一条记录,反之亦然. 例 Id 姓名 性别 年龄 电话号码 1 张三 男 23 13320848263 一对多 一张表中有一条记录,对应另一张表多条记录但是反过来,另一张表的一条记录只能对应这张表的一条记录. 例母亲与孩子的关系 多对多 一张表中的一条记录对应另外一张表的多条记录,同时另一张表的一条记录对应另外一张表的多条

【python3的学习之路二】数据类型和变量

整数 python可以处理任意大小的整数(包括负整数),如100,0,-8080等. 浮点数 浮点数也就是小数,如1.23,-9.01等.但对于很大或很小的浮点数,就必须用科学计数法表示,把10用e代替,1.23*109就是1.23e9,0.000012可以写成1.2e-5. 字符串 字符串是以单引号或双引号括起来的任意文本.如果字符串内部既包含'又包含"怎么办?可以用转义字符\来标识,如果你不想让反斜杠发生转义,可以在字符串前面添加一个 r,表示原始字符串. print('I\'m \&quo

【python3的学习之路三】字符串和编码

字符串编码 由于计算机是美国人发明的,因此,最早只有127个字符被编码到计算机里,也就是大小写英文字母.数字和一些符号,这个编码表被称为ASCII编码,比如大写字母A的编码是65,小写字母z的编码是122. 但是要处理中文显然一个字节是不够的,至少需要两个字节,而且还不能和ASCII编码冲突,所以,中国制定了GB2312编码,用来把中文编进去. 但是全世界有上百种语言,各国有各国的标准就,会不可避免地出现冲突,结果就是,在多语言混合的文本中,显示出来会有乱码.因此,Unicode应运而生.Uni

python3.5学习之路_day1_用户登录

1 #!/usr/bin/env python 2 #_*_coding:utf-8_*_ 3 #by anthor zhangxiaoyu 2017-01-10 4 #blog:http://www.cnblogs.com/gushiren/ 5 6 import getpass 7 username = "zhangxiaoyu" 8 password = "www.123" 9 count = 3 10 for i in range(3): 11 userna

Scala学习(二)——高级特性

apply() 方法 apply方法是Scala提供的一个语法糖 类名+括号,调用对象的apply方法 对象名+括号,调用类的apply方法 对apply方法的简单测试:(其中,带 new -- class ApplyTest,不带 new -- object ApplyTest) class ApplyTest { println("class ApplyTest") def apply() { println("class APPLY method") } }

【python3的学习之路一】输入和输出

标识符 第一个字符必须是字母或下划线 标识符的其他的部分由字母.数字和下划线组成 标识符对大小写敏感 Python保留字 即关键字,不能把它们用作任何标识符名称 >>> import keyword >>> keyword.kwlist ['False', 'None', 'True', 'and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except',

【python3的学习之路九】函数式编程

变量作用域 变量的作用域决定了在哪一部分程序可以访问哪个特定的变量名称.Python的作用域一共有4种,分别是: L (Local) 局部作用域 E (Enclosing) 闭包函数外的函数中 G (Global) 全局作用域 B (Built-in) 内建作用域 以 L –> E –> G –>B 的规则查找,即:在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,再者去内建中找. x = int(2.9) # 内建作用域 g_count = 0 # 全局作用域 de

【python3的学习之路十四】IO编程

File(文件) 方法 file 对象使用 open 函数来创建 file.close() 关闭文件.关闭后文件不能再进行读写操作. file.flush() 刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入. file.fileno() 返回一个整型的文件描述符(file descriptor FD 整型), 可以用在如os模块的read方法等一些底层操作上. file.isatty() 如果文件连接到一个终端设备返回 True,否则返回 False. f