集合,循环控制

python常用结构

python常用结构有集合以及循环,另外集合包括列表和集合两大类。

集合类

  • 有序列表list
    1
    2
    3
    >>> listTest = ['ha','test','yes']
    >>> listTest
    ['ha', 'test', 'yes']

len()获取list元素个数。

1
2
>>> len(listTest)
3

可以用索引来访问每一个元素,0表示第一个,-1还可以表示最后一个,即倒数第一个,依此类推-2表示倒数第二个,超过了也会报越界错误。

1
2
3
4
5
6
7
8
9
10
11
12
>>> listTest[0]
'ha'
>>> listTest[1]
'test'
>>> listTest[3]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list index out of range
>>> listTest[-1]
'yes'
>>> listTest[-2]
'test'

也可以把元素插入到指定的位置,比如索引号为1的位置:

1
2
3
>>> listTest.insert(1,'jack')
>>> listTest
['ha', 'jack', 'test', 'yes']

删除末尾元素,用pop()方法,添加到末尾用append()

1
2
3
4
5
6
>>> list
['ha', 'jack', 'test', 'yes']
>>> listTest.pop()
'yes'
>>> listTest
['ha', 'jack', 'test']

删除指定位置的元素,用pop(i)方法,其中i是索引位置:

1
2
3
4
5
6
>>> listTest
['ha', 'jack', 'test']
>>> listTest.pop(1)
'jack'
>>> listTest
['ha', 'test']

把某个元素替换,直接赋值即可,并且类型也可以不同:

1
2
3
4
5
6
7
8
>>> listTest
['ha', 'test']
>>> listTest[1] = 'debug'
>>> listTest
['ha', 'debug']
>>> listTest[1] = 123
>>> listTest
['ha', 123]

list也可以嵌套:

1
2
3
4
5
6
7
8
9
>>> s = ['python', 'java', ['asp', 'php'], 'scheme']
>>> len(s)
4
>>> s[1]
'java'
>>> s[2]
['asp', 'php']
>>> s[2][1]
'php'

空的list:

1
2
3
>>> L = []
>>> len(L)
0
  • 不可变列表tuple
    另一种有序列表叫元组:tuple。tuple和list非常类似,但是tuple一旦初始化就不能修改。
    1
    2
    3
    4
    5
    >>> classmates = ('Michael', 'Bob', 'Tracy')
    >>> classmates
    ('Michael', 'Bob', 'Tracy')
    >>> classmates[1]
    'Bob'
    注意:由于tuple不可变,所以代码更安全,如果可能,能用tuple代替list就尽量用tuple
    tuple的陷阱:当你定义一个tuple时,在定义的时候,tuple的元素就必须被确定下来,比如:
    1
    2
    3
    >>> t = (1, 2)
    >>> t
    (1, 2)
    如果要定义一个空的tuple,可以写成():
    1
    2
    3
    >>> t = ()
    >>> t
    ()
    但是,要定义一个只有1个元素的tuple,如果你这么定义:
    1
    2
    3
    >>> t = (1)
    >>> t
    1
    定义的不是tuple,是1这个数!这是因为括号()既可以表示tuple,又可以表示数学公式中的小括号,这就产生了歧义,因此,Python规定,这种情况下,按小括号进行计算,计算结果自然是1

所以,只有1个元素的tuple定义时必须加一个逗号,,来消除歧义:

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

Python在显示只有1个元素的tuple时,也会加一个逗号,,以免你误解成数学计算意义上的括号。
最后来看一个可变的tuple:

1
2
3
4
5
>>> t = ('a', 'b', ['A', 'B'])
>>> t[2][0] = 'X'
>>> t[2][1] = 'Y'
>>> t
('a', 'b', ['X', 'Y'])

注意:tuple所谓的不变是说,tuple的每个元素,指向永远不变。

  • Map
    Python内置了字典:dict的支持,dict全称dictionary,在Java/C++中也称为Map,使用键-值(key-value)存储,具有极快的查找速度。
    1
    2
    3
    >>> d = {'Michael': 95, 'Bob': 75, 'Tracy': 85}
    >>> d['Michael']
    95

把数据放入dict的方法,除了初始化时指定外,还可以通过key放入:

1
2
3
>>> d['Adam'] = 67
>>> d['Adam']
67

注意:如果key不存在,dict就会报错:

1
2
3
4
>>> d['Thomas']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'Thomas'

要避免key不存在的错误,有两种办法,一是通过in判断key是否存在:

1
2
>>> 'Thomas' in d
False

或者通过dict提供的get方法,如果key不存在,可以返回None,或者自己指定的value:

1
2
3
>>> d.get('Thomas')
>>> d.get('Thomas', -1)
-1

删除dict里的元素,用pop(key)方法,对应的value也会从dict中删除:

1
2
3
4
>>> d.pop('Bob')
75
>>> d
{'Michael': 95, 'Tracy': 85}

正确使用dict非常重要,需要牢记的第一条就是dictkey必须是不可变对象。

  • set集合
    setdict类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的key
    要创建一个set,需要提供一个list作为输入集合:
    1
    2
    3
    >>> s = set([1, 2, 3])
    >>> s
    set([1, 2, 3])
    set会自动过滤重复元素,add(key)添加元素,可以重复添加,但是没有效果。remove(key)删除元素。对于两个集合,还可以通过&取集合的交集,|取集合的并集。

循环控制

  • 条件判断
    之前学过Java/C++可能会不太习惯这种方式,先看看python的条件判断代码:

    1
    2
    3
    4
    age = 20
    if age >= 18:
    print 'your age is', age
    print 'adult'

    根据Python的缩进规则,缩进的代码块就相当于Java/C++里大括号的内容。即ifTrue,执行代码块内容,加elseelif同理,注意不要漏掉:

    1
    2
    3
    4
    5
    6
    7
    8
    if <条件判断1>:
    <执行1>
    elif <条件判断2>:
    <执行2>
    elif <条件判断3>:
    <执行3>
    else:
    <执行4>

    注意: if还可以简写,下面这个和Java/C++有很大的不同,python对类型的判断很宽松,只要x是非零数值、非空字符串、非空list等,就判断为True,否则为False

    1
    2
    if x:
    print 'True'
  • 循环控制
    循环和Java/C++就很像了,也是有两种:for循环和while循环。
    for x in ...循环就是把每个元素代入变量x,然后执行缩进代码块:

    1
    2
    3
    names = ['Michael', 'Bob', 'Tracy']
    for name in names:
    print name

while循环,只要条件满足,就不断循环

1
2
3
4
5
6
sum = 0
n = 99
while n > 0:
sum = sum + n
n = n - 2
print sum