python学习笔记(二) 文件、异常、函数(filter,map,reduce,zip)

111 阅读4分钟

一、文件

(一)写入文件

file1 = open('name.txt','w')
file1.write('诸葛亮'+'\n'+'刘备'+'\n'+'关羽')
file1.close()

(二)读取文件

1.单行读取

file4 = open('name.txt')
print(file4.readline())  #readline单行读取

在这里插入图片描述

2.逐行读取

file5 = open('name.txt')
for line in file5.readlines():   #readlines逐行读取
    print(line)

在这里插入图片描述

(三)文件指针

需求:操作完成后,回到文件开头位置。

需要用到 tell()函数, tell()告诉用户文件的指针在哪儿。

seek()函数,其中可以写入两个参数:第一个为偏移位置,第二个参数 0表示从文件开头偏移,1表示从当前位置偏移,2表示从文件结尾偏移。 如:seek(5,0)表示从文件开头偏移5个位置。

file6 = open('name.txt')
print('文件开始时指针位置:%s' %file6.tell())

file6.read(1)  #读取一个
print('当前指针位置:%s' %file6.tell())
print('读取内容:%s' %file6.read(1))

file6.seek(0)
print('当前指针位置:%s' %file6.tell())

file6.seek(6,0)
print('当前指针位置:%s' %file6.tell())

在这里插入图片描述

(四)其他操作

name.txt: 在这里插入图片描述 weapon.txt: 在这里插入图片描述

#读取人物名称
f = open('name.txt')
data = f.read()  #读取的内容
print(data.split('1')) #用'1‘做分割

#读取兵器名称
f2 = open('weapon.txt')

i = 1
for line in f2.readlines()
    if i%2 ==1:
        print(line.strip('\n'))  #输出的内容中去掉每行的换行符
    i +=1

f3 = open('sanguo.txt',encoding='GB18030') #中文问题,以GB18030字符编码打开
print(f3.read().replace('\n'),'') #把文件中所有的换行符替换为空

二、异常的检测和处理

在这里插入图片描述异常:

year = int(input('year:'))

在这里插入图片描述

异常处理:

try:
    year = int(input('year:'))
except ValueError:
    print('年份要输入数字')

在这里插入图片描述 其他操作:

  1. except可以用于多个异常的处理,但要把它们放在一个元组中。
except (ValueError,KeyError,……)
  1. 希望不但显示错误信息,还要显示给用户的错误时操作。

异常:

print(1/0)

在这里插入图片描述

try:
    print(1/0)
except ZeroDivisionError as e:  #把错误信息重命名为一个变量e
    print('0不能做除数%s' %e)

在这里插入图片描述

  1. 捕获全部的错误信息,Exception
try:
    print(1/'a')
except Exception as e:  #把所有错误信息重命名为一个变量e
    print('%s' %e)

在这里插入图片描述

  1. 自己定义新的错误信息
try:
    raise NameError('helloError')   #把NameError定义为helloError
except NameError:
    print('hello')

在这里插入图片描述

  1. 不论是否产生错误,都要执行finally
try:
    a = open('name.txt')
except Exception as e:  #打开文件失败,输出错误信息
    print(e)
finally:
    a.close()

三、函数

在这里插入图片描述

(一)函数定义和调用

def func(filename):
    print(open('filename').read())

func('name.txt')
import re
def find_item(hero):  #统计名字在小说中出现的次数
    with open('sanguo.txt',encoding='GB18030') as f:
        data = f.read().replace('\n','')
        name_num = re.findall(hero,data) #findall函数打印hero在data中出现的字符
        print('主机 %s 出现 %s 次' %(hero,len(name_num)))

    return len(name_num)

#读取人物的信息
name_dict = {}
with open('name.txt') as f:  #f是指向文件的一个变量
    for line in f:
        names = line.split(']')
        for n in names:
            name_sum = find_item(n) #名字对应的次数
            name_dict[n] = name_sum

(二)函数传参

函数中的参数需要按顺序输入,如果想跳过某个参数,可以使用关键字参数。

例子: 在这里插入图片描述

print('abc',end='\n')
print('dc')

在这里插入图片描述 例子:

def func(a,b,c):
    print('a=%s' %a)
    print('b=%s' %b)
    print('c=%s' %c)

func(1,c=3,b=2)

在这里插入图片描述

可变长参数

可边长参数前面加*,表示是可选的。

def howlong(first,*other):
    print(1+len(other))    #first的长度是1

howlong(123,234,34)

在这里插入图片描述

(三)变量作用域

函数内部和外部有变量同名。 global 用于定义全局变量。 在这里插入图片描述

(四)迭代器与生成器

迭代器举例:

list1 = [1,2,3]
it = iter(list1)  #用iter将list1处理成迭代器
print(next(it))  #用next取it中的第一个元素
print(next(it))
print(next(it))

在这里插入图片描述

for i in range(10,20,2): #输出10——19,步长为2
    print(i)

在这里插入图片描述 实例:编写一个步长为小数的迭代器(生成器)

#一个步长为小数的迭代器 def frange(start,stop,step): x = start while x < stop: x += step print(x)

frange(10,20,0.5)

在这里插入图片描述这里函数在最后输出的值是20.0

yield函数 如果没有加yield,函数会把所有的值一次性的返回。加入yield,会在此暂停,并且记住当前位置,当通过next调用时,会从该位置继续返回一个值。

#一个步长为小数的迭代器
def frange(start,stop,step):
    x = start
    while x < stop:
        yield x
        x += step

for i in frange(10,20,0.5):
    print(i)

在这里插入图片描述 这里最后输出的值是19.5

(四)lambda表达式

用法:

def add(x,y):return x+y
lambda x,y : x+y
lambda x:x<=(month,day)
def func1(x):return x<=(month,day)

四、python内建函数

(一)fileter函数

filter(function or none, iterable)选择iterable中满足function或none的值。 用法:

a = [1,2,3,4,5,6,7]
b = list(filter(lambda x:x>2,a)) #选择a中大于2的数,list强制转换为列表类型否则lambda不会被执行
print(b)

(二)map函数

map(func,*iterables),对数据依次处理。

a = [1,2,3]
b = [4,5,6]
ma =list(map(lambda x:x+1,a))
print(ma)

mab=list(map(lambda x,y:x+y,a,b))
print(mab)

在这里插入图片描述

(三)reduce函数

reduce函数不能直接应用,必须通过functools导入。

from functools import reduce

reduce ( function , sequence [ , initial ] ),中括号的意思为初始值可以省略,作用为将序列和初始值按照函数的方式做运算,每次运行一个序列。

用法: 在这里插入图片描述 意思 是:((1+2)+3)+4 =10

(四)zip函数

zip( iter1, [ , iter2 [ …… ] ] ) 用法:

a = (1,2,3)
b = (4,5,6)
zip(a,b)
for i in zip(a,b):
    print(i)

在这里插入图片描述 zip函数实现字典中的key和value值对调:

dicta = {'a':'aa','b':'bb'}
dictb = dict(zip(dicta.values(),dicta.keys()))
print(dictb)

在这里插入图片描述