NO.3:自学python之路------集合、文件操作、函数
引言
本来计划每周完成一篇Python的自学博客,由于上一篇到这一篇遇到了过年、开学等杂事,导致托更到现在。现在又是一个新的学期,春天也越来越近了(冷到感冒)。好了,闲话就说这么多。开始本周的自学Python之路。而且,同时从这周开始,也要开始自学Tensorflow。希望能严格要求自己,不会托更。加油啦。
正文
这个周主要学习了集合,文件的操作,以及一点函数中的知识。下面将会详细介绍各个内容。
集合
集合也是Python的一种变量类型。它与列表不同,集合中没有顺序,没有重复。通常定义一个集合可以用以下两种方法。例子:
#直接写出集合中的各个元素
list = set([2,1,10,15,18]) #将列表转换为集合,会去掉重复的值
list = [1,5,8,2,4,3,6,1,3]
list = set(list)
对集合的编辑首先从添加开始,向集合中添加一个或多个元素的方法,例子:
list = set([2,1,10,15,18])#建立集合 list.add(99)#添加一项
list.update([99,100,101])#添加多项
说完了添加,下面将会带来几种删除的方法,例子:
list = set([2,1,10,15,18])#建立集合 list.remove(2)#删除2,若list中不存在会报错
list.discard(114514)#删除114514,若list中不存在不会报错
list.pop()#随机删除一个并返回
讲完了集合的编辑,就不得不提集合的几种运算,即交集、并集、差集。在Python中还多了一种对称差集,也就是集合A与集合B中所有不属于A∩B的元素的集合。例子:
list = set([2,1,10,15,18])#建立集合
list_new = set([10,15,18,99,65])#建立集合 #交集
list.intersection(list_new)
list & list_new
#并集
list.union(list_new)
list | list_new
#差集
list.difference(list_new)
list - list_new
#对称差集
list.symmetric_difference(list_new)
list ^ list_new
同样,Python中也预设了一些判断语句,方便判断时使用。例子:
list = set([2,1,10,15,18])#建立集合
list_new = set([10,15,18,99,65])#建立集合 #判断是否为子集
list.issubset(list_new)
list_new in list
#判断是否为父集
list.issuperset(list_new)
#未相交判断
list.isdisjoint(list_new)
文件操作
文件操作是任何一种语言学习中的重点。读写硬盘中的文件一方面是为内存中的程序运行提供必要数据,另一方面也是保存内存中运算结果的重要手段。
在Python中,文件操作主要由三个步骤组成:打开——操作——关闭。但是这里首先讲解文件操作中的打开和关闭。
打开一个文件与关闭这个文件是一一对应的。之要打开,就需要关闭。虽然,在程序运行结束后,会自动从内存中释放打开的文件,但是在整个程序运行的过程中,这个文件都是打开的,这对于数据的安全和运行都是不利的。所以,一定要关闭文件。打开和关闭的方法比较简单。例子:
f = open('test.txt','r')#打开文件,('文件名及绝对或相对路径','操作权限')
#操作
f.close()#关闭文件
为了避免忘记关闭文件的不便,鉴于Python缩进编程的优势,还有一种无需写关闭文件的打开方法。例子:
#打开一个文件
with open('test.txt','r') as f:
#操作
#后续代码 #打开多个文件
with open('test.txt','r') as f,\
open('test_new','w') as f_new:
#操作
#后续代码
在填写路径时,由于Linux用户的路径使用的是正斜杠,'/';而Windows用户的路径使用的是反斜杠,'\'。而反斜杠容易被组合形成转义字符,发生冲突。这里Windows用户也可以一律在路径中填写正斜杠,也会识别。下面就要介绍几种常用的操作权限:
'''
'r' 只读
'w' 只写,若文件存在会覆盖原文件
'a' 添加,在文件后继续添加,不能读
'b' 二进制模式,与r和w组合使用,rb,wb
'+' 添加另一种模式,与r和w组合使用,r+,w+,但只会写在最后
'U' #linux与windows的区别,将\r\n自动转换为\n
'''
之后,就要介绍文件的操作方法了。首先,要将文件全部读为字符一次性读入内存,可以用这个方法。例子:
with open('test.txt','r') as f:
f.readlines()#每行一个元素,全部读入
这种方法只适用于小文件读取。当文件比较大是,如果用这种方法有可能会爆掉内存。这里就要介绍另外一种方法了,及一行一行的读取。文件在刚打开时,文件读取的指针放在了文件初始位置。每读取一次一行,读取指针就会移动到下一行的开头。当读取为空时,就完成了文件的读取。例子:
with open('test.txt','r') as f:
f.readline()#读取第一行
f.readline()#读取第二行
f.readline()#读取第三行
当读取到一半时,很难确定此时指针的位置。Python中提供了获取指针位置和移动指针到某一位置的方法。例子:
with open('test.txt','r') as f:
f.readline()#读取一行
f.tell()#返回此时指针的位置
f.seekable(0)#将指针移动到括号中的位置,0为开始位置
写入文件的方法比较简单。例子:
with open('test.txt','w') as f:
f.write('字符串')#写入文件要想写入后换行可以在字符串结尾加入\n
出了读写外,Python还为文件操作增加了一些其他内容,这里一并介绍。例子:
with open('test.txt','w') as f:
f.encoding#文件的编码
f.fileno()#返回操作系统调用文件接口的编号
f.truncate()#清空文件,或进行括号内字符量的截断,与光标指针位置无关
f.flush()#强制刷新
同样,Python也为文件操作提供了一些判断。例子:
with open('test.txt','w') as f:
f.seekable()#判断光标能否移动
f.readable()#判断是否可读
f.writable()#判断是否可写
f.closed#判断是否关闭
文件内容的循环。例子:
with open('test.txt','r+') as f:
#低效循环
for line in f.readlines():
print(line.strip())#读一行,strip去掉前后空格
for index,line in enumerate(f.readlines()):
print(index)
print(line.strip())
#高效循环
count = 0
for line in f:#一行行读入内存
print(count)
print(line.strip())
count += 1
对于硬盘上的文件修改,也有两种方法。一种是低效方法,即将文件中的内容全部读入内存后,利用正则表达式等方法对其修改后再将其重新写入文件。另一种方法是同时打开两个文件,一个读一个写,然后循环每行读出需要修改的文件,然后逐行修改后分别存入另一个文件。这里不再举例。
字符编码与转码
字符编码有多种多样,如ASCII码、UTF-8、Unicode、GBK、GB2312。字符编码的不同往往会导致程序中出现各种各样的问题。所以学会转码是避免字符编码导致问题的一种手段。
起初美国确立了ASCII码,在这里面每个字母符号均占一个字节。为了显示各国文字,各个国家分别建立了自己的字符编码,如GBK,但是它们之间又不互相兼容。为了解决各国编码不兼容的问题,万国码Unicode应用而生。但是Unicode中所有的符号都占用2个字节,使得英文体积变大。为此,又出现了UTF-8,在UTF-8中,英文占一个字节其他文字占3个字节。Python3.X中的默认编码格式为UTF-8。
Unicode由于其兼容性,成为了各种编码间互相转换的桥梁。UTF-8和Unicode可以直接转换为各国的编码。各国的编码要想互相转换,就需要先解码为Unicode然后由Unicode转换为其他编码。
转换例子:
#-*- coding:UTF-8 -*-
#声明文档的编码格式 utf8 = 'hello world!'
utf8_gbk = utf8.encode('gbk')#UTF-8转GBK
gbk_utf8 = utf8_gbk.decode('gbk').encode('utf-8')#GBK转其他
函数
编写函数可以大大减轻编程中重复代码编写为编程人员带来的麻烦。函数具有:代码可重复利用、可扩展性以及保持一致性的优点。下面将介绍函数的一般形式。例子:
def 函数名(变量名=默认值,…):#变量名与默认值非必须填写
'''函数功能介绍'''
函数体
return 返回值1,返回值2…
当不写return时,函数返回None。调用函数时,括号中的变量应该互相对应。每个变量都应该赋有确定的值。但是当该变量由默认值时,可以省略不写。当依靠位置为变量赋值时,对应位置的值,与付给的值相对应。例子:
def number(x,y,z=0):#z初始值为0
print(x)
print(y)
print(z)
return x+y,x-z
number(3,2,1)#此时,x=3,y=2,z=1
number(2,1)#此时不会报错,x=2,y=1,z=0
当使用关键字参数赋值时,可以更改位置。当位置参数与关键字参数混用时关键字参数不能写在位置参数前面,且不能赋给已赋值的位置参数。例子:
def number(x,y,z=0):#z初始值为0
print(x)
print(y)
print(z)
return x+y,x-z
number(x=3,2,1)#报错
number(2,x=1)#报错
number(2,z=1,y=3)#不报错,x=2,y=3,z=1
当赋入位置参数个数不确定时,可以将不确定个数个位置参数以元组的形式传入。例子:
def number(*args):#z初始值为0
print(args)
return 0
number(1,2,3)
number(*[1,2,3])
当赋入关键字参数个数不确定时,可以将不确定个数个关键字参数以字典的形式传入。例子:
def number(**kwargs):#z初始值为0
print(kwargs)
return 0
number(age = 12,name = 'kai')
number(**{'age':12,'name':'kai'})
终极混乱函数形式。字典形式应放在最后,原组放在字典前。例子:
def number(name,age=12,*args,**kwargs):
print(name)
print(age)
print(args)
print(kwargs)
return 0
number('kai',22,sex='kai',age=5)#age报错
number('kai',22,33,44,55,sex='men')#name=kai,age=22,args=(33,44,55),kwargs={'sex':'men'}
除了普通的函数,还有一种叫递归函数。递归函数是指函数内部可以调用其他函数,如果调用自己就是递归函数。递归函数必须有明确的结束条件,每进入更深一层,问题规模应该有所减少。
递归函数的运行效率低,并且,程序每调用一个函数,栈中会增加一层栈帧,每返回一个函数,栈中会减少一层栈帧。多层的递归函数容易导致栈溢出。
下面将写一个简单的递归函数。例子:
def number(n):
'''判断奇偶'''
if n-2>0:
return number(n-2)
else:
return n
高阶函数是接收另一个函数作为参数的函数。下面将写一个简单的高阶函数。例子:
def number(x,y,f):#这里f作为某种函数被当作输入参数
z = f(x)+f(y)
return z
sum(-3,9,sqrt)#sqrt开方函数
介绍了函数,就不得不讲一下全局变量与局部变量。而这个定义与C++等其他语言中相似,所以不再赘述。在函数中想要修改或定义全局变量需要声明global。但一般情况下不建议这样做。
x = 3
def number():
global x
x = 5
return 0
print(x)#x = 3
number()
print(x)#x = 5
作业
对一个用户文件实现增删改查
流程图:
主程序:
#-*- coding:UTF-8 -*-
#Author:猛男落泪
#配置文件的增删改查 import os #打印标题
title = '欢迎进入用户管理系统'
print(title.center(50,'-')) def option_error():
'''输入错误提醒'''
print('请输入正确的选项编号!') quit_flag = True while quit_flag:
back_flag = True
print('''
1.查询用户
2.增加用户
3.删除用户
4.修改用户
q.退出系统
''') option = input('请输入所需求的功能:')
if option == 'q':
#退出
quit_flag = False
elif option.isdigit():
option = int(option)
if option == 1:
#查询系统
while back_flag:
info = input('请输入要查询的用户姓名:')
if info == 'b':
back_flag = False
elif info == 'q':
back_flag = False
quit_flag = False
else:
with open('user information.txt','r') as f:
for line in f:
if info in eval(line):
print(eval(line)[info])
break
else:
option_error()
elif option == 2:
#增加系统
while back_flag:
info = input('请输入增加用户的姓名,年龄,性别,职业(空格隔开,b返回q退出):')
if info == 'b':
back_flag = False
elif info == 'q':
back_flag = False
quit_flag = False
else:
info = info.split()
dic_info = {}
dic = {}
dic_info['年龄'] = info[1]
dic_info['性别'] = info[2]
dic_info['职业'] = info[3]
dic[info[0]] = dic_info
info = str(dic)
with open('user information.txt','a') as f:
f.write('%s\n' %info)
f.flush()#强制刷新
print('%s保存成功!' %info)
elif option == 3:
#删除系统
while back_flag:
info = input('请输入要删除的用户姓名:')
if info == 'b':
back_flag = False
elif info == 'q':
back_flag = False
quit_flag = False
else:
f = open('user information.txt','r')
f_new = open('user information_new.txt','w')
for line in f:
if info in eval(line):
print('用户删除')
break
else:
option_error()
f.seek(0)#光标指针回归
for line in f:
if info in eval(line):
continue
f_new.write('%s' %line)
f.close()
f_new.close()
os.remove('user information.txt')
os.rename('user information_new.txt','user information.txt')
elif option == 4:
#修改系统
while back_flag:
info = input('请输入要修改的用户姓名:')
if info == 'b':
back_flag = False
elif info == 'q':
back_flag = False
quit_flag = False
else:
f = open('user information.txt','r')
f_new = open('user information_new.txt','w')
for line in f:
if info in eval(line):
info_new = input('请输入要修改用户的年龄,性别,职业(空格隔开):')
info_new = info_new.split()
dic_info = {}
dic = {}
dic_info['年龄'] = info_new[0]
dic_info['性别'] = info_new[1]
dic_info['职业'] = info_new[2]
dic[info] = dic_info
info_new = str(dic)
print('%s保存成功!' %info_new)
break
else:
option_error()
f.seek(0)#光标指针回归
for line in f:
if info in eval(line):
f_new.write('%s\n' %info_new)
else:
f_new.write('%s' %line)
f.close()
f_new.close()
os.remove('user information.txt')
os.rename('user information_new.txt','user information.txt')
else:
option_error()
else:
option_error()
print('感谢你的使用!')
用户信息文件:
user information.txt
{'凯凯王': {'年龄': '', '性别': '男', '职业': '学生'}}
{'卖力头': {'年龄': '', '性别': '男', '职业': '学生'}}
{'飘飘流': {'年龄': '', '性别': '男', '职业': '学生'}}
NO.3:自学python之路------集合、文件操作、函数的更多相关文章
- Python基础-week03 集合 , 文件操作 和 函数详解
一.集合及其运算 1.集合的概念 集合是一个无序的,不重复的数据组合,它的主要作用如下 *去重,把一个列表变成集合,就自动去重了 *关系测试,测试两组数据之前的交集.并集.差集.子集.父级.对称差集, ...
- 跟着ALEX 学python day3集合 文件操作 函数和函数式编程 内置函数
声明 : 文档内容学习于 http://www.cnblogs.com/xiaozhiqi/ 一. 集合 集合是一个无序的,不重复的数据组合,主要作用如下 1.去重 把一个列表变成集合 ,就自动去重 ...
- 小白的Python之路 day2 文件操作
文件操作 对文件操作流程 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件 现有文件如下 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 1 ...
- python之路(五)-文件操作
文件操作无非两个,即:读.写 python 2.x: 文件句柄 = file('文件路径', '模式') python3.x: 文件句柄 = open('文件路径', '模式') 打开文件的模式有: ...
- python之路---08 文件操作
二十六. 文件 f = open(文件路径,mode = '模式',encoding = '编码格式') 1.基础 ① 读写时,主要看光标的位置 ②操作完成要写 f.close( ) f.f ...
- Python之旅Day3 文件操作 函数(递归|匿名|嵌套|高阶)函数式编程 内置方法
知识回顾 常见五大数据类型分类小结:数字.字符串.列表.元组.字典 按存值个数区分:容器类型(列表.字典.元组) 标量原子(数字.字符串) 按是否可变区分:可变(列表.字典) 不可变(数字.字符串.元 ...
- python基础学习之文件操作&函数
1.文件处理相关 1.编码问题 ①python2与python3中的默认编码: py2默认使用ASCII码,py3默认使用utf-8 ②为什么会出现中文乱码,中文乱码的情况有哪些? #sys.stdo ...
- 自学Python之路
自学Python之路[第一回]:初识Python 1.1 自学Python1.1-简介 1.2 自学Python1.2-环境的搭建:Pycharm及python安装详细教程 1.3 ...
- 自学Python之路-Python基础+模块+面向对象+函数
自学Python之路-Python基础+模块+面向对象+函数 自学Python之路[第一回]:初识Python 1.1 自学Python1.1-简介 1.2 自学Python1.2-环境的 ...
随机推荐
- C#中HttpWebRequest的用法详解(转载)
1.HttpWebRequest和HttpWebResponse类是用于发送和接收HTTP数据的最好选择.2.命名空间:System.Net3.HttpWebRequest对象不是利用new关键字创建 ...
- 读取本地json文件另一种方式
function getScenemapData(){ $.ajax({ url: "/js/currency.json", type: "GET" ...
- #leetcode刷题之路25- k个一组翻转链表
给出一个链表,每 k 个节点一组进行翻转,并返回翻转后的链表.k 是一个正整数,它的值小于或等于链表的长度.如果节点总数不是 k 的整数倍,那么将最后剩余节点保持原有顺序. 示例 :给定这个链表:1- ...
- pt-archiver数据归档
可以使用percona-toolkit包中的pt-archiver工具来进行历史数据归档 pt-archiver使用的场景: 1.清理线上过期数据. 2.清理过期数据,并把数据归档到本地归档表中,或者 ...
- Linux基础-3.用户、群组和权限
1.用户及passwd文件 1)掌握/etc/passwd文件的功能:存储所有用户的相关信息,每一个用户占用一行记录,该文件也被称为用户信息数据库(Database) 2)/etc/passwd文件中 ...
- Linux查看当前登录用户并踢出用户
1.查看当前登录用户 [wilsh@lcl ~]$ whatis w w (1) - Show who is logged on and what they a ...
- vue---class和style的基本用法
不多BB了 直接上代码了 通俗移动易懂总结了5种常用改变样式 的形式 <style> .actived2{ color:red; } </style> </head> ...
- Java操作Redis(一)
一.创建项目,导入依赖 <dependency> <groupId>redis.clients</groupId> <artifactId>jedis& ...
- PHpStorm + phpstudy 断点调试配置
步骤: phpstudy 其他菜单 ->打开配置文件 ->打开 php.ini ->找到 XDebug ->XDebug修改成下面文字 [XDebug] :红色 (1 ...
- urllib库使用方法1 request
urllib是可以模仿浏览器发送请求的库,Python自带 Python3中urllib分为:urllib.request和urllib.parse import urllib.request url ...