初学Python Ⅱ

Python 基础

使用list和tuple

list

list是一种有序的集合,可以随时添加和删除其中的元素。

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

1
2
3
>>> classmates = ['Michael', 'Bob', 'Tracy']
>>> classmates
['Michael', 'Bob', 'Tracy']

list的成员可以通过类似下标访问:

1
2
3
4
>>> classmates[0]
'Michael'
>>> classmates[1]
'Bob'

如果要取最后一个元素,除了计算索引位置外,还可以用-1做索引,直接获取最后一个元素:

1
2
3
4
>>> classmates[-1]
'Tracy'
>>> classmates[-2]
'Bob'

list是一个可变的有序表,所以,可以往list中追加元素到末尾:

1
2
3
>>> classmates.append('Adam')
>>> classmates
['Michael', 'Bob', 'Tracy', 'Adam']

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

1
2
3
>>> classmates.insert(1, 'Jack')
>>> classmates
['Michael', 'Jack', 'Bob', 'Tracy', 'Adam']

要删除list末尾的元素,用pop()方法:

1
2
3
4
>>> classmates.pop()
'Adam'
>>> classmates
['Michael', 'Jack', 'Bob', 'Tracy']

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

1
2
3
4
>>> classmates.pop(1)
'Jack'
>>> classmates
['Michael', 'Bob', 'Tracy']

list内的成员类型可以不同,甚至成员可以是另一个list

1
2
3
4
5
6
>>> L = ['apple', 123, True]
>>> s = ['python', 'java', ['asp', 'php'], 'scheme']
>>> len(s)
4
>>> s[2][1]
'php'

tuple

另一种有序列表叫元组:tuple。tuple和list非常类似,但是tuple一旦初始化就不能修改.

1
>>> classmates = ('Michael', 'Bob', 'Tracy')

tuple代码更安全。如果可能,能用tuple代替list就尽量用tuple。

当tuple内只有一个元素的时候,要这么定义:

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

只有1个元素的tuple定义时必须加一个逗号,,来消除括号表达式带来的歧义。

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

当然,如果tuple内有元素是list类型,那么依旧能够改变list里的元素:

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

条件判断

条件判断

条件判断当然是if语句。

1
2
3
4
5
6
7
age = 3
if age >= 18:
print('your age is', age)
print('adult')
else:
print('your age is', age)
print('teenager')

注意!!! else 之后有个冒号:

elif 可以细分判断,其实elif 就是else if 的缩写。例如:

1
2
3
4
5
6
7
age = 3
if age >= 18:
print('adult')
elif age >= 6:
print('teenager')
else:
print('kid')

elif 之后是没有冒号:

再议input

input() 函数的返回值是str 类型的。例如:

1
2
3
4
5
6
7
>>> s = input("birth:")
birth:19
>>> s
'19'
>>> s = int(s)
>>> s
19

int() 函数发现传入的字符串不是合法的数字的时候会报错!

循环

for…in 循环

1
2
3
4
5
6
7
8
>>>languages = ["C", "C++", "Perl", "Python"]
>>> for x in languages:
... print (x)
...
C
C++
Perl
Python

注意 for...in 结尾有冒号:

重点记得缩进!!!

所以for x in ...循环就是把每个元素代入变量x,然后执行缩进块的语句。

再比如我们想计算1-10的整数之和,可以用一个sum变量做累加:

1
2
3
4
sum = 0
for x in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]:
sum = sum + x
print(sum)

如果要计算1-100的整数之和,从1写到100有点困难,幸好Python提供一个range()函数,可以生成一个整数序列,再通过list()函数可以转换为list。比如range(5)生成的序列是从0开始小于5的整数:

1
2
>>> list(range(5))
[0, 1, 2, 3, 4]

range(101)就可以生成0-100的整数序列,计算如下:

1
2
3
4
5
>>> sum = 0
>>> for x in range(101):
... sum = sum + x
...
>>> print(sum)

range 函数

1
2
3
4
5
6
7
8
9
list(range(5))
# 表示[0,1,2,3,4]
list(range(5,9))
# 表示[5,6,7,8]
list(range(0,10,3))
# 表示[0,3,6,9]
# 第三个参数代表步长

可以结合range()和len()函数以遍历一个序列的索引,例如:

1
2
3
4
5
6
7
8
9
>>> a = ['Google', 'Baidu', 'IBM', 'Taobao', 'QQ']
>>> for i in range(len(a)):
... print(i, a[i])
...
0 Google
1 Baidu
2 IBM
3 Taobao
4 QQ

enumerate 函数

以下是 enumerate() 方法的语法:

1
enumerate(sequence, [start=0])

上面那个循环输出可以用内置的enumerate()函数来写:

1
2
3
4
5
6
7
8
9
>>> a = ['Google', 'Baidu', 'IBM', 'Taobao', 'QQ']
>>> for i,j in enumerate(a,2):
... print(i,j)
...
2 Google
3 Baidu
4 IBM
5 Taobao
6 QQ

第二个参数代表下标起始的序号。

while 循环

1
2
3
4
5
6
7
8
9
>>> n = 100
>>> sum = 0
>>> ct = 1
>>> while ct <= n:
... sum = sum + ct
... ct += 1
...
>>> print(sum)
5050

注意while语句最后同样有个冒号:

然后Python不支持类似i++这种自增运算

然后+=这种运算符貌似也有一些要求,具体之后再学习吧(哭泣T ^ T)

(刚学Python对于语法好不适应,各种冒号以及种种……)

当然,操作可以更骚一点

例如这样:

1
2
>>> print(sum(range(101)))
5050

无限循环

可以通过Ctrl + C结束无限循环。

pass 语句

Python pass是空语句,是为了保持程序结构的完整性。

pass 不做任何事情,一般用做占位语句。

使用dict和set

dict

Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。

用Python写一个dict如下:

1
2
3
>>> d = {'Michael': 95, 'Bob': 75, 'Tracy': 85}
>>> d['Michael']
95

要避免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

注意:返回None的时候Python的交互式命令行不显示结果。

要删除一个key,用pop(key)方法,对应的value也会从dict中删除:

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

请务必注意,dict内部存放的顺序和key放入的顺序是没有关系的。

dict是用空间来换取时间的一种方法。

dict的key必须是不可变对象

这是因为dict根据key来计算value的存储位置,如果每次计算相同的key得出的结果不同,那dict内部就完全混乱了。这个通过key计算位置的算法称为哈希算法(Hash)

要保证hash的正确性,作为key的对象就不能变。在Python中,字符串、整数等都是不可变的,因此,可以放心地作为key。而list是可变的,就不能作为key。

set

大体跟C++ STL中的set差不多,不过不默认排序。

要创建一个set,需要提供一个list作为输入集合:

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

通过add(key)方法可以添加元素到set中,可以重复添加,但不会有效果:

1
2
3
4
5
6
>>> s.add(4)
>>> s
{1, 2, 3, 4}
>>> s.add(4)
>>> s
{1, 2, 3, 4}

通过remove(key)方法可以删除元素:

1
2
3
>>> s.remove(4)
>>> s
{1, 2, 3}

set可以看成数学意义上的无序和无重复元素的集合,因此,两个set可以做数学意义上的交集、并集等操作:

1
2
3
4
5
6
>>> s1 = set([1, 2, 3])
>>> s2 = set([2, 3, 4])
>>> s1 & s2
{2, 3}
>>> s1 | s2
{1, 2, 3, 4}

(曾经想起用c语言手动模拟交并等等各种操作的恐惧,泪流满面)

参考资料

廖雪峰的官方网站