一、冒泡算法

冒泡算法,给定一组数据,从大到小排序或者从小到大排序,就像气泡一样

原理:  相邻的两个对象相比,大的放到后面,交换位置

  • 交换位置通过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 11

2、如何将上述的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基础(冒泡、生成器、迭代器、列表与字典解析)的更多相关文章

  1. python基础(八)生成器,迭代器,装饰器,递归

    生成器 在函数中使用yield关键字就会将一个普通的函数变成一个生成器(generator),普通的函数只能使用return来退出函数,而不执行return之后的代码.而生成器可以使用调用一个next ...

  2. Python基础(二) —— 字符串、列表、字典等常用操作

    一.作用域 对于变量的作用域,执行声明并在内存中存在,该变量就可以在下面的代码中使用. 二.三元运算 result = 值1 if 条件 else 值2 如果条件为真:result = 值1如果条件为 ...

  3. python基础(14):生成器、列表推导式

    1. 生成器 什么是⽣成器?⽣成器实质就是迭代器. 在python中有三种⽅式来获取⽣成器: 1. 通过⽣成器函数 2. 通过各种推导式来实现⽣成器 3. 通过数据的转换也可以获取⽣成器 ⾸先,我们先 ...

  4. python基础之生成器迭代器

    1 生成器: 为什么要有生成器? 就拿列表来说吧,假如我们要创建一个list,这个list要求格式为:[1,4,9,16,25,36……]这么一直持续下去,直到有了一万个元素的时候为止.如果我们要创建 ...

  5. Python基础(2)——列表、字典、数据运算

    1.列表 #创建列表 name_list = ['alex', 'seven', 'eric'] #或 name_list = list(['alex', 'seven', 'eric']) #访问列 ...

  6. python基础(二)列表与字典

    列表list-数组stus=['苹果','香蕉','橘子','红枣',111.122,]# 下标 0 1 2 3 4#下标,索引,角标#print(stus[4]) #st=[]#空list#st=l ...

  7. python基础(二)-- 列表、字典、集合、字符串操作

    4.列表: 基本操作: 索引 切片 追加 删除 长度 切片 循环 包含 import copy i=0 #persons=['dailaoban','xiekeng',['age',100,50],' ...

  8. python高级之生成器&迭代器

    python高级之生成器&迭代器 本机内容 概念梳理 容器 可迭代对象 迭代器 for循环内部实现 生成器 1.概念梳理 容器(container):多个元素组织在一起的数据结构 可迭代对象( ...

  9. 第三篇:python高级之生成器&迭代器

    python高级之生成器&迭代器   python高级之生成器&迭代器 本机内容 概念梳理 容器 可迭代对象 迭代器 for循环内部实现 生成器 1.概念梳理 容器(container ...

随机推荐

  1. Linux 随笔1

    使用fork()系统调用产生的子进程对父进程中数据的修改不会影响到父进程,因为fork()采用的是写时复制机制,就是在fork产生的子进程没有修改父进程的值时,父子进程共享同一块内存,包括栈区.当子进 ...

  2. JDBC连接执行 MySQL 存储过程报权限错误:User does not have access to metadata required to determine stored procedure parameter types. If rights can not be granted,

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html 内部邀请码:C8E245J (不写邀请码,没有现金送) 国 ...

  3. 1. Nginx

    参考: http://www.darrenfang.com/2014/02/install-php-with-nginx-on-ubuntu/   安装: apt-get install python ...

  4. ZOJ 2975 思维

    题意 给出一个矩形 问在其中存在多少子矩形 其四个角上的字母是一样的 一开始暴力写了一发 先枚举行数 再枚举两个列数 再向下枚举行数 判断能否 没有意外的超时了 后来想了想 当我们已经确定两个列数的时 ...

  5. [ZZ] Shadow Map

    Shadow Map 如何能够高效的产生更接近真实的阴影一直是视频游戏的一个很有挑战的工作,本文介绍目前所为人熟知的两种阴影技术之一的ShadowMap(阴影图)技术.     ShadowMap技术 ...

  6. spring mvc和spring配置扫描包问题

    spring mvc和spring俩配置文件,其中都要配置扫描包. <context:component-scan base-package="com.controller" ...

  7. git 使用钩子直接推送到工作目录

    远端机器 $ mkdir /www/teacherapi  # 创建工作目录 $ cd /data/git $ git init teacherapi.git --bare --shared Init ...

  8. PHP获取某远程网站的服务器时间

    <?php function get_time($server){ $data  = "HEAD / HTTP/1.1\r\n"; $data .= "Host:  ...

  9. 20145235 《Java程序设计》第5周学习总结

    教材学习内容总结 8.1语法与继承架构 try和catch语法,如果被try{}的语句出现了catch()的问题就执行catch{}的语句. 错误的对象都继承于java.long.Throwable, ...

  10. 【转】NGUI创建UIRoot后报NullReferenceException的解决办法

    本文参考自 http://forum.china.unity3d.com/thread-1099-1-1.html 使用NGUI版本3.7.5. 在创建了一个UIRoot后,有时会报NullRefer ...