本文以 Eric Matthes 的《Python编程:从入门到实践》为基础,以有一定其他语言经验的程序员视角,对书中内容提炼总结,化繁为简,将这本书的精髓融合成一篇10分钟能读完的文章。
读完本篇文章后,可对 Python 语言特性、编码风格有一定了解,并可写出简单的 Python 程序。
100 多位经验丰富的开发者参与,在 Github 上获得了近 1000 个 star 的开源项目想了解下吗?
项目地址:https://github.com/cachecats/coderiver
一、安装与运行
各个系统的 Python 安装教程请自行查阅资料,这里不再赘述。
检查 Python 版本,在命令行输入 python 即可,同时会进入命令行交互模式,可以在这里执行 python 命令。
如果电脑中安装了 python2.x 和 python3.x 两个版本,输入 python 运行的是 2.x 版本。想运行 3.x,则需输入 python3。
在命令行输入 python :
Solo-mac:~ solo$ python
Python 2.7.10 (default, Aug 17 2018, 19:45:58)
[GCC 4.2.1 Compatible Apple LLVM 10.0.0 (clang-1000.0.42)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>
在命令行输入 python3 :
Solo-mac:~ solo$ python3
Python 3.7.0 (v3.7.0:1bf9cc5093, Jun 26 2018, 23:26:24)
[Clang 6.0 (clang-600.0.57)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>
输入 exit() 即可退出命令行模式。
命令行运行 python 文件
如果是写好了一个 python 文件,想通过命令行运行它,进入这个目录,在命令行输入 python 文件名.py 即可。
比如桌面上有个文件 hello.py,内容是打印一句话:
print("Hello, Python")
想运行它,先进入 Desktop 目录,再在命令行输入 python hello.py 就能运行:
Solo-mac:Desktop solo$ python hello.py
Hello, Python
二、变量和简单数据类型
2.1 变量命名规则
变量名只能包含字母、数字和下划线。变量名可以字母或下划线打头,但不能以数字打 头,例如,可将变量命名为message_1,但不能将其命名为1_message。
变量名不能包含空格,但可使用下划线来分隔其中的单词。例如,变量名greeting_message 可行,但变量名greeting message会引发错误。
不要将Python关键字和函数名用作变量名,即不要使用Python保留用于特殊用途的单词, 如print。
变量名应既简短又具有描述性。例如,name比n好,student_name比s_n好,name_length比length_of_persons_name好。
慎用小写字母l和大写字母O,因为它们可能被人错看成数字1和0。
变量名应该是小写的,虽然没有强制规定,但是约定俗称的规则。
2.2 字符串
字符串就是一系列字符。在Python中,用引号括起的都是字符串,其中的引号可以是单引号,也可以是双引号,还可以同时使用。如:
"This is a string."
'This is also a string.'
"I love 'python'"
2.2.1 字符串的简单运算
下面介绍字符串的简单运算。
title()
title()以首字母大写的方式显示每个单词,即将每个单词的首字母都改为大写。
>>> name = 'solo coder'
>>> name.title()
'Solo Coder'
upper()、lower()
将字符串改为全部大写或全部小写。
>>> name
'solo coder'
>>> name.upper()
'SOLO CODER'
>>> name.lower()
'solo coder'
>>> name
'solo coder'
注意:title()、upper()、lower() 均不改变原字符串,只是输出了一个新的字符串。
2.2.2 合并(拼接)字符串
Python使用加号(+)来合并字符串。
>>> first = 'solo'
>>> last = 'coder'
>>> full = first + ' ' + last
>>> full
'solo coder'
2.2.3 使用制表符或换行符来添加空白
在编程中,空白泛指任何非打印字符,如空格、制表符和换行符。
要在字符串中添加制表符,可使用字符组合 \t,要在字符串中添加换行符,可使用字符组合 \n 。
>>> print('\tPython')
Python
>>> print('Hello,\nPython')
Hello,
Python
2.2.4 删除空白
rstrip() 删除右侧空白,lstrip() 删除左侧空白,strip() 删除两端空白。
>>> msg = ' Python '
>>> msg
' Python '
>>> msg.rstrip()
' Python'
>>> msg.lstrip()
'Python '
>>> msg.strip()
'Python'
>>> msg
' Python '
注意执行完去空格命令后,再打印出 msg,还是原来的字符串,这说明 strip() 也不改变原来的字符串。
2.2.5 Python 2 中的 print 语句
在Python 2中,print语句的语法稍有不同:
>>> python2.7
>>> print "Hello Python 2.7 world!"
Hello Python 2.7 world!
在Python 2中,无需将要打印的内容放在括号内。从技术上说,Python 3中的print是一个函数,因此括号必不可少。有些Python 2 print语句也包含括号,但其行为与Python 3中稍有不同。简单地说,在Python 2代码中,有些print语句包含括号,有些不包含。
2.3 数字
2.3.1 整数
在Python中,可对整数执行加(+)减(-)乘(*)除(/)运算。
>>> 2 + 3
5
>>> 3 - 2
1
>>> 2 * 3
6
>>> 3 / 2
1.5
Python还支持运算次序,因此你可在同一个表达式中使用多种运算。你还可以使用括号来修 改运算次序,让Python按你指定的次序执行运算,如下所示:
>>> 2 + 3*4
14
>>> (2 + 3) * 4 20
2.3.2 浮点数
Python将带小数点的数字都称为浮点数。大多数编程语言都使用了这个术语,它指出了这样一个事实:小数点可出现在数字的任何位置。
从很大程度上说,使用浮点数时都无需考虑其行为。你只需输入要使用的数字,Python通常都会按你期望的方式处理它们:
>>> 0.1 + 0.1
0.2
>>> 0.2 + 0.2 9 0.4
>>>2 * 0.1
0.2
>>>2 * 0.2
0.4
但需要注意的是,结果包含的小数位数可能是不确定的:
>>> 0.2 + 0.1
0.30000000000000004
>>> 3 * 0.1
0.30000000000000004
所有语言都存在这种问题,没有什么可担心的。Python会尽力找到一种方式,以尽可能精确地表示结果,但鉴于计算机内部表示数字的方式,这在有些情况下很难。后面将会学习更多的处理方式。
2.3.3 使用函数str()避免类型错误
如果用数字跟字符串拼接,就会出现类型错误。为避免这个问题,可以使用 str() 将数字转换为字符串再进行操作。
>>> age = 18
>>> print('my age is ' + age)
Traceback (most recent call last):
File "", line 1, in
TypeError: can only concatenate str (not "int") to str
>>> print('my age is ' + str(age))
my age is 18
2.3.4 Python 2 中的整数
在Python 2中,将两个整数相除得到的结果稍有不同:
>>> python2.7
>>> 3 / 2
1
Python返回的结果为1,而不是1.5。在Python 2中,整数除法的结果只包含整数部分,小数部 分被删除。请注意,计算整数结果时,采取的方式不是四舍五入,而是将小数部分直接删除。
在Python 2中,若要避免这种情况,务必确保至少有一个操作数为浮点数,这样结果也将为 浮点数:
>>> 3 / 2
1
>>> 3.0 / 2
1.5
>>> 3 / 2.0
1.5
>>> 3.0 / 2.0
1.5
从Python 3转而用Python 2或从Python 2转而用Python 3时,这种除法行为常常会令人迷惑。使用或编写同时使用浮点数和整数的代码时,一定要注意这种异常行为。
2.3.5 注释
在Python中,注释用井号(#)标识。井号后面的内容都会被Python解释器忽略。如
# 向大家问好
print("Hello Python people!")
三、列表
列表由一系列按特定顺序排列的元素组成。
在Python中,用方括号([])来表示列表,并用逗号来分隔其中的元素。
>>> list = []
>>> list.append('haha')
>>> list.append('heihei')
>>> list.append('hehe')
>>> list
['haha', 'heihei', 'hehe']
>>> list[0]
'haha'
获取最后一个元素可以用 -1,如 list[-1] 是获取最后一个元素,list[-2] 是获取倒数第二个元素。
3.1 列表的增删改查
3.1.1 修改元素
修改元素直接用索引修改
>>> list[0] = 'nihao'
>>> list
['nihao', 'heihei', 'hehe']
3.1.2 添加元素
可以在末尾添加,也可以在任意位置插入。
在末尾添加:append
>>> list.append('wa')
>>> list
['nihao', 'heihei', 'hehe', 'wa']
插入:insert
>>> list.insert(1, 'hello')
>>> list
['nihao', 'hello', 'heihei', 'hehe', 'wa']
3.1.3 删除元素
删除有三种方式:
del:按索引删除
pop():删除列表最后一个元素并返回最后一个元素的值。也可以传索引删除任意位置的值。
remove():按值删除
>>> list
['nihao', 'hello', 'heihei', 'hehe', 'wa']
>>> del list[1]
>>> list
['nihao', 'heihei', 'hehe', 'wa']
>>> list.pop()
'wa'
>>> list.remove('hehe')
>>> list
['nihao', 'heihei']
给 pop() 传索引删除其他位置的值
>>> list
['nihao', 'heihei']
>>> list.pop(0)
'nihao'
>>> list
['heihei']
注意:
方法remove()只删除第一个指定的值。如果要删除的值可能在列表中出现多次,就需要使用循环来判断是否删除了所有这样的值。
如果你不确定该使用del语句还是pop()方法,下面是一个简单的判断标准:如果你要从列表中删除一个元素,且不再以任何方式使用它,就使用del语句;如果你要在删除元素后还能继续使用它,就使用方法pop()。
3.2 组织列表
本节将介绍列表的排序、反转、计算长度等操作。
列表的排序主要有两种方式:
使用方法sort()对列表进行永久性排序
使用函数sorted()对列表进行临时排序
3.2.1 使用方法sort()对列表进行永久性排序
使用 sort() 方法将改变原列表。如果要反转排序,只需向sort()方法传递参数 reverse=True。
>>> list
['zhangsan', 'lisi', 'bob', 'alex']
>>> list.sort()
>>> list
['alex', 'bob', 'lisi', 'zhangsan']
>>> list.sort(reverse=True)
>>> list
['zhangsan', 'lisi', 'bob', 'alex']
3.2.2 使用函数sorted()对列表进行临时排序
函数 sorted() 让你能够按特定顺序显示列表元素,同时不影响它们在列表中的原始排列顺序。
如果要反转排序,只需向 sorted() 传递参数 reverse=True。
>>> list = ['douglas','alex','solo','super']
>>> sorted(list)
['alex', 'douglas', 'solo', 'super']
>>> list
['douglas', 'alex', 'solo', 'super']
>>> sorted(list, reverse=True)
['super', 'solo', 'douglas', 'alex']
>>> list
['douglas', 'alex', 'solo', 'super']
3.2.3 反转列表
要反转列表元素的排列顺序,可使用方法 reverse()。 reverse() 也会改变原始列表。
reverse() 只会按原来的顺序反转,不会进行额外的按字母排序。
>>> list
['douglas', 'alex', 'solo', 'super']
>>> list.reverse()
>>> list
['super', 'solo', 'alex', 'douglas']
3.2.4 确定列表的长度
使用函数len()可快速获悉列表的长度。
>>> list
['super', 'solo', 'alex', 'douglas']
>>> len(list)
4
3.3 操作列表
3.3.1 循环
使用 for…in 循环。
python 以缩进来区分代码块,所以需要正确的缩进
>>> cats
['super', 'solo', 'alex', 'douglas']
>>> for cat in cats:
... print(cat)
...
super
solo
alex
douglas
3.3.2 range()
Python函数range()让你能够轻松地生成一系列的数字。
>>> for value in range(1,5):
... print(value)
...
1
2
3
4
注意:range() 会产生包含第一个参数但不包含第二个参数的一系列数值。
使用 range() 创建列表
>>> numbers = list(range(1,6))
>>> numbers
[1, 2, 3, 4, 5]
range() 还可以指定步长。下面的例子生成了从0开始,到11的偶数:
>>> nums = list(range(0,11,2))
>>> nums
[0, 2, 4, 6, 8, 10]
3.3.3 对列表简单的计算
有几个专门用于处理数字列表的Python函数。
min():计算最小值
max():计算最大值
sum():计算总和
>>> numbers
[1, 2, 3, 4, 5]
>>> min(numbers)
1
>>> max(numbers)
5
>>> sum(numbers)
15
3.3.4 列表解析
列表解析将for循环和创建新元素的代码合并成一行,并自动附加新元素。
>>> squares = [value**2 for value in range(1,11)]
>>> squares
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
要使用这种语法,首先指定一个描述性的列表名,如squares;然后,指定一个左方括号, 并定义一个表达式,用于生成你要存储到列表中的值。在这个示例中,表达式为 value ** 2,它计 算平方值。接下来,编写一个for循环,用于给表达式提供值,再加上右方括号。在这个示例中, for循环为for value in range(1,11),它将值1~10提供给表达式 value ** 2。请注意,这里的for 语句末尾没有冒号。
3.4 切片
要创建切片,可指定要使用的第一个元素和最后一个元素的索引。与函数range()一样,Python在到达你指定的第二个索引前面的元素后停止。要输出列表中的前三个元素,需要指定索引0~3,这将输出分别为0、1和2的元素。
>>> names = ['aa','bb','cc','dd']
>>> print(names[1:4])
['bb', 'cc', 'dd']
如果你没有指定第一个索引,Python将自动从列表开头开始:
>>> print(names[:4])
['aa', 'bb', 'cc', 'dd']
如果没有指定终止索引,将自动取到列表末尾
>>> print(names[2:])
['cc', 'dd']
也可以使用负数索引,比如返回最后三个元素
>>> print(names[-3:])
['bb', 'cc', 'dd']
遍历切片
>>> for name in names[1:3]:
... print(name)
...
bb
cc
3.5 复制列表
可以使用切片来快速复制列表,不指定开始索引和结束索引。
>>> names
['aa', 'bb', 'cc', 'dd']
>>> names2 = names[:]
>>> names2
['aa', 'bb', 'cc', 'dd']
用切片复制出来的新列表,跟原来的列表是完全不同的列表,改变其实一个不会影响另一个列表。
>>> names.append('ee')
>>> names
['aa', 'bb', 'cc', 'dd', 'ee']
>>> names2
['aa', 'bb', 'cc', 'dd']
而如果简单的通过赋值将 names 赋值给 names2,就不能得到两个列表,实际上它们都指向了同一个列表。如果改变其中一个,另一个也将被改变。
>>> names
['aa', 'bb', 'cc', 'dd']
>>> names2 = names
>>> names2
['aa', 'bb', 'cc', 'dd']
>>> names.append('ee')
>>> names
['aa', 'bb', 'cc', 'dd', 'ee']
>>> names2
['aa', 'bb', 'cc', 'dd', 'ee']
3.6 元组
Python将不能修改的值称为不可变的,而不可变的列表被称为元组。
元组看起来犹如列表,但使用圆括号而不是方括号来标识。定义元组后,就可以使用索引来访问其元素,就像访问列表元素一样。
>>> food = ('apple', 'orange')
>>> food[0]
'apple'
>>> food[1]
'orange'
>>> food[1] = 'banana'
Traceback (most recent call last):
File "", line 1, in
TypeError: 'tuple' object does not support item assignment
遍历用法跟列表一致。
四、条件判断
每条if语句的核心都是一个值为True或False的表达式,这种表达式被称为条件测试。
检查是否相等,用 ==
检查是否不相等,用 !=
数字比较 >、 <、 >=、 <=
多个条件与 and
多个条件或 or
判断列表是否包含某元素 in
>>> names
['aa', 'bb', 'cc', 'dd', 'ee']
>>> 'bb' in names
True
判断列表是否不包含某元素
>>> names
['aa', 'bb', 'cc', 'dd', 'ee']
>>> 'ff' not in names
True
if 语句
简单的 if-else
>>> a = 10
>>> if a > 10:
... print('hello')
... else:
... print('bye')
...
bye
if-elif-else
>>> if a<5:
... print(a<5)
... elif 5
... print('5