Python 基础
在 Shell 中直接启动 python
应用程序,会进入 Python 的交互模式,即 REPL —— Read-Evaluation-Print Loop(读取、求值、打印循环)。从这个角度来说,Python 和 Shell 程序有很多相似之处。
用户通过键入 Python 语法的语句,将外部数据输入或载入进这个环境中,以及对这些数据进行操作。用户也可以将 Python 语句写入文件中(扩展名为 .py
),即 Python 脚本,并使用 Python 程序执行这个脚本。
数据类型
值
数:形如 123
、45.6
这样的值为数。
字符串:即一连串字符,以单引号或双引号包裹。如 "apple"
、'banana'
。多行字符串以三个连续的引号包裹:
"""
越过长城,走向世界。
Across the Great Wall we can reach every corner in the world.
"""
多行字符串,会以原状存储起来。上述字符串以字符串字面量表示即为 '\n越过长城,走向世界。\n Across the Great Wall we can reach every corner in the world.\n'
。
直接写出一个值,即定义了一个值。但是因为没有名称,我们不能使用,因此没有实际意义。于是,我们需要将名称绑定在值上,像下面这样。
x = 1.234
y = "Hello, Beijing!"
我们也可以将新的名称绑定在已有的名称对应的值上:
x = 123
y = x
数值类型一经产生,便不可修改。我们也将值称作“不可变类型”。
不同于“1.2”“3.45”等朴素值(primitive type),字符串有若干成员方法,我们可以调用这些方法得到新的字符串对象。
s1 = 'hello'
s2 = s1.upper() # s2: 'HELLO'
s3 = 'abc'.upper() # s3: 'ABC'
类
容器
最常使用应属容器类了:Python 中提供存放多个元素的容器——列表(list),以及关联容器——字典(dict)等。
类似的,我们也可以将名字捆绑到类的实例——对象上:
l = list()
d = dict()
对于列表和字典,Python 提供有简单的书写方式:
l = [] # 空列表
d = {} # 空字典
我们以方括号 []
的形式来表示一个列表。列表中的元素不限种类。也可以将已有的名称放入列表中。我们可以将不具名的元素视作匿名值或匿名对象。
x = 1
y = [2, 3]
z = "banana"
l = [x, y, 2.3, "apple", z, [4,5,6]]
我们可以使用元组将若干元素绑定在一起。需要注意,若干元素一经捆绑生成元组后,便不能再对该元组中元素进行增加或删除的操作。
age = 21
things = ["phone", "keys"]
t = ("xiaoming", age, things)
下面的例子可以介绍名称即“引用”的概念,即,x
是对一个列表的引用,虽然将其与 y
一并建立生成了一个元组,但我们仍能通过这个引用修改对应的列表。
x = [1,2,3]
y = 'apple'
t = (x, y)
t[0].append('4')
print(x) # 输出:[1, 2, 3, '4']
以其中含有键值对的花括号 {}
的形式来表示一个字典。字典要求键的类型为值。
fruit_colors = {'apple':['red'], 'banana':['yellow'], 'pitaya':['green', 'red']}
students = [{'name':'Jason', 'age': 13}, {'name':'Henry', 'age': 14}]
集合(set)要求其中的元素不重复。
colors = {'red','blue','yellow'}
l = ['apples', 'bananas', 'cherries', 'apples']
s = set(l) # s: {'apple', 'banana', 'cherries'}
列表中的元素从概念上是有序的,即,可以通过数字下标访问第 n 个元素。字典中的键值对、集合中的元素,在概念上应当理解为无序的,即,两个对象之间不存在逻辑上的先后顺序。
索引容器中的元素
对于容器,我们通过方括号运算符 []
进行索引,取得对其中的元素的引用。对于列表和元组,使用数字(下标)访问。对于字典,我们用“键”来访问。
使用下表访问列表中的元素:
menu = ['dishes', 'drinks', 'fruit']
print(menu[0]) # 输出:dishes
使用下表访问元组中的元素:
person = ("xiaoming", 21, ["phone", "keys"])
print(person[1]) # 输出:21
使用键访问关联容器(字典)中对应的值:
color = {'apple':['red'], 'banana':['yellow'], 'pitaya':['green', 'red']}
print(color['apple']) # 输出:['red']
color['apple'].append('green')
print(color['apple']) # 输出:['red', 'green']
students = [{'name':'Jason', 'age': 13}, {'name':'Henry', 'age': 14}]
stu = students[0]
print(stu['name']) # 输出:Jason
print(stu[1]['age']) # 输出:14
可调用对象
也有函数类型,我们也可以将其视作可调用对象。
定义一个函数。函数的参数列表为函数中要使用的名称。我们通过括号运算符 ()
来对一个对象执行调用操作。
def get_hello():
return 'hello'
h = get_hello() # h: 'hello'
def push_back_letter_s(some_list):
some_list.append('s')
l = ['a', 'b']
push_back_s(l) # l: ['a', 'b', 's']
同样,我们也可以将一个名称绑定到函数对象上。
def to_plural_append_s(s):
return s + 's'
f = to_plural_append_s
s1 = 'apple'
s2 = f(s) # s2: 'apples'
对于一些简单的操作,我们可以使用 lambda 表达式。
append_s = lambda x : x + 's'
words = ['apple', 'banana', 'melon']
plural = list(map(append_s, words))
# plural: ['apples', 'bananas', 'melons']
map(f, l)
会生成一个map
对象,其将f
操作应用在l
中的每一个元素上。该map
对象不能直接访问其中元素,但可以被迭代,比如使用for
循环,同理,亦可使用其构造一个列表,即list(map(f,l))
。
字符串、容器之间的转换
字符串是可迭代对象。因此,我们可以从字符串生成一个列表。
s = 'hello'
l = list(s)
# l: ['h', 'e', 'l', 'l', 'o']
同理,也能生成一个集合,集合内就是字符串中出现的所有的字符。
s = 'hello'
p = set(s)
# p: {'l', 'h', 'e', 'o'}
字符串是不能修改的(任何对字符串的操作会产生一个新的对象),但可以修改列表中某个位置对于对象的引用。
s = 'hello'
l = list(s)
# l: ['h', 'e', 'l', 'l', 'o']
l[1] = 'a'
# l: ['h', 'a', 'l', 'l', 'o']
使用某字符串的 join
方法可以将列表中的字符串拼接在一起,并以该字符串为间隔。
l = ['h', 'e', 'l', 'l', 'o']
s1 = "".join(l) # s1: 'hello'
s2 = "-".join(l) # s2: 'h-e-l-l-o'