Python
- 简单、易学、开发效率高
Python解释器
- 计算机只认二进制0/1
- 解释器将代码翻译为二进制提交给计算机运行
- 即 python.exe
PyCharm
- 第三方IDE(集成开发工具)
- PyCharm CE 即 Community Edition 版本
- 以工程为单元
VSCode+Jupyter
基础知识
字面量
- 在代码中被写下来的固定的值,常见类型有整数、浮点数、字符串
数据类型
- 数字 Number 整数int、浮点float、复数complex、布尔bool
- 字符串 String 由任意数量的字符组成,双引号""括起来
- 列表 List 有序可变序列
- 元组 Tuple 有序不可变序列
- 集合 Set 无序不重复集合
- 字典 Dictionary 无序 Key-Value 集合
注释
- 单行注释 : 以 # 开头,建议与注释内容以一个空格隔开
- 多行注释 : """注释内容""",一对三个双引号
变量
- 程序运行时,能储存计算结果或能表示值的抽象概念
- 变量名称 = 变量的值
- None 可以声明无初始内容的变量
print
- print(内容1, 内容2, ···, 内容N)
- 不换行: print(内容, end='')
- 制表符\t对齐,print("Hello\tWorld")
type
- 查看数据类型:type(被查看的数据类型)
- type(变量):查看的是变量存储的数据的类型;因为python中变量无类型,但它存储的数据有
- 有返回值
数据类型转换
- 带返回值
- int(x) : 浮点型转为整型会向下取整,丢失精度;将字符串转成数字要求字符串内容都是数字
- float(x) : 末尾默认带一位小数
- str(x) : 任何类型都能转为字符串
标识符
- 变量的名字、方法的名字、类的名字;等等
- 内容限定:只允许出现 英文、中文、数字、下划线_;数字不能开头;不推荐用中文
- 大小写敏感:可以区分
- 不可使用 关键字:
* False True None and as assert break class
* continue def del elif else except finally for
* from global if import in is lambda nonlocal
* not or pass raise return try while with yield
运算符
算数运算符
- 加+ 减- 乘* 除/
- 取整除// : 9//2=4 ; 9.0//2.5=3.0
- 取余% : 9%2=1
- 指数** : 2**3=8
赋值运算符 =
- 把 = 右边的结果赋给左边的变量
复合赋值运算符
- 如 += 、-= 、*= 、 /= 、 %= 、**= 、 //=
字符串拓展
三种定义方式
- name = 'Luna' ; 可含""
- name = "Luna" ; 可含''
- name = """Luna""" ; 支持换行,若不用变量接收,则作为多行注释使用
- 可用转义字符(\)将引号解除效用
字符串拼接
- 字符串字面量、变量,可以用+拼接为一个字符串
- 无法和非字符串类型进行拼接
字符串格式化
- 语法
* "%占位符" % 变量
- 数字类型占位
* 常用 %s | %f | %d
- %s 占位拼接
* %表示占位
* s表示将变量变成字符串放入占位的地方
* 多个变量占位变量要用()括起来,并按占位顺序填入:
* message = "Luna是%f个非常厉害的%s" % (1, "程序员")
- 精度控制
* 辅助符号 m.n
* m , 控制宽度,设置的宽度小于数字自身则不生效
* .n , 控制小数精度,会进行小数的四舍五入
* 如:%6.2d输出数字11.2468,结果为[空格][空格]11.25
* 省略则不限制
- 快速格式化f:format
* 语法: f"内容{变量}"
* 如: print(f"我是{name}, 我今年{age}岁")
- 表达式格式化
* 表达式: 一条具有明确执行结果的代码语句
* print("字符串在Python中的类型是:%s" % type('字符串'))
* f"{表达式}"
* "%s\%d\%f" % (表达式、表达式、表达式)
数据输入
input语句
- variate = input("提示信息")
- 从键盘读取输入
- 默认接收类型为字符串
判断语句
bool类型
- True 1 真
- False 0 假
- 定义、比较运算符(==、!=、>、<、>=、<=)
if判断语句
- if 要判断的条件1:
- 条件成立时要做的事情1
- 条件成立时要做的事情2
- elif 要判断的条件2:
- 条件成立时要做的事情3
- 条件成立时要做的事情4
- else:
- 条件成立时要做的事情5
- 条件成立时要做的事情6
嵌套
- if 要判断的条件1:
- 条件成立时要做的事情1
- if 要判断的条件2:
- 条件成立时要做的事情2
- else:
- 条件成立时要做的事情3
- else:
- 条件成立时要做的事情4
随机数字random
- import random
- num = random.randint(1,10) # 产生数字范围在1~10的整数
循环语句
while循环
- while 条件:
- 条件成立时要做的事情1
- ``````
- 自行控制循环条件
- 九九乘法表
* a = 1
* while a <= 9:
* b = 1
* while b <= a:
* print(f"{b} * {a} = {a * b}", end='\t')
* b += 1
* a += 1
* print()
for循环
- 轮询机制,无法定义循环条件
- for 临时变量 in 待处理数据集:
- 循环满足条件时执行的代码
- 待处理数据集:序列类型
* 字符串、列表、元组等
- range语句
* range(num)
· 获取从0开始,到num结束的数字序列(不包含num)
· range(5)得到[0, 1, 2, 3, 4]
* range(num1, num2)
· 获取从num1开始,到num2结束的数字序列(不包含num2)
· range(5, 10)得到[5, 6, 7, 8, 9]
* range(num1, num2, step)
· 获取从num1开始,到num2结束的数字序列(不包含num2)
· 数字之间步长以step为准,默认1
· range(5, 10, 2)得到[5, 7, 9]
- 在编程规范上,临时变量作用域仅在for循环内部,但实际在for循环外部访问得到,但不要这么做,可以在for循环之前定义一下
break 和 continue
- 关键字,用以对循环进行临时跳过和直接结束
函数
定义
- def 函数名(传入参数):
- 函数体
- return 返回值
- 传入参数、返回值不需要可省略
- 无返回值即返回None字面量,类型是<class 'NoneType'>
- 形参
调用
- 函数名(参数)
- 先定义,后调用
- 实参
说明
- def func(x, y):
- """
- 函数说明
- :param x: 形参x的说明
- :param y: 形参y的说明
- :return: 返回值的说明
- """
- 函数体
- return 返回值
多返回值
- 返回: return 1,2
- 接收: x,y = func()
- 支持不同类型数据return
参数
- 位置参数:调用函数时根据函数定义的参数位置来传参,个数保持一致
- 关键字参数:调用函数时通过"键=值"形式传参,可以不固定参数位置顺序,但与位置参数混用时,位置参数必须在前
- 缺省参数:也叫默认参数,调用函数时,可不传该默认参数的值;所有位置参数必须出现在默认参数前,包括函数定义和调用
- 不定长参数:也叫可变参数,分为位置传递不定长和关键字传递不定长;
* 位置传递不定长,用"*args"代替,args是元组类型,def func(*args): print(args)
* 关键字传递不定长,用"**kwargs"代替,会根据"键=值"组成字典,传参也是这个形式,def func(**kwargs): print(kwargs)
- 函数作为参数传递
* def test(compute):
* result = compute(1, 2)
* print(result)
* def compute(x, y):
* return ((x + y) * y) ** x
* 计算逻辑的传递,而非数据的传递,任何逻辑都可以自行定义并作为函数传入
lambda匿名函数
- lambda关键字定义匿名函数(无名称,有名称用def关键字)
- 无名称的匿名函数只可使用一次(有名称的函数可基于名称重复使用)
- lambda 传入参数: 函数体(一行代码)
* def test(compute):
* result = compute(1, 2)
* print(result)
* test(lambda x, y: ((x + y) * y) ** x)
局部变量和全局变量
- 根据变量作用域
- 局部变量定义在函数体内,只在函数体内生效,用于临时保存数据,函数调用完成后则销毁
- 全局变量在函数体内、外都能生效
global关键字
- 声明变量为全局变量,可设置局部变量为全局变量
数据容器
- 一种可以容纳多份数据的数据类型,容纳的每一份数据称之为1个元素
- 每一个元素,可以是任意类型的数据,如字符串、数字、布尔等
- 数据容器根据不同特点(是否支持重复元素;是否可以修改;是否有序等),分为五类:
* 列表(List)
* 元组(Tuple)
* 字符串(str)
* 集合(set)
* 字典(dict)
列表(List)
- 基本语法
* # 字面量
* [元素1, 元素2, 元素3, 元素4, ···]
* # 定义变量
* 变量名称 = [元素1, 元素2, 元素3, 元素4, ···]
* # 定义空列表
* 变量名称 = []
* 变量名称 = list()
* # 嵌套定义
* 变量名称 = [[元素1, 元素2], [元素3, 元素4], ···]
* # 可以这样:my_list = ['Luna', 888, [1, 2, 3], True]
- 下标索引
* 列表[下标索引]:从0开始为列表第一个元素下标,每次+1
* 反向索引:从-1开始为列表最后一个元素下标,每次-1
* 嵌套: 列表[下标索引1][下标索引2]
* 超出取值范围无法取出且会报错
- 方法
* Python中,若将函数定义为class类,则函数称之为方法
* class 方法名:
* def 函数名():
* 函数体
* 使用:
- 变量1 = 类名()
- 变量2 = 变量1.方法1()
* 查询功能:
- 查找指定元素在列表中的下标,找不到,报ValueError
- list.index(元素)
* 修改功能
# 修改特定位置(下标)的元素值 改
- 列表[下标] = 值
# 插入元素 插
- 列表.insert(想要插入的位置的下标, 元素)
# 追加元素到列表尾部 增
- 列表.append(元素)
- 列表.extend(其他数据容器)
# 删除元素 删
- del 列表[下标]
- element = 列表.pop(下标)
- 列表.remove(下标)
# 清空列表
- 列表.clear()
# 统计某元素在列表内的数量
- 列表.count(元素)
# 统计列表内的元素数量
- len(列表)
- 特点
* 有序存储 * 允许元素重复 * 可以修改 * 上限 (2**63 -1) 个 * 可以存不同类型的元素
- 遍历
* while index < len(list):
* for index in list
元组(Tuple)
- 一旦定义完成,就不可修改
- 需要在程序内封装数据,但又不希望数据被篡改
- 定义
* # 字面量
* (元素1, 元素2, 元素3, ···, 元素n)
* # 定义变量
* 变量名称 = (元素1, 元素2, 元素3, ···, 元素n)
* # 定义空元组
* 变量名称 = ()
* 变量名称 = tuple()
* # 嵌套定义
* 变量名称 = ((元素1, 元素2), ···, (元素n, 元素n+1))
* # 可以这样:my_tuple = ('Luna', 888, [1, 2, 3], True)
* 定义单个元素必须根"," 否则不是元组
* # t = ("hello", )
- 下标取值和list一样
- 特点除了不能修改元素,都和list一样;但若元组内嵌套list,list里面元素可修改;list里面嵌套的元组的内容同样不可修改
- 操作方法:
* index()
* count()
* len(元组)
字符串(str)
- 字符的容器,一个字符串可以存放任意数量的字符
- 不支持修改
- 只可以存储字符串
- 操作方法
* 起始下标 = 字符串.index(字符串)
* # 字符串替换:不是修改字符串本身,而是得到一个新字符串。2替换掉1
* 新字符串 = 旧字符串.replace(字符串1, 字符串2)
* # 字符串分割:字符串本身不变,而是得到了一个列表对象
* 列表 = 字符串.split(分隔符字符串)
* # 字符串的规整操作: 去除前后空格及回车符
* 字符串.strip()
* 字符串.strip(字符串) # 去前后指定字符串,例:传入"12",则"1"和"2"都会移除
* count = 字符串.count(字符串)
* len(字符串)
- ASCII
* a~z : 97~122
* A~Z : 65~90
* 字符串按位比较
序列
- 指内容连续、有序,可使用下标索引的一类数据容器
- 列表、元组、字符串,均可视为序列
- 序列的切片操作
* 即从一个序列中取出一个子序列
* 序列[起始下标:结束下标:步长]
* 表示从指定位置开始依次取出元素到结束位置结束,得到一个新序列,间隔步长-1;步长为负数,则反向取
* 实际区间左闭右开
* 此操作不会影响序列本身,而是得到一个新序列
* # 还可以这样操作:
* # my_str[::-1][3:7];
* # my_str.split(",")[1].replace("a","b")[::-1]
集合(set)
- 不支持元素的重复,且内容无序,因此不支持下标索引访问
- 定义
* # 字面量
* {元素1, 元素2, 元素3, ···, 元素n}
* # 定义变量
* 变量名称 = {元素1, 元素2, 元素3, ···, 元素n}
* # 定义空集合
* 变量名称 = set()
- 允许修改
* # 添加新元素
* 集合.add(元素)
* # 移除元素
* 集合.remove(元素)
* # 随机取出元素,取出的元素会从集合中删除
* element = 集合.pop()
* # 清空集合
* 集合.clear()
* # 取出两个集合的差集,集合1有而集合2没有的
* 差集 = 集合1.diffrence(集合2)
* # 消除两个集合的交集,在集合1内删除和集合2相同的元素
* 集合1.diffrence_update(集合2)
* # 合并两个集合
* 并集 = 集合1.union(集合2)
* # 统计集合元素数量
* len(集合)
- 遍历不支持while循环,因为不支持下标索引访问
字典(dict)
- 元素是键值对
- 定义
* # 字面量
* {key:value, key:value, key:value, ···, key:value}
* # 定义变量
* 变量名称 = {key:value, key:value, key:value, ···, key:value}
* # 定义空字典
* 变量名称 = {}
* 变量名称 = dict()
- key不能重复
- 不支持下标索引
- 可以通过key找到对应value值:value = dict["key"]
- key和value可以是任意类型数据,但key不可为字典,故字典可嵌套
- 获取嵌套: value21 = dict["key2"]["key21"]
- 常用操作
* # 新增元素
* 字典[key]=value
* # 更新元素,更新value值
* 字典[key]=value
* # 删除元素
* value = 字典.pop(key)
* # 清空字典
* 字典.clear()
* # 获得全部key
* 字典.keys() # 结果是dict_keys(['key1','key2','key3'])
* # 统计字典元素数量
* len(字典)
- 遍历
* for key in dict.keys():
* for key in dict
* 不支持while循环
共通
- 通用统计功能:len(容器)、max(容器)、min(容器)
* max、min统计容器的最大最小元素
- 通用转换功能:list(容器)、str(容器)、tuple(容器)、set(容器) #
* 字典转列表、元组、集合会将value值都抛弃
* 其他转字符串没什么变化
* 字符串转其他会把每个字符单拿出来当元素
* 转集合会变地无序
- 通用排序功能:将给定容器进行排序
* sorted(容器, [reverse=True])
* 排序结果都变成列表对象
* reverse=True 即降序
文件操作
文件的编码
- 编码技术即翻译规则,将内容翻译成二进制,以及将二进制翻译回可识别内容
- 计算机中可用编码如:UTF-8、GBK、Big5等
文件的操作
- 基本操作步骤:打开、读写、关闭
- 打开文件
* open()函数
- file = open(name, mode, encoding)
# name: 要打开的目标文件名的字符串(可包含文件所在的具体路径)
# mode: 设置打开文件的模式(访问模式): 只读、写入、追加等
# encoding: 编码格式(推荐UTF-8);非第三位参数,应使用关键字传参
# file是open函数的文件对象,是一种特殊数据类型,拥有属性和方法
- 读操作"r"
* read()方法
- 文件对象.read(num)
# num表示要从文件中读取的数据的长度(单位是字节),没有传入则读取所有数据
* readlines()方法
- 按照行的方式把整个文件内容一次性读取,且返回一个[列表],每行数据为一个元素
* readline()方法
- 一次读取一行内容
* for循环读取文件行
- for line in open("D:/python.txt", "r"):
# 每个line临时变量,就记录了文件的一行数据
* 多次调用会从上一次调用结尾处开始读取
- 写操作"w"
* write()方法
- 直接调用write,内容并未真正写入文件,而是会攒在程序的内存中,称之为缓冲区
- 当调用flush时,内容会真正写入文件,close方法内置了flush功能
- 这是为了避免频繁操作硬盘,导致效率下降
- 文件不存在时,使用open("file", "w")时会先创建该文件
- 文件存在时,使用open("file", "w")时会先把文件里面内容清空,再去操作写入
- 追加操作"a"
* write()方法
- a模式,文件不存在会创建文件
- a模式,文件存在会在最后,追加写入文件,也要flush
- 关闭文件
* close()
- 关闭文件对象,即关闭对文件的占用, 否则若程序没有停止运行, 文件将一直被python程序占用
* 停止运行程序
* with open语法
- with open("python.txt", "r") as f:
- f.readlines()
- 可以在操作完成后自动关闭文件,避免遗忘掉close方法
异常
- 当检测到一个错误时,Python解释器就无法继续执行了,反而出现了一些错误的提示,即"异常"
- 捕获异常/异常处理:提前准备、提前处理
- 语法:
* try:
* 可能发生错误的代码
* except: # 这也属于捕获所有异常
* 如果出现异常执行的代码
* else:
* 没出现异常时执行的代码
* finally:
* 无论是否异常都要执行的代码
- 捕获指定的异常
* try:
* print(name)
* except NameError as e:
* print('name变量名称未定义错误')
* print(e) # 打印异常信息
* # 如果尝试执行的代码的异常类型和要捕获的异常类型不一致,则无法捕获异常
* # 一般try下方只放一行尝试执行的代码
- 捕获多个异常
* try:
* print(1/0)
* except (NameError, ZeroDivisionError) as e:
* print('错误')
* print(e) # 打印异常信息
- 捕获所有异常
* except Exception as e: # 这也属于捕获所有异常
- 异常具有传递性
* func1函数发生异常但没有捕获,异常会传递到调用该函数的func2
* func2也没有捕获处理该异常时,mian函数会捕获
* 当所有函数都没有捕获异常时,程序就会报错
模块
- Module,是一个Python文件,以.py结尾
- 模块能定义函数、类、变量,也能包含可执行的代码
- 助力快速实现一些功能,认为一个工具包
- 导入方式
* [from 模块名] import [模块 | 类 | 变量 | 函数 | *] [as 别名]
* # 1
* imort 模块名1, 模块名2
* 模块名1.功能名()
* 通过"."来确定层级关系
* # 2
* from 模块名 import 功能名
* 功能名()
* # 3 导入模块中所有功能
* from 模块名 import *
* 功能名()
* # 4 别名
* import 模块名 as 别名 # 模块定义别名
* from 模块名 import 功能名 as 别名 # 功能定义别名
- 模块的导入一般写在代码文件的开头位置
- 自定义模块
* 每个Python文件都可以作为一个模块,模块名就是文件名,定义模块名必须符合标识符命名规则
* 当导入多个模块,且多个模块内部有同名功能,当调用这个同名功能,调用到的是后面导入的模块的功能
- 测试模块
* 编写模块后想要测试但不想其他文件导入模块时运行测试代码
* if __name__ == '__main__'
* test()
* 只在当前文件单独运行时调用该函数;
* 即当前文件运行时,该文件的"__name__"这个内置变量的值会被标记为"__main__",其他文件运行时不会被标记故不会被调用
- "__all__"变量
* 如果一个模块文件中有"__all__"变量,当使用'from xxx import *'导入时,只能导入这个列表中的元素
* 即若定义 __all__=['test_A'], 则只能用test_A(), 不能用test_B(), 如果手动导test_B是可以的
包
- 从物理上看,包是一个文件夹,包含了一个"__init__.py"文件,该文件夹可用于包含多个模块文件
- 从逻辑上看,包本质依然是模块
- 模块文件越来越多时,包可以帮助管理这些模块
- 导入包
* # 1
* import 包名.模块名
* 包名.模块名.目标()
* # 2
* from 包名 import 模块名
* 模块名.目标()
* # 3
* from 包名.模块名 import 目标
* 目标()
* # 4
* 在"__init__.py"文件中,添加"__all__ = []", 控制"import *"允许导入的模块列表,不影响手动导入
* from 包名 import *
* 模块名.目标()
- 第三方包(非Python官方)
* 科学计算numpy包;数据分析pandas包;大数据计算pyspark,apache-flink;图形可视化matplotlib,pyecharts;人工智能tensorflow等
* 由于Python没有内置,需要安装才能导入使用,可通过命令提示符程序通过网络快速安装
* pip install 包名 # 默认连接国外网站,速度比较慢
* pip install -i http://pypi.tuna.tsinghua.edu.cn/simple 包名 # 该网站由清华提供,可供pip程序下载第三方包
* PyCharm 软件也提供安装第三方包的功能:Python Interpreter , 按 "+" 搜索包名