Python学习日记

Python学习日记

Property
notion image
Python学习打卡日记,日期加上学习的主题命名好了~
已经学习完成,接下来只需要将内容整理成方便复习的样子。

1. 基础语法

1.1 变量创建与赋值

1.1.1 变量的类型

  • 整形
  • 浮点型
  • 布尔型
  • 字符串型

1.1.2 变量标识符的命名

通俗命名规则:
  • 模块和包名:小写
  • 函数名:尽量全小写,单词之间用‘_’隔开
  • 类名:首字母大写,驼峰原则
  • 常量名:全大写,单词之间用‘_’隔开

1.1.3 变量的声明和赋值

删除变量时,只是删除了栈里的,堆里的对象没被删除,最后被Python的垃圾回收器处理掉。
链式赋值:
  • x = y = 123
系列解包赋值:
  • a, b, c = 1, 2, 3
  • a, b = b, a
同一运算符判断:
  • is 判断两个标识符是不是引用同一个对象,也即比较ID地址
  • == 用于判断引用变量引用对象的值是否相等,也即对比两个堆中的value
  • 【-5,256】会缓存这部分数,因此值相等的时候,地址(ID)也是一样
  • is 要比 == 效率要高

1.1.4 变量的转换与打印

  • round(),去掉小数位
  • 时间的获取:time.time()
  • 返回值为以秒为单位,小数点后面的单位为微秒
1)格式化字符串
F-String (Python 3.6+)
age = 15
result = f"小明今年{age}岁了!"
print(result)

output:小明今年15岁了!
format()
result = "你好{},小明今年{}岁了!".format(name,age)

output:你好老王,小明今年15岁了!
2)格式化数字
pi = 3.1415926
# 对 pi 进行格式化
# 格式:“:+ “填充、对齐” + “符号” +  “宽度” + "." + "位数" + "f"
result = f"圆周率{pi:.4f}是一个无限不循环小数"

# 设置小数点后四位显示
result = f"圆周率{pi:50.4f}是一个无限不循环小数"

# 设置小数点后四位显示 且占50位空间
result = f"圆周率{pi:+50.4f}是一个无限不循环小数"

# 设置小数点后四位显示 且占50位空间 加“+”号
result = f"圆周率{pi:<.4f}是一个无限不循环小数"

# 设置小数点后四位显示 向左对齐

# 向右对齐使用 > 居中显示使用 ^
result = f"圆周率{pi:*<50.4f}是一个无限不循环小数"

# 设置填充,超出实际宽度的部分进行填充,这里是用“*”填充
result = f"圆周率{pi:.2%}是一个无限不循环小数"

# 以百分号形式展示 :.0% 表示不要小数位
result = f"圆周率{pi:#b}是一个无限不循环小数"

# 表示为二进制 :b  加了
#/显示0## 表示为十六进制 :x

1.1.5 变量的逻辑运算符

基本运算符
  • Python不支持自增和自减
notion image
  • and:与
  • or:或
  • not:非
  • 优先级:常规数学运算,如果优先级错误,直接加小括号
      1. *
      1. / % //
        1. < > = ≥ ≤ == ≠
        1. and or not
        1. =

    1.1.6 变量的作用域与拷贝

    全局变量:
    • 在函数和类定义之外声明的变量
    局部变量:
    • 函数里定义的变量
    • 函数执行完即消失
    • 局部变量与全局变量同名时,优先使用局部变量,使用全局变量前声明 global variable
    • 局部变量的引用比全局变量快,优先考虑使用
    浅拷贝和深拷贝
    浅拷贝:
    • 不拷贝子对象的内容,只是拷贝子对象的引用
    • 拷贝了栈里的变量标识符,并且拷贝了该变量指向的堆里的对象的地址,因此作出的部分更改会
    • copy.copy()
    • 只拷贝引用
    notion image
    深拷贝:
    • 会连子对象的内容也全部拷贝一份,对子对象的修改不会影响源对象
    • 拷贝了栈里的变量标识符,拷贝了该变量指向的堆里的对象,并且拷贝了堆里对象所指向的所有子对象
    • copy.deepcopy()
    • 全部拷贝到新的内存变量
    notion image
    nonlocal global
    • nonlocal 声明外层的局部变量
    • global 声明全局变量
    LEGB 规则
    Python在查找一个名字时,按照该顺序查找:
    • Local - Enclosed - Global - Built in
    • 局部变量 - 闭包 - 全局变量 - Python保留字
    短路现象
    指python在执行 或 or 的时候,它在运行到or前为真值的时候,即停止运行后面的代码

    1.2 函数创建

    1.2.1 基础函数

    If 与 Else
    • If 是 流程控制语句,用来判断
    • 条件满足则执行语句
    • 为分支语句,在Python中主要使用冒号与缩进
    • Else 是 不满足 If 条件时,执行的备选代码块
    • Elif 是 If 的额外判断情况,如果情况比较多的话,建议使用Switch
    随机数获取
    • 首先导入 Import random
    • 生成随机数 random.randint(start, end)
    随机整数,rand int
    • 这里的上下限都是包含在生成范围内的
    画图函数
    notion image
    notion image
    Range方法
    • range(value)
    # 生成一个有序整数列表
    a = list(range(100))
    print(a)
    
    $ [0,1,2,3,...,99]
    • range(start, end)
    # 设置起始范围与终点范围
    a = list(range(3,6))
    print(a)
    
    $ [3,4,5]
    • range(start,end,step)
    # 设置步长
    a = list(range(0,100,20))
    print(a)$ [0, 20, 40, 60, 80]
    For循环及While循环
    for item in nums:
        <code stock>
    while <code stock>:
        <code block>
    • 调试时,代码当前高亮表示即将被执行

    1.2.2 函数用法与底层分析

    • 可重用的程序代码块
    • 注重逻辑的一致性,也即功能单一
    函数大致分为:
    • 内置函数
    • 标准库函数
    • 第三方函数
    • 用户自定义
    如何创建自定义函数?语法如下:
    • def funcName(para1, para2):
      • Code block
    函数也是一个对象,在def语句后初始化一个对象,对象具有 ID 、 类型 、 值 三要素。因此也同样,初始化后 ID 绑定到函数名,也即标识符上。
    • 实参与形参必须一一对应
    • 调用前定义函数
    • 无参数也必须保留圆括号
    • 形式参数无需声明变量类型,也不需要指定返回值类型

    1.2.3 形参、实参

    形参:
    • 在函数定义时,圆括号内自己设置的参数,只在函数执行过程中生效,其余时间失效
    • 属于函数,无法被外部调用
    • 值需要在调用时,从外部传入
    实参:
    • 在调用函数时,传递值给函数的变量
    • 可以被函数内部调用,但不建议
    • 一般只传递值

    1.2.4 返回值详解

    返回值:调用函数后,返回的值
    • 使用return 语句
    • 无需预先定义
    • 返回的变量类型、数量不受限制
    • 调用函数时需要保证有变量接收
    • 执行 return 后立马结束函数

    1.2.5 函数底层

    Python中一切皆对象:
    • 函数定义时,系统创建了对应的对象
    • 小括号代表调用
    • 变量名存在堆里,也叫做函数标识符,函数的ID、值和类型也即函数对象在堆里
    • 函数可以作为参数传递,高阶函数的用法
    • 函数被调用时,会生成栈帧,stack frame,这里面存放局部变量。

    1.2.6 参数的传递

    传递可变对象:
    • Python中一切皆对象,因此参数的传递都是对象地址的传递
    • 可变实参跟形参对应一个对象时,对形参更改后,不创建对象拷贝,直接修改这个对象,因而原本的可变实参也发生对应的变化
    传递不可变对象:
    • 字符串、数字、元组都是不可变对象
    • 传参数时同样是传入对象的地址
    • 但因实参不可变,因此在对形参更改时,创建实参的拷贝并执行更改操作
    引用的本质,栈内存和堆内存以及内存示意图
    • 栈里放变量,对象存放在堆里。
    • 对象为上面三类,变量存放的为对象地址。

    1.3 内置函数

    1.3.1 eval 函数

    用法如下:
    notion image
    很有意思的函数,可以用于动态更新代码
    notion image
    递归函数
    就是自己调用自己罢了,套娃,但是记得加上终止条件,一般都是迭代条件。
    notion image

    1.3.2 不可变对象包含可变对象

    参数的传递:
    • 传递不可变对象时为浅拷贝
    • 因此当不可变对象中包含可变对象时,对可变对象部分的修改会影响源数据
    ### 1.3.3 参数的类型
    • 位置参数:根据位置、个数跟参数匹配
    • 默认值参数:如果传入参数不足时默认参数使用默认值,默认参数必须放在最后
    • 命名参数:在调用函数传参的时候,加上参数的名称,直接赋值
    • 可变参数:定义函数时,传入参数可以为可变对象
    notion image
    • 强制命名参数:带星号的’可变参数’后面增加新的参数,必须是 ‘强制命名参数’
    notion image

    1.3.4 lambda 表达式和匿名函数

    lambda para1, para2, para3, …:
    notion image

    1.3.5 嵌套函数

    • 设置内置嵌套函数可以降低内部重复代码
    • 很有意思
    notion image

    第一章完结,第二章为字符串相关。

    2. 字符串操作

    2.1 字符串

    • 字符串不可修改
    • 只能复制部分或者增加形成新的字符串
    • Python不支持单字符类型,单字符也是作为一个字符串使用的
    • Python3直接使用Unicode编码,默认为16位Unicode编码
    • 使用内置函数ord()可以把字符转换成对应的Unicode码
    • 使用内置函数chr()可以把十进制数字转换成对应的字符
    字符串驻留
    • 当标识符仅包含下划线、字母和数字时,会启用字符串驻留机制
    • 可以节省内存空间

    2.2 可变字符串

    如确实需要原地修改字符串,使用io.StringIO对象或者array模块
    • import io
    • str_new = io.StringIO(str)
    • str_new.seek(7) # 移动指针到第几个字符的位置
    • str_new.write(stringNum) # 写入新的字符串
    • .replace(str1, str2) 本质上创建了一个新的字符串,原有的字符串是不可变的
    • 对原有的字符串进行更改需要重新进行赋值
    • 在对字符串进行拼接时,尽量使用list对象存储,再用.join(),效率相比+好很多
    • +号拼接时会生成新的对象

    2.3 字符串截取

    # 获取字符串中某段字符
    string_show = "abcedfghijklmn"
    
    # 截取字符串中第二个与第三个,语法
    [start:end:step]string_show[1:3:1] 
    
    # 编号从0开始# 字符串倒置
    string_show[::-1]
    
    # 查找并替换字符,输出
    “abcdffghijklmn”string_show.replace("e","f")

    2.4 字符串分割

    • str() 可以将其他数据类型转换成字符型
    • 使用 [] 提取字符
    # .split(string,'code')
    string_show = '1,2,3,4,5,6'
    
    a = string_show.split(',')
    print(a)
    
    output: [1,2,3,4,5,6]

    2.5 字符串方法

    • 查找方法
    • len()
    • .startswith(str) 查看是否以某字符串开头
    • .endswith(str) 查看是否以某字符串结尾
    • .find(str) 查找字符串第一次出现的index
    • .rfind(str) 查找字符串最后一次出现的index
    • .count(str) 查找字符串出现的次数
    • .isalnum() 所有字符全是字母或数字
    • .strip() 去除首尾字符信息,不填的话去掉空格符
    • .lower() 将字符串中的字母改为小写
    • .upper() 将字符串中的字母改为大写
    • .capitalize() 产生新的字符串,首字母大写
    • .title() 产生新的字符串,每个单词首字母大写
    • .swapcase() 产生新的字符串,大小写转换
    • .center(num, str) 以多少个字符显示,填充指定字符,并居中
    • .ljust() 同上,左对齐
    • .rjust() 同上,右对齐,默认以空格填充

    第二章完结,第三章为Python List相关。