人生苦短,我用Python![1]
这个系列是一个帮助零基础的人入门编程的教程,本文承接上一篇,介绍Python的基本类型和控制语句。
Python基本类型
Python的对象是有类型之说的,所有的类型基本可以分为两种: 原子类型(Atomic Type)和集合类型(Collective Type)。
原子类型顾名思义是一种不可分的类型,表示一个单一的值。例如整数(int),浮点数(float),布尔类型(bool, 即true和false)。
集合类型则包含了多个值,比如说字符串(str)。
Python中的数字
在Python中,数字主要分为两种:
- 整数(int)
- 浮点数/实数(float)
1 | pos_number = 68 # int |
对于这些数字,Python支持基础的数学运算
- 加(+)、减(-)、乘(*)、除(/、//)、幂(**)
请注意除法有两种符号:
- “/“: 表示的数学上的除法,结果必定是准确的float
- “//“: 在除法计算的结果中只保留整数部分(只是截取整数部分,并非四舍五入),结果必定是int
Python中的布尔
布尔(bool)是指包含真(True)和假(False)的逻辑数据类型[2]。
布尔对象是数字比较的结果,可以检查不同数据值的关系。比如说,小于12 < 10
,大于12 > 10
,等于12 == 21
。
Python中也有一些逻辑操作符:
- and: 和
- or: 或
- not: 非
Python中的字符串
字符串(str)是Python中相当常用的一种集合数据类型,可以当成字符的序列。对于一个字符串,需要用双引号(")或者单引号(')括起来。
字符可以是任何从键盘上输入的东西。
- 字母(‘a’),数字(‘123’),标点符号(‘?’),空格(‘ ‘),tab(‘\t’),换行(‘\n’)。
Python中有效字符串可以是
1 | first_name = "Mary" |
在Python中,可以使用print()
函数将字符串在屏幕上输出。比如说,
1 | a = 1 |
常用的字符串内置方法,用于字符串操作:
- len(): 获取字符串长度
- String.upper(): 字符串变大写
- String.lower(): 字符串变小写
- String.count(): 对字符串中的片段计数
1 | a_str = "hello" |
结果是:
1 | 5 |
更多详细的字符串方法可以参考Python官方文档[3]。
我们可以把这些方法看作是字符串的工具,字符串在自己使用这些工具来达到目的。
表达式与运算符
正如上篇所说,一个Python程序包含一个或多个模块(Module),比如说Python源代码文件。而每个模块包含一个或多个语句(Statement),一个语句包含一个或多个表达式(Expression)。每个表达式又由Python对象和运算符(Operator)组成。
所以表达式是一个运算符和数据对象的组合,可以被求值为某一个数据类型的值。而表达式的计算结果可以赋值给另一个变量用于下一步的计算。
表达式的通用语法是:
1 | <算子> <运算符> <算子> |
在Python中,表达式有:
- 算术运算符(Arithmetic operator)
- 关系运算符(Relational operator)
- 逻辑运算符(Logical operator)
算术运算符和表达式
算术运算符在Python中可以用于基础的数学运算,比如说
- 加法(a + b)
- 减法(a - b)
- 乘法(a * b)
- 地板除法,取最大整数,结果是int (a // b)
- 真除法,结果是float (a / b)
- 取余数(a % b)
- 幂(a ** b)
1 | print(5 + 3) |
结果为
1 | 8 |
由上可知,算术表达式
- 由算术运算符和数字(int或者float类型)组成
- 运算结果是int或者float类型的值
- 如果两个算子都是int,则结果一般是int
- 如果其中一个算子是float,那结果是float
算术表达式的优先级
- 拥有更高优先级的运算符将会被先计算
- 在优先级相同时,从左往右计算
- “*”和”/“比”+”和”-“有更高的优先级
- 小括号可以覆盖优先级
关系运算符和表达式
在Python中,关系运算符包括
- 等于(a == b),注意是两个等于号
- 不等于(a != b)
- 小于(a < b)
- 小于等于(a <= b)
- 大于(a > b)
- 大于等于(a >= b)
关系运算符主要用于判断已存在的两个值的关系。
关系表达式则是由关系运算符和Python对象组成,求值结果是True或者False。如果比较对象是数字(int或者float),那会根据数字大小进行对比,而如果比较对象是字符串(str),则会根据字母表的顺序进行对比。
1 | 23 < 123 |
结果为
1 | True |
当然,比较关系表达式也是可以嵌套成复合关系表达式的。它可以用于多个值,而且可以由算术表达式组成。
1 | 2 + 3 <= 7 - 2 |
结果为
1 | True |
注意,算术运算符的优先级要高于关系运算符,所以算术表达式会优先计算求值,然后再进行比较。
逻辑运算符和表达式
- AND运算符:
a and b
- 返回True如果a和b都是True
- OR运算符:
a or b
- 返回True如果a和b其中一个或两个为True
- NOT运算符:
not a
- 返回相反的布尔值,如果a是True,则返回False
逻辑运算符可以和关系运算符一起使用,用于处理一些较复杂的逻辑。
运算符的优先级: 算术运算符 > 关系运算符 > 逻辑运算符
以下是一些复合逻辑表达式的例子
1 | x = 6 |
结果是
1 | False |
逻辑表达式一般会用于条件语句(if-else)去控制程序的执行流程。
语句和赋值
语句(Statement)是Python程序中的指令,可以被Python解释器解释并且执行。
赋值(Assignment)是将一个数据对象(一般用于表示具体某个值)绑定至一个变量。当然,也可以将一个表达式的求值结果赋值给变量。
1 | message = "Welcome to the Python Programming Fundation" # Assigned by object |
一般Python程序里使用的是单行语句,但是如果语句太长一行写不下,也可以用反斜杠”\“将语句分为多行。
1 | bool_result = value > 0 \ |
根据PEP8标准[4], 每行最大79个字符,如果一行语句过长则会影响可读性,所以需要分成多行。
语句块
语句块(Statement block)是一个跨多行代码的程序组成部分。它可以是程序执行流程的控制结构。
1 | flag = True |
每个语句块一般都在控制结构下执行,一般由同一缩进表示,和冒号”:”表示语句块的开始。
注意,Python中的缩进是语法强制的。
控制结构
if-else语句
if-else语句使用逻辑表达式作为条件去选择执行某一语句块。以下是伪代码例子,
1 | if the condition is True: |
注意,缩进在定义语句块中非常重要。
1 | message = "Welcome to Python Programming Fundation" |
嵌套if语句
在面对多个条件的时候很有用。
1 | message = "Welcome to Python Programming Fundation" |
elif语句
和嵌套if语句很像,用于处理多个条件,合并了if和else。
1 | message = "Welcome to Python Programming Fundation" |
缩进
Python中的缩进是语法敏感的,用于表示语句块。在Python的解释器中,Space和Tab都是可以的。
一般情况下,根据PEP8[5],优先采用4 Spaces。在很多现代的代码编辑器和IDE中,会自动的将Tab输入转换成Spaces。
- Tab
- Space
缩进一方面是语法需求,需要缩进来避免语法错误,另一方面则是可以有更好的可读性。
注意,Space或者Tab一定要保持统一,不能混用
迭代结构
Python中的迭代结构(Iteration Constructs)一般用于控制一部分语句重复运行。
while循环
while循环中只要能满足设定的条件,将会重复执行一个语句块。
1 | while the condition is True: |
注意,这个条件或者逻辑表达式得能最终变成False,否则将会无限运行循环。除非有break,这将会在教程第4篇中提到。
以下是一个例子,用于求 $\sum_{n=1}^5n$
1 | number = 1 |
for循环
for循环类似于while循环,但是不需要定义条件。取而代之的是需要给定一个集合用于迭代,比如说List,集合类型将会在教程第3篇中介绍。
以下是一个例子,用于求 $\prod_{n=1}^5n$
1 | num_list = [1, 2, 3, 4, 5] |
注意,这个for循环结构用in运算符可以用于任何可迭代的集合类型(比如Dictionary)
注释
注释(Comment)是程序编写中非常重要的一部分。一般来说注释可以增强程序的可读性(readability),也能拿来解释程序的功能和意义。
在Python中,注释的开头用井号”#”表示。任何注释的文字,将会被Python解释器忽略,不会运行。
1 | a = 1 # first number |
注释分两种,一种是内嵌注释,和代码在同一行,如上所示。还有一种是”块注释”,每一行都有一个”#”。
1 | # Program description |
或者也可以使用三个引号来表示,
1 | """ |
更多关于注释的详细内容可以参考PEP8[6]和Google Python Style Guide[7]。
不过要注意的是,注释是为了加强理解,而不是冗长的照搬代码内容。
程序员最讨厌的两件事:
- 讨厌在自己的代码中写注释
- 讨厌别人没有注释的代码
实践试试
这次使用的环境和上一篇教程相同,具体内容请看Python编程基础01:Python语言和编程。
英尺到英寸转换器
我们一般都很熟悉公制单位,而不熟悉英制单位。所以有必要做一个英制单位的转换器,这里我们用英尺(feet)和英寸(inch)作为例子。这个程序可以将inch转换成feet。其中的关系是,
$$feet = \frac{inches}{12}$$
举个例子,如果要把6 inches转换成feet,那么这个将是 $6 / 12 = 0.5\ feet$。
于是,我们可以写出以下代码。
1 | # Prompt the user for the input. |
华氏度到摄氏度转换器
这个其实和上一篇很像,只不过转换的是华氏度(Fahrenheit)和摄氏度(Celsius)。转换公式是,
$$celsius = \frac{5}{9}(fahrenheit - 32)$$
代码如下,
1 | # Prompt the user for the input. |
简单四则计算器
在这个练习中,将要做一个简单的四则计算器,这个程序有3个输入,其中2个算子1个运算符。然后将会把结果输出到控制台上。
1 | # Prompt for user input for the operator. The input can be add, sub, div, mul. |
顺便试试Pycharm
由于以上都在Jupyter中完成,趁这个时候试试看PyCharm,并且体验交互式模式和脚本模式的区别。
参考文献
- [1] B. Eckel, “sebsauvage.net - Python”, Sebsauvage.net, 2021. [Online]. Available: http://sebsauvage.net/python/.
- [2] “Python Booleans”, W3schools.com, 2021. [Online]. Available: https://www.w3schools.com/python/python_booleans.asp.
- [3] “Built-in Types — Python 3.9.1 documentation”, Docs.python.org, 2021. [Online]. Available: https://docs.python.org/3/library/stdtypes.html#string-method.
- [4] “PEP 8 -- Style Guide for Python Code”, Python.org, 2021. [Online]. Available: https://www.python.org/dev/peps/pep-0008/#maximum-line-length.
- [5] “PEP 8 -- Style Guide for Python Code”, Python.org, 2021. [Online]. Available: https://www.python.org/dev/peps/pep-0008/#tabs-or-spaces
- [6] “PEP 8 -- Style Guide for Python Code”, Python.org, 2021. [Online]. Available: https://www.python.org/dev/peps/pep-0008/#comments
- [7] “styleguide”, styleguide, 2021. [Online]. Available: https://google.github.io/styleguide/pyguide.html#38-comments-and-docstrings.