热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

NO.3:自学python之路集合、文件操作、函数

引言本来计划每周完成一篇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 = 0for 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初始值为0print(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初始值为0print(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初始值为0print(args)return 0
number(
1,2,3)
number(
*[1,2,3])

  当赋入关键字参数个数不确定时,可以将不确定个数个关键字参数以字典的形式传入。例子:

def number(**kwargs):#z初始值为0print(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 xx = 5return 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 = Truewhile quit_flag:back_flag = Trueprint('''1.查询用户2.增加用户3.删除用户4.修改用户q.退出系统''')option = input('请输入所需求的功能:')if option == 'q':#退出quit_flag = Falseelif option.isdigit():option = int(option)if option == 1:#查询系统while back_flag:info = input('请输入要查询的用户姓名:')if info == 'b':back_flag = Falseelif info == 'q':back_flag = Falsequit_flag = Falseelse:with open('user information.txt','r') as f:for line in f:if info in eval(line):print(eval(line)[info])breakelse:option_error()elif option == 2:#增加系统while back_flag:info = input('请输入增加用户的姓名,年龄,性别,职业(空格隔开,b返回q退出):')if info == 'b':back_flag = Falseelif info == 'q':back_flag = Falsequit_flag = Falseelse:info = info.split()dic_info = {}dic = {}dic_info['年龄'] = info[1]dic_info['性别'] = info[2]dic_info['职业'] = info[3]dic[info[0]] = dic_infoinfo = 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 = Falseelif info == 'q':back_flag = Falsequit_flag = Falseelse:f = open('user information.txt','r')f_new = open('user information_new.txt','w')for line in f:if info in eval(line):print('用户删除')breakelse:option_error()f.seek(0)#光标指针回归for line in f:if info in eval(line):continuef_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 = Falseelif info == 'q':back_flag = Falsequit_flag = Falseelse: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_infoinfo_new = str(dic)print('%s保存成功!' %info_new)breakelse: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

{'凯凯王': {'年龄': '17', '性别': '', '职业': '学生'}}
{
'卖力头': {'年龄': '16', '性别': '', '职业': '学生'}}
{
'飘飘流': {'年龄': '17', '性别': '', '职业': '学生'}}

 

转:https://www.cnblogs.com/zk71124720/p/8518108.html



推荐阅读
  • 本文介绍了如何使用Python爬取妙笔阁小说网仙侠系列中所有小说的信息,并将其保存为TXT和CSV格式。主要内容包括如何构造请求头以避免被网站封禁,以及如何利用XPath解析HTML并提取所需信息。 ... [详细]
  • 本文节选自《NLTK基础教程——用NLTK和Python库构建机器学习应用》一书的第1章第1.2节,作者Nitin Hardeniya。本文将带领读者快速了解Python的基础知识,为后续的机器学习应用打下坚实的基础。 ... [详细]
  • 解决Bootstrap DataTable Ajax请求重复问题
    在最近的一个项目中,我们使用了JQuery DataTable进行数据展示,虽然使用起来非常方便,但在测试过程中发现了一个问题:当查询条件改变时,有时查询结果的数据不正确。通过FireBug调试发现,点击搜索按钮时,会发送两次Ajax请求,一次是原条件的请求,一次是新条件的请求。 ... [详细]
  • 如何将Python与Excel高效结合:常用操作技巧解析
    本文深入探讨了如何将Python与Excel高效结合,涵盖了一系列实用的操作技巧。文章内容详尽,步骤清晰,注重细节处理,旨在帮助读者掌握Python与Excel之间的无缝对接方法,提升数据处理效率。 ... [详细]
  • 本文介绍了如何通过 Python 代码实现对字符串的特定反转操作。具体而言,给定一个字符串 s,要求在保持所有非英文字母字符位置不变的情况下,将所有英文字母(无论是小写还是大写)的位置进行反转。最终返回经过处理后的字符串 s。 ... [详细]
  • Python多线程编程技巧与实战应用详解 ... [详细]
  • 在Python中,通过实现一个便捷的函数来解码Base64编码的数据,并将其转换为数组形式。该函数能够将Base64字符串解码为字节数组,便于进一步处理。例如,可以使用如下代码片段进行解码:`base64_decode_array('6gAAAOsAAAD')`。这为处理二进制数据提供了高效且简洁的方法。 ... [详细]
  • Java 零基础入门:SQL Server 学习笔记(第21篇)
    Java 零基础入门:SQL Server 学习笔记(第21篇) ... [详细]
  • 深入解析Python文本数据处理的技巧与方法
    学习Python时,它总能让人深刻体会到这款语言的魅力。今天小编为大家带来一个有趣的项目,用Python处理文本数据,一起来看看今天的问题吧 ... [详细]
  • MySQL初级篇——字符串、日期时间、流程控制函数的相关应用
    文章目录:1.字符串函数2.日期时间函数2.1获取日期时间2.2日期与时间戳的转换2.3获取年月日、时分秒、星期数、天数等函数2.4时间和秒钟的转换2. ... [详细]
  • 多线程基础概览
    本文探讨了多线程的起源及其在现代编程中的重要性。线程的引入是为了增强进程的稳定性,确保一个进程的崩溃不会影响其他进程。而进程的存在则是为了保障操作系统的稳定运行,防止单一应用程序的错误导致整个系统的崩溃。线程作为进程的逻辑单元,多个线程共享同一CPU,需要合理调度以避免资源竞争。 ... [详细]
  • 本文全面解析了 Python 中字符串处理的常用操作与技巧。首先介绍了如何通过 `s.strip()`, `s.lstrip()` 和 `s.rstrip()` 方法去除字符串中的空格和特殊符号。接着,详细讲解了字符串复制的方法,包括使用 `sStr1 = sStr2` 进行简单的赋值复制。此外,还探讨了字符串连接、分割、替换等高级操作,并提供了丰富的示例代码,帮助读者深入理解和掌握这些实用技巧。 ... [详细]
  • 人脸识别中的损失函数
    本文主要是针对人脸识别中的各种loss进行总结。 背景对于分类问题,我们常用的lossfunction是softmax,表示为:,当然有softmax肯定也有hardmax:,so ... [详细]
  • #第一章(概率论的基本概念)##第一节(样本空间、随机事件)样本空间:随机试验E的所有基本结果组成的集合,记为$\Omega$必然事件:\(\Omega\)不可能事件:\(\var ... [详细]
  • Python之基础篇(三)
    基础篇之三:一,数据类型之set.总结:set无序,不重复。1,创建set:s{1,2,3}print(s,type(s))list1[1,2,3]s1(list1)prin ... [详细]
author-avatar
宛如画中人需_308
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有