好比,输入用户年龄,根据年龄打印不一样的内容,在Python程序中,能够用if语句实现:函数
age = 20 if age >= 18: print 'your age is', age print 'adult' print 'END'
注意: Python代码的缩进规则。具备相同缩进的代码被视为代码块,上面的3,4行 print 语句就构成一个代码块(但不包括第5行的print)。若是 if 语句判断为 True,就会执行这个代码块。测试
缩进请严格按照Python的习惯写法:4个空格,不要使用Tab,更不要混合Tab和空格,不然很容易形成由于缩进引发的语法错误。spa
(tab在不一样的操做系统平台、不一样的应用里缩进的空格数是不一样的,因此不建议用tab)操作系统
注意: if 语句后接表达式,而后用 :
表示代码块开始。code
若是你在Python交互环境下敲代码,还要特别留意缩进,而且退出缩进须要多敲一行回车:对象
>>> age = 20 >>> if age >= 18: ... print 'your age is', age ... print 'adult' ... your age is 20 adult
当 if 语句判断表达式的结果为 True 时,就会执行 if 包含的代码块:blog
if age >= 18: print 'adult'
若是咱们想判断年龄在18岁如下时,打印出 'teenager',怎么办?索引
方法是再写一个 if:内存
if age < 18: print 'teenager'
或者用 not 运算:rem
if not age >= 18: print 'teenager'
细心的同窗能够发现,这两种条件判断是“非此即彼”的,要么符合条件1,要么符合条件2,所以,彻底能够用一个 if ... else ... 语句把它们统一块儿来:
if age >= 18: print 'adult' else: print 'teenager'
利用 if ... else ... 语句,咱们能够根据条件表达式的值为 True 或者 False ,分别执行 if 代码块或者 else 代码块。
注意: else 后面有个“:”。
问题:使用IDEL编译Python代码,自带行缩进功能。所以每次输入else: 都会出现:IndentationError: unindent does not match any outer indentation level问题 解决办法:if前面虽然有>>>3个占位符,可是if实际上仍是顶格,首行缩进为0,因此在输入else以前,使用Backspace,使else首行缩进为0. 代码: >>> score=55 >>> if score<=60: print 'Failed' else: print 'Passed' Failed
if age >= 18: print 'adult' else: if age >= 6: print 'teenager' else: print 'kid'
这样写出来,咱们就获得了一个两层嵌套的 if ... else ... 语句。这个逻辑没有问题,可是,若是继续增长条件,好比3岁如下是 baby:
if age >= 18: print 'adult' else: if age >= 6: print 'teenager' else: if age >= 3: print 'kid' else: print 'baby'
这种缩进只会愈来愈多,代码也会愈来愈难看。
要避免嵌套结构的 if ... else ...,咱们能够用 if ... 多个elif ... else ...的结构,一次写完全部的规则:
if age >= 18: print 'adult' elif age >= 6: print 'teenager' elif age >= 3: print 'kid' else: print 'baby'
elif 意思就是 else if。这样一来,咱们就写出告终构很是清晰的一系列条件判断。
特别注意: 这一系列条件判断会从上到下依次判断,若是某个判断为 True,执行完对应的代码块,后面的条件判断就直接忽略,再也不执行了。
list或tuple能够表示一个有序集合。若是咱们想依次访问一个list中的每个元素呢?好比 list。
Python的 for 循环就能够依次把list或tuple的每一个元素迭代出来:
L = ['Adam', 'Lisa', 'Bart'] for name in L: print name
注意: name 这个变量是在 for 循环中定义的,意思是,依次取出list中的每个元素,并把元素赋值给 name,而后执行for循环体(就是缩进的代码块)。
这样一来,遍历一个list或tuple就很是容易了。
N = 10 x = 0 while x < N: print x x = x + 1
while循环每次先判断 x < N,若是为True,则执行循环体的代码块,不然,退出循环。
在循环体内,x = x + 1 会让 x 不断增长,最终由于 x < N 不成立而退出循环。
若是没有这一个语句,while循环在判断 x < N 时老是为True,就会无限循环下去,变成死循环,因此要特别留意while循环的退出条件。
用 for 循环或者 while 循环时,若是要在循环体内直接退出循环,可使用 break 语句。
好比计算1至100的整数和,咱们用while来实现:
sum = 0 x = 1 while True: sum = sum + x x = x + 1 if x > 100: break print sum
咋一看, while True 就是一个死循环,可是在循环体内,咱们还判断了 x > 100 条件成立时,用break语句退出循环,这样也能够实现循环的结束。
在循环过程当中,能够用break退出当前循环,还能够用continue跳事后续循环代码,继续下一次循环。
假设咱们已经写好了利用for循环计算平均分的代码:
L = [75, 98, 59, 81, 66, 43, 69, 85] sum = 0.0 n = 0 for x in L: sum = sum + x n = n + 1 print sum / n
如今老师只想统计及格分数的平均分,就要把 x < 60 的分数剔除掉,这时,利用 continue,能够作到当 x < 60的时候,不继续执行循环体的后续代码,直接进入下一次循环:
for x in L: if x < 60: continue sum = sum + x n = n + 1
在循环内部,还能够嵌套循环,咱们来看一个例子:
for x in ['A', 'B', 'C']: for y in ['1', '2', '3']: print x + y
x 每循环一次,y 就会循环 3 次,这样,咱们能够打印出一个全排列:
A1
A2
A3
B1
B2
B3
C1
C2
C3
咱们已经知道,list 和 tuple 能够用来表示顺序集合,例如,班里同窗的名字:
['Adam', 'Lisa', 'Bart']
或者考试的成绩列表:
[95, 85, 59]
可是,要根据名字找到对应的成绩,用两个 list 表示就不方便。
若是把名字和分数关联起来,组成相似的查找表:
'Adam' ==> 95 'Lisa' ==> 85 'Bart' ==> 59
给定一个名字,就能够直接查到分数。
Python的 dict 就是专门干这件事的。用 dict 表示“名字”-“成绩”的查找表以下:
d = { 'Adam': 95, 'Lisa': 85, 'Bart': 59 }
咱们把名字称为key,对应的成绩称为value,dict就是经过 key来查找 value。
花括号 {} 表示这是一个dict,而后按照 key: value, 写出来便可。最后一个 key: value 的逗号能够省略。
因为dict也是集合,len() 函数能够计算任意集合的大小:
>>> len(d) 3
注意: 一个 key-value 算一个,所以,dict大小为3。
咱们已经能建立一个dict,用于表示名字和成绩的对应关系:
d = { 'Adam': 95, 'Lisa': 85, 'Bart': 59 }
那么,如何根据名字来查找对应的成绩呢?
能够简单地使用 d[key] 的形式来查找对应的 value,这和 list 很像,不一样之处是,list 必须使用索引返回对应的元素,而dict使用key:
>>> print d['Adam'] 95 >>> print d['Paul'] Traceback (most recent call last): File "index.py", line 11, in <module> print d['Paul'] KeyError: 'Paul'
注意: 经过 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:
>>> print d.get('Bart') 59 >>> print d.get('Paul') None
例子:
任务 根据以下dict: d = { 'Adam': 95, 'Lisa': 85, 'Bart': 59 } 请打印出: Adam: 95 Lisa: 85 Bart: 59
d = { 'Adam': 95, 'Lisa': 85, 'Bart': 59 } print 'Adam:', d['Adam'] print 'Lisa:', d['Lisa'] print 'Bart:', d['Bart']
dict的第一个特色是查找速度快,不管dict有10个元素仍是10万个元素,查找速度都同样。而list的查找速度随着元素增长而逐渐降低。
不过dict的查找速度快不是没有代价的,dict的缺点是占用内存大,还会浪费不少内容,list正好相反,占用内存小,可是查找速度慢。
因为dict是按 key 查找,因此,在一个dict中,key不能重复。
dict的第二个特色就是存储的key-value序对是没有顺序的!这和list不同:
d = { 'Adam': 95, 'Lisa': 85, 'Bart': 59 }
当咱们试图打印这个dict时:
>>> print d {'Lisa': 85, 'Adam': 95, 'Bart': 59}
打印的顺序不必定是咱们建立时的顺序,并且,不一样的机器打印的顺序均可能不一样,这说明dict内部是无序的,不能用dict存储有序的集合。
dict的第三个特色是做为 key 的元素必须不可变,Python的基本类型如字符串、整数、浮点数都是不可变的,均可以做为 key。可是list是可变的,就不能做为 key。
能够试试用list做为key时会报什么样的错误。
不可变这个限制仅做用于key,value是否可变无所谓:
{ '123': [1, 2, 3], # key 是 str,value是list 123: '123', # key 是 int,value 是 str ('a', 'b'): True # key 是 tuple,而且tuple的每一个元素都是不可变对象,value是 boolean }
最经常使用的key仍是字符串,由于用起来最方便。
dict是可变的,也就是说,咱们能够随时往dict中添加新的 key-value。好比已有dict:
d = { 'Adam': 95, 'Lisa': 85, 'Bart': 59 }
要把新同窗'Paul'的成绩 72 加进去,用赋值语句:
>>> d['Paul'] = 72
再看看dict的内容:
>>> print d {'Lisa': 85, 'Paul': 72, 'Adam': 95, 'Bart': 59}
若是 key 已经存在,则赋值会用新的 value 替换掉原来的 value:
>>> d['Bart'] = 60 >>> print d {'Lisa': 85, 'Paul': 72, 'Adam': 95, 'Bart': 60}
因为dict也是一个集合,因此,遍历dict和遍历list相似,均可以经过 for 循环实现。
直接使用for循环能够遍历 dict 的 key:
>>> d = { 'Adam': 95, 'Lisa': 85, 'Bart': 59 } >>> for key in d: ... print key ... Lisa Adam Bart
因为经过 key 能够获取对应的 value,所以,在循环体内,能够获取到value的值。
例子:
d = { 'Adam': 95, 'Lisa': 85, 'Bart': 59 } for key in d: print key+":",d[key] #print key,":",d[key]
dict的做用是创建一组 key 和一组 value 的映射关系,dict的key是不能重复的。
有的时候,咱们只想要 dict 的 key,不关心 key 对应的 value,目的就是保证这个集合的元素不会重复,这时,set就派上用场了。
set 持有一系列元素,这一点和 list 很像,可是set的元素没有重复,并且是无序的,这点和 dict 的 key很像。
建立 set 的方式是调用 set() 并传入一个 list,list的元素将做为set的元素:
>>> s = set(['A', 'B', 'C'])
能够查看 set 的内容:
>>> print s set(['A', 'C', 'B'])
请注意,上述打印的形式相似 list, 但它不是 list,仔细看还能够发现,打印的顺序和原始 list 的顺序有多是不一样的,由于set内部存储的元素是无序的。
由于set不能包含重复的元素,因此,当咱们传入包含重复元素的 list 会怎么样呢?
>>> s = set(['A', 'B', 'C', 'C']) >>> print s set(['A', 'C', 'B']) >>> len(s) 3
结果显示,set会自动去掉重复的元素,原来的list有4个元素,但set只有3个元素。
因为set存储的是无序集合,因此咱们无法经过索引来访问。访问 set中的某个元素实际上就是判断一个元素是否在set中。
例如,存储了班里同窗名字的set:
>>> s = set(['Adam', 'Lisa', 'Bart', 'Paul'])
咱们能够用 in 操做符判断:Bart是该班的同窗吗?
>>> 'Bart' in s True
bart是该班的同窗吗?
>>> 'bart' in s False
看来大小写很重要,'Bart' 和 'bart'被认为是两个不一样的元素。
set的内部结构和dict很像,惟一区别是不存储value,所以,判断一个元素是否在set中速度很快。
set存储的元素和dict的key相似,必须是不变对象,所以,任何可变对象是不能放入set中的。
最后,set存储的元素也是没有顺序的。
set的这些特色,能够应用在哪些地方呢?
星期一到星期日能够用字符串'MON', 'TUE', ... 'SUN'表示。
假设咱们让用户输入星期一至星期日的某天,如何判断用户的输入是不是一个有效的星期呢?
能够用 if 语句判断,但这样作很是繁琐:
x = '???' # 用户输入的字符串 if x!= 'MON' and x!= 'TUE' and x!= 'WED' ... and x!= 'SUN': print 'input error' else: print 'input ok'
注意:if 语句中的...表示没有列出的其它星期名称,测试时,请输入完整。
若是事先建立好一个set,包含'MON' ~ 'SUN':
weekdays = set(['MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT', 'SUN'])
再判断输入是否有效,只须要判断该字符串是否在set中:
x = '???' # 用户输入的字符串 if x in weekdays: print 'input ok' else: print 'input error'
这样一来,代码就简单多了。
因为 set 也是一个集合,因此,遍历 set 和遍历 list 相似,均可以经过 for 循环实现。
直接使用 for 循环能够遍历 set 的元素:
>>> s = set(['Adam', 'Lisa', 'Bart']) >>> for name in s: ... print name ... Lisa Adam Bart
注意: 观察 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 = set([1, 2, 3]) >>> s.add(3) >>> print s set([1, 2, 3])
删除set中的元素时,用set的remove()方法:
>>> s = set([1, 2, 3, 4]) >>> s.remove(4) >>> print s set([1, 2, 3])
若是删除的元素不存在set中,remove()会报错:
>>> s = set([1, 2, 3]) >>> s.remove(4) Traceback (most recent call last): File "<stdin>", line 1, in <module> KeyError: 4
因此用add()能够直接添加,而remove()前须要判断。
参考慕课网课程:http://www.imooc.com/learn/177