8.8(文件的高级应用,修改文件的两种方式,函数的定义,定义函数的三种形式,函数的返回值,函数的调用,函数的参数)

复习

字符编码:

二进制和字符之间的转换过程 --> 字符编码

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字符编码的区别:

  1. 打开python解释器
  2. python解释器相当于文本编辑器,读取二进制转化为普通字符 a = 1
  3. 对转化后的普通字符进行解释(定义变量就要新开辟内存空间存放变量)
    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)
特点:按照位置为对应的形参依次传值

关键字实参:

调用函数时,按照键值对的方式指定参数传值,

可以打破位置限制,能为指定的形参赋值

注意事项:

  1. 可以混用位置实参和关键字实参,但是位置实参必须在关键字实参的左边。
  2. 可以混用位置实参和关键字实参,但不能对一个形参重复赋值。

默认形参:

定义的时候就被赋值,调用时可以不用为其赋值

注意事项:

  1. 位置形参必须放在默认形参的左边。
  2. 默认形参的值只在定义阶段赋值一次,也就是说默认参数的值在函数定义阶段就已经固定了

猜你喜欢

转载自www.cnblogs.com/jiann/p/11323765.html