Python 从入门到实践(一)
在当今的环境下 Python 逐渐成为一门热门的语言,作为一门有着 30 年发展历史的编程语言,其在数据分析领域以及人工智能领域发挥着重要作用。Python 是基于 C 语言,一诞生就具备了完善的语法,其给程序员最直观的印象是——它的简洁性。
Python 特点
- 语法简单灵活;
- 规范化代码;
- Python 是一个开源项目,有着广泛的开发支持;
- Python 是一门面向对象的编程语言;
- Python 具有强大的可移植性;
- Python 属于解释性的编程语言;
- Python 是一个“胶水语言”;
- Python 拥有良好的并发处理支持。
搭建 Python 学习环境
前往 Python 官网下载最新版 Python,需要说明的是,Python2.x 和 Python3.x 之间存在较大差异,在开发中一般都使用 Python3.x,本次使用的版本为 3.8.1。
下载完成后运行安装程序,勾选 Add Python 3.8 to PATH,点击 Customize installation,点击 Next,点击 Install,等待安装完成。按下 Windows+R 组合键,输入 CMD 进入命令行窗口,输入 python,发现可进入 Python 交互式环境,如下图。
文本编辑器到底哪家强?我推荐 Visual Studio Code。前往官网,点击 Download for Windows,下载完成后运行安装程序,下一步即可,建议到下图这一步时勾选上这三个选项,等待安装完成。
安装完成后进入 Visual Studio Code,进入扩展市场(左侧第五个图标),搜索 chinese,如下图,点击 Install 安装简体中文包,安装完成后点击 Restart Now,。
仍然点击左侧第五个图标,搜索 python,第一个就是微软官方的,如下图,安装。
Python 学习起步
虽然 Python 拥有交互式环境,但是无论如何,程序是需要定义在源文件之中的,Python 源文件的后缀为 py。新建一个文件夹,名字自定义,例如 Python Learning,VS Code 中打开该文件夹,如下图(也可以直接右键点击 Python Learning,选择通过 Code 打开),VS Code 中新建文件,命名为 hello_world.py,文件中输入以下一行代码,Ctrl+S 保存。
1 | print("Hello,world!") |
点击右上角运行图标,可看到学习任何一门编程语言时第一个编写的程序的运行结果,如下图。
注释
- 单行注释:
# [注释内容]
- 多行注释:
'''[多行注释内容]'''
或"""[多行注释内容]"""
变量(对象)
Python 中的变量不需要声明,每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。
范例:使用变量(修改文件 hello_world.py)
1 | message = "Hello,world!" |
打印结果:
1 | Hello,world! |
可以同时为多个变量赋值。
范例:为多个变量赋值(修改文件 hello_world.py)
1 | message1, message2 = "Hello,world!", "Hello,ql!" |
打印结果:
1 | Hello,world! |
值得说明的是,如果我们比较熟悉面向对象的编程的话,Python 语言里面所有的变量严格意义上来讲应该被称为“对象”;
范例:定义变量但是不设置内容(新建文件 None.py)
1 | message = None # 空引用 |
打印结果:
1 | None |
很多编程语言都会使用;
作为每行程序的完结符,然而;
在 Python 中被设计为可选符号,如果希望在一行定义多个变量,可用;
。
范例:使用;
对一行中的多个变量进行区分(新建文件 hello_ql.py)
1 | message = "Hello,world" ;print(message) ;message = "Hello,ql!" ;print(message) |
打印结果:
1 | Hello,world! |
和其他语言一样,Python 中,我们在命名变量时也需要遵守一些规则和指南,违反规则将导致错误,遵守指南让你编写的代码更容易阅读和理解:
- 变量名只能包含字母、数字和下划线。变量名可以以字母或下划线开头但不能以数字开头;
- 变量名不能包含空格,但可用下划线代替;
- 不要将 Python 关键字用做变量名,注意将 Python 内置函数用做变量名时,虽然不会导致错误但将覆盖这些函数;
- 变量名应即简短又具有描述性。例如:name 比 n 好,student_name 比 s_n 好,name_length 比 length_of_persons_name;
- 慎用小写字母 i 和大写字母 O,因为它们可能被人错看成数字 1 和 0。
常用数据类型
在 Python 之中常用的数据类型包括:整数、浮点数、复数、布尔、字符串、列表、元组、字典和日期。
范例:通过 type() 函数查看数据类型(新建文件 type.py)
1 | message = "Hello,world!" |
打印结果:
1 | <class 'str'> |
"<class ‘str’>"表示 message 变量为字符串类型。
整数和浮点数
范例:两个整数相除(新建文件 num.py)
1 | num_a = 10 |
打印结果:
1 | 2.5 |
范例:获取数据类型(修改文件 num.py)
1 | num_a = 10 |
打印结果:
1 | <class 'int'> |
复数
复数数据类型不能直接使用,需要通过 complex() 函数。
范例:使用复数(一)(新建文件 complex.py)
1 | num = complex(10,2) # 实部为10,虚部为2 |
打印结果:
1 | (10+2j) |
范例:使用复数(二)(修改文件 complex.py)
1 | num = complex(10,2) # 实部为10,虚部为2 |
打印结果:
1 | (10+2j) |
布尔
“布尔”是 19 世纪一位英国数学家的名字,Python 中布尔的取值:True
和False
。
范例:使用布尔(一)(新建文件 boolean.py)
1 | flag = True # Python中的True是首字母大写的 |
打印结果:
1 | Hello,world! |
Python 是通过 C 语言开发的,Python 继承了布尔型值为 0 表示假,为非 0 表示真的特性。
范例:使用布尔(二)(修改文件 boolean.py)
1 | flag = 1 # 非0 |
打印结果:
1 | Hello,world! |
字符串
字符串是一个开发中最为重要的的概念,Python 中直接使用单引号''
或双引号""
进行字符串的定义,使用哪一种引号定义字符串都是一样的,但需统一,不同的引号可以嵌套。
范例:引号嵌套(新建文件 quotation_mark.py)
1 | message = '"Hello,world!"' # 使用单引号定义字符串 |
打印结果:
1 | "Hello,world!" |
可使用+
进行字符串的拼接操作。
范例:字符串的拼接(新建文件 string.py)
1 | message = "Hello,world!,"+"Hello,ql!" |
打印结果:
1 | Hello,world!,Hello,ql! |
常用转义字符串
符号 | 描述 | 符号 | 描述 |
---|---|---|---|
\ | 续航符,实现字符串多行定义 | \n | 换行 |
\\ | 等价于“\” | \v | 纵向制表符 |
\’ | 等价于单引号 | \t | 横向制表符 |
\" | 等价于双引号 | \r | 回车 |
\000 | 空字符串 | \f | 换页 |
\b | 退格 | \oyy | 八进制字符,如“\o12:”为换行 |
\e | 转义 | \xyy | 十进制字符,如“\x0a”为换行 |
范例:使用转义字符串(新建文件 escape.py)
1 | message = "Python:\"Hello,world!\"\n\tPython:\"Hello,ql!\"" |
打印结果:
1 | Python:"Hello,world!" |
函数 input()
利用函数 input(),Python 可以接受通过键盘输入的字符串类型的数据
范例:通过键盘输入数据(新建文件 input.py)
1 | input_data = input("你的名字:") # 给出提示字符串 |
打印结果:
1 | 你的名字:ql |
1 | 你的名字:ql |
范例:获取输入类型(修改文件 input.py)
1 | input_data = input("你的名字:") # 给出提示字符串 |
打印结果:
1 | 你的名字:ql |
1 | 你的名字:ql |
数据类型转换函数
函数 | 描述 |
---|---|
int(数据) | 将指定数据转为整形数据 |
float(数据) | 将指定数据转为浮点型数据 |
bool(数据) | 将指定数据转为布尔型数据 |
str(数据) | 将指定数据转为字符串型数据 |
范例:int() 函数(一)(新建文件 int.py)
1 | str = "155" |
打印结果:
1 | 155 |
如果字符串不是由规定字符组成,int.py 就会产生异常。
范例:字符串不是由规定字符组成(修改文件 int.py)
1 | str = "2BC9" |
打印结果:
1 | Traceback (most recent call last): |
范例:int() 函数(二)(修改文件 int.py)
1 | str = "199" |
打印结果:
1 | 399 |
范例:int() 函数(三)(修改文件 int.py)
1 | num_a = int(input("请输入第一个整数:")) |
打印结果:
1 | 请输入第一个整数:12 |
1 | 请输入第二个整数:13 |
1 | 请输入第一个整数:12 |
使用+
拼接任何数据与字符串时都需要先将任何数据转为字符串类型。
范例:改正以上错误(修改文件 int.py)
1 | num_a = int(input("请输入第一个整数:")) |
打印结果:
1 | 请输入第一个整数:12 |
1 | 请输入第二个整数:13 |
1 | 请输入第一个整数:12 |
格式化输出
在使用+
拼接字符串时总是得先将所有数据转为字符串实在是太麻烦。Python 沿用了传统的格式化输出标记和格式化输出辅助标记。
格式化输出标记
标记 | 描述 | 标记 | 描述 |
---|---|---|---|
%c | 输出单个字符字符串 | %s | 输出字符串 |
%d | 输出整形 | %f | 输出浮点型,可设置精度 |
%e | 以科学计数法格式输出,使用小写字母 e | %E | 以科学计数法格式输出,使用大写字母 E |
%g | %f 和 %e 的简写 | %G | %f 和 %E 的简写 |
%u | 输出无符号整型 | %o | 输出无符号八进制数 |
%x | 输出无符号十六进制数 | %X | 输出无符号十六进制数(大写字母) |
范例:格式化输出标记(新建文件 format1.py)
1 | age = 23 |
打印结果:
1 | ql 今年 23 岁,我的个人博客地址:https://ql-isaac.github,io,我的 qq 号码(十六进制):0X31BD0667。 |
格式化输出辅助标记
标记 | 描述 | 标记 | 描述 |
---|---|---|---|
* | 定义宽度或小数点精度 | # | 在八进制数前面显示零(0),在十六进制数前面显示“0x”或“0X” |
- | 左对齐 | 0 | 显示位数不足时填充 0 |
+ | 在正数前面显示加号 | m.n | m 设置显示总长度,n 设置小数位数 |
空格 | 显示位数不足时填充空格 | ||
(var) | 映射变量(字典参数) |
范例:格式化输出辅助标记(一)(新建文件 format2.py)
1 | num_a = 192.121231311121231 |
打印结果:
1 | 192.121231,98.230000 |
范例:格式化输出辅助标记(二)(修改文件 format2.py)
1 | num_a = 192.121231311121231 |
打印结果:
1 | 192.121231,98.230000 |
函数 print()
默认情况下使用函数 print() 都会进行换行,如果不希望换行,可以使用“end“参数。
范例:使用“end“参数(新建文件 print.py)
1 | print("Python:Hello,world",end="!") |
打印结果:
1 | Python:Hello,world!Hello,ql! |
运算符
数学运算符
运算符 | 描述 | 范例 |
---|---|---|
+ | 加法计算 | 20 + 15 = 35 |
- | 减法计算 | 20 - 15 = 5 |
* | 乘法计算 | 20 * 15 = 300 |
/ | 除法计算 | 20 / 15 = |
% | 取模计算 | 10 % 3 = 1 |
** | 幂运算 | 10 ** 3 = 1000 |
// | 整除计算 | 10 // 3 = 3 |
范例:数学运算符(一)(新建文件 arithmetic.py)
1 | result = (1 + 2) * (4 / 2) |
打印结果:
1 | 6.0 |
范例:数学运算符(二)(修改文件 arithmetic.py)
1 | result = (1 + 2) * (4 // 2) |
打印结果:
1 | 6 |
简化赋值运算符
运算符 | 范例 | 形如 |
---|---|---|
+= | a += b | a = a + b |
-= | a -= b | a = a - b |
*= | a *= b | a = a * b |
/= | a /= b | a = a / b |
%= | a %= b | a = a % b |
**= | a **= b | a = a ** b |
//= | a //= b | a = a // b |
范例:字符串上使用乘法(新建文件 multiplication.py)
1 | message = "Hello,world!" |
打印结果:
1 | Hello,world!Hello,world!Hello,world! |
Python 中没有自增(++
)和自减(--
)运算符,因为 Python 中所有的变量都为对象,所有的数据类型都为引用数据类型,而自增(++
)和自减(--
)运算符是只适用于基本数据类型的。
关系运算符
运算符 | 描述 | 范例 |
---|---|---|
== | 相等比较 | 1 == 1(True) |
!= | 不等比较 | 1 != 1(False) |
> | 大于比较 | 10 > 5(True) |
< | 小于比较 | 10 < 20(True) |
>= | 大于等于比较 | 10 >= 10(True) |
<= | 小于等于比较 | 20 <= 20(True) |
关系运算符除了能针对数值型数据进行比较之外,还能比较字符串,比较字符串实际上就是依次比较字符的编码。
范例:比较字符串(新建文件 string.py)
1 | print("ql" == "ql") |
打印结果:
1 | True |
如果想知道某单个字符字符串的编码,可使用 ord() 函数。
范例:查看某单个字符字符串的编码(新建文件 ord.py)
1 | print("小写的“l”的编码:%d,大写的“L”的编码:%d"%(ord("l"),ord("L"))) |
打印结果:
1 | 小写的“l”的编码:108,大写的“L”的编码:76 |
顺便说明一下数字和大小写字母的编码范围:
- 数字:”0“(48) ~ ”9“(57)
- 大写字母:”A“(65) ~ ”Z“(90)
- 小写字母:”a“(97) ~ “z”(122)
逻辑运算符
运算符 | 描述 |
---|---|
and | 逻辑与 |
or | 逻辑或 |
not | 逻辑非 |
位运算符
运算符 | 描述 |
---|---|
& | 位与 |
| | 位或 |
^ | 位异或 |
~ | 位非 |
<< | 左移运算符 |
>> | 右移运算符 |
进制转换函数
函数 | 描述 |
---|---|
bin(数据) | 转换为二进制数据 |
oct(数据) | 转换为八进制数据 |
int(数据) | 转换为十进制数据 |
hex(数据) | 转换为十六进制数据 |
身份运算符
Python 中所有的数据类型都为引用数据类型,id() 函数可以获取相应的内存地址。
范例:id() 函数(新建文件 id.py)
1 | num_a = 2 |
打印结果:
1 | num_a 变量的地址:1757145024 |
Python 中相等比较运算符==
类似于 Java 中的equals()
。
范例:内容相等比较(新建文件 equals.py)
1 | num_a = 2 # 整形 |
打印结果:
1 | 整形变量地址:1757145024,浮点型变量地址:11878208,两者内容是否相等:True |
那么 Java 中的==
在 Python 中用什么运算符替代呢?答案是身份运算符。
运算符 | 描述 |
---|---|
is | 判断是否引用同一内存 |
is not | 判断是否引用不同内存 |
范例:内存地址相等比较(修改文件 equals.py)
1 | num_a = 2 # 整形 |
打印结果:
1 | 整形变量地址:1757145024,浮点型变量地址:16400192,两者内容是否相等:False |
分支结构
针对分支结构的实现,Python 里有三个关键字:if
、elif
(Python 单独提供了该关键字,同 else if)和else
,三种语法:
- if 判断
1 | if <布尔表达式>: |
- if…else 判断
1 | if <布尔表达式>: |
- 多条件判断
1 | if <布尔表达式>: |
不得不说说 Python 中的缩进,Python 根据缩进来判断代码行与前一个代码行的关系,类似于 C 和 Java 语言的大括号,PEP8 建议每级缩进都使用四个空格,这既可提高可读性,又留下了足够多的多级缩进空间。
范例:判断闰年(新建文件 leap_year.py)
1 | year = int(input("请输入一个年份:")) |
循环结构
循环结构指的就是某段代码重复地执行,在循环结构之中需要定义一个循环的条件,只有在满足循环条件时代码才执行,Python 中循环结构有两种:while 循环和 for 循环。
while 循环
1 | while <循环条件>: |
或
1 | while <循环条件>: |
范例:进行 1~100 的自然数的累加(新建文件 accumulation.py)
1 | sum = 0 |
打印结果:
1 | 5050 |
范例:打印 1000 以内的斐波那契数列(新建文件 fibonacci_sequence.py)
1 | num_a = 0 |
for 循环
for 循环 | for…else 循环 |
---|---|
for <变量> in <序列> |
<循环语句> | for <变量> in <序列>
<循环语句>
else:
<循环语句执行完毕后的语句> |
序列
Python 在设计的过程中强调的一直是简洁性。在许多的编程语言中,都是首先利用了数组去描述多数据的存储,但是数组有长度固定,插入麻烦等缺点,因而才有了许多数据结构来满足我们的各种需求,Python 则帮我们封装了数组和许多数据结构,相应着重提出了序列这一概念,将能动态修改的内容统一称为序列,在 Python 之中字符串、列表、元组、字典都属于序列。
列表
直接使用一对中括号定义列表,可使用索引访问列表元素,从 0 开始。
范例:定义列表(新建文件 list.py)
1 | infos = ["C/C++","Java","Python"] |
打印结果:
1 | C/C++、Java、Python |
特性
范例:空列表不等同于 None(新建文件 None.py)
1 | list_a = [] |
打印结果:
1 | list_a的地址为 13626696,类型为 <class 'list'> |
范例:在进行索引访问时不能越界(修改文件 list.py)
1 | infos = ["C/C++","Java","Python"] |
打印结果:
1 | C/C++、Java、Python |
范例:列表除了可以正向索引访问之外,还可以反向索引访问(修改文件 list.py)
1 | infos = ["C/C++","Java","Python"] |
打印结果:
1 | C/C++、Java、Python |
范例:通过列表保存多种数据类型(新建文件 python.py)
1 | infos = ["Python","简洁",["列表元素 1","列表元素 2","列表元素 3"]] # 数据的意义:编程语言(Python),特点(简洁),举例(列表) |
打印结果:
1 | 编程语言:Python、特点:简洁、举例:['列表元素 1', '列表元素 2', '列表元素 3'] |
范例:使用 for 循环迭代输出(修改文件 list.py)
1 | infos = ["C/C++","Java","Python"] |
打印结果:
1 | C/C++ |
范例:使用 for 循环索引访问输出(修改文件 list.py)
1 | infos = ["C/C++","Java","Python"] |
打印结果:
1 | C/C++ |
范例:根据索引修改数据内容(修改文件 list.py)
1 | infos = ["C/C++","Java","Python"] |
打印结果:
1 | C/C++、PHP、Python |
范例:使用乘法(新建文件 multiply.py)
1 | infos = ["C/C++","Java","Python"] * 3 |
打印结果:
1 | ['C/C++', 'Java', 'Python', 'C/C++', 'Java', 'Python', 'C/C++', 'Java', 'Python'] |
范例:使用加法(新建文件 add.py)
1 | infos = ["C/C++","Java","Python"] + ["PHP"] |
打印结果:
1 | ['C/C++', 'Java', 'Python', 'PHP'] |
数据分片
列表的数据分片,即截取列表的一部分:
- 指定截取范围:
<列表>[<开始索引>:<结束索引>]
; - 从指定索引一直截取到结尾:
<列表>[<开始索引>:]
; - 从开头一直截取到指定索引:
<列表>[:<结束索引>]
; - 设置截取步长:
<列表>[<开始索引>:<结束索引>:<步长>]
。
元组
序列统计函数
函数
函数深入
lambda 表达式
lambda 表达式即 lambda 函数,
主函数
callable()
callabl()
1 | print("input()是否可以调用:%s" % callable(input)) |