Python的高级特性(切片,迭代,生成器,迭代器)
掌握了python的数据类型,语句和函数,基本上就可以编出很多有用的程序了。
但是在python中,并不是代码越多越好,代码不是越复杂越好,而是越简单越好。
基于这个思想,就引申出python的一些高级特性。
切片
在python中,取list或者是tuple的部分元素是非常常见的操作。
L = ["gege","gege","egye"];
[L[0],L[1],L[2]]
上面这个是一个笨办法,因为扩展一下,取前面n个元素就没办法了。
r = []
n = 3
for i in range(n):
r.append(i)
还有这种经常取指定索引范围的操作,用循环十分繁琐,所以python提供了切片(Slice)操作符,极大的简化这种操作。类似于javascript中的数组的slice方法。
JavaScript数组中的slice方法
它能够基于当前数组中的一个或多个项创建一个新数组。slice()方法可以接受一个或两个参数,即要返回项的起始位置和结束位置。
在只有一个参数的情况下,slice方法返回从该参数指定位置开始到当前数组末尾的所有项。
如果有两个参数,该方法返回起始和结束位置之间的项,但是不包括结束位置的项。
注意:slice方法不会影响原始数组。
对于上面的问题,想要取前面三个元素。直接就用
L[0:3]
//也可以省略0:
L[:3]
类似的,python数组支持负数索引,切片也支持倒数切片,记住倒数第一个元素的索引是-1.
还可以取不连续的数
L = list(range(100));
L[:10] // 前10个数
L[-10:] //后10个数
L[:10:2] //前10个数,每两个取一个
L[:] //原样复制一个list
tuple也是一种list,唯一的区别是tuple不可变,因此tuple也可以使用切片操作,只是操作的结果仍然是tuple。
(0,1,2,3,4)[:3]
//(0,1,2)
字符串‘xxxx’也可以看成是一种list,每个元素就是一个字符,因此字符串也可以做切片,只是操作的结果还是字符串
“ffeefg”[:3]
其实其他编程语言对字符串也有很多操作,如substring,目的就是对字符串进行切片,python没有针对字符串的截取函数,只需要一个切片操作就可以完成,非常简单。
迭代
在python中,迭代是通过for... in循环来操作的,不仅可以作用在list或tuple上,还可以作用在其他可迭代对象上。
//dict
d = {'a':1,'b':2,'c':3}
for key in d:
print(key)
for value in d.values():
print(value)
for k,v in d.items():
print(k,v)
//字符串
for ch in 'abc':
print(ch)
使用for循环时,不管是什么数据类型,只要是一个可迭代对象就行,那如何判断是一个可迭代对象呢?
使用collections模块的Iterable类型判断
from collections import Iterable
isinstance('abc',Iterable) //true
# str是否可迭代
isinstance([1,2,3],Iterable) //true
# list是否可迭代
isinstance(123,Iterable) //false
# 整数是否可迭代
Python内置的enumerate函数可以把一个list变成索引-元素对,这样就可以for循环中同时迭代索引和元素本身了。
for i,value in enumerate(['s','ss','sss']):
print(i,value)
列表生成式
[x*x for x in range(1,11)]
//把要生成的元素放在前面
[x*x for x in range(1,11) if x%2 == 0]
//for循环后面还可以加上if判断
[m+n for m in 'ABC' for n in 'XYZ']
//['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']
//可以使用两层循环,生成全排列
三层以及三层以上就很少用
生成器(generator)
通过列表生成式在列表容量很大的时候就会占用很多空间
所以生成器就派上用场了,一遍循环一遍计算的机制
定义generator的第一种方法,
g = (x * x for x in range(10))
for n in g:
print(n)
创建了一个generator后,基本上永远不会调用next(),而是通过for循环来迭代它,并且不需要关心StopIteration的错误
著名的斐波拉契数列
定义generator的第二种方法
def fib(max):
n,a,b = 0,0,1
while n < max:
// print(b)
yield b
a,b = b,a+b
n = n + 1
将上面的print(b)改成yield b,就是一个generator。
Python的高级特性(切片,迭代,生成器,迭代器)的更多相关文章
- python的高级特性:切片,迭代,列表生成式,生成器,迭代器
python的高级特性:切片,迭代,列表生成式,生成器,迭代器 #演示切片 k="abcdefghijklmnopqrstuvwxyz" #取前5个元素 k[0:5] k[:5] ...
- Python 高级特性介绍 - 迭代的99种姿势 与协程
Python 高级特性介绍 - 迭代的99种姿势 与协程 引言 写这个笔记记录一下一点点收获 测试环境版本: Python 3.7.4 (default, Sep 28 2019, 16:39:19) ...
- Python的高级特性8:你真的了解类,对象,实例,方法吗
Python的高级特性1-7系列是本人从Python2过渡3时写下的一些个人见解(不敢说一定对),接下来的系列主要会以类级为主. 类,对象,实例,方法是几个面向对象的几个基本概念,其实我觉得很多人并不 ...
- Python的高级特性7:闭包和装饰器
本节跟第三节关系密切,最好放在一起来看:python的高级特性3:神奇的__call__与返回函数 一.闭包:闭包不好解释,只能先看下面这个例子: In [23]: def outer(part1): ...
- Python高级特性(切片,迭代,列表生成式,生成器,迭代器)
掌握了Python的数据类型.语句和函数,基本上就可以编写出很多有用的程序了. 比如构造一个1, 3, 5, 7, ..., 99的列表,可以通过循环实现: L = [] n = 1 while n ...
- Python 高级特性之:生成器(generator)和迭代器(Iterator)
前言: 之前学习Python自动化,接触了不少python的学习,对生成器印象尤其深,网上也看了很多介绍,下面主要是这些概念的个人学习整理(如侵删). 正文: 如要创建一个非常大的列表,受到内存限制, ...
- python函数高级特性
掌握了Python的数据类型.语句.函数,基本可以编写出很多有用的程序了.但是Python中,代码不是越多越好,而是越少越好.代码不是越复杂越好,而是越简单越好.基于这一思想,我们来介绍python中 ...
- Learning Python 011 高级特性 2
Python 高级特性 2 列表生成式 列表生成式就是指类似这样的代码:[x for x in range(1, 11)] >>> L = [x for x in range(1, ...
- Learning Python 011 高级特性 1
Python 高级特性 1 切片 将L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack']列表中前上个3个元素: L = ['Michael', 'Sarah ...
随机推荐
- promise 如何知道所有的回调都执行完了?
var fs = require('fs'); /** * @return {object} Promise */ function doThing(fileName) { // ... // con ...
- Linux内核中内存cache的实现【转】
Linux内核中内存cache的实现 转自:http://blog.chinaunix.net/uid-127037-id-2919545.html 本文档的Copyleft归yfydz所有,使用 ...
- GitHub创建项目入门学习
第一次创建git项目注意事项还是挺多了,这里就写个操作步骤,方便以后查看. 网页部分 1.打开自己的主页,点击“New repository”创建远程仓库. 2.填写信息 本地部分 前提: 下载git ...
- C 实现有追求的线程池 后续
引言 -_- 还是老套路开局 很久以前写过一个有追求的线程池 -> C 实现有追求的线程池 探究 讲述的是一种思路, 并且实现了. 可以一用. 最近在详细搞simplec 框架. 准备发布个正式 ...
- UCenter创始人、Discuz!创始人、管理员账号的认知(转)
UCenter创始人.Discuz!创始人.管理员账号的认知 什么是创始人?现在可能还有好多的站长对这个概念有点模糊,今天我给大家屡屡思路,讲讲这个概念性问题,没啥技术含量.已经明白这个概 ...
- poj 3264(RMQ或者线段树)
Balanced Lineup Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 42929 Accepted: 20184 ...
- 从徐飞的文章《Web应用的组件化开发(一)中窥视web应用开发的历史
Web应用的组件化开发(一) 原文来自 徐飞 基本思路 1. 为什么要做组件化? 无论前端也好,后端也好,都是整个软件体系的一部分.软件产品也是产品,它的研发过程也必然是有其目的.绝大多数软件产品是追 ...
- 让你完全理解Base-64是怎么回事
HTTP将BASE64-编码用于基本认证和摘要认证,在几种HTTP扩展中也使用了该编码. Base-64编码保证了二进制数据的安全 Base-64编码可以将任意一组字节转换为较长的常见文本字符序列,从 ...
- lr_Analysis Options选项介绍
- NoSQL 数据库应用
类型 部分代表 特点 列存储 Hbase Cassandra Hypertable 顾名思义,是按列存储数据的.最大的特点是方便存储结构化和半结构化数据,方便做数据压缩,对针对某一列或者某几列的查 ...