Python基础复习笔记

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 , 按 "+" 搜索包名

 

posted @ 2025-07-10 18:17  L_Rx  阅读(12)  评论(0)    收藏  举报