1.Python创建list:

Python内置的一种数据类型是列表:list。list是一种有序的集合,可以随时添加和删除其中的元素。

比如,列出班里所有同学的名字,就可以用一个list表示:

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

list是数学意义上的有序集合,也就是说,list中的元素是按照顺序排列的。

构造list非常简单,按照上面的代码,直接用 [ ] 把list的所有元素都括起来,就是一个list对象。通常,我们会把list赋值给一个变量,这样,就可以通过变量来引用list:

>>> classmates = ['Michael', 'Bob', 'Tracy']
>>> classmates # 打印classmates变量的内容
['Michael', 'Bob', 'Tracy']

由于Python是动态语言,所以list中包含的元素并不要求都必须是同一种数据类型,我们完全可以在list中包含各种数据:

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

一个元素也没有的list,就是空list:

>>> empty_list = []

任务

假设班里有3名同学:Adam,Lisa和Bart,他们的成绩分别是 95.5,85 和 59,请按照 名字, 分数, 名字, 分数... 的顺序按照分数从高到低用一个list表示,然后打印出来。

2.Python按照索引访问list:

由于list是一个有序集合,所以,我们可以用一个list按分数从高到低表示出班里的3个同学:

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

那我们如何从list中获取指定第 N 名的同学呢?方法是通过索引来获取list中的指定元素。

需要特别注意的是,索引从 0 开始,也就是说,第一个元素的索引是0,第二个元素的索引是1,以此类推。

因此,要打印第一名同学的名字,用 L[0]:

>>> print L[0]
Adam

要打印第二名同学的名字,用 L[1]:

>>> print L[1]
Lisa

要打印第三名同学的名字,用 L[2]:

>>> print L[2]
Bart

要打印第四名同学的名字,用 L[3]:

>>> print L[3]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list index out of range

报错了!IndexError意思就是索引超出了范围,因为上面的list只有3个元素,有效的索引是 0,1,2。

所以,使用索引时,千万注意不要越界。

任务

三名同学的成绩可以用一个list表示:

L = [95.5, 85, 59]

请按照索引分别打印出第一名、第二名、第三名,同时测试 print L[3]。

3.Python之倒序访问list:

我们还是用一个list按分数从高到低表示出班里的3个同学:

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

这时,老师说,请分数最低的同学站出来。

要写代码完成这个任务,我们可以先数一数这个 list,发现它包含3个元素,因此,最后一个元素的索引是2:

>>> print L[2]
Bart

有没有更简单的方法?

有!

Bart同学是最后一名,俗称倒数第一,所以,我们可以用 -1 这个索引来表示最后一个元素:

>>> print L[-1]
Bart

Bart同学表示躺枪。

类似的,倒数第二用 -2 表示,倒数第三用 -3 表示,倒数第四用 -4 表示:

>>> print L[-2]
Lisa
>>> print L[-3]
Adam
>>> print L[-4]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list index out of range

L[-4] 报错了,因为倒数第四不存在,一共只有3个元素。

使用倒序索引时,也要注意不要越界。

任务

三名同学的成绩可以用一个list表示:

L = [95.5, 85, 59]

请按照倒序索引分别打印出倒数第一、倒数第二、倒数第三。

4.Python之添加新元素:

现在,班里有3名同学:

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

今天,班里转来一名新同学 Paul,如何把新同学添加到现有的 list 中呢?

第一个办法是用 list 的 append() 方法,把新同学追加到 list 的末尾:

>>> L = ['Adam', 'Lisa', 'Bart']
>>> L.append('Paul')
>>> print L
['Adam', 'Lisa', 'Bart', 'Paul']

append()总是把新的元素添加到 list 的尾部。

如果 Paul 同学表示自己总是考满分,要求添加到第一的位置,怎么办?

方法是用list的 insert()方法,它接受两个参数,第一个参数是索引号,第二个参数是待添加的新元素:

>>> L = ['Adam', 'Lisa', 'Bart']
>>> L.insert(0, 'Paul')
>>> print L
['Paul', 'Adam', 'Lisa', 'Bart']

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

任务

假设新来一名学生Paul,Paul 同学的成绩比Bart好,但是比Lisa差,他应该排到第三名的位置,请用代码实现。

5.Python从list删除元素:

pop(3)->poe(2)-pop(1)

Paul同学刚来几天又要转走了,那么我们怎么把Paul 从现有的list中删除呢?

如果Paul同学排在最后一个,我们可以用list的pop()方法删除:

>>> L = ['Adam', 'Lisa', 'Bart', 'Paul']
>>> L.pop()
'Paul'
>>> print L
['Adam', 'Lisa', 'Bart']

pop()方法总是删掉list的最后一个元素,并且它还返回这个元素,所以我们执行 L.pop() 后,会打印出 'Paul'。

如果Paul同学不是排在最后一个怎么办?比如Paul同学排在第三:

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

要把Paul踢出list,我们就必须先定位Paul的位置。由于Paul的索引是2,因此,用 pop(2)把Paul删掉:

>>> L.pop(2)
'Paul'
>>> print L
['Adam', 'Lisa', 'Bart']

任务

注意右边编辑器代码中 list 如下:

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

Paul的索引是2,Bart的索引是3,如果我们要把Paul和Bart都删掉,请解释下面的代码为什么不能正确运行:

L.pop(2)
L.pop(3)

怎样调整代码可以把Paul和Bart都正确删除掉?

6.Python中替换元素:

假设现在班里仍然是3名同学:

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

现在,Bart同学要转学走了,碰巧来了一个Paul同学,要更新班级成员名单,我们可以先把Bart删掉,再把Paul添加进来。

另一个办法是直接用Paul把Bart给替换掉:

>>> L[2] = 'Paul'
>>> print L
L = ['Adam', 'Lisa', 'Paul']

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

由于Bart还可以用 -1 做索引,因此,下面的代码也可以完成同样的替换工作:

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

任务

班里的同学按照分数排名是这样的:

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

但是,在一次考试后,Bart同学意外取得第一,而Adam同学考了倒数第一。

请通过对list的索引赋值,生成新的排名。

7.Python之创建tuple:

tuple是另一种有序的列表,中文翻译为“ 元组 ”。tuple 和 list 非常类似,但是,tuple一旦创建完毕,就不能修改了。

同样是表示班里同学的名称,用tuple表示如下:

>>> t = ('Adam', 'Lisa', 'Bart')

创建tuple和创建list唯一不同之处是用( )替代了[ ]

现在,这个 t 就不能改变了,tuple没有 append()方法,也没有insert()和pop()方法。所以,新同学没法直接往 tuple 中添加,老同学想退出 tuple 也不行。

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

>>> t[0] = 'Paul'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment

8.Python之创建单元素tuple:

tuple和list一样,可以包含 0 个、1个和任意多个元素。

包含多个元素的 tuple,前面我们已经创建过了。

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

>>> t = ()
>>> print t
()

创建包含1个元素的 tuple 呢?来试试:

>>> t = (1)
>>> print t
1

好像哪里不对!t 不是 tuple ,而是整数1。为什么呢?

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

正是因为用()定义单元素的tuple有歧义,所以 Python 规定,单元素 tuple 要多加一个逗号“,”,这样就避免了歧义:

>>> t = (1,)
>>> print t
(1,)

Python在打印单元素tuple时,也自动添加了一个“,”,为了更明确地告诉你这是一个tuple。

多元素 tuple 加不加这个额外的“,”效果是一样的:

>>> t = (1, 2, 3,)
>>> print t
(1, 2, 3)

任务

请指出右边编辑器中代码为什么没有创建出包含一个学生的 tuple:

t = ('Adam')

print t

请修改代码,确保 t 是一个tuple。

9.Python之“可变”的tuple:

前面我们看到了tuple一旦创建就不能修改。现在,我们来看一个“可变”的tuple:

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

注意到 t 有 3 个元素:'a','b'和一个list:['A', 'B']。list作为一个整体是tuple的第3个元素。list对象可以通过 t[2] 拿到:

>>> L = t[2]

然后,我们把list的两个元素改一改:

>>> L[0] = 'X'
>>> L[1] = 'Y'

再看看tuple的内容:

>>> print t
('a', 'b', ['X', 'Y'])

不是说tuple一旦定义后就不可变了吗?怎么现在又变了?

别急,我们先看看定义的时候tuple包含的3个元素:

当我们把list的元素'A'和'B'修改为'X'和'Y'后,tuple变为:

表面上看,tuple的元素确实变了,但其实变的不是 tuple 的元素,而是list的元素。

tuple一开始指向的list并没有改成别的list,所以,tuple所谓的“不变”是说,tuple的每个元素,指向永远不变。即指向'a',就不能改成指向'b',指向一个list,就不能改成指向其他对象,但指向的这个list本身是可变的!

理解了“指向不变”后,要创建一个内容也不变的tuple怎么做?那就必须保证tuple的每一个元素本身也不能变。

任务

定义了tuple:

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

由于 t 包含一个list元素,导致tuple的内容是可变的。能否修改上述代码,让tuple内容不可变?

10.Python之if语句:

计算机之所以能做很多自动化的任务,因为它可以自己做条件判断。

比如,输入用户年龄,根据年龄打印不同的内容,在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和空格,否则很容易造成因为缩进引起的语法错误。

注意: if 语句后接表达式,然后用:表示代码块开始。

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

>>> age = 20
>>> if age >= 18:
... print 'your age is', age
... print 'adult'
...
your age is 20
adult

任务

如果成绩达到60分或以上,视为passed。

假设Bart同学的分数是75,请用if语句判断是否能打印出 passed:

11.Python之 if-else:

当 if 语句判断表达式的结果为 True 时,就会执行 if 包含的代码块:

if age >= 18:
print 'adult'

如果我们想判断年龄在18岁以下时,打印出 'teenager',怎么办?

方法是再写一个 if:

if age < 18:
print 'teenager'

或者用 not 运算:

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 后面有个“:”。

任务

如果成绩达到60分或以上,视为passed,否则视为failed。

假设Bart同学的分数是55,请用if语句打印出 passed 或者 failed:

12.Python之 if-elif-else:

有的时候,一个 if ... else ... 还不够用。比如,根据年龄的划分:

条件1:18岁或以上:adult
条件2:6岁或以上:teenager
条件3:6岁以下:kid

我们可以用一个 if age >= 18 判断是否符合条件1,如果不符合,再通过一个 if 判断 age >= 6 来判断是否符合条件2,否则,执行条件3:

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,执行完对应的代码块,后面的条件判断就直接忽略,不再执行了。

请思考下面的代码:

age = 8
if age >= 6:
print 'teenager'
elif age >= 18:
print 'adult'
else:
print 'kid'

当 age = 8 时,结果正确,但 age = 20 时,为什么没有打印出 adult?

如果要修复,应该如何修复?

任务

如果按照分数划定结果:

90分或以上:excellent

80分或以上:good

60分或以上:passed

60分以下:failed

请编写程序根据分数打印结果。

13.Python之 for循环:

list或tuple可以表示一个有序集合。如果我们想依次访问一个list中的每一个元素呢?比如 list:

L = ['Adam', 'Lisa', 'Bart']
print L[0]
print L[1]
print L[2]

如果list只包含几个元素,这样写还行,如果list包含1万个元素,我们就不可能写1万行print。

这时,循环就派上用场了。

Python的 for 循环就可以依次把list或tuple的每个元素迭代出来:

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

注意:  name 这个变量是在 for 循环中定义的,意思是,依次取出list中的每一个元素,并把元素赋值给 name,然后执行for循环体(就是缩进的代码块)。

这样一来,遍历一个list或tuple就非常容易了。

任务

班里考试后,老师要统计平均成绩,已知4位同学的成绩用list表示如下:

L = [75, 92, 59, 68]

请利用for循环计算出平均成绩。

14.Python之 while循环:

和 for 循环不同的另一种循环是 while 循环,while 循环不会迭代 list 或 tuple 的元素,而是根据表达式判断循环是否结束。

比如要从 0 开始打印不大于 N 的整数:

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循环的退出条件。

任务

利用while循环计算100以内奇数的和。

15.Python之 break退出循环:

用 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语句退出循环,这样也可以实现循环的结束。

任务

利用 while True 无限循环配合 break 语句,计算 1 + 2 + 4 + 8 + 16 + ... 的前20项的和。

16.Python之 continue继续循环:

在循环过程中,可以用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

任务

对已有的计算 0 - 100 的while循环进行改造,通过增加 continue 语句,使得只计算奇数的和:

sum = 0
x = 1
while True:
sum = sum + x
x = x + 1
if x > 100:
break
print sum

17.Python之 多重循环:

在循环内部,还可以嵌套循环,我们来看一个例子:

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

任务

对100以内的两位数,请使用一个两重循环打印出所有十位数数字比个位数数字小的数,例如,23(2 < 3)。


18.Python之什么是dict

我们已经知道,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。

任务

新来的Paul同学成绩是 75 分,请编写一个dict,把Paul同学的成绩也加进去。

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

19.Python之访问dict:

我们已经能创建一个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

20.Python中dict的特点:

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,可以根据分数来查找名字,已知成绩如下:

Adam: 95,

Lisa: 85,

Bart: 59.


21.Python更新dict:

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}

22.Python之 遍历dict:

由于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的值。

任务

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

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

23.Python中什么是set:

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表示班里的4位同学:

Adam, Lisa, Bart, Paul


24.Python之 访问set:

由于set存储的是无序集合,所以我们没法通过索引来访问。

访问 set中的某个元素实际上就是判断一个元素是否在set中。

例如,存储了班里同学名字的set:

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

我们可以用 in 操作符判断:

Bart是该班的同学吗?

>>> 'Bart' in s
True

Bill是该班的同学吗?

>>> 'Bill' in s
False

bart是该班的同学吗?

>>> 'bart' in s
False

看来大小写很重要,'Bart' 和 'bart'被认为是两个不同的元素。

任务

由于上述set不能识别小写的名字,请改进set,使得 'adam' 和 'bart'都能返回True。

25.Python之 set的特点:

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'

26.Python之 遍历set:

由于 set 也是一个集合,所以,遍历 set 和遍历 list 类似,都可以通过 for 循环实现。

直接使用 for 循环可以遍历 set 的元素:

>>> s = set(['Adam', 'Lisa', 'Bart'])
>>> for name in s:
... print name
...
Lisa
Adam
Bart

注意: 观察 for 循环在遍历set时,元素的顺序和list的顺序很可能是不同的,而且不同的机器上运行的结果也可能不同。

任务

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

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

27.Python之 更新set:

由于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()前需要判断。

任务

针对下面的set,给定一个list,对list中的每一个元素,如果在set中,就将其删除,如果不在set中,就添加进去。

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

Python:Base2(List和Tuple类型, 条件判断和循环,Dict和Set类型)的更多相关文章

  1. Python基础(一)_数据类型、条件判断、循环、列表

    编译型语言(中文版)运行代码之前,要先编译.然后再运行编译时间比较长c.c++.c# 解释型语言(翻译版)运行的时候才去编译,运行一次编译.运行效率没有编译型语言快python.ruby.shell. ...

  2. python学习笔记-(三)条件判断和循环

    1.条件判断语句 Python中条件选择语句的关键字为:if .elif .else这三个.其基本形式如下: age_of_cc = 27 age = int(input("guessage ...

  3. python学习笔记(三)条件判断和循环

    1.条件判断语句 Python中条件选择语句的关键字为:if .elif .else这三个.其基本形式如下: 1 2 3 4 5 6 7 8 9 age_of_cc = 27   age = int( ...

  4. python之--条件判断和循环

    Python之判断 和其他语言一样,python同样具有条件判断和循环的操作,比如我们可以编写一个简单的判断操作:使用if关键字可以达到判断的效果,如下例: >>> test_if ...

  5. python学习第六天 条件判断和循环

    总归来讲,学过C语言的同学,对条件判断和循环并不陌生.这次随笔只是普及一下python的条件判断和循环对应的语法而已. 条件判断: 不多说,直接贴代码: age = 23 if age >= 6 ...

  6. python入门(11)条件判断和循环

    python入门(11)条件判断和循环 条件判断 计算机之所以能做很多自动化的任务,因为它可以自己做条件判断. 比如,输入用户年龄,根据年龄打印不同的内容,在Python程序中,用if语句实现: ag ...

  7. Python第四天 流程控制 if else条件判断 for循环 while循环

    Python第四天   流程控制   if else条件判断   for循环 while循环 目录 Pycharm使用技巧(转载) Python第一天  安装  shell  文件 Python第二天 ...

  8. python基础(二)条件判断、循环、格式化输出

    继续上一篇,今天主要总结一下条件判断.循环.格式化输出 一.条件判断 python中条件判断使用if else来判断,多分支的话使用if elif ... else,也就是如果怎么怎么样就怎么怎么样, ...

  9. Python之条件判断和循环(入门4)

    转载请标明出处: http://www.cnblogs.com/why168888/p/6407755.html 本文出自:[Edwin博客园] Python之条件判断和循环 1. Python之if ...

  10. 写给.NET开发者的Python教程(三):运算符、条件判断和循环语句

    本节会介绍Python中运算符的用法,以及条件判断和循环语句的使用方法. 运算符 运算符包括算术运算符.赋值运算符.比较运算符.逻辑运算符等内容,大部分用法和C#基本一致,下面我们来看一下: 算数运算 ...

随机推荐

  1. 布隆算法(BloomFilter)

          BloomFilter算法,是一种大数据排重算法.在一个数据量很大的集合里,能准确断定一个对象不在集合里:判断一个对象有可能在集合里,而且占用的空间不大.它不适合那种要求准确率很高的情况, ...

  2. Httpd总结 :HTTPD的基本概念

    这是一篇为初学者准备的文章,所以作者会尽量从基础出发,尽量细致的描述每一个细节,以求让初学者不会一头雾水,有一定基础的同学就不用看了,以免浪费你的时间.   假设博主今天春心荡漾,想要访问一些不可描述 ...

  3. hive日期函数-Demo(二)

    需求:某资产近一个月的资产值 比如:今天是2018年2月28日,近一个月若是按照自然月来算,那么是2018年2月1日至2018年2月28日.最终需要的日期格式为:yyyyMMdd. 当日时间戳 uni ...

  4. AngularJs-变量

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  5. java8 Date Localdatetime instant 相互转化(转) 及当天的最大/最小时间

    Java 8中 java.util.Date 类新增了两个方法,分别是from(Instant instant)和toInstant()方法 // Obtains an instance of Dat ...

  6. 【BD2】- Linux安装db2 v11.1

    一.背景 项目需要兼容多种数据库oracle.mysql.db2.KingDB等等...... 自己在阿里云买的服务器安装测试...... 二.记录安装过程 1.创建db2目录 [root@ysx y ...

  7. React事件,修改this.state的值

    1.React中绑定事件 React中绑定事件格式: onClick = { function } React中绑定事件的标准用法: import React from 'react' export ...

  8. windows驱动开发详解学习笔记

    1. windows驱动分两类,NT式驱动和WDM驱动,后者支持即插即用: 2. DriverEntry是入口函数,传入参数:pDriverObject由IO管理器传入: 3. WDM驱动中,AddD ...

  9. vue使用子路由时,默认的子路由视图不显示问题

    解决办法是,将父级的name去掉.(大多数情况下是按name来跳转的,不过这样一改,调到父级就得用路径跳转了): 下面上一下路由的配置: { path: "/index", com ...

  10. vue 使用axios 出现跨域请求的两种解决方法

    最近在使用vue axios发送请求,结果出现跨域问题,网上查了好多,发现有好几种结局方案. 1:服务器端设置跨域 header(“Access-Control-Allow-Origin:*”); h ...