Python中,万物皆对象。不过这并不是这里要探讨的话题,想说的是一定要注意关键字,因为所有东西都是对象,所以一个简简单单的赋值操作就可以把系统内置的函数给变成一个普通变量,来看下边例子:
id(type) # 506070640L
type = 1 # type成了指向1的变量
id(type) # 35556792L
id = 2 # id成了指向2的变量
from __future__ import print_function
print = 3 # print成了指向3的变量
注意print是个很特殊的存在,在Python3中是按照函数用,在Python2中却是个命令式的语句,最早print的用法其实是下边这样:
print "Hello world!"
这么用主要是受到ABC语法的影响,但这个用法并不Pythonic,后来加入了print函数,为了兼容允许两种用法并存。所以单纯给print赋值是不灵的,在Python2中使用Python3中的一些特性都是用from __future__ import来实现。
模块导入
因为提到了对象名覆盖和import,所以简单讲一下。import是利用Python中各种强大库的基础,比如要计算cos(π)的值,可以有下面4种方式:
# 直接导入Python的内置基础数学库
import math
print(math.cos(math.pi))
# 从math中导入cos函数和pi变量
from math import cos, pi
print(cos(pi))
# 如果是个模块,在导入的时候可以起个别名,避免名字冲突或是方便懒得打字的人使用
import math as m
print(m.cos(m.pi))
# 从math中导入所有东西
from math import *
print(cos(pi))
一般来说最后一种方式不是很推荐,因为不知道import导入的名字里是否和现有对象名已经有冲突,很可能会不知不觉覆盖了现有的对象。
容器
列表
Python中的容器是异常好用且异常有用的结构。这节主要介绍列表(list),元组(tuple),字典(dict)和集合(set)。这些结构和其他语言中的类似结构并无本质不同,来看例子了解下使用:
a = [1, 2, 3, 4]
b = [1]
c = [1]
d = b
e = [1, "Hello world!", c, False]
print(id(b), id(c)) # (194100040L, 194100552L)
print(id(b), id(d)) # (194100040L, 194100040L)
print(b == c) # True
f = list("abcd")
print(f) # ['a', 'b', 'c', 'd']
g = [0]*3 + [1]*4 + [2]*2 # [0, 0, 0, 1, 1, 1, 1, 2, 2]
因为变量其实是个引用,所以对列表而言也没什么不同,所以列表对类型没什么限制。也正因为如此,和变量不同的是,即使用相同的语句赋值,列表的地址也是不同的,在这个例子中体现在id(b)和id(c)不相等,而内容相等。列表也可以用list()初始化,输入参数需要是一个可以遍历的结构,其中每一个元素会作为列表的一项。“*”操作符对于列表而言是复制,最后一个语句用这种办法生成了分段的列表。
列表的基本操作有访问,增加,删除,和拼接:
a.pop() # 把最后一个值4从列表中移除并作为pop的返回值
a.append(5) # 末尾插入值,[1, 2, 3, 5]
a.index(2) # 找到第一个2所在的位置,也就是1
a[2] # 取下标,也就是位置在2的值,也就是第三个值3
a += [4, 3, 2] # 拼接,[1, 2, 3, 5, 4, 3, 2]
a.insert(1, 0) # 在下标为1处插入元素0,[1, 0, 2, 3, 5, 4, 3, 2]
a.remove(2) # 移除第一个2,[1, 0, 3, 5, 4, 3, 2]
a.reverse() # 倒序,a变为[2, 3, 4, 5, 3, 0, 1]
a[3] = 9 # 指定下标处赋值,[2, 3, 4, 9, 3, 0, 1]
b = a[2:5] # 取下标2开始到5之前的子序列,[4, 9, 3]
c = a[2:-2] # 下标也可以倒着数,方便算不过来的人,[4, 9, 3]
d = a[2:] # 取下标2开始到结尾的子序列,[4, 9, 3, 0, 1]
e = a[:5] # 取开始到下标5之前的子序列,[2, 3, 4, 9, 3]
f = a[:] # 取从开头到最后的整个子序列,相当于值拷贝,[2, 3, 4, 9, 3, 0, 1]
a[2:-2] = [1, 2, 3] # 赋值也可以按照一段来,[2, 3, 1, 2, 3, 0, 1]
g = a[::-1] # 也是倒序,通过slicing实现并赋值,效率略低于reverse()
a.sort()
print(a) # 列表内排序,a变为[0, 1, 1, 2, 2, 3, 3]
因为列表是有顺序的,所以和顺序相关的操作是列表中最常见的,首先我们来打乱一个列表的顺序,然后再对这个列表排序:
import random
a = range(10) # 生成一个列表,从0开始+1递增到9
print(a) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
random.shuffle(a) # shuffle函数可以对可遍历且可变结构打乱顺序
print(a) # [4, 3, 8, 9, 0, 6, 2, 7, 5, 1]
b = sorted(a)
print(b) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
c = sorted(a, reverse=True)
print(c) # [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
元组
元组和列表有很多相似的地方,最大的区别在于不可变,还有如果初始化只包含一个元素的tuple和列表不一样,因为语法必须明确,所以必须在元素后加上逗号。另外直接用逗号分隔多个元素赋值默认是个tuple,这在函数多返回值的时候很好用:
a = (1, 2)
b = tuple(['3', 4]) # 也可以从列表初始化
c = (5,)
print(c) # (5,)
d = (6)
print(d) # 6
e = 3, 4, 5
print(e) # (3, 4, 5)
集合
评论
查看更多