Python学习打卡日记,日期加上学习的主题命名好了~
已经学习完成,接下来只需要将内容整理成方便复习的样子。
1. 基础语法1.1 变量创建与赋值1.1.1 变量的类型1.1.2 变量标识符的命名1.1.3 变量的声明和赋值1.1.4 变量的转换与打印1.1.5 变量的逻辑运算符1.1.6 变量的作用域与拷贝1.2 函数创建1.2.1 基础函数1.2.2 函数用法与底层分析1.2.3 形参、实参1.2.4 返回值详解1.2.5 函数底层1.2.6 参数的传递1.3 内置函数1.3.1 eval 函数1.3.2 不可变对象包含可变对象1.3.4 lambda 表达式和匿名函数1.3.5 嵌套函数2. 字符串操作2.1 字符串2.2 可变字符串2.3 字符串截取2.4 字符串分割2.5 字符串方法
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不支持自增和自减
- and:与
- or:或
- not:非
- 优先级:常规数学运算,如果优先级错误,直接加小括号
- *
- / % //
- < > = ≥ ≤ == ≠
- and or not
- =
1.1.6 变量的作用域与拷贝
全局变量:
- 在函数和类定义之外声明的变量
局部变量:
- 函数里定义的变量
- 函数执行完即消失
- 局部变量与全局变量同名时,优先使用局部变量,使用全局变量前声明 global variable
- 局部变量的引用比全局变量快,优先考虑使用
浅拷贝和深拷贝
浅拷贝:
- 不拷贝子对象的内容,只是拷贝子对象的引用
- 拷贝了栈里的变量标识符,并且拷贝了该变量指向的堆里的对象的地址,因此作出的部分更改会
- copy.copy()
- 只拷贝引用
深拷贝:
- 会连子对象的内容也全部拷贝一份,对子对象的修改不会影响源对象
- 拷贝了栈里的变量标识符,拷贝了该变量指向的堆里的对象,并且拷贝了堆里对象所指向的所有子对象
- copy.deepcopy()
- 全部拷贝到新的内存变量
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
- 这里的上下限都是包含在生成范围内的
画图函数
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 函数
用法如下:
很有意思的函数,可以用于动态更新代码
递归函数
就是自己调用自己罢了,套娃,但是记得加上终止条件,一般都是迭代条件。
1.3.2 不可变对象包含可变对象
参数的传递:
- 传递不可变对象时为浅拷贝
- 因此当不可变对象中包含可变对象时,对可变对象部分的修改会影响源数据
### 1.3.3 参数的类型
- 位置参数:根据位置、个数跟参数匹配
- 默认值参数:如果传入参数不足时默认参数使用默认值,默认参数必须放在最后
- 命名参数:在调用函数传参的时候,加上参数的名称,直接赋值
- 可变参数:定义函数时,传入参数可以为可变对象
- 强制命名参数:带星号的’可变参数’后面增加新的参数,必须是 ‘强制命名参数’
1.3.4 lambda 表达式和匿名函数
lambda para1, para2, para3, …:
1.3.5 嵌套函数
- 设置内置嵌套函数可以降低内部重复代码
- 很有意思
第一章完结,第二章为字符串相关。
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相关。