对应原视频 第12集 函数 & 第13集 文件操作:
本篇概要:
(这两集的学习也没遇到太多什么,知识点学习看视频就好,下面的内容基本是概要,可以用来通过看概要回想检验自己记得什么。)
P12
--定义函数时,规范的格式是上下要留两行空行
--四道课堂小练习题
P13
--个人需求,尝试应用文件操作失败
P12 函数
--函数的概念:
如果在开发程序时,需要某块代码多次,但是为了提高编写的效率以及代码的重用,所以把具有独立功能的代码块组织为一个小模块,这就是函数。
在编程语言里,它有可能叫函数,也有可能叫方法。弹幕说一般封装在类里叫方法。虽然我不懂啥叫类,记一下吧。
--定义函数:
def 函数名( ):
代码
def:define定义
# 函数的调用
# 带参数的函数
我们后边需要进行定义的基本上都是要带参数的。后边实际应用的时候可以多去尝试。
--定义函数时,规范的格式是上下要留两行空行
# 带返回值的函数
我定义函数的时候出现了警告:
问题反馈:
说是希望在定义函数的语句前可以留两行空行,定义完之后也留两行空行,再写调用的或其它语句,这样就不会出现下划波浪线警告。不空行也可以执行,就是一直有警告而已,格式不规范。
像这样空了2行就不会:
带返回值的函数,直接执行可以不可以呢?试一下看看。
结果:直接写,执行后什么也没有。也就是说定义是没有问题的,通过return来返回运算结果。这是没有问题的。
但是它返回之后呢形成了数值,add2num(11, 22),这个地方就相当于你写了一个结果在这里,并没有进行打印输出,也没有进行赋值运算。
所以我们可以直接把它打印出来:# 带返回值的函数
def add2num(a, b):
return a + b # 通过return返回运算结果
print(add2num(11, 22))
结果:33
这是可行的。
还可以直接在外边定义一个变量。这个我们常用,其实就是一个函数,将它的返回结果赋值给一个变量,然后把变量给打印出来:def add2num(a, b):
return a + b
result = add2num(11, 22)
print(result)
结果:33
这个我们很常用,大家知道它的写法就可以了。一个def,然后别忘了有一个冒号,同样的有这个缩进,这缩进的代码相当于一个代码块。
# 返回多个值的函数
divide:divide除法。整除用两个斜杠表示:\\,除数取整。
直接return,返回几个都可以,多个的用英文逗号分隔。
--四道课堂小练习题
1、
def printline():
print("-" * 30)
printline()# 调用直接打印一条横线
结果:------------------------------
2、
def printline():
print("-" * 30)
def selfline(a):
for i in range(a):
# print("-" * 30)
printline() # 调用第1小题定义的打印横线函数。
selfline(3)
结果:
------------------------------
------------------------------
------------------------------
老师这里用的是while循环。
老师说打印多少行之前用一个input语句获取,由用户决定。这就考虑到现实场景,考虑到了用户输入的过程。这里我是一点都不考虑。
3、
方法1:不带返回值
def add3num(a, b, c):
d = a + b + c
print(d) # 带3个参数,不返回值,直接打印。
add3num(1, 3, 5)
结果:9
方法2:带返回值
def add3num(a, b, c):
d = a + b + c
return d # 带返回值的函数
h = add3num(1, 3, 5)
print(h)
结果:9
直接返回既可以是一个结果,也可以是一个表达式。
这里发现老师写的是直接return,后面表达式:def add3num(a, b, c):
return a + b + c
更简洁了,真合我意。
4、不会。看了老师写的之后,我发现我思路是对的,但把除号写错了。是 /,是 /,是 /。不是\啊。def add3num(a, b, c):
return a + b + c
def average3num(a, b, c):
sumresult = add3num(a, b, c)
ave3result = sumresult/3.0
return ave3result
result = average3num(10, 20, 30)
print(result)
结果:20.0
result = average3num(11, 20, 30)
结果:20.333333333333332
/ 3.0,后面加个小数点,表示平均值是浮点数,除不尽可以有小数点后的数。
老师的变量命名好好,和其本身的含义很相关,看名字就可以想到大概的作用。1:28
20201107
11:46
# 局部变量
在一个函数里进行定义的变量,就叫局部变量。
所以说局部变量的作用,它就是在函数内部定义的变量。不同的函数可以定义相同的名字。
# 全局变量
全局变量之所以叫全局,是因为它在整个文档里是可以被到处访问的。
a = 100 # 全局变量def test1():
print(a)
def test2():
print(a)
test1()
test2()
结果:
100
100在每一个局部变量都没有被定义在每一个函数里的时候,只有一个全局的时候,它默认访问的这个a,其实就是全局的这个a。因为它自己没有定义a,它自己如果再想访问a,那就是全局的a。所以这就是一个全局变量的作用。
可是这个有什么应用场景呀,我知识经验有限无法想到,但希望老师可以讲一下。不是为了学而学,是为了用而学。我现在一直不明白我为什么要学这个,自己的函数里什么都没有定义,这个函数是写出来玩的吗?这里是想用这个例子说明全局变量在函数里的影响。我还是想不到知道来干嘛,为了说明而说明吗?
如果说以后遇到了你就会知道有什么用了,那为什么现在不说明一下既然我现在不能知道而你知道,只有你知道学这个的意义,我呢,在什么都看不到的视野上无意义地记下来,等着所谓的以后你就知道它的作用了。接受的应试教育就是这样,只是一年一年地在那里背在那里记,根本不知道这样做的意义作用。为什么就是一句话两句话一个例子两个例子的事,学的时候就是不说呢。你现在不用知道,你以后就会知道了,啊呸。你当然感觉好啦,你自己知道这是什么,跟别人说清楚太费事,又不是职责。我不知道我在做的是什么,像个傻子那样说怎样做就怎样做,不清楚自己在干什么。那些清楚的(有教学的工作义务者),就是不跟你说。想想那些应试浪费掉的人生,真浪费。(20201219当时突然想到应试教育而写的,很不喜欢“你以后就会知道了”之类的废话,不是对视频内容,我是有多喜欢这个教学视频才做这么详细的笔记你是不知道的,故在次注明一下)
12:49
13:33
如果我全局和局部的这个变量的名字是一样的,会怎么样?局部变量优先使用。
# 在函数中修改全局变量
声明一下:a前加个前缀global。global a。
P13 文件操作
我们经常要用到的就是:打开、关闭、读取、形容。
打开:open
在python中的打开非常简单,就一句话,open,指定一个文件名就可以了,甚至后面这个打开模式‘w’都不用写。f = open("test.txt", "w")在python里边,使用open打开的时候,如果它找了一个不存在的文件,那么它会帮你新建一个。
当然这并不是任何实践都是这样的,因为我这里使用的是w,就是写入的这么个模式。也就是当它发现不存在的时候,它就帮你新建一个,这个w就是准备写的这么一个状态。
w:write写入
关闭:
因为我用一个f变量接收了我打开这个文件的,可以理解为对象,f接收了这个对象。
那我直接用它f . close( ),这样就关闭掉了。f . close() # 关闭文件
读取模式:
这里涉及到文件读和写的操作。那么这里的读和写,主要跟这个模式有关。
r:read
w: write
它默认就是r只读模式了。f = open("test.txt") # 默认模式:r,read只读当这个文件存在的时候,默认打开是没有问题的。但是当你这个文件不存在的时候,你没有任何一个模式的限定,它默认就是一个读取的模式,它就会报错。报的错是一个文件没有找到的错误,说没有这样的一个文件在当前的这样一个路径下,文件不存在。
这样大家就知道了,到底这个代码能不能正常运行,它是由旁边的这个模式的选择来决定的。
最常用的就是r、w,还有以字节的方式进行读和写rb、wb。其它的了解一下就可以。
写入内容:
我们给它写一些内容进去。f = open("test.txt", "w") # 打开文件,w模式(写模式):文件不存在就新建
f . write("hello world, i am here!")
f . close() # 关闭文件
这里我们是没有任何文件的,已经删了。现在用w这个模式,写一句话进去,然后关闭掉。
读取的方式:read
那写完之后能不能读出来呢?可以的。
因为这样一个文件已经存在了,我们直接用r的模式来试一下。f = open("test.txt", "r")
content = f . read(5)
print(content)
f . close()
读完了之后,为什么上来就要加close?就是因为每次读完了之后,还要关闭。这样的话,才能让别的文件或者别的程序继续访问它。所以在这里每一次用都要养成一个好习惯,打开之后关闭。
content = f . read(5),这里的5表示读5个字符出来。
可以发现,这个read,只是在刚打开的时候定位在开头,你执行以后它就往后移5个了。想读多少个就写多少。
# read方法:读取指定的字符,开始时定位在文件头部,每执行一次向后移动指定字符数。
有人说这也太费劲了。我是读一个文件就得写多少个字符,还要查一下吗?
当然不用,你可以一次性读一行,可以不用一个字母一个字母读。
但一个个字符地读,也非常有用。是因为我们在这个网络上的时候,或者文件传输的时候,很有可能你读的是二进制的,或者读的本来就是字符式,那么你就可以直接按照字符的数量来读。因为经常你下载文件的时候,会告诉你这个文件有多大,你就可以按这个文件的个数来读,就行了。这样正好能判断文件是否完全地完成了。如果你自己写个下载器,这个就是非常非常必要的。
读取的方式:按行
readline():读一行
readlines():读多行当我们使用readlines() 的时候,它其实执行的一个过程就是把整个文档都帮你读进来,一个文档全部读完。这比起一个一个字符读要快得多。全部放到内存里,形成一个列表。所以大家知道为什么我们前边要练那么多的列表,那么细致地去讲列表了吧。因为你在文件读的时候取操作的全是列表。
它连换行都能检测出来的。其实上面列表形式的时候就可以看到有换行的标识符的。
以上是关于文件常用的三种读取方式:read,readlines,readline。
你可以去了解一下还有哪一些文件中的操作。在后边我们的这个练习里,这些并不会经常用到。但是如果你自己想写一些桌面的应用程序什么的,还是经常会用到。
强调一下就是,遇到删除啊什么的这样的一些操作的时候,千万要慎重,看清楚路径啊,这个千万不要把电脑的整个系统都给删光了。!!!18:00
--个人需求,尝试应用文件操作失败
20201108
21:35
今天想用网易见外工作台把一个视频或音频转写成文字的,但是不能用了,也不知道还会不会恢复。后面找了另外的网站,转写出来txt文件,但是里面的内容一行超级长,没怎么换行。所以我就想着用python的读写代码来整理文档,每次读指定的字符数,然后写入另外一个空文档。
我将这个转写的文档拷贝到当前程序的目录下了。但是运行的时候并不成功。后面还在考虑要用什么作为循环条件来写个for循环的时候,省了,试只有一次的时候,就出现了下面的问题。
去搜是什么意思,大概是字符编码器什么的问题,好像是说编码方式要匹配什么的,具体我也不懂,是什么问题我的概念很模糊,更不知道怎么解决。
代码是:
f = open(“有内容的文档.txt”, “r”)
w = open(“空文档.txt”, “w”)
# for i
content = f . read(46)
w . write(content)
f . close()
w . close()
结果:
第一次想把学的用到实处,宣告失败。未能认识问题并解决。