黑马程序员python教程,8天python从入门到精通
Python环境安装
安装Anaconda
建议安装Anaconda ,自带Python环境;
在Anaconda中创建虚拟环境安装GPU版本的Pytorch
常见问题
Q1:命令提示符内,输入python出现 ‘python’ 不是内部或外部命令,也不是可运行的程序或批处理文件。
A1:安装python的时候,没有勾选:add python 3.10 to PATH的选项
添加环境变量 or 卸载Python,重新安装python,勾选这个选项
然后重新打开命令提示符程序,即可
Q2:命令提示符内,出现“无法初始化设备 PRN”
A2:这是因为没有进入到python解释器环境内执行代码。应该在命令提示符内:
Q3:执行出现:SyntaxError: invalid character ‘“’ (U+201C)
A3:这是因为,代码中的符号是中文符号。
请检查代码中的双引号、小括号,应该是英文符号
Python解释器
计算机不认识Python代码,但是Python有解释器程序,如下图
安装Python环境,本质 = 电脑中安装Python解释器程序代码,随时可以写,但能不能运行,就要看电脑里面有没有解释器程序了。
解释器存放在:<Python安装目录>/python.exe
在CMD(命令提示符)程序内执行的python,就是下图的python.exe程序
不使用解释器,计算机不认识Python代码
使用Python解释器程序,就能执行Python代码了
在python解释器程序内,写完一行代码并回车,会直接运行。
能否写好多行代码,一次运行呢?
可以将代码写入一个以".py"结尾的文件中,使用python命令去运行它。
如,在Windows系统的D盘,新建一个名为:test.py的文件,并通过记事本程序打开它,输入如下内容:
在“命令提示符”程序内,使用python命令,运行,如图:
Python开发环境
Python程序的开发有多种方式,常见的有:
- Python解释器环境内,执行单行代码
- 使用Python解释器程序,执行Python代码文件
- 使用第三方IDE(集成开发工具),如PyCharm软件
Pycharm安装
常用快捷键
撤销:Ctrl/Command + Z
重做:Ctrl/Command + Y
加粗:Ctrl/Command + B
斜体:Ctrl/Command + I
标题:Ctrl/Command + Shift + H
无序列表:Ctrl/Command + Shift + U
有序列表:Ctrl/Command + Shift + O
检查列表:Ctrl/Command + Shift + C
插入代码:Ctrl/Command + Shift + K
插入链接:Ctrl/Command + Shift + L
插入图片:Ctrl/Command + Shift + G
查找:Ctrl/Command + F
替换:Ctrl/Command + G
弹出传参提示:Ctrl/Command + P
基础知识
字面量
- 被写下来的固定的值。
字符串(string)
- 字符的串,又称文本,由任意数量的字符,如中英文、各类符号、数字组成,用单引号’ ‘、双引号" "或三引号’‘’ ‘’'括起来。
注释
- 单行注释:通过 # 号定义,在#号右侧的所有内容均作为注释
- 多行注释:通过一对三个引号来定义(“”" “”" 或 ‘’’ ‘’'),引号内部均是注释,可以换行
变量
- 在程序运行时,能储存计算结果或能表示值的抽象概念。变量的值可以改变。
print语句
-
print(内容1, 内容2, …, 内容N)
-
默认print语句输出内容会自动换行
在print语句中,加上 end=’’ 即可输出不换行了
-
\t = 在键盘上按下tab键,让多行字符串进行对齐。
数据类型
type(变量)可以输出类型,查看的是:变量存储的数据的类型。变量无类型,但是它存储的数据有。字符串变量表示变量存储了字符串,而不表示变量就是字符串。
数据类型转换
- 从文件中读取的数字,默认是字符串,需要转换成数字类型
- input()语句,默认结果是字符串,若需要数字也需要转换
- 将数字转换成字符串,用以写出到外部系统…
语句(函数) | 说明 |
---|---|
int(x) | 将x转换为一个整数 |
float(x) | 将x转换为一个浮点数 |
str(x) | 将x转换为字符串 |
这三个语句,都是带有结果的(返回值),可以用print直接输出,或用变量存储结果值。
- 任何类型,都可以通过str(),转换成字符串
- 字符串内必须真的是数字,才可以将字符串转换为数字
- 浮点数转整数会丢失精度(小数部分)
标识符
- 定义:用户编写代码时,对变量、类、方法等编写的名字。
- 命名规则
内容限定:中文、英文、数字、下划线
大小写敏感
不可使用关键字
- 命名规范
见名知意
下划线命名法
英文字母全小写
运算符
字符串扩展
- 单引号定义法,可以内含双引号
- 双引号定义法,可以内含单引号
- 可以使用转移字符(\)来将引号解除效用,变成普通字符串
字符串拼接
- 使用“+”号连接字符串变量 or 字符串字面量 即可
- 无法和非字符串类型进行拼接
字符串格式化
- 多个变量占位,变量要用括号括起来,并按照占位的顺序填入。
“%占位符” % 变量
格式符号 | 转化 |
---|---|
%s | 将内容转换成字符串,放入占位位置 |
%d | 将内容转换成整数,放入占位位置 |
%f | 将内容转换成浮点型,放入占位位置 |
- 快速格式化
f”{变量} {变量}”
f"{表达式}":"%s\%d\%f" % (表达式、表达式、表达式)
不理会类型
不做精度控制
适合对精度没有要求的时候快速使用
数字精度控制
- 使用辅助符号"m.n"来控制数据的宽度和精度,m和.n均可省略。
m,控制宽度,要求是数字(很少使用),设置的宽度小于数字自身,不生效
.n,控制小数点精度,要求是数字,会进行小数的四舍五入
数据输入
- input()语句获取键盘输入的数据
- input(提示信息),在使用者输入内容之前提示。
- 无论键盘输入什么类型的数据,获取到的数据永远都是字符串类型
判断语句
- 布尔(bool)表达现实生活中的逻辑,即真和假
True表示真,False表示假。
True本质上是一个数字记作1,False记作0
<比较运算符>计算得到bool类型的结果
if语句
- 判断条件的结果一定要是布尔类型
- 不要忘记判断条件后的: 引号
- 归属于if语句的代码块,需在前方填充4个空格缩进
if-else语句
- else不需要判断条件,当if的条件不满足时,else执行
- else的代码块,同样要4个空格作为缩进
if-elif-else语句
- elif可以写多个,完成多个条件的判断
- 判断是互斥且有序的,上一个满足后面的就不会判断了
- 可以在条件判断中,直接写input语句,节省代码量
for / 遍历 循环
基础语法
- while循环的循环条件是自定义的,自行控制循环条件。
- for循环for循环无法定义循环条件,只能从被处理的数据集中,依次取出内容进行处理,是一种”轮询”机制,是对一批内容进行”逐个处理”。
# 从待处理数据集中,逐个取出数据赋值给临时变量
for 临时变量 in 待处理数据集(可迭代对象):
循环满足条件时执行的代码
range语句
- 可迭代类型:其内容可以一个个依次取出的一种类型,包括:字符串、列表、元组。
语法 | 说明 |
---|---|
range(num) | [0, num)的数字序列,如range(5)取得的数据是:[0, 1, 2, 3, 4] |
range(num1, num2) | [num1, num2)的数字序列,步长1 |
range(num1, num2, step) | [num1, num2),步长step,如,range(5, 10, 2)表示:[5, 7, 9] |
变量作用域
- for循环中的临时变量,作用域限定为:循环内
- 这种限定是编程规范的限定,而非强制限定(不建议)
- 如需访问临时变量,可以预先在循环外定义它
for循环嵌套
- for循环和while循环可以相互嵌套使用
- 在for和while循环中作用一致
- 只能作用在所在的循环上,无法对上层循环起作用
关键字 | 作用 |
---|---|
continue | 中断所在循环的当次执行,直接进入下一次 |
break | 直接结束所在的循环 |
数据容器
可以容纳多份数据的数据类型,每份数据称为一个元素,其类型可以不一样,如字符串、数字、布尔等。
分为5类:列表(list)、元组(tuple)、字符串(str)、集合(set)、字典(dict)
列表(list)- []
定义
特点
- 可以容纳多个数据
- 可以容纳
不同类型
的数据(混装) - 数据是有序存储的(下标索引)
- 允许重复数据存在
- 可以修改(增、删、改等)
- 支持
嵌套
。 - 支持for、while循环
索引
- 从前向后,编号从0开始递增
从后向前,编号从-1开始递减 - 列表[下标],即可取出对应位置的元素
- 要注意下标索引的取值范围,超出范围无法取出元素,并且会报错
方法
如果将函数定义为class(类)的成员,那么函数会被称为方法。
函数:
方法:
函数的使用:
方法的使用:
pop()
方法用于从列表中移除并返回
指定位置的元素。如果不指定位置,则默认移除并返回列表的最后一个元素。
遍历 / 迭代
for、while循环
元组(tuple)- ()
定义
若元组只有一个数据,这个数据后面要添加逗号
。
特点
- 可以容纳多个数据
- 可以容纳
不同类型
的数据(混装) - 数据是有序存储的(下标索引)
- 允许重复数据存在
- 不可以修改普通元素(增、删、改等),只可以修改元组内的
list
的内容(增、删、改、反转等) - 支持
嵌套
。 - 支持for、while循环
方法
字符串(str)- ""
定义
字符的容器。
特点
只可以存储字符串
- 长度任意(取决于内存大小)
支持下标索引
- 允许重复字符串存在
- 不可以修改(增、删、改等)
- 支持for、while循环
方法
序列的切片
序列
内容连续、有序,可使用下标索引的一类数据容器,如:列表、元组、字符串。
切片
- 定义:表示从序列中,从指定位置开始,依次取出元素,到指定位置结束,得到一个
新序列
。序列(列表、元组、字符串)支持切片。 - 语法:序列 [起始
下标
: 结束下标 : 步长]
起始下标可以留空,视作从头开始。
结束下标(不含
)可以留空,视作截取到结尾。
步长N
:每次跳过N-1个元素。步长为负数:表示反向取(下标也要反向标记)
集合(set)- {}
定义
不能用{}定义空集合,会被当作dict。
特点
- 可以容纳多个数据
- 可以容纳不同类型的数据(混装)
- 数据是
无序
存储的(不支持下标索引
) 不允许重复
数据存在可以修改
(增加或删除元素等)支持for循环,不支持while循环
方法
字典、映射(dict)-{}
定义
特点
- 可以容纳多个数据
- 可以容纳不同类型的数据(key不可为字典)
- 每个元素是一个键值对,Key:Value,键值对之间使用逗号分隔
- Key不可重复,重复会对原有数据覆盖
- 字典
不可用下标索引
,而是通过Key检索Value - 可以修改(增、删、改元素等)
- 支持for循环,
不支持while循环
访问Values里的dict:stu_score[key1][key2]
方法
数据容器的对比
通用方法
字符串大小比较
- 字符串的字符,如:大小写英文字母、数字、特殊符号(!、\、|、@、#、空格等),都有对应的ASCII码值。
- 字符串大小比较 = 基于数字的码值大小比较。
- 从头到尾,一位位进行比较,其中一位大,后面就无需比较了。
函数
定义
- 函数:是组织好的,可重复使用的,用来实现特定功能的代码段。
- input()、print()、str()、int()、len()等都是Python的内置函数,随时都可以使用
语法
'''
先定义函数,后调用函数
参数不需要,可以省略,传入参数的数量是不受限制的
返回值不需要,可以省略
'''
def 函数名(形参):
函数体
return 返回值
函数说明文档
def func(x, y):
"""
函数说明(应写在函数体之前)
:param x: 参数x的说明
:param y: 参数y的说明
:return: 返回值的说明
"""
函数体
return 返回值
变量的作用域
- 局部变量:定义在函数体内部的变量,临时保存数据,当函数调用完成后则销毁,只在函数体内部生效。
- 全局变量:在函数体内、外都能生效的变量。使用 global关键字声明。
返回值之None类型
- None是类型 “NoneType” 的字面量,表示:空的、无意义的
- 不使用return语句 / 主动return None,即返回None
- 使用场景:函数返回值 / if判断(None等同False) / 定义变量(暂不需要变量有具体值,用None来代替)
多返回值函数
- 按照返回值的顺序,写对应顺序的多个变量接收,变量之间用逗号隔开
- 支持不同类型的数据return
多种传参方式
位置参数
- 调用函数时,根据函数定义的参数位置来传递参数
- 传递的参数,和定义的参数的顺序及个数必须一致
关键字参数
- 函数调用时,通过 “键=值” 形式传递参数。
- 函数调用时,
位置参数必须在关键字参数的前面
,但关键字参数之间不存在先后顺序。
缺省参数 / 默认参数
- 用于定义函数,为参数提供默认值,调用函数时可不传该默认参数的值。
所有位置参数必须出现在默认参数前
,包括函数定义和调用。- 函数调用时,如果为缺省参数传值,则修改默认参数值, 否则使用这个默认值。
不定长参数 / 可变参数
- 当调用函数时不确定参数个数时(不传参也可以)的场景。
- 类型:位置传递、关键字传递。
位置不定长:传递以*
号标记一个形式参数,以元组
的形式接受参数,形式参数一般命名为args
关键字不定长:传递以**
号标记一个形式参数,以字典
的形式接受参数,形式参数一般命名为kwargs
匿名函数
函数作为参数传递
- 函数本身可以作为参数,传入另一个函数中使用。
- 传入计算逻辑,而非传入数据。
lambda函数
- def关键字,定义带有名称的函数,基于名称重复使用
- lambda关键字,定义匿名函数(无名称),只可临时使用一次。
'''
lambda 是关键字,表示定义匿名函数
传入参数表示匿名函数的形式参数,如:x, y 表示接收2个形式参数
'''
lambda 传入参数:函数体(只能写一行代码,无法写多行)
文件
文件的编码
- 编码是一种规则集合,记录了内容和二进制间进行相互转换的逻辑。最常用的是UTF-8编码
- 计算机只认识0和1,需要将内容翻译成0和1才能保存在计算机中。
同时也需要编码, 将计算机保存的0和1,反向翻译回可以识别的内容。
文件的读取
文件
- 内存中存放的数据在计算机关机后就会消失。要长久保存数据,就要使用硬盘、光盘、U 盘等设备。为了便于数据的管理和检索,引入了“文件”的概念。
- OS以文件为单位管理磁盘中的数据。文件可分为文本文件、视频文件、音频文件、图像文件、可执行文件等。
打开文件open()
打开一个已经存在的文件,或者创建一个新文件
'''
open(name, mode, encoding)
name:是要打开的目标文件名的字符串(可以包含文件所在的具体路径)。
mode:设置打开文件的模式(访问模式):只读、写入、追加等。
encoding:编码格式(推荐使用UTF-8)
'''
# encoding的顺序不是第三位,所以不能用位置参数,用关键字参数直接指定
# `f`是`open`函数的文件对象(特殊的数据类型),拥有属性和方法,可以使用对象.属性或对象.方法对其访问
f = open('python.txt', 'r', encoding='UTF-8')
模式 | 描述 |
---|---|
r | 以只读方式打开,文件的指针将会放在文件开头(默认模式)。 |
w | 打开文件只用于写入 。若该文件已存在,则打开并从开头起编辑,原内容被删除 。若该文件不存在,创建 新文件。 |
a | 打开文件用于追加 。若该文件已存在,新内容将会被写入到已有内容之后。若该文件不存在,创建 新文件进行写入。 |
读文件read()
写文件write()
# 1. 打开文件
f = open('python.txt', 'w', encoding='UTF-8')
# 2.文件写入
f.write('hello world')
# 3. 内容刷新
f.flush()
- 直接调用write,内容并未真正写入文件,而是会积攒在程序的内存中,称之为缓冲区
- 当调用flush的时候,内容会真正写入文件,避免频繁的操作硬盘,导致效率下降(攒一堆,一次性写磁盘)
- 文件如果不存在,使用”w”模式,会
创建新文件
- 文件如果存在,使用”w”模式,会将
原有内容清空
- close()方法,带有flush()方法的功能,自动刷新
文件的追加
- 追加写入文件使用open函数的”a”模式进行写入
- 追加写入的方法有(和w模式一致):
wirte(),写入内容
flush(),刷新内容到硬盘中 - a模式,文件不存在,会创建新文件
a模式,文件存在,会在原有内容后面继续写入 - 可以使用”\n”来换行
模块、异常与包
异常
定义
当检测到一个错误时,Python解释器就无法继续执行,出现错误的提示,这就是“异常” / BUG
异常的捕获方法
- 遇到了BUG, 有2种情况:
① 整个程序因为一个BUG停止运行
② 对BUG进行提醒, 程序继续运行 - 如果尝试执行的代码的异常类型和要捕获的异常类型不一致,则无法捕获异常。
当捕获多个异常时,可以把要捕获的异常类型的名字,放到except 后,并使用元组
的方式进行书写。
[except:] / [except Exception:] 两种方式捕获全部
的异常
try:
可能发生错误的代码 # 一般try下方只放一行尝试执行的代码
except [异常as 别名]:
如果出现异常执行的代码
[else:]
如果没有异常要执行的代码
[finally:]
无论是否异常都要执行的代码
异常的传递
- 当func01()中发生异常,并且没有捕获处理这个异常的时候,异常会传递到函数func02,
当func02()也没有捕获处理这个异常的时候,main()会捕获这个异常。
当所有函数都没有捕获异常的时候, 程序就会报错。 - 可以在main()中设置异常捕获,由于无论在整个程序哪里发生异常,最终都会传递到main()中, 这样就可以确保所有的异常都会被捕获。
模块
定义
Python 模块(Module),是一个 Python 文件,以 .py 结尾。模块能定义函数,类和变量,模块里也能包含可执行的代码。每一个模块都可以帮助快速实现一些功能,比如实现和时间相关的功能就可以使用time模块。
模块的导入
模块在使用前需要先导入
[from 模块名] import [模块|类|变量|函数|*] [as 别名]
import 模块名
from 模块名 import 类、变量、方法等
from 模块名 import *
import 模块名 as 别名
from 模块名 import 功能名 as 别名
import 模块名
import 模块名1,模块名2
''' 通过 "." 来确定层级关系 '''
模块名.功能名()
from 模块名 import 功能名
功能名()
from 模块名 import *
功能名()
自定义模块
- 通过import、from关键字,和导入Python内置模块一样导入即可使用。
if __ main__== "__main__"
表示,只有当程序是直接执行的才会进入if内部,如果是被导入的,则if无法进入。- 不同模块,同名的功能,如果都被导入,那么后导入的会
覆盖
先导入的。 __all__
变量可以控制import *的时候哪些功能可以被导入。
包
定义
从物理上看,包 = 文件夹,包含多个模块文件,该文件夹下包含了一个 __init__.py
文件。
新建包后,包内部会自动创建__init__.py
文件,这个文件控制着包的导入行为。
从逻辑上看,包的本质依然是模块。
作用
帮助我们管理模块。
导入包
import 包名.模块名
包名.模块名.目标
'''
必须在`__init__.py`文件中添加`__all__ = []`,控制允许导入的模块列表
__all__针对的是 from ... import * 这种方式
对 import xxx 这种方式无效
'''
from 包名 import *
模块名.目标
第三方包
- 一个包,就是一堆同类型功能的集合体。
第三方包(非Python官方),丰富了Python的生态,提高了开发效率。如:
科学计算中常用的:numpy
包
数据分析中常用的:pandas
包
大数据计算中常用的:pyspark、apache-flink包
图形可视化常用的:matplotlib
、pyecharts
人工智能常用的:tensorflow
… - 但是由于是第三方,Python没有内置,所以需要安装才可以
导入
使用。
第三方包的安装,只需要使用Python内置的pip程序。
打开命令提示符程序
,输入:
pip install 包名称 / pip install -i https://pypi.tuna.tsinghua.edu.cn/simple 包名称
,
即可通过网络快速安装第三方包。