数据类型主要用一下 一二三点来进行分析
#一:基本使用 1 用途 2 定义方式 3 常用操作+内置的方法 #二:该类型总结 1 存一个值or存多个值 只能存一个值 可以存多个值,值都可以是什么类型 2 有序or无序 3 可变or不可变 !!!可变:值变,id不变。可变==不可hash !!!不可变:值变,id就变。不可变==可hash
一:整型和浮点型
#整型int 作用:年纪,等级,身份证号,qq号等整型数字相关 定义: age=10 #本质age=int(10) #浮点型float 作用:薪资,身高,体重,体质参数等浮点数相关 salary=3000.3 #本质salary=float(3000.3)
浮点型和整型:
没有可变不可变直说,存一个值 #二进制,十进制,八进制,十六进制
二:字符串
#作用:名字,性别,国籍,地址等描述信息
#定义:在单引号双引号三引号内,由一串字符组成
name='egon'
#优先掌握的操作:
#1、按索引取值(正向取+反向取) :只能取
#2、切片(顾头不顾尾,步长)
#3、长度len
#4、成员运算in和not in
#1、按索引取值(正向取+反向取) :只能取 # msg='he lo' # print(msg[0]) # print(msg[2]) # msg[2]='A' #2、切片(顾头不顾尾,步长) # msg='hello world' # print(msg[0:4]) #hell # print(msg[0:4:2]) #hell #3、长度len # msg='hello' # print(len(msg)) #4、成员运算in和not in # msg='alex say my name is alex' # if 'alex' in msg: # print('存在') # print('alex' not in msg) # 推荐使用 # print(not 'alex' in msg)
#5、移除空白strip #6、切分split #7、循环
#1、strip(移除空白),lstrip(移除左边空白),rstrip (移除右边空白) #2、lower(全部小写),upper(全部大写) #3、startswith(是否什么开头),endswith(是否什么结尾) #4、format的三种玩法(格式化处理方式) #5、split(分隔符),rsplit #6、join(加入字符串) #7、replace(替代) #8、isdigit(是否为整数)
#strip name='*egon**' print(name.strip('*')) print(name.lstrip('*')) print(name.rstrip('*')) #lower,upper name='egon' print(name.lower()) print(name.upper()) #startswith,endswith name='alex_SB' print(name.endswith('SB')) print(name.startswith('alex')) #format的三种玩法 res='{} {} {}'.format('egon',18,'male') res='{1} {0} {1}'.format('egon',18,'male') res='{name} {age} {sex}'.format(sex='male',name='egon',age=18) #split name='root:x:0:0::/root:/bin/bash' print(name.split(':')) #默认分隔符为空格 name='C:/a/b/c/d.txt' #只想拿到顶级目录 print(name.split('/',1)) name='a|b|c' print(name.rsplit('|',1)) #从右开始切分 #join tag=' ' print(tag.join(['egon','say','hello','world'])) #可迭代对象必须都是字符串 #replace name='alex say :i have one tesla,my name is alex' print(name.replace('alex','SB',1)) #isdigit:可以判断bytes和unicode类型,是最常用的用于于判断字符是否为"数字"的方法 age=input('>>: ') print(age.isdigit()) 示例
只需要了解
#1、find,rfind,index,rindex,count #2、center,ljust,rjust,zfill #3、expandtabs #4、captalize,swapcase,title #5、is数字系列 #6、is其他
#find,rfind,index,rindex,count name='egon say hello' print(name.find('o',1,3)) #顾头不顾尾,找不到则返回-1不会报错,找到了则显示索引 # print(name.index('e',2,4)) #同上,但是找不到会报错 print(name.count('e',1,3)) #顾头不顾尾,如果不指定范围则查找所有 #center,ljust,rjust,zfill name='egon' print(name.center(30,'-')) print(name.ljust(30,'*')) print(name.rjust(30,'*')) print(name.zfill(50)) #用0填充 #expandtabs name='egon hello' print(name) print(name.expandtabs(1)) #captalize,swapcase,title print(name.capitalize()) #首字母大写 print(name.swapcase()) #大小写翻转 msg='egon say hi' print(msg.title()) #每个单词的首字母大写 #is数字系列 #在python3中 num1=b'4' #bytes num2=u'4' #unicode,python3中无需加u就是unicode num3='四' #中文数字 num4='Ⅳ' #罗马数字 #isdigt:bytes,unicode print(num1.isdigit()) #True print(num2.isdigit()) #True print(num3.isdigit()) #False print(num4.isdigit()) #False #isdecimal:uncicode #bytes类型无isdecimal方法 print(num2.isdecimal()) #True print(num3.isdecimal()) #False print(num4.isdecimal()) #False #isnumberic:unicode,中文数字,罗马数字 #bytes类型无isnumberic方法 print(num2.isnumeric()) #True print(num3.isnumeric()) #True print(num4.isnumeric()) #True #三者不能判断浮点数 num5='4.3' print(num5.isdigit()) print(num5.isdecimal()) print(num5.isnumeric()) ''' 总结: 最常用的是isdigit,可以判断bytes和unicode类型,这也是最常见的数字应用场景 如果要判断中文数字或罗马数字,则需要用到isnumeric ''' #is其他 print('===>') name='egon123' print(name.isalnum()) #字符串由字母或数字组成 print(name.isalpha()) #字符串只由字母组成 print(name.isidentifier()) print(name.islower()) print(name.isupper()) print(name.isspace()) print(name.istitle()) 示例
三:列表
#作用:多个装备,多个爱好,多门课程,多个女朋友等 #定义:[]内可以有多个任意类型的值,逗号分隔 my_girl_friends=['alex','wupeiqi','yuanhao',4,5] #本质my_girl_friends=list([...]) 或 l=list('abc') #优先掌握的操作: #1、按索引存取值(正向存取+反向存取):即可存也可以取 #2、切片(顾头不顾尾,步长) #3、长度 #4、成员运算in和not in #5、追加 #6、删除 #7、循环
#ps:反向步长 l=[1,2,3,4,5,6] #正向步长 l[0:3:1] #[1, 2, 3] #反向步长 l[2::-1] #[3, 2, 1] #列表翻转 l[::-1] #[6, 5, 4, 3, 2, 1]
列表属于有序的,存多个值,可变的的类型
#一:list基本使用 # 1 用途:存放多个值 # 2 定义方式:[]内用逗号分隔开多个元素,每个元素可以是任意数据类型 # l=[1,'a',[1,2]] #l=list([1,'a',[1,2]]) # 3 常用操作+内置的方法 #优先掌握的操作: #1、按索引存取值(正向存取+反向存取):即可以取也可以改 names=['egon','alex','wxx','xxx','yxx'] # print(names[4]) # print(names[-1]) # print(names[-2]) # print(id(names)) # names[0]='EGON' # print(id(names)) # print(names) # names[5]=3 #超出索引限制就会报错 #2、切片(顾头不顾尾,步长) names=['egon','alex','wxx','xxx','yxx'] # print(names[0:3:2]) # print(names[:]) #了解:反向步长 # print(names[3:-1:-1]) # print(names[-1::-1]) #3、长度 # names=['egon','alex','wxx','xxx','yxx'] # print(len(names)) #4、成员运算in和not in # names=['egon','alex','wxx','xxx','yxx',1,2,3,4] # print('alex' in names) # print(4 in names) #5、追加与插入 # names=['egon','alex','wxx','xxx','yxx'] # names.append('oldboy1') # names.append('oldboy2') # names.append('oldboy3') # print(names) # names.insert(2,'oldboy') # print(names) #6、删除列表中某一个元素 names=['egon','alex','wxx','xxx','yxx'] # del names[2] # print(names) # res=names.remove('wxx') # 指定要删除的元素,remove方法没有返回值 # print(res) # print(names) #从列表中取走一个元素 # if 100 < len(names): # res=names.pop(100) # 按照索引删除的元素(会返回刚刚删掉的元素),超过索引限制则报错 # print(names) # print(res) #7、循环 # names=['egon','alex','wxx','xxx','yxx',1,2,3,4] # for x in names: # print(x) # 需要掌握的操作 names=['egon','alex','wxx','xxx','xxx','yxx',1,2,3,4] # names.reverse() # names.reverse() # print(names) # names.count() # print(names.count('xxx')) # names.clear() # names.clear() # print(names) # names.copy() # l=names.copy() # print(l) # names.index() # names=['egon','alex','wxx','xxx','xxx','yxx',1,2,3,4] # print(names.index('alexasdf')) # names.sort(): 列表中的元素必须是同一类型才能比较排序 # names=['b','a','+'] # names.sort() # print(names) # 了解:字符|列表之间比较大小 # x='hello' # y='z' # print(y > x) #排序:'A-Za-z' # l1=[1,2,'a','b'] # l2=[1,2,'b'] # # print(l2 > l1) #二:该类型总结 # 1 存多个值 # 2 有序 # 3 可变 #练习题: #1 队列:先进先出 l=[] # 入队:first->second->third # l.append('first') # l.append('second') # l.append('third') # print(l) # 出队: # print(l.pop(0)) # print(l.pop(0)) # print(l.pop(0)) #2 堆栈:先进后出 # 入栈:first->second->third l.append('first') l.append('second') l.append('third') # 出栈:third->second->first print(l.pop(-1)) print(l.pop()) print(l.pop())
四:元祖
#作用:存多个值,对比列表来说,元组不可变(是可以当做字典的key的),主要是用来读 #定义:与列表类型比,只不过[]换成() age=(11,22,33,44,55)本质age=tuple((11,22,33,44,55)) #优先掌握的操作: #1、按索引取值(正向取+反向取):只能取 #2、切片(顾头不顾尾,步长) #3、长度 #4、成员运算in和not in #5、循环
五:字典
#作用:存多个值,key-value存取,取值速度快 #定义:key必须是不可变类型,value可以是任意类型 info={'name':'egon','age':18,'sex':'male'} #本质info=dict({....}) 或 info=dict(name='egon',age=18,sex='male') 或 info=dict([['name','egon'],('age',18)]) 或 {}.fromkeys(('name','age','sex'),None) #优先掌握的操作: #1、按key存取值:可存可取 #2、长度len #3、成员运算in和not in #4、删除 #5、键keys(),值values(),键值对items() #6、循环
一:dict基本使用 1 用途:存多个值,key:value,key对value有描述的作用 2 定义方式:{}内用逗号分开多个元素,每一个元素都是key:value的形式 其中key必须是不可变类型,key通常都应该是字符串类型 其中value可以是任意数据类型 info={'name':'egon',(1,2):18} #info=dict({'name':'egon','age':18}) print(info['name']) print(info[(1,2)]) 3 常用操作+内置的方法 优先掌握的操作: 1、按key存取值:可存可取 d={'x':1} print(id(d)) d['x']=2 print(id(d)) print(d) d['y']=3 print(d) 2、长度len info={'x':1,'y':2,'z':3} print(len(info)) 3、成员运算in和not in :判断的是字典的key info={'x':1,'y':2,'z':3} print('x' in info) 4、删除 info={'x':1,'y':2,'z':3} del info['x'] print(info) print(info.popitem()) print(info.pop('xxxxx',None)) print(info) 5、键keys(),值values(),键值对items() msg_dic={ 'apple':10, 'tesla':100000, 'mac':3000, 'lenovo':30000, 'chicken':10, } print(msg_dic.keys()) 6、循环 msg_dic={ 'apple':10, 'tesla':100000, 'mac':3000, 'lenovo':30000, 'chicken':10, }
如果我想根据key来取对应的值,在值不存在的情况下会抛出异常KeyError,如何避免该问题?
答:用get方法取值可以避免异常
7、更新、增加 update更新 字典 用新数据更新原来表格数据 msg_dic.update d1={'x':1,'y':2} d1.update({'x':2,'z':3}) print(d1) msg_dic.setdefault 1、key存在,则不改变key对应的值,放回原值 d={'x':1,'y':2} res=d.setdefault('x',1000) # print(d) print(res) 2、key不存在,则增加一个key:value,返回新增的value d={'x':1,'y':2} res=d.setdefault('z',1000) print(d) print(res) 总结:setdefault有则不变,无则增加 s='hello alex alex say hello sb sb' words=s.split() d={} for word in words: if word not in d: d[word]=1 #d={'hello':1,'alex':1} else: d[word]+=1 d.setdefault(word,words.count(word)) print(d)
文件处理:
一 介绍
计算机系统分为:计算机硬件,操作系统,应用程序三部分。
我们用python或其他语言编写的应用程序若想要把数据永久保存下来,必须要保存于硬盘中,这就涉及到应用程序要操作硬件,众所周知,应用程序是无法直接操作硬件的,这就用到了操作系统。操作系统把复杂的硬件操作封装成简单的接口给用户/应用程序使用,其中文件就是操作系统提供给应用程序来操作硬盘虚拟概念,用户或应用程序通过操作文件,可以将自己的数据永久保存下来。
有了文件的概念,我们无需再去考虑操作硬盘的细节,只需要关注操作文件的流程:
#1. 打开文件,得到文件句柄并赋值给一个变量
#2. 通过句柄对文件进行操作
#3. 关闭文件
二 在python中
#1. 打开文件,得到文件句柄并赋值给一个变量 f=open('a.txt','r',encoding='utf-8') #默认打开模式就为r #2. 通过句柄对文件进行操作 data=f.read() #3. 关闭文件 f.close()
三 f=open('a.txt','r')的过程分析
#1、由应用程序向操作系统发起系统调用open(...) #2、操作系统打开该文件,并返回一个文件句柄给应用程序 #3、应用程序将文件句柄赋值给变量f
四 强调!!!
#强调第一点: 打开一个文件包含两部分资源:操作系统级打开的文件+应用程序的变量。在操作完毕一个文件时,必须把与该文件的这两部分资源一个不落地回收,回收方法为: 1、f.close() #回收操作系统级打开的文件 2、del f #回收应用程序级的变量 其中del f一定要发生在f.close()之后,否则就会导致操作系统打开的文件还没有关闭,白白占用资源, 而python自动的垃圾回收机制决定了我们无需考虑del f,这就要求我们,在操作完毕文件后,一定要记住f.close() 虽然我这么说,但是很多同学还是会很不要脸地忘记f.close(),对于这些不长脑子的同学,我们推荐傻瓜式操作方式:使用with关键字来帮我们管理上下文 with open('a.txt','w') as f: pass with open('a.txt','r') as read_f,open('b.txt','w') as write_f: data=read_f.read() write_f.write(data) #强调第二点: f=open(...)是由操作系统打开文件,那么如果我们没有为open指定编码,那么打开文件的默认编码很明显是操作系统说了算了,操作系统会用自己的默认编码去打开文件,在windows下是gbk,在linux下是utf-8。 这就用到了上节课讲的字符编码的知识:若要保证不乱码,文件以什么方式存的,就要以什么方式打开。 f=open('a.txt','r',encoding='utf-8')
练习,利用b模式,编写一个cp工具,要求如下:
1. 既可以拷贝文本又可以拷贝视频,图片等文件
2. 用户一旦参数错误,打印命令的正确使用方法,如usage: cp source_file target_file
提示:可以用import sys,然后用sys.argv获取脚本后面跟的参数
import sys if len(sys.argv) != 3: print('usage: cp source_file target_file') sys.exit() source_file,target_file=sys.argv[1],sys.argv[2] with open(source_file,'rb') as read_f,open(target_file,'wb') as write_f: for line in read_f: write_f.write(line)
五 文件的修改
文件的数据是存放于硬盘上的,因而只存在覆盖、不存在修改这么一说,我们平时看到的修改文件,都是模拟出来的效果,具体的说有两种实现方式:
方式一:将硬盘存放的该文件的内容全部加载到内存,在内存中是可以修改的,修改完毕后,再由内存覆盖到硬盘(word,vim,nodpad++等编辑器)
import os with open('a.txt') as read_f,open('.a.txt.swap','w') as write_f: data=read_f.read() #全部读入内存,如果文件很大,会很卡 data=data.replace('alex','SB') #在内存中完成修改 write_f.write(data) #一次性写入新文件 os.remove('a.txt') os.rename('.a.txt.swap','a.txt')
方式二:将硬盘存放的该文件的内容一行一行地读入内存,修改完毕就写入新文件,最后用新文件覆盖源文件
import os with open('a.txt') as read_f,open('.a.txt.swap','w') as write_f: for line in read_f: line=line.replace('alex','SB') write_f.write(line) os.remove('a.txt') os.rename('.a.txt.swap','a.txt')