Python基础(冒泡、生成器、迭代器、列表与字典解析)
一、冒泡算法
冒泡算法,给定一组数据,从大到小排序或者从小到大排序,就像气泡一样
原理: 相邻的两个对象相比,大的放到后面,交换位置
- 交换位置通过a,b=b,a来实现
1、我们可以通过for循环来根据下标(index)取值:
li = [13,22,6,99,11]for i in xrange(len(li)): print i,li[i] 结果: 0 13 1 22 2 6 3 99 4 112、如何将上述的li列表的每两个对象进行排序,大的放到后面 (交换位置) :
for num in xrange(len(li)-1): #第1次排序,用5个元素,最大的99放到后面 if li[num] > li[num+1]: li[num],li[num+1] = li[num+1],li[num] 结果:print li[13, 6, 22, 11, 99] for num in xrange(len(li)-2): #第2次排序,用4个元素,最大的22放到后面 if li[num] > li[num+1]: li[num],li[num+1] = li[num+1],li[num] 结果:print li[6, 13, 11, 22, 99] for num in xrange(len(li)-3): #第3次排序,用3个元素,最大的13放到后面 if li[num] > li[num+1]: li[num],li[num+1] = li[num+1],li[num]结果:print li [6, 11, 13, 22, 99] for num in xrange(len(li)-4): #第4次排序,用2两个元素进行排序,最大的11放到后面 if li[num] > li[num+1]: li[num],li[num+1] = li[num+1],li[num]结果:print li[6, 11, 13, 22, 99]所以上面的1,2,3,4就是次数,可以利用for循环来构建次数:
for m in xrange(1,len(li)): #用一个循环来构造上面的次数 for num in xrange(len(li)-m): if li[num] > li[num+1]: li[num],li[num+1] = li[num+1],li[num] 结果: print li [6, 11, 13, 22, 99]或者用sorted函数直接排序:
结果: print sorted(li) [6, 11, 13, 22, 99]小结:
- 每相邻的两个对象比较,交换位置
- 如果一个对象的元素个数有n个(通过len函数计算),就需要比n-1次
- sorted函数也可以直接从小到到大排序
二、列表解析、字典解析
1、列表解析是Python中强大的生成式,性能比for循环高
用法:
- [expr for iter_var in iterable]
- [expr for iter_var in iterable if cond_expr]
每个数相加:
l = [x + x for x in range(1,11)] print l [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
求1-10之间的偶数
l1 = [x for x in range(1,11) if x % 2 == 0 ] print l1
求1-10之间的奇数
l2 = [x for x in range(1,11) if x %2 == 1] print l2 [1, 3, 5, 7, 9]
嵌套
L3 = [m + n for m in 'abcd' for n in 'abcd'] print L3 ['aa', 'ab', 'ac', 'ad', 'ba', 'bb', 'bc', 'bd', 'ca', 'cb', 'cc', 'cd', 'da', 'db', 'dc', 'dd']
生成sda..sdz
>>> import string >>> ['sd'+ letter for letter in string.lowercase] ['sda', 'sdb', 'sdc', 'sdd', 'sde', 'sdf', 'sdg', 'sdh', 'sdi', 'sdj', 'sdk', 'sdl', 'sdm', 'sdn', 'sdo', 'sdp', 'sdq', 'sdr', 'sds', 'sdt', 'sdu', 'sdv', 'sdw', 'sdx', 'sdy', 'sdz']
列出当前所有的进程,等同于top看到进程总数
>>> [ pid for pid in os.listdir('/proc') if pid.isdigit() ] ['] >>>
列出当前目录下面所有以.txt后缀的文件
[file for file in os.listdir(os.getcwd()) if file.endswith('.txt')]
将[]变成()将返回一个生成器(generator)对象,可以通过next()、for循环访问对象
L4 = (m * n for m in range(1,6) for n in range(1,6)) print L4 <generator object <genexpr> at 0x000000000246A630> #generator对象 for i in L4: print i, 1 2 3 4 5 2 4 6 8 10 3 6 9 12 15 4 8 12 16 20 5 10 15 20 25
2、字典解析
字典也可以推导,只需将[]换成{}:
dic1 = {x: x * x for x in range(1,11)} print dic1 {1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81, 10: 100}
三、生成器、迭代器
生成器是实现迭代器的一种方式,感觉差不多但又有点区别, 反正特点就是迭代
1、迭代器
迭代器仅是一容器对象,它实现了迭代器协议。是访问集合的一种方式:
- 通过next()方法直到抛出异常StopIteration,
- 通过for循环来取值会自动解决异常,用for语句遍历时会自动的通过__iter__()方法来获得迭代器对象,并且通过next()方法来获取下一个元素
特点:
- 仅需要通过next()方法取值直到抛出异常
- 迭代器只能前进而不能后退、不能随机
- 便于循环比较大的数据集合, 节省内存
iterator、itertable区别:
- itertable是可迭代的对象,list、str、dict、tuple都可以通过for循环进行迭代,这种是可迭代的对象
- iterator是迭代器,可以通过next()方法并不断返回下一个值的对象称为迭代器
- itertable可以通过iter()方法变成itertable
1、可以通过iter方法构建一个itertator(所有的Iterable可以通过iter()来转变为Iterator)
t = (1,2,3) l = [1,2,3] d = {1:'zhang',2:'li',3:'wang'} print iter(t) print iter(l) print iter(d) <tupleiterator object at 0x000000000256DB70> <listiterator object at 0x000000000256DB70> <dictionary-keyiterator object at 0x0000000002556CC8>//可以看到可被迭代的对象都可以变成一个迭代器
2、通过next()方法访问直到抛出异常
t = iter((1,2,3)) print t.next() 1 print t.next() 2 print t.next() 3 print t.next() #异常 StopIteration
2、生成器
一个函数调用时返回一个迭代器,那这个函数就叫做生成器(generator),如果函数中包含yield语法,那这个函数就会变成生成器函数
- xrange()是生成器,range()不是生成器
- open('filename')是生成器,而readlines不是生成器
xrange与range区别:
range直接在内存里面生成数据,而xrange是当迭代访问的时候才有数据,相比节省内存。能用xrange()就不要用range()
>>> a = range(10) >>> b = xrange(10) >>> a [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> b xrange(10)xrange()只有通过for循环迭代
>>> for i in b: ... print i, ... 0 1 2 3 4 5 6 7 8 9//在python3中没有xrange,只有range. 等同于python2中的xrange
总结:
冒泡算法:
- 原理是比较相邻两个元素,大的放到后面,交换位置,即a,b = b,a
- 如果一个序列的个数是n个,需要匹配n-1次
列表、字典解析:
- 简单的表述,性能更好
生成器、迭代器:
- 可以通过next()、for循环的方法取出元素
- iter()方式生成迭代器, itertable是可迭代的对象,iterator是迭代器
- itertable对象可以通过iter()方法生成iterator
Python基础(冒泡、生成器、迭代器、列表与字典解析)的更多相关文章
- python基础(八)生成器,迭代器,装饰器,递归
生成器 在函数中使用yield关键字就会将一个普通的函数变成一个生成器(generator),普通的函数只能使用return来退出函数,而不执行return之后的代码.而生成器可以使用调用一个next ...
- Python基础(二) —— 字符串、列表、字典等常用操作
一.作用域 对于变量的作用域,执行声明并在内存中存在,该变量就可以在下面的代码中使用. 二.三元运算 result = 值1 if 条件 else 值2 如果条件为真:result = 值1如果条件为 ...
- python基础(14):生成器、列表推导式
1. 生成器 什么是⽣成器?⽣成器实质就是迭代器. 在python中有三种⽅式来获取⽣成器: 1. 通过⽣成器函数 2. 通过各种推导式来实现⽣成器 3. 通过数据的转换也可以获取⽣成器 ⾸先,我们先 ...
- python基础之生成器迭代器
1 生成器: 为什么要有生成器? 就拿列表来说吧,假如我们要创建一个list,这个list要求格式为:[1,4,9,16,25,36……]这么一直持续下去,直到有了一万个元素的时候为止.如果我们要创建 ...
- Python基础(2)——列表、字典、数据运算
1.列表 #创建列表 name_list = ['alex', 'seven', 'eric'] #或 name_list = list(['alex', 'seven', 'eric']) #访问列 ...
- python基础(二)列表与字典
列表list-数组stus=['苹果','香蕉','橘子','红枣',111.122,]# 下标 0 1 2 3 4#下标,索引,角标#print(stus[4]) #st=[]#空list#st=l ...
- python基础(二)-- 列表、字典、集合、字符串操作
4.列表: 基本操作: 索引 切片 追加 删除 长度 切片 循环 包含 import copy i=0 #persons=['dailaoban','xiekeng',['age',100,50],' ...
- python高级之生成器&迭代器
python高级之生成器&迭代器 本机内容 概念梳理 容器 可迭代对象 迭代器 for循环内部实现 生成器 1.概念梳理 容器(container):多个元素组织在一起的数据结构 可迭代对象( ...
- 第三篇:python高级之生成器&迭代器
python高级之生成器&迭代器 python高级之生成器&迭代器 本机内容 概念梳理 容器 可迭代对象 迭代器 for循环内部实现 生成器 1.概念梳理 容器(container ...
随机推荐
- 每天php函数 - list()给一组变量赋值
array list ( mixed $varname [, mixed $... ] ) 像 array() 一样,这不是真正的函数,而是语言结构.list()用一步操作给一组变量进行赋值. var ...
- 20个C语言中常用宏定义总结
01: 防止一个头文件被重复包含 #ifndef COMDEF_H#define COMDEF_H//头文件内容#endif 02: 重新定义一些类型防止由于各种平台和编译器的不同,而产生的类型字节数 ...
- 20145235 《Java程序设计》实验二
实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计模式 实验步骤 单元测试 代码及则是结果: public cla ...
- Bootstrap页面布局23 - BS折叠内容
<div class='container-fluid'> <h3 class='page-header'>Bootstrap 折叠内容</h3> <!--如 ...
- Java内存管理和垃圾回收
笔记,深入理解java虚拟机 Java运行时内存区域 程序计数器,线程独占,当前线程所执行的字节码的行号指示器,每个线程需要记录下执行到哪儿了,下次调度的时候可以继续执行,这个区是唯一不会发生oom的 ...
- nginx搭建http和rtmp协议的流媒体服务器
nginx搭建http和rtmp协议的流媒体服务器 时间:2013-09-23 23:52来源:佚名 作者:本站 举报 点击:232次 实验目的:让Nginx支持flv和mp4格式文件,同时支持Rtm ...
- git 第一次初始化
Command line instructions Git global setup git config --global user.name "{名字}({工号})" git ...
- Android UI开发: 横向ListView(HorizontalListView)及一个简单相册的完整实现 (附源码下载)
http://blog.csdn.net/yanzi1225627/article/details/21294553 原文
- JAVA内省(Introspector)
什么是Java内省:内省是Java语言对Bean类属性.事件的一种缺省处理方法. Java内省的作用:一般在开发框架时,当需要操作一个JavaBean时,如果一直用反射来操作,显得很麻烦:所以sun公 ...
- 在 mac os 上搭建 git server
前言:之前学习了如何使用 git 后,一直想搭建一个本机搭建一个 git server 的,一开始不知道走了弯路用了 gitosis,折腾了我好几天都没配置好.昨晚查资料发现 gitosis 早就过时 ...