抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

ControlNet

个人博客 << 分享一些有用的东西

人生苦短,我用Python![1]

这个系列是一个帮助零基础的人入门编程的教程,本文承接上一篇,介绍Python的基本类型和控制语句。

Python基本类型

Python的对象是有类型之说的,所有的类型基本可以分为两种: 原子类型(Atomic Type)和集合类型(Collective Type)。

原子类型顾名思义是一种不可分的类型,表示一个单一的值。例如整数(int),浮点数(float),布尔类型(bool, 即true和false)。

集合类型则包含了多个值,比如说字符串(str)。

Python中的数字

在Python中,数字主要分为两种:

  • 整数(int)
  • 浮点数/实数(float)
1
2
3
4
5
pos_number = 68 # int
neg_number = -56 # int
pi = 3.1416 # float
gamma = 0.577215 # float
another_number = 3.126e3 # float

对于这些数字,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
2
3
4
5
first_name = "Mary"
short_name = "M"
student_id = "12345678"
empty_str = " "
message = "Welcome to my blog"

在Python中,可以使用print()函数将字符串在屏幕上输出。比如说,

1
2
3
a = 1
b = 2
print("result is", a + b)

常用的字符串内置方法,用于字符串操作:

  • len(): 获取字符串长度
  • String.upper(): 字符串变大写
  • String.lower(): 字符串变小写
  • String.count(): 对字符串中的片段计数
1
2
3
4
5
a_str = "hello"
print(len(a_str))
print(a_str.upper())
print(a_str.lower())
print(a_str.count("l"))

结果是:

1
2
3
4
5
'HELLO'
'hello'
2

更多详细的字符串方法可以参考Python官方文档[3]

string-tools

我们可以把这些方法看作是字符串的工具,字符串在自己使用这些工具来达到目的。

表达式与运算符

正如上篇所说,一个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
2
3
4
5
6
7
8
9
10
print(5 + 3)
print(5 - 3)
print(5 * 3)
print(5 / 3)
print(5 // 3)
print(5.0 // 3)
print(5 % 3)
print(5 ** 3)
answer = 5 ** 3
print(answer)

结果为

1
2
3
4
5
6
7
8
9
8
2
15
1.6666666666666667
1
1.0
2
125
125

由上可知,算术表达式

  • 由算术运算符和数字(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
2
3
4
23 < 123
"xyz" < "xy"
123 == "123"
789 < "789"

结果为

1
2
3
4
True
False
False
TypeError

当然,比较关系表达式也是可以嵌套成复合关系表达式的。它可以用于多个值,而且可以由算术表达式组成。

1
2
3
2 + 3 <= 7 - 2
5 / 2 == 5 // 2
6 / 2 == 6 // 2

结果为

1
2
3
True
True
False

注意,算术运算符的优先级要高于关系运算符,所以算术表达式会优先计算求值,然后再进行比较。

逻辑运算符和表达式

  • AND运算符: a and b
    • 返回True如果a和b都是True
  • OR运算符: a or b
    • 返回True如果a和b其中一个或两个为True
  • NOT运算符: not a
    • 返回相反的布尔值,如果a是True,则返回False

逻辑运算符可以和关系运算符一起使用,用于处理一些较复杂的逻辑。

运算符的优先级: 算术运算符 > 关系运算符 > 逻辑运算符

以下是一些复合逻辑表达式的例子

1
2
3
4
5
x = 6
y = 9
print(x % 3 == 0 and x < 0)
print(x < 10 and x < y)
print(x + y > 10 or x + y < 10)

结果是

1
2
3
False
True
True

逻辑表达式一般会用于条件语句(if-else)去控制程序的执行流程。

语句和赋值

语句(Statement)是Python程序中的指令,可以被Python解释器解释并且执行。

赋值(Assignment)是将一个数据对象(一般用于表示具体某个值)绑定至一个变量。当然,也可以将一个表达式的求值结果赋值给变量。

1
2
3
message = "Welcome to the Python Programming Fundation" # Assigned by object
temp_f = temp_c * 9 / 5 + 32 # Assigned by statement
bool_result = value > 0 or value < 100

一般Python程序里使用的是单行语句,但是如果语句太长一行写不下,也可以用反斜杠”\“将语句分为多行。

1
2
3
bool_result = value > 0 \
and value < 100 \
and value % 5 == 0

根据PEP8标准[4], 每行最大79个字符,如果一行语句过长则会影响可读性,所以需要分成多行。

语句块

语句块(Statement block)是一个跨多行代码的程序组成部分。它可以是程序执行流程的控制结构。

1
2
3
4
5
6
7
8
flag = True

if flag == True:
print("Yes")
print("It is true!")
else:
print("No")
print("It is false!")

每个语句块一般都在控制结构下执行,一般由同一缩进表示,和冒号”:”表示语句块的开始。

注意,Python中的缩进是语法强制的。

控制结构

if-else语句

if-else语句使用逻辑表达式作为条件去选择执行某一语句块。以下是伪代码例子,

1
2
3
4
if the condition is True:
do this statement block
else:
do this statement block

注意,缩进在定义语句块中非常重要。

1
2
3
4
5
6
7
8
message = "Welcome to Python Programming Fundation"
letter = "o"
count = message.count(letter)
if count < 1:
print(letter + " doesn't exist in " + message)
else:
print(letter + " exists in " + message)
print(letter + " occurs " + str(count) + " times")

嵌套if语句

在面对多个条件的时候很有用。

1
2
3
4
5
6
7
8
9
10
11
message = "Welcome to Python Programming Fundation"
letter = "o"
count = message.count(letter)
if count < 1:
print(letter + " doesn't exist in " + message)
else:
print(letter + " exists in " + message)
if count >= 5:
print(letter + " occurs 5 times or more")
else:
print(letter + " occurs less than 5 times")

elif语句

和嵌套if语句很像,用于处理多个条件,合并了if和else。

1
2
3
4
5
6
7
8
9
10
11
message = "Welcome to Python Programming Fundation"
letter = "o"
count = message.count(letter)
if count < 1:
print(letter + " doesn't exist in " + message)
elif count >= 5:
print(letter + " exists in " + message)
print(letter + " occurs 5 times or more")
else:
print(letter + " exists in " + message)
print(letter + " occurs less than 5 times")

缩进

Python中的缩进是语法敏感的,用于表示语句块。在Python的解释器中,Space和Tab都是可以的。

一般情况下,根据PEP8[5],优先采用4 Spaces。在很多现代的代码编辑器和IDE中,会自动的将Tab输入转换成Spaces。

  • Tab
    tab-example
  • Space
    space-example

缩进一方面是语法需求,需要缩进来避免语法错误,另一方面则是可以有更好的可读性。

注意,Space或者Tab一定要保持统一,不能混用
indentation-consistent.png

迭代结构

Python中的迭代结构(Iteration Constructs)一般用于控制一部分语句重复运行。

while循环

while循环中只要能满足设定的条件,将会重复执行一个语句块。

1
2
while the condition is True:
do this statement block

注意,这个条件或者逻辑表达式得能最终变成False,否则将会无限运行循环。除非有break,这将会在教程第4篇中提到。

以下是一个例子,用于求 $\sum_{n=1}^5n$

1
2
3
4
5
6
number = 1
s = 0 # s for sum
while number <= 5:
s += number
number += 1
print(s)

for循环

for循环类似于while循环,但是不需要定义条件。取而代之的是需要给定一个集合用于迭代,比如说List,集合类型将会在教程第3篇中介绍。

以下是一个例子,用于求 $\prod_{n=1}^5n$

1
2
3
4
5
num_list = [1, 2, 3, 4, 5]
product = 1
for item in num_list:
product *= item
print(product)

注意,这个for循环结构用in运算符可以用于任何可迭代的集合类型(比如Dictionary)

注释

注释(Comment)是程序编写中非常重要的一部分。一般来说注释可以增强程序的可读性(readability),也能拿来解释程序的功能和意义。

在Python中,注释的开头用井号”#”表示。任何注释的文字,将会被Python解释器忽略,不会运行。

1
2
3
4
5
6
a = 1  # first number
b = 2 # second number
result = a + b

# print the result
print("The addition of a and b is", result)

注释分两种,一种是内嵌注释,和代码在同一行,如上所示。还有一种是”块注释”,每一行都有一个”#”。

1
2
3
4
# Program description
# Author: ...
# First created: ...
# Last modified: ...

或者也可以使用三个引号来表示,

1
2
3
"""
This code is used for ...
"""

更多关于注释的详细内容可以参考PEP8[6]和Google Python Style Guide[7]

不过要注意的是,注释是为了加强理解,而不是冗长的照搬代码内容。
comments

程序员最讨厌的两件事:

  • 讨厌在自己的代码中写注释
  • 讨厌别人没有注释的代码

实践试试

这次使用的环境和上一篇教程相同,具体内容请看Python编程基础01:Python语言和编程

英尺到英寸转换器

我们一般都很熟悉公制单位,而不熟悉英制单位。所以有必要做一个英制单位的转换器,这里我们用英尺(feet)和英寸(inch)作为例子。这个程序可以将inch转换成feet。其中的关系是,
$$feet = \frac{inches}{12}$$

举个例子,如果要把6 inches转换成feet,那么这个将是 $6 / 12 = 0.5\ feet$。

于是,我们可以写出以下代码。

1
2
3
4
5
6
7
8
# Prompt the user for the input.
inches = float(input("Please input the inches number. "))

# Convert feet to inches.
feet = inches / 12

# Print the result as "<input> inches is equal to <output> feets".
print(f"{inches} inches is equal to {feet} feets")

华氏度到摄氏度转换器

这个其实和上一篇很像,只不过转换的是华氏度(Fahrenheit)和摄氏度(Celsius)。转换公式是,
$$celsius = \frac{5}{9}(fahrenheit - 32)$$

代码如下,

1
2
3
4
5
6
7
8
# Prompt the user for the input.
fahrenheit = float(input("Please input the fahrenheit number. "))

# Convert Fahrenheit to Celsuis.
celsius = 5 / 9 * (fahrenheit - 32)

# Print the result as "<input> Fahrenheit is equal to <output> Celsius".
print(f"{fahrenheit} Fahrenheit is equal to {celsius} Celsius.")

简单四则计算器

在这个练习中,将要做一个简单的四则计算器,这个程序有3个输入,其中2个算子1个运算符。然后将会把结果输出到控制台上。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# Prompt for user input for the operator. The input can be add, sub, div, mul.
operator = input("Which operator do you need? add, sub, div or mul? ")

# Prompt for user input for both operands.
operand1 = float(input("Please enter the first operand. "))
operand2 = float(input("Please enter the second operand. "))
# Apply the operator and store the result in a variable.
if operator == "add":
result = operand1+operand2
elif operator=="sub":
result = operand1-operand2
elif operator=="div":
result = operand1/operand2
elif operator=="mul":
result = operand1*operand2
else:
result = None

# Print the result
if result != None:
print("The output is", result)
else:
print("Invalid operator!")

顺便试试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.

评论