首页 > 技术文章 > 初学python笔记

ldf223 2018-10-29 15:25 原文

一、关于python

① 由荷兰人Guido van Rossum(龟叔)于1989年圣诞节为打发无聊时间所编写的编程语言。

② python的特点:优雅 明确 简单。代码量少,运行速度快。

缺点:运行速度慢、源码不能加密

③ 适合的领域:Web网站和各种网络服务、系统工具和脚本、作为“胶水”语言把其他语言开发的模块包装起来方便使用。

不适合的领域:贴近硬件的代码,例如驱动程序等(首选C)、移动开发:iOS/Android有各自的开发语言(ObjC,Swift/Java)、游戏开发:首选C/C++

④ 实际应用:国外:YouTube(视频网站)、Instagram(照片墙)(社交应用)等  国内:豆瓣、搜狐邮箱等  著名的开源云计算平台openstack(国外)

广泛应用于大公司:Google、Yahoo、NASA

⑤ 和其它语言对比:类型          运行速度          代码量

C            编译为机器码        非常快           非常多

Java        编译为字节码           快                 多

Python       解释执行             慢                  少(开发速度快 运行速度取决于数据库的操作和网络调用)

二、变量和数据类型

1.在python中能直接处理的数据类型有以下几种:

① 整数

包括负整数。计算机使用二进制,所以使用16进制表示整数比较方便。16进制用0x前缀和0-9a-f表示,例如:0xff00等。

② 浮点数  

浮点数就是小数,按照科学计数法表示,一个浮点数的小数点位置是可变的。对于很大或者很小的浮点数,必须用科学计数法表示,10可以用e代替,1.23*10^9就是1.23e9.0.000012可以写成1.2e-5.

③ 字符串

字符串是以’’“”括起来的任意文本,如’abc’等。

④ 布尔值

布尔值和布尔代数的表示完全一致,一个布尔值只有TrueFalse两种值,要么是true要么是false。在python中,可以直接用TrueFalse表示布尔值(注意大小写),也可以通过布尔运算计算出来。

布尔值可以用andornot运算。

And与运算:所有结果都为trueand运算结果才是true

Or或运算:只要有一个结果是trueor运算结果就是true

Not非运算:单目运算符,把true变成falsefalse变成true

⑤ 空值

空值是python里的一个特殊值,用none表示。None并不是0,因为0是有意义的,而none是一个特殊的空值。

2.print语句

Print语句即是指定输出的文字。比如‘Hello world,用代码表示:print ‘hello world’

Print语句可以跟上多个字符串,用逗号隔开,就可以连成一串输出。Print会依次打印每个字符串,遇到逗号‘,’会输出一个空格,因此输出的字符串是拼起来的。

>>> print 'The quick brown fox', 'jumps over', 'the lazy dog'

The quick brown fox jumps over the lazy dog

Print也可以打印整数,或者计算结果。

>>> print '100 + 200 =', 100 + 200

100 + 200 = 300     #运行结果

3.注释

Python的注释以‘#’开头,后面的文字只到行尾都算注释。

4.变量

① 变量的概念基本上和代数的方程变量是一致的。在python中,变量使用一个变量名表示,变量名必须是大小写英文、数字和下划线(-)的组合,且不能用数字开头。

② 等号=是赋值语句,可以把任意数据类型赋值给变量,同一个变量可以反复赋值,而且可以是不同类型的变量。这种变量本身类型不固定的语言称之为动态语言,相比静态语言,动态语言更加灵活。

a = 123    # a是整数

print a

a = 'imooc'   # a变为字符串

print a

③ 静态语言在定义变量时必须指定变量类型,如果赋值的时候类型不匹配,就会报错。

int a = 123; // a是整数类型变量

a = "mooc"; // 错误:不能把字符串赋给整型变量

④ 变量在计算机内存中的表示。

假如写a=’ABC’,python解释器做了2件事情。

第一、在内存中创建了一个ABC’的字符串;

第二、在内存中创建了一个名为a的变量,并把它指向‘ABC

5.定义字符串

字符串可以用’’和””括起来表示。

如果字符串包含””,我们可以用 ’ ’ 括起来表示。

'Learn "Python" in imooc'

如果两个都包含,需要使用转义字符进行‘转义’,python字符串用\进行转义。

如果要表示字符串 Bob said “I ‘ m  OK”

由于’和”会引起歧义,因此我们在它前面插入一个\表示这是一个普通字符,不代表字符串的起始,因此这个字符串可以表示为

'Bob said \"I\'m OK\".'

注意:转义字符 \ 不计入字符串的内容中。

常用的转义字符还有:

\n 表示换行

\t 表示一个制表符

\\ 表示 \ 字符本身

6.python中的raw字符串与多行字符串

如果一个字符串包含很多需要转义的字符,对每一个字符进行转义很麻烦,为了避免这种情况,我们可以在字符串前面加个前缀r,表示这是一个raw字符串,里面的字符就不需要转义了。

r'\(~_~)/ \(~_~)/'

表示多行字符串,用'''...'''表示

'''Line 1

Line 2

Line 3'''

在多行字符串前面添加r,把这个多行字符串也变成一个raw字符串

r'''Python is created by "Guido".

It is free and easy to learn.

Let's start learn Python in imooc!'''

7.python中的unicode字符串

Python后来添加了对unicode的支持,以unicode表示的字符串用u’...’表示,比如

Print u ‘中文’

注意:不加u,中文就不能正常显示。

Unicode字符串出来多了一个u之外,同普通字符串,转义字符和多行表示法仍然有效。

转义:

u'中文\n日文\n韩文'

多行:

u'''第一行

第二行'''

raw+多行:

ur'''Python的Unicode字符串支持"中文",

"日文",

"韩文"等多种语言'''

如果中文字符串在Python环境下遇到 UnicodeDecodeError,这是因为.py文件保存的格式有问题。可以在第一行添加注释目的是告诉Python解释器,用UTF-8编码读取源代码。然后用Notepad++ 另存为... 并选择UTF-8格式保存。

# -*- coding: utf-8 -*-

8.python中的整数和浮点数

Python支持对整数和浮点数直接进行四则混合运算,运算规则和数学上的四则运算规则完全一致。

和数学运算不同的地方是:python的整数运算结果仍然为整数,浮点数运算结果仍然是浮点数。整数和浮点数运算结果仍然是浮点数。

Python的整数除法即使除不尽,结果仍然为整数,余数被直接扔掉,不过python提供了一个求余的运算可以直接计算余数。如果要计算11/4的精确结果,按照“整数和浮点数混合运算的结果是浮点数”的法则,把两个数中的一个变成浮点数再运算。

11 / 4    # ==> 2

11 % 4    # ==> 3

11.0 / 4    # ==> 2.75

9.python中的布尔类型

python中,布尔类型还可以与其他数据类型做andornot运算。

a = True

print a and 'a=T' or 'a=F'

计算结果是字符串a=T.

这个涉及到andor运算的一条重要法则:短路计算。

A:在计算a and b时,如果afalse,则根据与运算法则,整个结果必定是false,因此返回a;如果atrue,则整个计算结果必定取决于b,因此返回b

B:在计算a or b时,如果atrue,则根据或运算法则,整个结果必定是true,因此返回a;如果afalse,则整个计算结果必定取决于b,因此返回b

所以,python在做布尔运算时,只要能提前确定计算结果,它就会直接返回结果。

三.ListTuple类型

1.创建list

Listpython内置的一种数据类型,它是一种有序的集合,可以随时添加和删除元素。

List的元素是按照顺序排列的。构造list很简单,直接用 []把所有的list元素都括起来,就是一个list对象。

可以把list赋值给一个变量,可以通过变量来引用list

>>> classmates = ['Michael', 'Bob', 'Tracy']

>>> classmates # 打印classmates变量的内容

['Michael', 'Bob', 'Tracy']

由于python是动态语言,所有list中可以包含各种数据。一个元素也没有的就是空list

>>> L = ['Michael', 100, True]

>>> empty_list = []

2.python按照索引访问list

由于list是一个有序集合,我们可以通过索引来获取list中的指定元素。需要特别注意的是,索引从0开始。

打印第一个就是 print L[0]

当使用索引越界时候,就会报错IndexError

3.倒序访问list

倒数第一个,可以用索引-1来表示最后一个元素。倒数第二用-2表示。注意,千万不要越界。

4.添加新元素

Listappend()方法,把新元素添加到list的末尾。

Listinsert()方法,第一个参数是索引号,第二个参数是待添加的新元素。

>>> L = ['Adam', 'Lisa', 'Bart']

>>> L.insert(0, 'Paul')

>>> print L

['Paul', 'Adam', 'Lisa', 'Bart']

L.insert(0, 'Paul') 的意思是,'Paul'将被添加到索引为 0 的位置上(也就是第一个),而原来索引为 0 Adam同学,以及后面的所有同学,都自动向后移动一位。

5.list中删除元素

Listpop()方法,总是删掉list的最后一个元素,并且它还返回这个元素。

可以使用pop()方法的索引定位元素的位置,将其进行删除。

>>> L = ['Adam', 'Lisa', 'Paul', 'Bart']

>>> L.pop(2)

'Paul'

>>> print L

['Adam', 'Lisa', 'Bart']

6.替换元素

list中的某一个索引赋值,可以直接用新的元素来替换掉原来的元素,list中包含的元素个数不变。

Bart替换成Paul

>>> L = ['Adam', 'Lisa', 'Bart']

>>> L[2] = 'Paul'

>>> print L

由于Bart还可以用-1做索引,所以下面的同样可以完成替换工作

L = ['Adam', 'Lisa', 'Paul']

>>> L[-1] = 'Paul'

7.python之创建tuple

Tuple翻译为“元组”,是一种有序的列表,但是tuple一旦创建完毕,就不能修改了。

Tuple()list[]

Tuple没有添加和删除方法,是写死的。

获取tuple元素的方式和list的方式是一模一样的。我们可以正常使用t[0]t[-1]等索引方式访问元素,但是不能赋值成别的元素。

8.创建单元素tuple

Tuplelist一样,可以包含01个和任意多个元素。

包含0个元素的tuple,也就是空tuple,用()表示。

>>> t = ()

>>> print t

()

包含一个元素的tuple

>>> t = (1)

>>> print t

1

注意:()既可以表示tuple又可以作为括号表示运算时的优先级,结果(1)python解释器计算出结果1,导致我们得到的不是tuple而是整数1

()定义单元素的tuple有歧义,所以单元素tuple要多加一个“,”,避免歧义。多元素可加可不加。

>>> t = (1,)

>>> print t

(1,)

9.“可变”的tuple

>>> t = ('a', 'b', ['A', 'B'])

>>> L = t[2]

>>> L[0] = 'X'

>>> L[1] = 'Y'

>>> print t

('a', 'b', ['X', 'Y'])

表面上看,tuple的元素确实变了,但是变得其实不是tuple的元素,而是list的元素。Tuple一开始指向的list并没有改成别的list,所以tuple所谓的“不变”是说,tuple的每个元素,指向永远不变,即指向a就不能改成指向b,指向一个list,就不能改成指向其他对象,但指向这个list本身是可变的。

四、条件判断和循环

1.if语句

Python代码的缩进规则,具有相同缩进的代码被视为代码。

缩进严格按照python的习惯写法:4个空格,不要使用Tab,更不要混合Tab和空格,否则很容易因为缩进而造成语法错误。

If语句后接表达式,然后用 : 表示代码块的开始。

如果在python交互环境下敲代码,还有特别留意缩进,并且退出缩进需要多敲一行回车。

>>> age = 20

>>> if age >= 18:

...     print 'your age is', age

...     print 'adult'

...

your age is 20

adult

2.if-else语句

两种判断条件是“非此即彼”的,因此可以使用if-else语句来将它们统一

Else后面有个 :

if age >= 18:

    print 'adult'

else:

    print 'teenager'

3.if-elif-else语句

Elif的意思就是else if。这一系列的条件判断会从上到下依次判断,如果某个判断为true,执行完对应的代码块,后面的条件判断就直接忽略不再执行了。

if age >= 18:

    print 'adult'elif age >= 6:

    print 'teenager'elif age >= 3:

    print 'kid'else:

    print 'baby'

4.for循环

For循环可以依次把list或者tuple中的每个元素迭代出来。

L = ['Adam', 'Lisa', 'Bart']for name in L:

    print name

5.while循环

While循环不会迭代list或者tuple的元素,而是根据表达式判断循环是否结束。

N = 10

x = 0while x < N:

    print x

    x = x + 1

While循环每次先判断x<n,如果为true,则执行循环体的代码块,否则退出循环。在循环体内,x=x+1会不断增加,最终因为x<n不成立而退出循环。

如果没有这一个语句,while循环在判断x<n时总是为true,就会无限循环下去,变化才能死循环。

6.break退出循环

sum = 0

x = 1while True:

    sum = sum + x

    x = x + 1

    if x > 100:

        break

print sum

7.continue继续循环

在循环过程中,使用continue跳过后续循环代码,继续下一次循环。

L = [75, 98, 59, 81, 66, 43, 69, 85]

sum = 0.0

n = 0for x in L:

    sum = sum + x

    n = n + 1

print sum / n

如果只想取x>60的话

for x in L:

    if x < 60:

        continue

    sum = sum + x

    n = n + 1

8.多重循环

在循环内部,可以嵌套循环。

for x in ['A', 'B', 'C']:

    for y in ['1', '2', '3']:

        print x + y

五、DictSet类型

1.什么是dict

Dict就是通过key来查找value。花括号{}表示这是一个dict,然后按照keyvalue,写出来即可,最后一个keyvalue的逗号可以省略。由于dict也是集合,len()函数可以计算任意集合的大小。

Eg:d = {

    'Adam': 95,

    'Lisa': 85,

    'Bart': 59

}

>>> len(d)

3           

        注意:一个key-value算一个,因此dict大小为3.

 2.访问dict

使用 d[key] 的形式来查找对应的 value,这和 list 很像,不同之处是,list 必须使用索引返回对应的元素,而dict使用key。只要key存在,dict就返回对应的value。如果key不存在,会直接报错:KeyError

避免KeyError方法:

① in操作符,判断key是否存在。如果不存在,判断为False,便不会执行print,避免错误。

if 'Paul' in d:

    print d['Paul']

 

② 使用dict本身提供的一个get方法,在key不存在的时候,返回None

>>> print d.get('Bart')

59

>>> print d.get('Paul')

None

3.dict的特点

① 查找速度快。无论dict有几个元素,查找速度一样,而list查找速度会随着元素的增加而逐渐下降,但是占用内存小。缺点:dict占用内存大,浪费内容多。

② 存储的key-value序对是没有顺序的。Dict的内部是无序的,不能用dict存储有序集合。List有序。

③ 作为key的元素必须不可变。

4.更新dict

Dict是可变的,我们可以随时往dict中添加新的key-value。用赋值语句,如果key不存在,直接加入,如果key已经存在,赋值会用新的value替换原来的value

>>> d['Paul'] = 72

5.遍历dict

Dict是一个集合,可以通过for循环遍历。由于通过key可以获取对应的value,因此在循环体内可以获取到value的值。

>>> d = { 'Adam': 95, 'Lisa': 85, 'Bart': 59 }

>>> for key in d:

...     print key

...

Lisa

Adam

Bart

6.Set

Dict的作用是建立一组keyvalue的映射关系,dictkey是不能重复的。当我们只想获取到dictkey,目的是为了保证这个集合的元素不会重复,此时使用set

Set持有一系列元素,同list,但set的元素不重复且无序,同dictkey

创建set的方式是调用set()并传入一个listlist的元素将作为set的元素。set内部存储的元素是无序的。因为set不能包含重复的元素,所以当我们传入包含重复元素的list的时候,set会自动去掉重复的元素。

>>> s = set(['A', 'B', 'C', 'C'])

>>> print s

set(['A', 'C', 'B'])

>>> len(s)

3

7.访问set

Set存储的是无序集合,所以访问set中的某个元素实际上就是判断这个元素是否在set中。

可以用in操作符判断。

>>> s = set(['Adam', 'Lisa', 'Bart', 'Paul'])

>>> 'Bart' in s

True

8.set的特点

① 判断一个元素是否在set中的速度很快。

② 任何可变对象不能放入set中。Set存储的元素必须是不变元素。

③ Set存储的元素是没有顺序的。

应用:

weekdays = set(['MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT', 'SUN'])

再判断输入是否有效,只需要判断该字符串是否在set中:

x = '???' # 用户输入的字符串if x in weekdays:

    print 'input ok'else:

    print 'input error'

9.遍历set

Set是一个集合,用for循环遍历set元素。元素的顺序和list的顺序是很可能不同的,而且在不同机器上运行的结果也可能不同。

请用 for 循环遍历如下的set,打印出 name: score 来。

s = set([('Adam', 95), ('Lisa', 85), ('Bart', 59)])

for x in s:

    print x[0] + ':', x[1]

10.更新set

Set存储的是一组不重复的无序元素,因此更新set,一是把新的元素添加到set中,二是把已有元素从set中删除。

添加元素时,用set.add()方法,如果添加的元素已经存在于set中,add()不会报错,但是不会加进去了。Add()可以直接添加。

>>> s = set([1, 2, 3])

>>> s.add(3)

>>> print s

set([1, 2, 3])

删除set的元素,使用setremove()方法。Remove()前需要判断,如果删除的元素不存在set中,remove()会报错。

>>> s = set([1, 2, 3])

>>> s.remove(4)

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

KeyError: 4

六、函数

1.函数

Python不但能非常灵活地定义函数,而且本身内置了很多有用的函数,可以直接调用。

Eg:圆的面积:s = area_of_circle(x)

2.调用函数

要调用一个函数,需要知道函数的名称和参数,比如求绝对值的函数abs,它接收一个参数。

要知道函数的名称和参数,有以下途径:

① Python官方网站

shttp://docs.python.org/2/library/functions.html#abs

 

② 在交互式命令行通过help(abs)查看函数的帮助信息

2.1绝对值函数调用。

>>> abs(-20)

20

调用函数的时候,传入参数量不对【abs(1,2)】,会报typeError的错误;如果参数类型不能被函数接受【abs(‘a’)】,也会报TypeError的错误,并且给出错误信息;

2.2比较函数cmp(x,y),需要两个参数,如果想x<y,返回-1,如果x==y,返回0,如果x>y,返回1.

>>> cmp(1, 2)

-1

>>> cmp(2, 1)

1

>>> cmp(3, 3)

0

2.3转换类型函数int()函数把其他数据类型转换成证书,str()函数把其他类型扎UNUNstr

>>> int(12.34)

12

>>> str(123)

'123'

3.编写函数

Python中,定义一个函数要使用def语句,依次写出函数名、括号,括号中的参数和冒号;然后,在缩进块中编写函数体,函数的返回值用return语句返回。

函数体内部的语句在执行时,一旦执行到return时,函数就执行完毕,并将结果返回。因此函数内部通过条件判断和循环可以实现非常复杂的逻辑。如果么有return语句,函数执行完毕后也会返回结果,只是结果为None

注意:return None可以简写为return

def my_abs(x):

    if x >= 0:

        return x

    else:

        return -x

4.返回多值

#math包提供了sin()cos()函数,我们先用import引用它:

import math

def move(x, y, step, angle):

    nx = x + step * math.cos(angle)

    ny = y - step * math.sin(angle)

    return nx, ny

Python函数返回的仍然是单一值,用print打印返回结果,原来返回值是一个tuple

在语法上,返回一个tuple可以省略括号,而多个变量可以同时接收一个tuple,按位置赋给对应的值,所以python的函数返回多值其实就是返回一个tuple,但写起来更方便。

5.递归函数

定义:在函数内部,可以调用其它函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。

优点:定义简单,逻辑清晰。

理论上,所有的递归函数都可以写成循环的方式,但是循环的逻辑不如递归清晰。

注意:使用递归函数需要防止栈溢出。

函数调用是通过栈这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。

6.定义默认参数

定义函数的时候,还可以有默认参数。函数的默认参数的作用是简化调用,你只需要把必须的参传进去。但是在需要时候,又可以传入额外的参数来覆盖默认参数值。

函数的参数按照从左到右的顺序匹配,所以默认参数只能定义在必需参数的后面。

7.定义可变参数

可变参数的名字前面有个*号,我们可以传入0个,1个或者多个参数给可变参数:

Python解释器会把传入的一组参数组装成有个touple传递给可变参数。因此,在函数内部,直接把变量args看成一个touple就好了。

定义可变参数目的:简化调用。

def average(*args):

    ...

这样,在调用的时候,可以这样写:

>>> average()

0

>>> average(1, 2)

1.5

>>> average(1, 2, 2, 3, 4)

2.4

七、切片

1.对list进行切片

对经常取指定索引范围的造作,用循环十分的复杂,此时使用python的切片(slice)操作符,简化操作。

① 如果一个索引是0,可以省略

>>> L[:3]

['Adam', 'Lisa', 'Bart']

② 索引从1开始,取2个元素

>>> L[1:3]

['Lisa', 'Bart']

③ 只用一个: 表示从头到尾

>>> L[:]

['Adam', 'Lisa', 'Bart', 'Paul']

④ 指定第三个参数

>>> L[::2]

['Adam', 'Bart']

第三个参数表示每N个取一个,上面的L[::2]会每两个元素取出一个来,也就是隔一个取一个。

list换成tuple,切片操作相同,只是切片的结果变成了tuple

2.倒序切片

对于listpython支持L[-1]取倒数第一个元素,那么它同样支持倒数切片。

记住倒数第一个元素的索引是-1。倒序切片包含起始索引不包含结束索引。

>>> L = ['Adam', 'Lisa', 'Bart', 'Paul']

>>> L[-2:]

['Bart', 'Paul']

 

>>> L[:-2]

['Adam', 'Lisa']

 

>>> L[-3:-1]

['Lisa', 'Bart']

 

>>> L[-4:-1:2]

['Adam', 'Bart']

3.对字符串切片

字符串xxx’和Unicode字符串可以看做是一种list,每个元素就是一个字符。因此,字符串也可以用切片操作,只是操作结果仍然是字符串。

Python只需要切片一个操作就可以对字符串进行各种截取,非常简单。

>>> 'ABCDEFG'[:3]

'ABC'

>>> 'ABCDEFG'[-3:]

'EFG'

>>> 'ABCDEFG'[::2]

'ACEG'

八、迭代

1.定义:python中,如果给定一个list或者tuple,我们可以通过for循环来遍历这个listtouple,这种遍历我们称为迭代。

Python中,迭代是通过for..in来完成的,而很多语言c或者java,迭代list是通过下标完成的,pythonfor循环抽象程度要高于javafor循环。

Pythonfor循环不仅可以用在list或者touple上,还可以作用于其他任何可迭代对象上。迭代操作就是对于一个集合,无论该集合是有序还是无序,我们用for循环总数可以依次取出集合的每一个元素。

注意:集合是指包含一组元素的数据结构,我们已经介绍的包括:

A:有序集合:listtouple,strunicode

B:无序集合:set

C:无序集合并且有key-value对:dict

 

2.索引迭代

迭代永远是取出元素本身,而非元素的索引。对于有序集合,元素确实是有索引的。有时候,我们想在循环中拿到索引,方法是使用enumerate()函数,使用这个可以在for循环中同时绑定索引index和元素name。因此,迭代的每一个元素实际上是一个touple

>>> L = ['Adam', 'Lisa', 'Bart', 'Paul']

>>> for index, name in enumerate(L):

...     print index, '-', name

...

0 - Adam

1 - Lisa

2 - Bart

3 - Paul

如果我们知道每个touple元素都包含两个元素,for循环又可以简写为:

for index, name in enumerate(L):

    print index, '-', name

 

因此,索引迭代也不是真的按照索引访问,而是又enumerate()函数自动把每个元素变成(indexelement)这样的tuple,再迭代就同时获得了索引和元素本身。

zip()函数可以把两个 list 变成一个 list:

>>> zip([10, 20, 30], ['A', 'B', 'C'])

[(10, 'A'), (20, 'B'), (30, 'C')]

3.迭代dictvalue

Dict对象本身就是可迭代对象,用for循环直接迭代dict,可以每次拿到dict的一个keyDict对象有一个value()方法,这个方法把dict转换成一个包含所有valuelist,这样我们迭代的就是每一个dictvalue

Dictitervalues()方法,迭代效果同values()方法。

不同点:

A:values()方法实际上把一个dict转换成了包含valuelist

B:itervalues()方法不会转换,它会在迭代过程中一次从dict中取出value,节省了生成list所需要的内存。

C:打印itervalues()返回<dictionary-valueiterator> 对象,说明任何迭代对象都可以作用于for循环。

注意:迭代是一种抽象的数据操作,它不对迭代对象内部的数据有任何要求。如果说一个对象可以迭代,可以直接使用for循环。

Eg:给定一个dictd = { 'Adam': 95, 'Lisa': 85, 'Bart': 59, 'Paul': 74 } 请计算所有同学的平均分

d = { 'Adam': 95, 'Lisa': 85, 'Bart': 59, 'Paul': 74 }

sum = 0.0

for v in d.itervalues():

    sum = sum + v

print sum / len(d)

4.迭代的keyvalue

在一个for循环中,能同时迭代keyvalue。使用dict对象的items()方法。Items()方法把dict对象转换成了半寒tuplelist,对这个list进行迭代,就可以同时获得keyvalue

Items类似于iteritems(),它是在迭代过程中不断给出tuple,所以iteritems()不占用额外的内存。

Eg

请根据dict:

d = { 'Adam': 95, 'Lisa': 85, 'Bart': 59, 'Paul': 74 }

打印出 name : score,最后再打印出平均分 average : score。

九、列表生成式

1.生成列表

列表生成式可以用一行语句代替循环生成list。写列表生成式时,要把生成的元素x*x放到前面,后面跟上for循环,就可以创建list

>>> [x * x for x in range(1, 11)]

[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

2.复杂表达式

For循环的迭代不仅可以迭代普通的list,还可以迭代dict

字符串可以通过%进行格式化,用指定的参数替代%s。字符串join()方法可以把一个list拼接成一个字符串。

 

如果我们用一个函数来替换字符串的格式化代码,可以得到更清晰的代码:

def generate_tr(name, score):

    return '<tr><td>%s</td><td>%s</td></tr>' % (name, score)

tds = [generate_tr(name, score) for name, score in d.iteritems()]

这样,只需要修改 generate_tr() 函数,必要的时候把score标红。

参考代码:

d = { 'Adam': 95, 'Lisa': 85, 'Bart': 59 }

def generate_tr(name, score):

    if score < 60:

        return '<tr><td>%s</td><td style="color:red">%s</td></tr>' % (name, score)

    return '<tr><td>%s</td><td>%s</td></tr>' % (name, score)

tds = [generate_tr(name, score) for name, score in d.iteritems()]

print '<table border="1">'

print '<tr><th>Name</th><th>Score</th><tr>'

print '\n'.join(tds)

print '</table>'

3.条件过滤

列表生成式的for循环后面可以加上if判断。有了if条件,只有if判断为true的时候,才把循环的当前元素添加到列表中。

>>> [x * x for x in range(1, 11) if x % 2 == 0]

[4, 16, 36, 64, 100]

4.多层表达式

For循环可以嵌套,因此在列表生成式中,可以用多层for循环来生成列表

对于字符串 'ABC' 和 '123',可以使用两层循环,生成全排列:

>>> [m + n for m in 'ABC' for n in '123']

['A1', 'A2', 'A3', 'B1', 'B2', 'B3', 'C1', 'C2', 'C3']

Eg

利用 3 层for循环的列表生成式,找出对称的 3 位数。例如,121 就是对称数,因为从右到左倒过来还是 121。

print [100 * n1 + 10 * n2 + n3 for n1 in range(1, 10) for n2 in range(10) for n3 in range(10) if n1==n3]

 

推荐阅读