python学习之路(六)

今天来介绍一下文件的操作,包括文件的增删改查,以及字符编码与转码,还有一些简单的函数操作。

要对文件进行操作,首先要打开一个文件,而打开文件需要声明要对这个文件干什么,比如读(‘r‘),写(‘w‘),追加(‘a‘),读写(‘r+‘),写读(‘w+‘),还需要告诉系统,用什么字符集来打开,如utf-8或者Unicode等
首先介绍一下文件的读取。  f.read 这个是读取整个文件的内容。

首先有个叫‘yesterday‘的文本文件(就当他有,我这里没写这个文件)
f=open(‘yesterday‘,‘r‘,encoding=‘utf-8‘)data1=f.readdata2=f.readprint(data1,“1”)print(data2,“2”)f.close

你会发现,输出的结果是data1输出的是文件的内容,data2输出的是空,而不是输出了两次整个文件,也不是读了两行。因为在这里,要介绍一个句柄的东西,大家可以理解成光标,f.read在读完文件的时候,句柄就停留在文件最后的位置,

在执行data2的时候,句柄在最后的位置,再往后面是没有内容的,所以输出的是一个空。而不是读第二遍文件。

这里还要注意一点的是,文件无论进行什么 操作,只要打开了文件,后面一定要关闭,f.close。

有时候我们可能不需要直接读取整个文件,这里介绍一下按行读取  f.readline

这里介绍几种方法
f=open(‘yesterday‘,‘r‘,encoding=‘utf-8‘)我们可以从第一行读几行for i in range (5):  print(f.readline())也可以读完整个文件
for line in f.readlines():    print(line.strip())

这里还有一种操作是按行输出,并写出这是第几行 用的是enumeratefor index,line in enumerate(f.readlines()):  print(index,line)

不过,readline命令是全读到内存里,运行速度不如在内存中读一行,删一行的速度快for line in f :  print(line)

文件的读取介绍的差不多了,下面介绍文件的写入,‘w’模式是写入模式,他是创建(如果文件存在就覆盖)一个文件。

f=open(‘yesterday‘,‘w‘,encoding=‘utf-8‘)f.write("abc")f.weite("456")f.close

代码执行之后会看到yesterday文件中有一行数据  abc456 ,他没有向我们程序中那样,写成两行,也是因为上文中提到的句柄,因为在写完abc之后,句柄就停留在了abc的后面,没有自动换行,所以在写入456的时候,他会紧接着abc写。

这里还有一点,就是在文件的写入过程中,不是write代码执行完成后,就立即写入硬盘文件中,而是在关闭这个文件的时候,数据才会一起写入磁盘中,之前都是保存在内存中的,所以这里也必须记得关闭文件。

如果想执行完write 就立即写入的话,可以再write语句后面使用 f.flush()  这个是直接写入到文件中,不需要关闭文件,括号中如果填数字,代表写这么多字符后自动写入文件。

还有几种文件的打开模式

A.  “a” 在这个模式下,写入的数据都会追加在原文件的末尾,而不会覆盖原文件。

B.  “r+”这个是读写模式,所谓读写模式是先读再写的模式。当你读取了三行后再写入,新写入的文件会出现在第三行的末尾而不是第四行。因为读取结束时,文件的句柄停留在了第三行的结尾,而且这个句柄不会自动移动到第四行,所以新写的数据会出现在第三行结束。读写模式,可读可写可追加,平时用处比较多。

C.  “w+”这个是写读模式,在这个模式下,系统会自动去寻找有没有这个文件,如果没有的话直接新建一个文件,如果有的话,覆盖这个文件。在读写模式下,先读取文件是没有用的,因为文件被覆盖,读不到任何数据。在写入的时候,虽然可以移动句柄,但是无法在移动后的句柄处写入,还是会写入在文件的末尾处。

D. "a+"是追加读写

E.  "rb"让文件以二进制方式读取出来。

F.  “wb”以二进制方式写入。这时候就不能输入英文,汉字等了,写入的时候会报错,因为输入的不是二进制。

这里在介绍一下文件的修改。文件的修改有两种方式。

1.把文件全读取到内存中,修改完成后再全部写入。这种方法不推荐用,因为当文件过大时,内存可能无法处理这个文件,而且就算是一般的文件,处理速度也会比较慢,因为占用内存比较大。

2.打开原文件的同时打开另一个文件,将修改完成的文件写入另一个新的文件,这样可以一部分一部分的去执行,提高运行速度,节省内存,是主流的修改文件的方法。

修改的语句可以用replace

for line in f :
    if "abc" in line :
        line = line.repiace("abc","def")
这就实现了一个,将文件中的abc替换成def的功能。

打开文件还有另一种操作,就是用with,用with的好处就是不用去关闭文件,他会自动帮你处理好

with open ("yesterday","r",encoding="utf-8") as f :
    print (f.readline())

打开多个文件的方法是
with open ("yesterday1","r",encoding="utf-8") as f ,    with open ("yesterday2","r",encoding="utf-8") as ff :
下一个文件要记缩进。

下面介绍字符编码和转码 
python3中默认的编码是Unicode。在py3中encode,在转码的同时还会把string 变成bytes类型,decode在解码的同时还会把bytes变回string。

不管是encode还是decode。只要记住在不同的字符集转换的时候,都要经过Unicode再转到别的字符集!!!

utf-8是Unicode的扩展集,所以Unicode可以在utf-8下直接打印出来。

最后介绍一部分函数。

所以,先定义一个函数

def test (x) :
   x+=1
   return 0

这样,我们就定义了一个名为test的函数,他的形参是x,他的函数体是x+=1, 返回值是一个0。如果未在函数中指定return,那这个函数的返回值为None
函数和过程最大的区别是函数必须有返回值,而过程是没有返回值的。

return 后面可以跟任何东西,他代表函数执行完成的一个标志,返回这个值就相当于说函数已经执行完成,而在函数中,return后面的语句也不会被执行,因为return是这个函数的结尾。

假设一个 a= test(1) 打印他会得到0.这就是上个函数执行完成的标志 。也可以return x 。这个会打印出一个2.因为函数中有x+=1.执行完成后x就变成了2.

形参和实参:

形参:变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形参变量

实参:可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使参数获得确定值

就像刚才上边的例子 x 就是一个形参。而a=test(1)中的1就是实参。

一个函数可以有多个形参和实参,比如下面代码

def test(x,y):
    print (x)
    print (y)
    return 0

test(1,2)
test(x=1,y=2)
test(1,y=2)
以上三种调用函数的传参方法都对,前两种不必多说,第三种方法,在函数中,他会主动识别位置参数,然后在去看赋值。但是不能将赋值卸载位置参数前面,会报错

函数还能赋默认参数

def test(x,y=1)
    print(x)
    print(y)
    return 0

test(1)
test(1,3)
test(1,y=3)
test(x=1)
test(x=1,y=3)
以上方法都正确,默认参数是可以赋也可以不赋值的。这种多用于有默认选项的情况,如默认国籍,或者默认数据库服务器端口等

函数也可以通过元祖,字典等方式传值

def test (*args)
     print(args)
     return 0

test(1,2,3,4)
test(*[1,2,3,4])
这两种也都可以的

这种传值方法多用于与传单一参数一起传递值得情况,比如一开始我定义了一个函数,只有一个形参x ,但是后来发现形参不够,还想加,就可以用下面的方法,省的日后再去改代码
def test (x,*args)
    print (x)
     print (args)
     return 0

这时候可以用test(1,2,3,4)传值
输出的结果为
1
(2,3,4)

通过字典传值

def stu_register(name,age,*args,**kwargs): # *kwargs 会把多传入的参数变成一个dict形式
    print(name,age,args,kwargs)   return 0
stu_register("Alex",22)
#输出
#Alex 22 () {}#后面这个{}就是kwargs,只是因为没传值,所以为空 

stu_register("Jack",32,"CN","Python",sex="Male",province="ShanDong")
#输出
# Jack 32 (‘CN‘, ‘Python‘) {‘province‘: ‘ShanDong‘, ‘sex‘: ‘Male‘} 

既然降到了函数,那么必然少不了局部变量和全局变量

在子程序中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量。

全局变量作用域是整个程序,局部变量作用域是定义该变量的子程序。

当全局变量与局部变量同名时:

在定义局部变量的子程序内,局部变量起作用;在其它地方全局变量起作用

x=1
def aaa(x,y)
    print(x)
    x=3
    print(x)
    c=x+y
    return 0
aaa(x,1)
print(x)

这个函数执行完之后是

1

3

1

在程序最顶端的是全局变量

而在函数里面的x是局部变量

虽然在函数里面可以通过语句global改变全局变量,但是不建议使用。

而且,只有str ,int 不能再函数中改变局部变量。

但是,列表,元祖,字典,集合,类,都可以在局部变量中改变全局变量。

递归函数

在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。

def calc(n):
    print(n)
    if int(n/2) ==0:
        return n
    return calc(int(n/2)) 

calc(10) 

输出:
10
5
2
1 

递归特性:

1. 必须有一个明确的结束条件

2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少

3. 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)

高阶函数

变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。

注:abs是取绝对值

def add(x,y,f):
    return f(x) + f(y) 

res = add(3,-6,abs)
print(res) 
时间: 2024-10-05 14:36:29

python学习之路(六)的相关文章

Python学习之路【第一篇】-Python简介和基础入门

1.Python简介 1.1 Python是什么 相信混迹IT界的很多朋友都知道,Python是近年来最火的一个热点,没有之一.从性质上来讲它和我们熟知的C.java.php等没有什么本质的区别,也是一种开发语言,而且已经进阶到主流的二十多种开发语言的top 5(数据源自最新的TIOBE排行榜). 来头不小啊!二十多种主流的开发语言,我该从哪一个开始呢?人生苦短,let‘s python! 1.2 Python的由来和发展趋势 Python的前世源自鼻祖“龟叔”.1989年,吉多·范罗苏姆(Gu

Python学习系列(六)(模块)

一,模块的基本介绍 1,import引入其他标准模块 标准库:Python标准安装包里的模块. 引入模块的几种方式: i)引入模块:import   moduleName ii)引入模块下的函数:from moduleName import function1,function2,-- iii)引入模块下的所有函数:from moduleName import * 使用模块里的函数的方法: moduleName.function(agrs) 示例: >>> import math >

Python学习之路-Day1-Python基础

Python学习之路第一天 学习内容: 1.Python简介 2.安装 3.第一个Python程序 4.变量 5.字符编码 6.用户输入 7.表达式if..else语句 8.表达式for语句 9.break和continue 10.while循环 11.字符串格式化 1.python简介 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承. 最新的TIOB

Python学习之路

Python学习之路 目录 Python学习之路[第一篇]:流程控制,用户交互,语法要求,变量,字符,注释,模块导入的使用 Python学习之路[第二篇]:文件,字符串,列表,元组,字典,集合的使用 更新中...

Python学习之路-装饰器&生成器&正则表达式

装饰器 通俗的讲,装饰器就是在不改变源代码基础上,给源代码增加新功能. 不改变函数的源代码.调用方式.返回值等,给函数增加新功能. 经典案例:登录装饰器, def login_decorator(func):     def inner():         if USER_TEMP["status"] == False:             print("\033[31;1m用户未登录,请先登录\033[0m")             login_atm()

Python学习之路——强力推荐的Python学习资料

资料一:程序媛想事儿(Alexia)总结 Python是一种面向对象.直译式计算机程序设计语言.它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用縮进来定义语句块.与Scheme.Ruby.Perl.Tcl等动态语言一样,Python具备垃圾回收功能,能够自动管理内存使用.它经常被当作脚本语言用于处理系统管理任务和网络程序编写,然而它也非常适合完成各种高级任务. Python上手虽然容易,但与其它任何语言一样要学好Python并非一日之功.我的Pyth

Python学习之路 001

Python学习之路 从今天起开始写Python学习的经历了,哈哈. 了解Python是在我想入坑Linux运维这条路开始的. 我是计算机出身有着一定编程的功底,刚开始接触Python的时候觉得Python我学习过的c,c++特性完全不一样.觉得为什么这东西会这么智能 就拿Hello World来说 C: 1 #include<stdio.h> 2 3 void main() 4 { 5 printf("Hello World"); 6 } C++: 1 #include&

Python 学习之路(二)

Python 学习之路(二) 以下所用的是Python 3.6 一.条件语句 简单判断 1 if 判断条件: 2 执行语句-- 3 else: 4 执行语句-- 复杂判断 1 if 判断条件1: 2 执行语句1-- 3 elif 判断条件2: 4 执行语句2-- 5 elif 判断条件3: 6 执行语句3-- 7 else: 8 执行语句4-- 二.循环语句 2.1 while语句 和其他语言一样,不同的是多了else语句.在 python 中,while - else 在循环条件为 false

Python 学习之路(三)

Python 学习之路(三) 以下所用的是Python 3.6 一.集合部分 集合是一个无序的,不重复的数据集合,主要用来去重,以及关系测试:交集,差集,并集等 1.1 关系操作 1.1.1 列表去重 可以给列表去重,例如: 1 set_demo = [1,2,3,4,5,3,2,1] # 列表 2 set_demo = set(set_demo) # 转换成集合,来去重 3 print(set_demo) 1.1.2 取交集 intersection()方法 可以获得两个集合的交集部分,例如:

Python学习之路(第一周)

走上软件开发之路已经三个年头.我本人是android原生开发出生.期间由于工作的需要以及开发的趋势发展,也走上混合开发的道路,现在主要运用ionic框架进行移动端app的开发.但是未来的互联网发展趋势还是大数据+人工智能.所以现在学习Python就很有必要.这里就不介绍Python语言的优劣了,想具体了解的小伙伴可以自行度娘吧. 好了,直接步入正题. 本博客主要记录自己接下来几个月的Python学习之路,能力有限,期间有什么表达不对的欢迎大家留言区批评指正! Python版本:Python3.5