掌握了python的数据类型,语句和函数,基本上就可以编出很多有用的程序了。

但是在python中,并不是代码越多越好,代码不是越复杂越好,而是越简单越好。

基于这个思想,就引申出python的一些高级特性。

切片

在python中,取list或者是tuple的部分元素是非常常见的操作。

  1. L = ["gege","gege","egye"];
  2. [L[0],L[1],L[2]]

上面这个是一个笨办法,因为扩展一下,取前面n个元素就没办法了。

  1. r = []
  2. n = 3
  3. for i in range(n):
  4. r.append(i)

还有这种经常取指定索引范围的操作,用循环十分繁琐,所以python提供了切片(Slice)操作符,极大的简化这种操作。类似于javascript中的数组的slice方法。

JavaScript数组中的slice方法

它能够基于当前数组中的一个或多个项创建一个新数组。slice()方法可以接受一个或两个参数,即要返回项的起始位置和结束位置。

在只有一个参数的情况下,slice方法返回从该参数指定位置开始到当前数组末尾的所有项。

如果有两个参数,该方法返回起始和结束位置之间的项,但是不包括结束位置的项。

注意:slice方法不会影响原始数组。

对于上面的问题,想要取前面三个元素。直接就用

  1. L[0:3]
  2. //也可以省略0:
  3. L[:3]

类似的,python数组支持负数索引,切片也支持倒数切片,记住倒数第一个元素的索引是-1.

还可以取不连续的数

  1. L = list(range(100));
  2. L[:10] // 前10个数
  3. L[-10:] //后10个数
  4. L[:10:2] //前10个数,每两个取一个
  5. L[:] //原样复制一个list

tuple也是一种list,唯一的区别是tuple不可变,因此tuple也可以使用切片操作,只是操作的结果仍然是tuple。

  1. (0,1,2,3,4)[:3]
  2. //(0,1,2)

字符串‘xxxx’也可以看成是一种list,每个元素就是一个字符,因此字符串也可以做切片,只是操作的结果还是字符串

  1. ffeefg”[:3]

其实其他编程语言对字符串也有很多操作,如substring,目的就是对字符串进行切片,python没有针对字符串的截取函数,只需要一个切片操作就可以完成,非常简单。

迭代

在python中,迭代是通过for... in循环来操作的,不仅可以作用在list或tuple上,还可以作用在其他可迭代对象上。

  1. //dict
  2. d = {'a':1,'b':2,'c':3}
  3. for key in d:
  4. print(key)
  5. for value in d.values():
  6. print(value)
  7. for k,v in d.items():
  8. print(k,v)
  9. //字符串
  10. for ch in 'abc':
  11. print(ch)

使用for循环时,不管是什么数据类型,只要是一个可迭代对象就行,那如何判断是一个可迭代对象呢?

使用collections模块的Iterable类型判断

  1. from collections import Iterable
  2. isinstance('abc',Iterable) //true
  3. # str是否可迭代
  4. isinstance([1,2,3],Iterable) //true
  5. # list是否可迭代
  6. isinstance(123,Iterable) //false
  7. # 整数是否可迭代

Python内置的enumerate函数可以把一个list变成索引-元素对,这样就可以for循环中同时迭代索引和元素本身了。

  1. for i,value in enumerate(['s','ss','sss']):
  2. print(i,value)

列表生成式

  1. [x*x for x in range(1,11)]
  2. //把要生成的元素放在前面
  3. [x*x for x in range(1,11) if x%2 == 0]
  4. //for循环后面还可以加上if判断
  5. [m+n for m in 'ABC' for n in 'XYZ']
  6. //['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']
  7. //可以使用两层循环,生成全排列
  8. 三层以及三层以上就很少用

生成器(generator)

通过列表生成式在列表容量很大的时候就会占用很多空间

所以生成器就派上用场了,一遍循环一遍计算的机制

定义generator的第一种方法,

  1. g = (x * x for x in range(10))
  2. for n in g:
  3. print(n)

创建了一个generator后,基本上永远不会调用next(),而是通过for循环来迭代它,并且不需要关心StopIteration的错误

著名的斐波拉契数列

定义generator的第二种方法


  1. def fib(max):
  2. n,a,b = 0,0,1
  3. while n < max:
  4. // print(b)
  5. yield b
  6. a,b = b,a+b
  7. n = n + 1

将上面的print(b)改成yield b,就是一个generator。

Python的高级特性(切片,迭代,生成器,迭代器)的更多相关文章

  1. python的高级特性:切片,迭代,列表生成式,生成器,迭代器

    python的高级特性:切片,迭代,列表生成式,生成器,迭代器 #演示切片 k="abcdefghijklmnopqrstuvwxyz" #取前5个元素 k[0:5] k[:5] ...

  2. Python 高级特性介绍 - 迭代的99种姿势 与协程

    Python 高级特性介绍 - 迭代的99种姿势 与协程 引言 写这个笔记记录一下一点点收获 测试环境版本: Python 3.7.4 (default, Sep 28 2019, 16:39:19) ...

  3. Python的高级特性8:你真的了解类,对象,实例,方法吗

    Python的高级特性1-7系列是本人从Python2过渡3时写下的一些个人见解(不敢说一定对),接下来的系列主要会以类级为主. 类,对象,实例,方法是几个面向对象的几个基本概念,其实我觉得很多人并不 ...

  4. Python的高级特性7:闭包和装饰器

    本节跟第三节关系密切,最好放在一起来看:python的高级特性3:神奇的__call__与返回函数 一.闭包:闭包不好解释,只能先看下面这个例子: In [23]: def outer(part1): ...

  5. Python高级特性(切片,迭代,列表生成式,生成器,迭代器)

    掌握了Python的数据类型.语句和函数,基本上就可以编写出很多有用的程序了. 比如构造一个1, 3, 5, 7, ..., 99的列表,可以通过循环实现: L = [] n = 1 while n ...

  6. Python 高级特性之:生成器(generator)和迭代器(Iterator)

    前言: 之前学习Python自动化,接触了不少python的学习,对生成器印象尤其深,网上也看了很多介绍,下面主要是这些概念的个人学习整理(如侵删). 正文: 如要创建一个非常大的列表,受到内存限制, ...

  7. python函数高级特性

    掌握了Python的数据类型.语句.函数,基本可以编写出很多有用的程序了.但是Python中,代码不是越多越好,而是越少越好.代码不是越复杂越好,而是越简单越好.基于这一思想,我们来介绍python中 ...

  8. Learning Python 011 高级特性 2

    Python 高级特性 2 列表生成式 列表生成式就是指类似这样的代码:[x for x in range(1, 11)] >>> L = [x for x in range(1, ...

  9. Learning Python 011 高级特性 1

    Python 高级特性 1 切片 将L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack']列表中前上个3个元素: L = ['Michael', 'Sarah ...

随机推荐

  1. caffe Python API 之 数据输入层(Data,ImageData,HDF5Data)

    import sys sys.path.append('/projects/caffe-ssd/python') import caffe4 net = caffe.NetSpec() 一.Image ...

  2. System.getProperty方法中输出路径的方法

    package codegenerator;/** *@author Eilen *@date 2017年9月27日---下午3:15:09 *@描述: *@answer */public class ...

  3. Struts2学习笔记02 之 使用

    一.页面向Action传参 1.基本属性注入,页面命名name,action提供成员变量name并提供set方法. 2.域模型注入:页面用user.name对象点属性形式.action成员user对象 ...

  4. linux命令(46):chgrp命令

    在lunix系统里,文件或目录的权限的掌控以拥有者及所诉群组来管理.可以使用chgrp指令取变更文件与目录所属群组,这种方式采用群组名称或群组识别码都可以.Chgrp命令就是change group的 ...

  5. LeetCode解题报告—— Longest Valid Parentheses

    Given a string containing just the characters '(' and ')', find the length of the longest valid (wel ...

  6. Django-form組件補充

    自定义验证规则 方法一: 1 2 3 4 5 6 7 8 9 10 from django.forms import Form   from django.forms import widgets f ...

  7. 一个前端资源站 http://www.bootcss.com/

    http://www.bootcss.com/ 里面有w3schools原版的镜像网站地址: https://www.quanzhanketang.com/ 这个网站正常版本被墙了,可以通过这个镜像访 ...

  8. Vuex ~ 初识

    状态:data中的属性需要共享给其他vue组件使用的部分(即data中需要共用的属性)   1.初识vuex直接来个小demo 下面操作都是基于vue-cli,如果不了解先学习下vue-cli 利用n ...

  9. Thinking in java基础之集合框架(转载)

    集合简介(容器)把具有相同性质的一类东西,汇聚成一个整体,就可以称为集合,例如这里有20个苹果,我们把每一个苹果当成一个东西(一个对象),然后我们借用袋子把这20个苹果装起来,而这个袋子就是集合(也叫 ...

  10. python 编码处理

    # -*- coding: utf-8 -*-import easygui as gimport sysreload(sys)sys.setdefaultencoding('utf-8')