慕课网Python基础学习整理
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了慕课网Python基础学习整理相关的知识,希望对你有一定的参考价值。
# -*- coding: utf-8 -*- """# Python的注释以 # 开头,后面的文字直到行尾都算注释;多行注释开头3个 " 结尾3个 " # 整数:十进制整数按照正常的写法;十六进制整数用0x前缀和0-9,a-f表示,例如:0xff00,0xa5b4c3d2; # 浮点数也就是小数,浮点数可以用数学写法,如 1.23,3.14,-9.01等等,对于很大或很小的浮点数就必须用科学计数法表示,1.23x10^9就是1.23e9,或者12.3e8,0.000012可以写成1.2e-5等等 # Python支持对整数和浮点数直接进行四则混合运算 # 使用括号可以提升优先级,这和数学运算完全一致,注意只能使用小括号,但是括号可以嵌套很多层:""" print (1 + 2) * 3 # ==> 9 print (2.2 + 3.3) / (1.5 * (9 - 0.3)) # ==> 0.42145593869731807 # 和数学运算不同的地方是,Python的整数运算结果仍然是整数,浮点数运算结果仍然是浮点数: print 1 + 2 # ==> 整数 3 print 1.0 + 2.0 # ==> 浮点数 3.0 # 但是整数和浮点数混合运算的结果就变成浮点数了: print 1 + 2.0 # ==> 浮点数 3.0 # 当同是整数进行运算,结果还是整数,算然除不尽 print 11 / 4 # ==> 2 如果要计算精确的结果,把其中一个数改为浮点数就可以了11.0 / 4 # ==> 2.75 # 布尔值只有True、False两种值(注意大小写);布尔值可以用and、or和not运算。 # 空值是一个特殊的值,用None表示 # 在Python中,布尔类型可以与其他数据类型做 and、or和not运算,请看下面的代码: a = True print a and ‘a=T‘ or ‘a=F‘ """# 计算结果不是布尔类型,而是字符串 ‘a=T‘,这是为什么呢?因为Python把0、空字符串‘‘和None看成 False,其他数值和非空字符串都看成 True,所以: # True and ‘a=T‘ 计算结果是 ‘a=T‘ # 继续计算 ‘a=T‘ or ‘a=F‘ 计算结果还是 ‘a=T‘ # 要解释上述结果,又涉及到 and 和 or 运算的一条重要法则:短路计算。 # 1. 在计算 a and b 时,如果 a 是 False,则根据与运算法则,整个结果必定为 False,因此返回 a;如果 a 是 True,则整个计算结果必定取决与 b,因此返回 b。 # 2. 在计算 a or b 时,如果 a 是 True,则根据或运算法则,整个计算结果必定为 True,因此返回 a;如果 a 是 False,则整个计算结果必定取决于 b,因此返回 b。 # 所以Python解释器在做布尔运算时,只要能提前确定计算结果,它就不会往后算了,直接返回结果""" # 字符串是以 ‘‘或“”括起来的任意文本,比如‘abc‘,"xyz" # 如果字符串本身包含‘怎么办?比如我们要表示字符串 I‘m OK ,这时,可以用" "括起来表示: print "I‘m OK" # 类似的,如果字符串包含",我们就可以用‘ ‘括起来表示: print ‘Learn "Python" in imooc‘ # 如果字符串既包含‘又包含"怎么办?这个时候,就需要对字符串的某些特殊字符进行“转义”,Python字符串用\进行转义 print ‘Bob said \"I\‘m OK\".‘ # 打印显示的结果:Bob said "I‘m OK". # 常用的转义字符还有: # \n 表示换行; \t 表示一个制表符 ; \\ 表示 \ 字符本身 # 如果一个字符串包含很多需要转义的字符,对每一个字符都进行转义会很麻烦。为了避免这种情况,我们可以在字符串前面加个前缀 r ,表示这是一个 raw 字符串,里面的字符就不需要转义了。例如: print r‘D:\A\B\C\n‘ # 但是r‘...‘表示法不能表示多行字符串,也不能表示包含‘和 "的字符串 # 如果要表示多行字符串,可以用‘‘‘...‘‘‘表示: print ‘‘‘Line 1 Line 2 Line 3‘‘‘ # 等同于print ‘Line 1\nLine 2\nLine 3‘ # 还可以在多行字符串前面添加 r ,把这个多行字符串也变成一个raw字符串: print r‘‘‘Python is created by "Guido". It is free and easy to learn. Let‘s start learn Python in imooc!‘‘‘ # 字符串还有一个编码问题。 # 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理。最早的计算机在设计时采用8个比特(bit)作为一个字节(byte),所以,一个字节能表示的最大的整数就是255(二进制11111111=十进制255),0 - 255被用来表示大小写英文字母、数字和一些符号,这个编码表被称为ASCII编码,比如大写字母 A 的编码是65,小写字母 z 的编码是122。 # 如果要表示中文,显然一个字节是不够的,至少需要两个字节,而且还不能和ASCII编码冲突,所以,中国制定了GB2312编码,用来把中文编进去。 # 类似的,日文和韩文等其他语言也有这个问题。为了统一所有文字的编码,Unicode应运而生。Unicode把所有语言都统一到一套编码里,这样就不会再有乱码问题了。 # Unicode通常用两个字节表示一个字符,原有的英文编码从单字节变成双字节,只需要把高字节全部填为0就可以。 # 因为Python的诞生比Unicode标准发布的时间还要早,所以最早的Python只支持ASCII编码,普通的字符串‘ABC‘在Python内部都是ASCII编码的。 # Python在后来添加了对Unicode的支持,以Unicode表示的字符串用u‘...‘表示,比如: print u‘中文‘ # 注意:不加u,中文就不能正常显示。Unicode字符串除了多了一个 u 之外,与普通字符串没啥区别,转义字符和多行表示法仍然有效 # 如果中文字符串在Python环境下遇到 UnicodeDecodeError,这是因为.py文件保存的格式有问题。可以在第一行添加注释 # -*- coding: utf-8 -*-目的是告诉Python解释器,用UTF-8编码读取源代码。然后用Notepad++ 另存为... 并选择UTF-8格式保存。 # 当我们在Python交互式环境下编写代码时,>>>时Python解释器的提示符,不是代码的一部分,千万不要自己添加>>>。 # print语句也可以跟上多个字符串,用逗号“,”隔开,就可以连成一串输出, print ‘hello‘, ‘world‘ # hello world # print也可以打印整数,或者计算结果 print ‘100+200=‘, 100 + 200 # 100+200=300 # 在Python程序中,变量是用一个变量名表示,变量名必须是大小写英文、数字和下划线(_)的组合,且不能用数字开头 # 在Python中,等号=是赋值语句,可以把任意数据类型赋值给变量,同一个变量可以反复赋值,而且可以是不同类型的变量,例如: a = 123 # a是整数 a = ‘imooc‘ # a变为字符串 这种变量本身类型不固定的语言称之为动态语言,与之对应的是静态语言 # 理解变量在计算机内存中的表示也非常重要。当我们写:a = ‘ABC‘时,Python解释器干了两件事情: # 1. 在内存中创建了一个‘ABC‘的字符串; # 2. 在内存中创建了一个名为a的变量,并把它指向‘ABC‘。 # 也可以把一个变量a赋值给另一个变量b,这个操作实际上是把变量b指向变量a所指向的数据,例如下面的代码: a = ‘ABC‘ b = a a = ‘XYZ‘ print b # 最后一行打印出变量b的内容到底是‘ABC‘呢还是‘XYZ‘?如果从数学意义上理解,就会错误地得出b和a相同,也应该是‘XYZ‘,但实际上b的值是‘ABC‘ # 集合 # 集合是指包含一组元素的数据结构,我们已经介绍的包括: # 1. 有序集合:list,tuple,str和unicode; # 2. 无序集合:set # 3. 无序集合并且具有 key-value 对:dict # list: Python内置的一种数据类型是列表:list。list是一种有序的集合,可以随时添加和删除其中的元素。例:[‘Michael‘, ‘Bob‘, ‘Tracy‘], # list是数学意义上的有序集合,也就是说,list中的元素是按照顺序排列的。 # 由于Python是动态语言,所以list中包含的元素并不要求都必须是同一种数据类型,我们完全可以在list中包含各种数据: L = [‘Michael‘, 100, True] # 一个元素也没有的list,就是空list: empty_list = [] # 我们可以通过索引来获取list中的指定元素。需要特别注意的是,索引从 0 开始,也就是说,第一个元素的索引是0,第二个元素的索引是1,以此类推。 print L[0] # d打印L的第一个值 ; 列表L只有3个值, 若取L[3]会抛出错误,所以使用索引时,千万注意不要超出索引范围 # 可以用 -1 这个索引来表示最后一个元素; 使用倒序索引时,也要注意不要越界。 print L[-1] # 向list添加新元素,方法:L.append() L.append(‘Paul‘) # append()总是把新的元素添加到 list 的尾部。 # 指定位置插入元素方法是用list的 insert()方法,它接受两个参数,第一个参数是索引号,第二个参数是待添加的新元素: L.insert(0, ‘Paul‘) # ‘Paul‘将被添加到索引为 0 的位置上(也就是第一个),而原来索引为 0 的元素,以及后面的所有元素,都自动向后移动一位。 print L # 结果是 [‘Paul‘,‘Michael‘,100,True,‘Paul‘] 表示list里面的值是可以重复的 # 从list删除元素: L.pop() # pop()方法总是删掉list的最后一个元素,并且它还返回这个元素,所以我们执行 L.pop() 后,会打印出 ‘Paul‘。 # 用 L.pop(2)删除指定索引的元素 ;需要注意的是当删除一个元素的时候,list的元素的索引有可能就变掉了,所以当再次删除其中的元素的时候要考虑将被删除的元素的索引有没有变化的问题 # 替换list中的元素:对list中的某一个索引赋值,就可以直接用新的元素替换掉原来的元素,list包含的元素个数保持不变。 L[1] = 99 # 列表L中索引为1,也就是第二个元素的值被替换为99; # tuple元组 # tuple是另一种有序的列表,中文翻译为“ 元组 ”。tuple 和 list 非常类似,但是,tuple一旦创建完毕,就不能修改了,tuple没有 append()方法,也没有insert()和pop()方法。 # tuple所谓的“不变”是说,tuple的每个元素,指向永远不变。即指向‘a‘,就不能改成指向‘b‘,指向一个list,就不能改成指向其他对象,但指向的这个list本身是可变的! # tuple返回的值的外面的括号可以省略 t = (‘a‘, ‘b‘, [‘c‘, ‘d‘]) L = t[2] L[0] = ‘e‘; L[1] = ‘f‘ print t # ==>(‘a‘,‘b‘,[‘e‘,‘f‘]) # 创建tuple和创建list唯一不同之处是用( )替代了[ ] # 获取 tuple 元素的方式和 list 是一模一样的,我们可以正常使用 t[0],t[-1]等索引方式访问元素,但是不能赋值成别的元素 # tuple和list一样,可以包含 0 个、1个和任意多个元素 # 因为()既可以表示tuple,又可以作为括号表示运算时的优先级,结果 (1) 被Python解释器计算出结果 1,导致我们得到的不是tuple,而是整数 1。 # 正是因为用()定义单元素的tuple有歧义,所以 Python 规定,单元素 tuple 要多加一个逗号“,”,这样就避免了歧义,例 t = (1,) print t # =>(1,) # if # 比如,输入用户年龄,根据年龄打印不同的内容,在Python程序中,可以用if语句实现: age = 20 if age < 18: # ==>注意后面有冒号 print ‘your age is‘, age print ‘teenager‘ elif age >= 18: print ‘your age is‘, age print ‘adult‘ elif age >= 1000: # ==>注意后面有冒号 print ‘成仙了‘ print ‘END‘ # 注意: Python代码的缩进规则。具有相同缩进的代码被视为代码块,上面的3,4行 print 语句就构成一个代码块(但不包括第5行的print)。如果 if 语句判断为 True,就会执行这个代码块。 # 缩进请严格按照Python的习惯写法:4个空格,不要使用Tab,更不要混合Tab和空格,否则很容易造成因为缩进引起的语法错误。 # 注意: if 语句后接表达式,然后用:表示代码块开始。 # 如果你在Python交互环境下敲代码,还要特别留意缩进,并且退出缩进需要多敲一行回车: # 循环 # for ... in ... : 与C#中的foreach相同 # while 和 for 循环不同的另一种循环是while 循环不会迭代 list 或 tuple 的元素,而是根据表达式判断循环是否结束。 # 用 for 循环或者 while 循环时,如果要在循环体内直接退出循环,可以使用 break 语句。 # 比如计算1至100的整数和,我们用while来实现: sum = 0 x = 1 while True: sum = sum + x x = x + 1 if x > 100: break # break语句退出循环 print sum # 在循环过程中,可以用break退出当前循环,还可以用continue跳过后续循环代码,继续下一次循环 # 计算1 - 100奇数的和: sum = 0 x = 0 while x < 100: x = x + 1 if (x % 2) == 0: continue # 不向下执行代码,回到while再执行 sum += x print sum # 多重循环 ;在循环内部,还可以嵌套循环,例子: for x in [‘A‘, ‘B‘, ‘C‘]: for y in [‘1‘, ‘2‘, ‘3‘]: print x + y # 打印的结果A1 A2 A3 B1 B2 B3 C1 C2 C3(为了节省行数,横着写了,实际应该是竖着的) # dict # 花括号 {} 表示这是一个dict,然后按照 key: value, 写出来即可。最后一个 key: value 的逗号可以省略。 # 由于dict也是集合,len() 函数可以计算任意集合的大小: d = {‘Adam‘: 95, ‘Lisa‘: 85, ‘Bart‘: 59} len(d) 3 # 注意: 一个 key-value 算一个,因此,dict大小为3 # 可以简单地使用 d[key] 的形式来查找对应的 value,这和 list 很像,不同之处是,list 必须使用索引返回对应的元素,而dict使用key: # 注意: 通过 key 访问 dict 的value,只要 key 存在,dict就返回对应的value。如果key不存在,会直接报错:KeyError。 # 要避免 KeyError 发生,有两个办法: # 一是先判断一下 key 是否存在,用 in 操作符: if ‘Paul‘ in d: print d[‘Paul‘] # 如果 ‘Paul‘ 不存在,if语句判断为False,自然不会执行 print d[‘Paul‘] ,从而避免了错误。 # 二是使用dict本身提供的一个 get 方法,在Key不存在的时候,返回None: # dict的第一个特点是查找速度快,无论dict有10个元素还是10万个元素,查找速度都一样。而list的查找速度随着元素增加而逐渐下降。不过dict的查找速度快不是没有代价的,dict的缺点是占用内存大,还会浪费很多内容,list正好相反,占用内存小,但是查找速度慢。 # 由于dict是按 key 查找,所以,在一个dict中,key不能重复。 # dict的第二个特点就是存储的key-value序对是没有顺序的!这和list不一样;打印的顺序不一定是我们创建时的顺序,而且,不同的机器打印的顺序都可能不同,这说明dict内部是无序的,不能用dict存储有序的集合。 # dict的第三个特点是作为 key 的元素必须不可变,Python的基本类型如字符串、整数、浮点数都是不可变的,都可以作为 key。但是list是可变的,就不能作为 key { ‘123‘: [1, 2, 3], # key 是 str,value是list 123: ‘123‘, # key 是 int,value 是 str (‘a‘, ‘b‘): True # key 是 tuple,并且tuple的每个元素都是不可变对象,value是 boolean } # dict是可变的,也就是说,我们可以随时往dict中添加新的 key-value # 要把新元素‘Paul‘:72 加进d去,用赋值语句: d[‘Paul‘] = 72 # 如果 key 已经存在,则赋值会用新的 value 替换掉原来的 value # 由于dict也是一个集合,所以,遍历dict和遍历list类似,都可以通过 for 循环实现。 # set # dict的作用是建立一组 key 和一组 value 的映射关系,dict的key是不能重复的。 # 有的时候,我们只想要 dict 的 key,不关心 key 对应的 value,目的就是保证这个集合的元素不会重复,这时,set就派上用场了。 # et 持有一系列元素,这一点和 list 很像,但是set的元素没有重复,而且是无序的,这点和 dict 的 key很像。 # 创建 set 的方式是调用 set() 并传入一个 list,list的元素将作为set的元素,例: s = set([‘A‘, ‘B‘, ‘C‘]) # set会自动去掉重复的元素 s = set([‘A‘, ‘B‘, ‘C‘, ‘C‘]) print s # 由于set存储的是无序集合,所以我们没法通过索引来访问。访问 set中的某个元素实际上就是判断一个元素是否在set中。 # 例如,存储了班里同学名字的set: s = set([‘Adam‘, ‘Lisa‘, ‘Bart‘, ‘Paul‘]) # 我们可以用 in 操作符判断: ‘Bart‘ in s # set的内部结构和dict很像,唯一区别是不存储value,因此,判断一个元素是否在set中速度很快。set存储的元素和dict的key类似,必须是不变对象,因此,任何可变对象是不能放入set中的。 # 由于 set 也是一个集合,所以,遍历 set 和遍历 list 类似,都可以通过 for 循环实现。注意: for 循环在遍历set时,元素的顺序和list的顺序很可能是不同的,而且不同的机器上运行的结果也可能不同。 # 由于set存储的是一组不重复的无序元素,因此,更新set主要做两件事:一是把新的元素添加到set中,二是把已有元素从set中删除。 # 添加元素时,用set的add()方法: s = set([1, 2, 3]) s.add(4) print s # ==>set([1, 2, 3, 4]) # 如果添加的元素已经存在于set中,add()不会报错,但是不会加进去了: s.add(3) print s # ==>set([1, 2, 3,4]) # 删除set中的元素时,用set的remove()方法: s.remove(4) print s # ==>set([1, 2, 3]) # 如果删除的元素不存在set中,remove()会报错: if 5 in s: s.remove(5) # Traceback (most recent call last): # File "<stdin>", line 1, in <module> # KeyError: 5 # 所以用add()可以直接添加,而remove()前需要判断 if 5 in s ... """ # 函数 # python内置函数网址 :https://docs.python.org/2/library/functions.html#abs # 在Python中,定义一个函数要使用 def 语句,依次写出函数名、括号、括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用 return 语句返回。 # 请注意,函数体内部的语句在执行时,一旦执行到return时,函数就执行完毕,并将结果返回。因此,函数内部通过条件判断和循环可以实现非常复杂的逻辑。 # 如果没有return语句,函数执行完毕后也会返回结果,只是结果为 None。return None可以简写为return # 返回多个值;在语法上,返回一个tuple可以省略括号,而多个变量可以同时接收一个tuple,按位置赋给对应的值,所以,Python的函数返回多值其实就是返回一个tuple # 在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数 # 定义函数的时候,还可以有默认参数。例如Python自带的 int() 函数,其实就有两个参数,我们既可以传一个参数,又可以传两个参数:""" print int(‘123‘) # ==>123 print int(‘123‘, 8) # ==>83 """ # int()函数的第二个参数是转换进制,如果不传,默认是十进制 (base=10),如果传了,就用传入的参数。 # 可见,函数的默认参数的作用是简化调用,你只需要把必须的参数传进去。但是在需要的时候,又可以传入额外的参数来覆盖默认参数值。 # 由于函数的参数按从左到右的顺序匹配,所以默认参数只能定义在必需参数的后面 # 如果想让一个函数能接受任意个参数,我们就可以定义一个可变参数:""" def fn(*args): print args # 可变参数的名字前面有个 * 号,我们可以传入0个、1个或多个参数给可变参数: # Python解释器会把传入的一组参数组装成一个tuple传递给可变参数,因此,在函数内部,直接把变量 args 看成一个 tuple 就好了 # 切片(Slice) L = [‘Adam‘, ‘Lisa‘, ‘Bart‘] # L[0:3]表示,从索引0开始取,直到索引3为止,但不包括索引3。即索引0,1,2,正好是3个元素 print L[0:3] # ==>[‘Adam‘, ‘Lisa‘, ‘Bart‘] # 如果第一个索引是0,还可以省略: L[:3] # ==>[‘Adam‘, ‘Lisa‘, ‘Bart‘] # 也可以从索引1开始,取出2个元素出来: L[1:3] # ==>[‘Lisa‘, ‘Bart‘] # 只用一个 : ,表示从头到尾,因此,L[:]实际上复制出了一个新list。 # 切片操作还可以指定第三个参数: L[::2] # ==>[‘Adam‘, ‘Bart‘] # 第三个参数表示每N个取一个,上面的 L[::2] 会每两个元素取出一个来,也就是隔一个取一个。 # 把list换成tuple,切片操作完全相同,只是切片的结果也变成了tuple # 对于list,既然Python支持L[-1]取倒数第一个元素,那么它同样支持倒数切片,例: L = [‘Adam‘, ‘Lisa‘, ‘Bart‘, ‘Paul‘] print L[-2:] # ==>[‘Bart‘, ‘Paul‘] print L[:-2] # ==>[‘Adam‘, ‘Lisa‘] print L[-3:-1] # ==>[‘Lisa‘, ‘Bart‘] print L[-4:-1:2] # ==>[‘Adam‘, ‘Bart‘] # 记住倒数第一个元素的索引是-1。倒序切片包含起始索引,不包含结束索引。 # 字符串 ‘xxx‘和 Unicode字符串 u‘xxx‘也可以看成是一种list,每个元素就是一个字符。因此,字符串也可以用切片操作,只是操作结果仍是字符串: print ‘ABCDEFG‘[:3] # ==>‘ABC‘ print ‘ABCDEFG‘[-3:] # ==>‘EFG‘ print ‘ABCDEFG‘[::2] # ==>‘ACEG‘ # 在很多编程语言中,针对字符串提供了很多各种截取函数,其实目的就是对字符串切片。Python没有针对字符串的截取函数,只需要切片一个操作就可以完成,非常简单。 """ # 迭代 # 在Python中,如果给定一个list或tuple,我们可以通过for循环来遍历这个list或tuple,这种遍历我们成为迭代(Iteration); # Python 的 for循环不仅可以用在list或tuple上,还可以作用在其他任何可迭代对象上。 # Python中,迭代永远是取出元素本身,而非元素的索引。 # 对于有序集合,元素确实是有索引的。有的时候,我们确实想在 for 循环中拿到索引,怎么办? # 方法是使用 enumerate() 函数:""" L = [‘Adam‘, ‘Lisa‘, ‘Bart‘, ‘Paul‘] for index, name in enumerate(L): print index, ‘-‘, name # ==>0 - Adam 1 - Lisa 2 - Bart 3 - Paul # 使用 enumerate() 函数,我们可以在for循环中同时绑定索引index和元素name。但是,这不是 enumerate() 的特殊语法。实际上,enumerate() 函数把: [‘Adam‘, ‘Lisa‘, ‘Bart‘, ‘Paul‘] # 变成了类似: [(0, ‘Adam‘), (1, ‘Lisa‘), (2, ‘Bart‘), (3, ‘Paul‘)] # 因此,迭代的每一个元素实际上是一个tuple: for t in enumerate(L): index = t[0] name = t[1] print index, ‘-‘, name # 如果我们知道每个tuple元素都包含两个元素,for循环又可以进一步简写为: for index, name in enumerate(L): print index, ‘-‘, name # 这样不但代码更简单,而且还少了两条赋值语句。 # 可见,索引迭代也不是真的按索引访问,而是由 enumerate() 函数自动把每个元素变成 (index, element) 这样的tuple,再迭代,就同时获得了索引和元素本身。 # 迭代dict的value # 我们已经了解了dict对象本身就是可迭代对象,用 for 循环直接迭代 dict,可以每次拿到dict的一个key。 # 如果我们希望迭代 dict 对象的value,应该怎么做? # dict 对象有一个 values() 方法,这个方法把dict转换成一个包含所有value的list,这样,我们迭代的就是 dict的每一个 value: d = {‘Adam‘: 95, ‘Lisa‘: 85, ‘Bart‘: 59} print d.values() # ==>[85, 95, 59] for v in d.values(): print v # dict除了values()方法外,还有一个 itervalues() 方法,用 itervalues() 方法替代 values() 方法,迭代效果完全一样: d = {‘Adam‘: 95, ‘Lisa‘: 85, ‘Bart‘: 59} print d.itervalues() # <dictionary-valueiterator object at 0x106adbb50> for v in d.itervalues(): print v """# 那这两个方法有何不同之处呢? # 1. values() 方法实际上把一个 dict 转换成了包含 value 的list。 # 2. 但是 itervalues() 方法不会转换,它会在迭代过程中依次从 dict 中取出 value,所以 itervalues() 方法比 values() 方法节省了生成 list 所需的内存。 # 3. 打印 itervalues() 发现它返回一个 <dictionary-valueiterator> 对象,这说明在Python中,for 循环可作用的迭代对象远不止 list,tuple,str,unicode,dict等,任何可迭代对象都可以作用于for循环,而内部如何迭代我们通常并不用关心。 # 如果一个对象说自己可迭代,那我们就直接用 for 循环去迭代它,可见,迭代是一种抽象的数据操作,它不对迭代对象内部的数据有任何要求。 # 迭代dict的key和value # 我们了解了如何迭代 dict 的key和value,那么,在一个 for 循环中,能否同时迭代 key和value?答案是肯定的。 # 首先,我们看看 dict 对象的 items() 方法返回的值:""" d = {‘Adam‘: 95, ‘Lisa‘: 85, ‘Bart‘: 59} print d.items() # ==>[(‘Lisa‘, 85), (‘Adam‘, 95), (‘Bart‘, 59)] # 可以看到,items() 方法把dict对象转换成了包含tuple的list,我们对这个list进行迭代,可以同时获得key和value: for key, value in d.items(): print key, ‘:‘, value # 和 values() 有一个 itervalues() 类似, items() 也有一个对应的 iteritems(),iteritems() 不把dict转换成list,而是在迭代过程中不断给出 tuple,所以, iteritems() 不占用额外的内存。 for key, value in d.iteritems(): print key, ‘:‘, value # 生成列表 # 要生成list [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],我们可以用range(1, 11) # 但如果要生成[1x1, 2x2, 3x3, ..., 10x10]怎么做?方法一是循环: L = [] for x in range(1, 11): L.append(x * x) print L # ==>[1, 4, 9, 16, 25, 36, 49, 64, 81, 100] # 但是循环太繁琐,而列表生成式则可以用一行语句代替循环生成上面的list: [x * x for x in range(1, 11)] # 这种写法就是Python特有的列表生成式。利用列表生成式,可以以非常简洁的代码生成 list。 # 写列表生成式时,把要生成的元素 x * x 放到前面,后面跟 for 循环,就可以把list创建出来; """ # 条件过滤 # 列表生成式的 for 循环后面还可以加上 if 判断。例如: [x * x for x in range(1, 11)] # ==>[1, 4, 9, 16, 25, 36, 49, 64, 81, 100] # 如果我们只想要偶数的平方,不改动 range()的情况下,可以加上 if 来筛选: # [x * x for x in range(1, 11) if x % 2 == 0] #==>[4, 16, 36, 64, 100] # 有了 if 条件,只有 if 判断为 True 的时候,才把循环的当前元素添加到列表中。 # 多层表达式 # for循环可以嵌套,因此,在列表生成式中,也可以用多层 for 循环来生成列表。 # 对于字符串 ‘ABC‘ 和 ‘123‘,可以使用两层循环,生成全排列: [m + n for m in ‘ABC‘ for n in ‘123‘] # ==>[‘A1‘, ‘A2‘, ‘A3‘, ‘B1‘, ‘B2‘, ‘B3‘, ‘C1‘, ‘C2‘, ‘C3‘] # 翻译成循环代码就像下面这样:""" L = [] for m in ‘ABC‘: for n in ‘123‘: L.append(m + n) # 复杂表达式 # 使用for循环的迭代不仅可以迭代普通的list,还可以迭代dict。 # 假设有如下的dict: d = {‘Adam‘: 95, ‘Lisa‘: 85, ‘Bart‘: 59} # 完全可以通过一个复杂的列表生成式把它变成一个 HTML 表格: tds = [‘<tr><td>%s</td><td>%s</td></tr>‘ % (name, score) for name, score in d.iteritems()] print ‘<table>‘ print ‘<tr><th>Name</th><th>Score</th><tr>‘ print ‘\n‘.join(tds) print ‘</table>‘ """# 注:字符串可以通过 % 进行格式化,用指定的参数替代 %s。字符串的join()方法可以把一个 list 拼接成一个字符串。 # 把打印出来的结果保存为一个html文件,就可以在浏览器中看到效果了: # <table border="1"> # <tr><th>Name</th><th>Score</th><tr> # <tr><td>Lisa</td><td>85</td></tr> # <tr><td>Adam</td><td>95</td></tr> # <tr><td>Bart</td><td>59</td></tr> # </table>"""