初学python笔记
一、关于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-9,a-f表示,例如:0xff00等。
② 浮点数
浮点数就是小数,按照科学计数法表示,一个浮点数的小数点位置是可变的。对于很大或者很小的浮点数,必须用科学计数法表示,10可以用e代替,1.23*10^9就是1.23e9.0.000012可以写成1.2e-5.
③ 字符串
字符串是以’’或“”括起来的任意文本,如’abc’等。
④ 布尔值
布尔值和布尔代数的表示完全一致,一个布尔值只有True,False两种值,要么是true要么是false。在python中,可以直接用True、False表示布尔值(注意大小写),也可以通过布尔运算计算出来。
布尔值可以用and、or、not运算。
And与运算:所有结果都为true,and运算结果才是true。
Or或运算:只要有一个结果是true,or运算结果就是true。
Not非运算:单目运算符,把true变成false,false变成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中,布尔类型还可以与其他数据类型做and、or、not运算。
a = True
print a and 'a=T' or 'a=F'
计算结果是字符串 ‘a=T’.
这个涉及到and和or运算的一条重要法则:短路计算。
A:在计算a and b时,如果a是false,则根据与运算法则,整个结果必定是false,因此返回a;如果a是true,则整个计算结果必定取决于b,因此返回b。
B:在计算a or b时,如果a是true,则根据或运算法则,整个结果必定是true,因此返回a;如果a是false,则整个计算结果必定取决于b,因此返回b。
所以,python在做布尔运算时,只要能提前确定计算结果,它就会直接返回结果。
三.List和Tuple类型
1.创建list
List是python内置的一种数据类型,它是一种有序的集合,可以随时添加和删除元素。
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.添加新元素
List的append()方法,把新元素添加到list的末尾。
List的insert()方法,第一个参数是索引号,第二个参数是待添加的新元素。
>>> L = ['Adam', 'Lisa', 'Bart']
>>> L.insert(0, 'Paul')
>>> print L
['Paul', 'Adam', 'Lisa', 'Bart']
L.insert(0, 'Paul') 的意思是,'Paul'将被添加到索引为 0 的位置上(也就是第一个),而原来索引为 0 的Adam同学,以及后面的所有同学,都自动向后移动一位。
5.从list中删除元素
List的pop()方法,总是删掉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
Tuple和list一样,可以包含0个1个和任意多个元素。
包含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
五、Dict和Set类型
1.什么是dict
Dict就是通过key来查找value。花括号{}表示这是一个dict,然后按照key:value,写出来即可,最后一个key:value的逗号可以省略。由于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的作用是建立一组key和value的映射关系,dict的key是不能重复的。当我们只想获取到dict的key,目的是为了保证这个集合的元素不会重复,此时使用set。
Set持有一系列元素,同list,但set的元素不重复且无序,同dict的key。
创建set的方式是调用set()并传入一个list,list的元素将作为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的元素,使用set的remove()方法。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()函数把其他类型扎UN哈UN成str。
>>> 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.倒序切片
对于list,python支持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循环来遍历这个list或touple,这种遍历我们称为迭代。
Python中,迭代是通过for..in来完成的,而很多语言c或者java,迭代list是通过下标完成的,python的for循环抽象程度要高于java的for循环。
Python的for循环不仅可以用在list或者touple上,还可以作用于其他任何可迭代对象上。迭代操作就是对于一个集合,无论该集合是有序还是无序,我们用for循环总数可以依次取出集合的每一个元素。
注意:集合是指包含一组元素的数据结构,我们已经介绍的包括:
A:有序集合:list,touple,str和unicode;
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()函数自动把每个元素变成(index,element)这样的tuple,再迭代就同时获得了索引和元素本身。
zip()函数可以把两个 list 变成一个 list:
>>> zip([10, 20, 30], ['A', 'B', 'C'])
[(10, 'A'), (20, 'B'), (30, 'C')]
3.迭代dict的value
Dict对象本身就是可迭代对象,用for循环直接迭代dict,可以每次拿到dict的一个key。Dict对象有一个value()方法,这个方法把dict转换成一个包含所有value的list,这样我们迭代的就是每一个dict的value。
Dict的itervalues()方法,迭代效果同values()方法。
不同点:
A:values()方法实际上把一个dict转换成了包含value的list。
B:itervalues()方法不会转换,它会在迭代过程中一次从dict中取出value,节省了生成list所需要的内存。
C:打印itervalues()返回<dictionary-valueiterator> 对象,说明任何迭代对象都可以作用于for循环。
注意:迭代是一种抽象的数据操作,它不对迭代对象内部的数据有任何要求。如果说一个对象可以迭代,可以直接使用for循环。
Eg:给定一个dict: d = { '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.迭代的key和value
在一个for循环中,能同时迭代key和value。使用dict对象的items()方法。Items()方法把dict对象转换成了半寒tuple的list,对这个list进行迭代,就可以同时获得key和value。
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]
初学python笔记的更多相关文章
- 初学python笔记----字符串
---恢复内容开始--- 1.在python中,用引号括起来的都是字符串,引号可以是单引号,也可以是双引号 2.修改字符串的大小写 3.字符串拼接用“+” 4.制表符("\t"), ...
- 初学python笔记---列表
---恢复内容开始--- 1.列表的格式:用方括号([])来表示的,逗号来分隔元素,下标从0开始 2.根据下标来查看列表中元素,当索引为-1时,显示的是最后一个元素 print(a[0])-----1 ...
- Python笔记之不可不练
如果您已经有了一定的Python编程基础,那么本文就是为您的编程能力锦上添花,如果您刚刚开始对Python有一点点兴趣,不怕,Python的重点基础知识已经总结在博文<Python笔记之不可不知 ...
- boost.python笔记
boost.python笔记 标签: boost.python,python, C++ 简介 Boost.python是什么? 它是boost库的一部分,随boost一起安装,用来实现C++和Pyth ...
- 初学Python
初学Python 1.Python初识 life is short you need python--龟叔名言 Python是一种简洁优美语法接近自然语言的一种全栈开发语言,由"龟叔&quo ...
- 20.Python笔记之SqlAlchemy使用
Date:2016-03-27 Title:20.Python笔记之SqlAlchemy使用 Tags:python Category:Python 作者:刘耀 博客:www.liuyao.me 一. ...
- Python笔记——类定义
Python笔记——类定义 一.类定义: class <类名>: <语句> 类实例化后,可以使用其属性,实际上,创建一个类之后,可以通过类名访问其属性 如果直接使用类名修改其属 ...
- 13.python笔记之pyyaml模块
Date:2016-03-25 Title:13.Python笔记之Pyymal模块使用 Tags:Python Category:Python 博客地址:www.liuyao.me 作者:刘耀 YA ...
- 8.python笔记之面向对象基础
title: 8.Python笔记之面向对象基础 date: 2016-02-21 15:10:35 tags: Python categories: Python --- 面向对象思维导图 (来自1 ...
随机推荐
- 站在CSS3的肩上定义选择器
按上下文选择元素 按祖先元素选择要格式化的元素 输入ancestor,这里的ancestor是希望格式化的元素的祖先元素的选择器. 输入一个空格(必不可少). 如果需要,对后续的每个祖先元素重复第(1 ...
- java ->网络通信协议(UDP协议、TCP协议)
网络通信协议 通过计算机网络可以使多台计算机实现连接,位于同一个网络中的计算机在进行连接和通信时需要遵守一定的规则,这就好比在道路中行驶的汽车一定要遵守交通规则一样.在计算机网络中,这些连接和通信的规 ...
- java-> 分包分层
项目分层(分包)的作用 程序为什么要分包分层? 以顾客去饭店吃饭案例分析一下: 小饭店: 一个服务员搞定(接待顾客\点菜\炒菜) 大饭店: 迎宾员(是否有预定\ 询问吃中餐还是西餐或者烧烤等\ 几位用 ...
- 【题解】合唱队形——LIS坑爹的二分优化
题目 [题目描述]N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形.合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2…,K,他们的身高分别为T1 ...
- 函数的不同调用方式决定了this的指向不同
一.函数的不同调用方式决定了this的指向不同,一般指向调用者 1.普通函数 this指向window的调用者 function fn(){ console.l ...
- Form action 方法上传文件
<form method="post" id="form1" runat="server" enctype="multipa ...
- springboot使用redis的keyspace notifications 实现定时通知
简单定时任务解决方案:使用redis的keyspace notifications(键失效后通知事件) 需要注意此功能是在redis 2.8版本以后推出的,因此你服务器上的reids最少要是2.8版本 ...
- 【MySQL】详细说下MySQL删除数据的过程是什么样的?
drop table 这里先介绍一下[InnoDB]存储表空间概念: Innodb存储引擎,可将所有的数据库数据存放于[ibdata1]的共享表空间:也可以将每张表存放于独立的.idb文件的独立表空间 ...
- json字符串转List集合
public List<Map<String,PendingInfo>> jsonToList(String json){//PendingInfo可以换成其它bean类 Li ...
- PHPstudy 修改数据库上传大小
要修改的地方已经标出来了 直接修改为你需要的值即可: