复习
字符编码:
二进制和字符之间的转换过程 --> 字符编码
ascii,gbk,shit,fuck 每个国家都有自己的编码方式
美国电脑内存中的编码方式为ascii ; 中国电脑内存中的编码方式为gbk , 美国电脑无法识别中国电脑写的程序 , 中国电脑无法识别美国电脑写的程序
现在硬盘中躺着 ascii/gbk/shit/fuck 编码的文件, 他们的编码格式已经无法修改了, 所以内存中出现unicode编码, 内存中的unicode编码方式可以识别 ascii/gbk/shit/fuck 编码的文件
用unicode编码方式运行了 ascii/gbk/shit/fuck 编码的文件, 最后还是要装入硬盘, 装入硬盘早期用unicode存进去,但是 他在识别ascii的时候, 会把8位数字转换成16位数字存入硬盘, 浪费空间, 所以出现了utf8(与unicode对应,并且压缩unicode编码的字符)
utf8 能识别其他国家的编码,只识别unicode, utf8目前还不能放在内存,. 但是现在写的代码都是utf8, 历史遗留ascii/gbk/shit/fuck 编码的文件迟早消失/淘汰,要么被转换成utf8格式.所以迟早有一天内存中也是utf8.
python2和3字符编码的区别:
- 打开python解释器
- python解释器相当于文本编辑器,读取二进制转化为普通字符 a = 1
- 对转化后的普通字符进行解释(定义变量就要新开辟内存空间存放变量)
python2
用文件指定的编码方式存储定义后的变量
如果文件指定编码为'gbk' ,那就会以gbk的形式存储变量, 本来打印的是0和1,但是终端会自动对你的0和1安装终端默认的编码转换成字符 ,如果终端的默认编码是utf8 ,乱码; 如果终端默认编码是gbk,不乱吗
如果定义变量前加上u,coding:xxx不会对他造成任何影响, 因为会用unicode编码存储变量, 终端是任何类型的编码都可以识别
python3
用unicode编码方式存储定义后的变量
以后写文件以什么格式存储,就以什么格式读取
文件的三种打开方式
r:只读
f.read()
w.清空后写入(文件不存在自动创建)
f.write()
a.追加(文件不存在是自动创建)
f.write()
文本模式:t 二进制模式:b
t/b无法单独使用,只能和r/w/a一起使用
with管理文件上下
with open() as f: #可自动关闭
pyinstallerde的使用
pip instlal pyinstaller
切换路径到文件夹(文件夹包含img.ico和test.py这两个文件)
pyinstaller -i img.ico -F test.py
文件的高级应用
r+t:可读可写
with open('test.py','r+',encoding='utf8') as fr:
# data = fr.read()
# print(fr.writable())
# fr.write('x = 10')
# print(data)
# r+既可读又可写
w+t:可写可读
w会清空文件,w+尽量不要使用 可写可读
# with open('test.py','w+',encoding='utf8') as fw:
# print(fw.readable())
# fw.write('x = 10')
# data = fw.read()
# print(data)
a+t:可追加可读
with open('test.py','a+',encoding='utf8') as fa:
# fa.seek(1,0)
# data = fa.read()
# print(data)
#
# fa.write('x = 10')
# fa.flush()刷新缓冲区的,即将缓冲区中的数据立刻写入文件,同时清空缓冲区
# 指针的应用
指针使用
seek(按字节位移)
# with open('test.py','r+',encoding='utf8') as fr:
# fr.seek(1) #1表示位移一位,默认从文件头开始
# fr.seek(1,0) #0表示从头开始
# fr.seek(4,1) #1表示从当前位置开始
# fr.seek(0,2) #2表示从文件末尾开始
# print(fr.read())
# tell(字节)当前指针位置
# with open('test.py','r+',encoding='utf8') as fr:
# fr.seek(2,0)
# print(fr.tell())
# read(n)字符读多少个字符
# with open('test.py','r+',encoding='utf8') as fr:
# print(fr.read(9))
# truncate()截断,字节
# with open('test.py','r+',encoding='utf8') as fr:
# fr.truncate(5) 清空后面的
文件修改的两种方式
将硬盘存放的该文件的内容全部加载到内存,在内存中是可以修改的,修改完毕后,再由内存覆盖到硬盘
with open('test.py', 'r+', encoding='utf8') as fr:
# data = fr.read()
# fr.truncate(0)
# data = '中中中下下下中中水电费中'
# print(data)
# import os
# #
# # # 文件没有修改这一说,只有覆盖这一说
# # with open('test.py', 'r', encoding='utf8') as fr,
# # open('test_swap.py', 'w', encoding='utf8') as fw:
# # data = fr.read()
# # data = data.replace('sb', 'dsb')
# #
# # fw.write(data)
# #
# # import time
# # time.sleep(5)
# # os.remove('test.py') # 删除文件
# # os.rename('test_swap.py', 'test.py') # 重命名文件
将硬盘存放的该文件的内容一行一行地读入内存,修改完毕就写入新文件,最后用新文件覆盖源文件(边读变写)
import os
# 文件没有修改这一说,只有覆盖这一说
with open('test.py', 'r', encoding='utf8') as fr,
open('test_swap.py', 'w', encoding='utf8') as fw:
for i in fr:
i = i.replace('sb', 'dsb')
fw.write(i)
os.remove('test.py') # 删除文件
os.rename('test_swap.py', 'test.py') # 重命名文件
函数的定义
# 定义函数的方式
'''
def 函数名(): # 定义阶段
"""函数注释写在这里"""
<代码块>
# 使用 # 调用阶段(开车阶段)
函数名()
'''
# 定义阶段不执行函数体代码,只检测语法错误
def func():
"""func函数的注释撒地方撒地方撒地方"""
# todo:未来写一个开车函数
pass
print(login.__doc__) # 记住 可以输出注释
# 字符串:split 列表:append 字典:get 集合:add
# read(), wirte()
函数三种定义方式
参数:未知量,变数
无参函数:单独使用
def add():
"""无参函数"""
x = input('num1:')
y = input('num2:')
print(int(x) + int(y))
有参函数:
def add(x, y): # 我这个工具不能单独使用,必须得加个配件,才能使用
"""有参函数"""
print(int(x) + int(y))
print(1)
x = input('num1:')
y = input('num2:')
add(x, y)
空函数:只定义了一个函数
def func():
pass
函数的调用
def add(x, y):
return x+y
add()
res = add()
print(res)
函数的返回值
return 返回函数值,跳出函数
可以返回任意数据类型 无个数限制
0 返回None
1 返回该值本身
多个 返回值是元组
函数的参数
形参:在函数定义阶段括号内定义的参数,称之为形式参数,简称形参,本质就是变量名
实参:在函数调用阶段括号内传入的参数,称之为实际参数,简称实参,本质就是变量的值
位置形参:
在函数定义阶段,按照从左到右的顺序依次定义的形参,称之为位置形参。
def func(x, y):
print(x)
print(y)
特点:按照位置定义的形参,都必须被传值,多一个不行,少一个也不行
位置实参:
在函数调用阶段,按照从左到右的顺序依次定义的实参,称之为位置实参。
func(1, 2)
特点:按照位置为对应的形参依次传值
关键字实参:
调用函数时,按照键值对的方式指定参数传值,
可以打破位置限制,能为指定的形参赋值
注意事项:
- 可以混用位置实参和关键字实参,但是位置实参必须在关键字实参的左边。
- 可以混用位置实参和关键字实参,但不能对一个形参重复赋值。
默认形参:
定义的时候就被赋值,调用时可以不用为其赋值
注意事项:
- 位置形参必须放在默认形参的左边。
- 默认形参的值只在定义阶段赋值一次,也就是说默认参数的值在函数定义阶段就已经固定了