介绍:
1.什么是数据?
例:x=10,10是我们要存储的数据
2.为何数据要分不同的类型?
数据是用来表示状态的,不同的状态用不同的类型的数据去表示
1.数据类型
1.数字(整形,长整形,浮点型,复数)
整形int
#一:基本使用 1 用途 用途:年龄,等级,qq号等 2 定义方式 age=18 #age=int(18) 3 常用操作+内置的方法 + - * / 等
1 #二:该类型总结 2 1 存一个值or存多个值 3 只能存一个值 4 2 没有顺序(只能存一个值) 5 3 可变or不可变(值改变id不变叫可变类型) 6 !!!不可变:值变,id就变。不可变==可hash 7 例:x=11 8 print(id(x)) 9 x=12 10 print(id(x)) 11 不可变==可hash 12 print(hash11)可以正常hash 13 补充:列表(值改了但是id不变为可变类型)为可变类型==不可hash 14 例l=[1,2,3] 15 print(id(l)) 16 1[0]=222 17 print(id(l))
浮点型float
1 用途 身高,体重,工资,体制参数等 2 定义方式 salary=3.1 #salary=float(3.1) 3 常用操作+内置的方法
#二:该类型总结 1 存一个值or存多个值 只能存一个值 2 没有顺序,只能存一个值 3 可变or不可变 !!!不可变:值变,id就变。不可变==可hash
了解:
长整型long
在python2中有,python3中没有 long(表示数字的长度过长) 例: x=3L print(type(x))
y=123123123123123 print(type(y))
复数complex
x=1+2j(j这个地方为什么定义其他的字符报错) 1代表实数 2代表虚数 print(x.real)查看实数 print(x.imag)查看虚数
print(type(x))
字符串floor
字符串
1 #一:基本使用 2 1 用途 3 姓名,性别,住址等描述性数据 4 2 定义方式 5 在单引号双引号三引号内,由一串字符组成 6 例: 7 msg='hello world' 8 这个字符串中的单个字符可以取出来,单个取出来的也叫字符串
1 #优先掌握的操作: 2 #1、按索引取值(正向取+反向取) :只能取,不能修改 3 print(msg[0],type(msg[0]))取出hello world的第一个值 4 print(msg[-1])取出最后一个值 5 不可以改字符串中的值 6 #2、切片(顾头不顾尾,步长) 7 print(msg[0:3])#>=0<3 8 print(msg[0:5])#>=0<5 9 print(msg[0:7:1])#>=0<7 10 print(msg[0:7:2])#>=0<7 #隔一个取一个(顾头不顾尾) 11 print(msg[:])从开头到结尾 12 print(msg[6:1])指的是从6开头到1,这没有可以取的东西了 13 print(msg[6:1:-1])这个首先是倒序取值,这样的就是指的倒着从6到1,就可以取出来了 14 print(msg[-1:0:-1])倒着取,这个0可以不加 15 #3、长度len 16 按着字符串中的一个个字符算的 17 print(msg.__len__())python内部调用的功能 18 print(len(msg))#就是msg.__len__() 19 #4、成员运算in和not in 20 msg='hello world' 21 print(’llo’ in msg)#判断这个llo子字符串在不在这个msg字符串中 22 print(llo not in msg)#这里的not in是取反的意思 23 #5、移除空白strip 24 password=' alex3714 '#如果多输入几个空格 25 print(password.strip())#取出多余的空格 26 password=input('>>>:').strip#可以这样写,input接收用户输入的内容都存为字符串 27 password='alex 3714 ' 28 print(password.strip()) 29 #6、切分split 30 user_info='root:x:0:0:/root:/bin/bash' 31 user_info.split(self,sep(sep指的是分隔符),maxsplit这里面有三个参数,现在可以忽略掉self这个参数,只有两个) 32 res=user_info.split(':') 33 print(res[0])#这样可以取出root这个值 34 35 file_path='c:\a\b\c\d.txt'#双\指的是windows中的目录 36 print(file_path.split('\',1))这个取出的是以第一个\为分隔符 37 print(file_path.rsplit('\',1))这个是从右边以第一个\为分隔符
#7、循环
1 #把每个字符都打印出来 2 msg='hello world' 3 n=0#来个索引等于0,根据索引取值 4 size=len(msg) 5 while n<size: 6 print(msg[n]) 7 n+=1 8 第二种方式: 9 不依赖索引 10 for i in msg: 11 print(i) 12 第三种方式:用for的索引方式取值 13 msg='hello world' 14 n=0 15 for i in range(0,10):#range范围,顾头不顾尾,这个地方还可以指定步长 16 while n<i: 17 print(msg[n]) 18 n+=1 19 第四种方式: 20 msg='hello world' 21 n=0 22 for i in range(0,len(msg)):#len取出长度,如果range(这里面只写一个3,指的就是从0到3) 23 print(msg[i])
#二:该类型总结 1 存一个值or存多个值 只能存一个值 2 有序(能按照索引取值) 3 可变or不可变 !!!不可变:值变,id就变。不可变==可hash
需要掌握的
1 #1、strip,lstrip,rstrip 2 print('***alex***'.strip('*')) 3 print('***alex***'.ltrip('*')) 4 print('***alex***'.rtrip('*')) 5 #2、lower,upper 6 print('ALEX'.lower())#都改成小写 7 print('aaa'.upper())#都改成大写 8 #3、startswith,endswith 9 msg='alex is SB' 10 print(msg.startswith('alex'))#以alex开头 11 print(msg.startswith('a'))#a开头 12 print(msg.endswith('SB'))#以SB结尾 13 #4、format的三种玩法(格式赋值) 14 print('my name is %s my age is %s' $('alex',18)) 15 'my name is {} my age is {}'.format('alex',18)按照顺序传值 16 print('my name is {name} my age is {age}'.format(age=18,name='alex')#不依赖于位置(常用) 17 print('{0} {1} {0}'.format('alex',18)) 18 #5、split,rsplit(把一个字符串切成一个列表) 19 info='root:x:0:0' 20 l=info.split(':') 21 print(l) 22 #6、join(把一个列表按照分隔符变成一个字符串) 23 ':'.join(l) 24 print(':'.join(l)) 25 反例: 26 l=[1,2,3] 27 print(':'.join(l))#只有在列表中的元素全是字符串类型,才能用join拼接 28 #7、replace(取代)(有三个参数old老的值,new要改成什么值,count改几次) 29 msg='alex say my name is alex,alex have on tesla' 30 msg=msg.replace('alex','SB',1)#字符串是不可变类型,压根不能改,要改的话只能存成一个新的值,加上1就代表只改第一个 31 print(msg) 32 33 #8、isdigit(判断字符串内是不是纯数字) 34 age=input('>>>:').strip() 35 print(age.isdigit())#用户如果输入的是123或其他的数字返回值为True,否则False 36 age=int(age)有一个猜年龄的程序,age用int只能把字符串中的数字转成整形才能做if判断和数字的比较 37 age=input('>>>:').strip() 38 if age.isdigit(): 39 age=int(age) 40 else: 41 print('必须输入数字') 42 43 age=int(age)
了解
1 #1、find,rfind,index,rindex,count 2 msg='hello world' 3 print(msg.find('wo'))#返回值为6,就是说能找到第一个字符串的索引(默认从左边开始找,rfind就是从右边找) 4 print(msg.find('SB'))#没有SB,所以返回-1 5 print(msg.index('SB'))#这个的返回值就会报错 6 print(msg.count('l'))#统计l这个字符串就是3个 7 print(msg.count('SB'))#返回值为0 8 9 #2、center,ljust,rjust,zfill(跟打印效果有关) 10 print('egon'.center(30,*))#30为指定宽度,*为填充的字符串,egon集中显示 11 print('egon'.ljust(30,*))#左对齐 12 print('egon'.rjust(30,*))#右对齐 13 print('egon'.zfill(30))#以0为填充符,默认往右对其 14 #3、expandtabs跟tab有关 15 print('hello world'.expandtabs(10)) 16 #4、captalize,swapcase,title 17 print('i am egon'.capitalize())#首字母大写 18 print('i am egon'.title())#每一个单词首字母大写 19 print('i am egon'.swapcase())#大小写反转 20 21 #5、is数字系列 22 #在python3中 23 #isdigit能判断bytes,unicode 24 print(num1.isdigit())# 25 num1=b'4' #bytes 26 num2=u'4' #unicode,python3中无需加u就是unicode#返回值True 27 num3='四' #中文数字#返回值False 28 num4='Ⅳ' #罗马数字#返回值False 29 30 #isnumeric能判断unicode 31 print(num2.isdecimal())True 32 print(num3.isdecimal())False 33 print(num4.isdecimal())False 34 35 #isnumeric来判断unicode,中文,罗马 36 print(num2.isnumeric())True 37 print(num3.isnumeric())True 38 print(num4.isnumeric())True 39 #6、is其他 40 print('===>') 41 name='egon123' 42 print(name.isalnum()) #字符串由字母或数字组成 43 print(name.isalpha()) #字符串只由字母组成 44 45 print(name.isidentifier())#字符串包含关键字 46 print(name.islower())#全都是小写字母用 47 print(name.isupper())#判断大写 48 print(name.isspace())#判断是不是空格 49 print(name.istitle())#判断是不是标题(首字母大写是标题)
列表list
1 #作用:多个装备,多个爱好,多门课程,多个女朋友等 2 3 #定义:[]内可以有多个任意类型的值,逗号分隔 4 # my_girl_friends=['alex','wupeiqi','yuanhao',4,5] #本质my_girl_friends=list([...]) 5 # print(list('hello'))#list会产生一个列表 6 # print(int('123')) 7 # print(str(123))#优先掌握的操作: 8 #1、按索引存取值(正向存取+反向存取):即可存也可以取 9 #2、切片(顾头不顾尾,步长) 10 #3、长度 11 my_girl_friends=['alex','wupeiqi','yuanhao',4,5] 12 print(len(my_girl_friends)) 13 #4、成员运算in和not in 14 print('wupeiqi' in my_girl_friends) 15 #5、追加 16 my_girl_friends[5]=3#IndexError: list assignment index out of range 17 对用的索引只能取出值或者修改值,不能追加 18 my_girl_friends.append(6) 19 print(my_girl_friends) 20 #6、删除 21 del my_girl_friends[0] 22 pirnt(my_girl_friends) 23 #单纯的删除 24 my_girl_friends.remove('yuanhao') 25 #列表中删除并想拿到结果:取走 26 res=my_girl_friends.pop(2)#pop()括号中如果没有值就从末尾去删 27 print(res) 28 29 my_girl_friends=['alex','wupeiqi','yuanhao',4,5] 30 print(my_girl_friends.pop(0))#拿走alex 31 print(my_girl_friends.pop(0))#拿走wupeiqi 32 print(my_girl_friends.pop(0))#拿走yuanhao 33 #7、循环 34 my_girl_friends=['alex','wupeiqi','yuanhao',4,5] 35 i=0 36 while i<len(my_girl_friends): 37 print(my_girl_friends) 38 i+=1 39 第二种方法: 40 for item in my_girl_friends: 41 print(item) 42 43 例子:1到10,不打印出7,用for 44 for item in range(10): 45 if item==7: 46 pass 47 continue 48 print(item) 49 else:(上面只要不被break打断就执行else) 50 print('>>>:') 51 掌握的方法: 52 my_girl_friends=['alex','wupeiqi','yuanhao',4,5] 53 my_girl_friends.insert(1,'egon')#指定索引 54 print(my_girl_friends) 55 56 my_girl_friends.clear()#清空掉 57 print(my_girl_friends) 58 59 l=my_girl_friends.copy()#拷贝一个列表 60 print(l) 61 62 my_girl_friends.count('yuanhao')#统计个数 63 64 my_girl_friends.extend()#往列表中加值 65 # l=['egon1','egon2'] 66 # my_girl_friends.extend(l) 67 # my_girl_friends.extend('hello') 68 # print(my_girl_friends) 69 70 print(my_girl_friends.index('wupeiqi'))#取出索引值 71 72 print(my_girl_friend.reverse())#把值翻转输出 73 74 #排序sort 75 l=[1,10,3,11,12] 76 l.sort() 77 print(l) 78 79 倒着排序 80 l.sort(reverse=True) 81 print(l) 82 83 l=[1,10,3,11,12,'a']#不行,因为数字和字符串不能比较大小 84 85 x='helloworld' 86 y='z' 87 print(y>x)#这个是根据abcd来比较的,因为z在h的后面
#二:该类型总结 1 存一个值or存多个值 可以存多个值,值都可以是任意类型 2 有序 3 可变or不可变 !!!可变:值变,id不变。可变==不可hash
元组tuple
1 #作用:存多个值,对比列表来说,元组不可变(是可以当做字典的key的),主要是用来读 2 3 #定义:与列表类型比,只不过[]换成() 4 age=(11,22,33,44,55)本质age=tuple((11,22,33,44,55)) 5 print(type(age)) 6 验证元组不可变:#元组没有变取决于id 7 age=(11,22,33,44,55) 8 age[0]=12#报错,提示不支持修改 9 t=(1,2,['a','b']) 10 t[2]=='xxx'#代表把元组中的元素改掉了,但是元组是不能改的,但是可以改元素内部的值 11 t[2][0]='A' 12 print(t) 13 这个地方只是把表中的a改成了A但是id没有变 14 15 #优先掌握的操作: 16 #1、按索引取值(正向取+反向取):只能取 17 #2、切片(顾头不顾尾,步长) 18 age=(11,22,33,44,55) 19 print(age[0:3]) 20 print(age) 21 22 #3、长度 23 print(len(age)) 24 #4、成员运算in和not in 25 print(11 in age) 26 #5、循环 27 for item in age: 28 print(item) 29 30 掌握 31 age=(11,22,33,44,55) 32 print(age.index(33))#找索引 33 print(age.count(33))#找个数
#二:该类型总结 1 存一个值or存多个值 可以存多个值,值都可以是什么类型 2 有序 3 可变or不可变
!!!不可变:值变,id就变。不可变==可hash
字典dict
1 #作用:存多个值,key-value存取,取值速度快 2 3 #定义:key必须是不可变类型(int,float,str,tuple),value可以是任意类型 4 定义字典方式info={'name':'egon','age':18,'sex':'male'} #本质info=dict({....}) 5 或 6 了解 7 info=dict(name='egon',age=18,sex='male') 8 或 9 info=dict([['name','egon'],('age',18),('sex','male')]) 10 或 11 info={}.fromkeys(('name','age','sex'),None)#快速产生空字典 12 info={}.fromkeys('hello',None) 13 print(info) 14 #优先掌握的操作: 15 #1、按key存取值:可存可取 16 d={'name':'egon'} 17 print(d['name']) 18 19 d=['age']=18#存数据 20 print(d) 21 #2、长度len 22 info={'name':'egon','age':18,'sex':'male'} 23 print(len(info)) 24 25 #3、成员运算in和not in 26 info={'name':'egon','age':18,'sex':'male'} 27 print('name' in info) 28 29 #4、删除 30 info={'name':'egon','age':18,'sex':'male'} 31 print(info.pop('name'))#对于列表如果不加索引默认是从右边删除,但是字典是无序的,pop必须要传key 32 print(info) 33 34 print(info.popitem())#item就是一个元素,在字典key:value算是一个元素,所以出来的即有key也有value 35 print(info)#最右边的那个值就拿出来了 36 #5、键keys(),值values(),键值对items()了解 37 print(info.keys())#输出的值像是以列表的形式取出 38 但是print(info.keys()[0])#没法取出值,所以不是列表 39 这个key的值可以用来做for循环,for循环不依赖索引 40 for key in info.keys(): 41 print(key) 42 43 print(list(info.keys()))#这个是真正的裂变加[0],可以取值 44 45 print(list(info.keys())) 46 47 print(info.items())#转成真正的列表print(list(info.items())) 48 49 50 #6、循环 51 info={'name':'egon','age':18,'sex':'male'} 52 for k in info: 53 print(k,info[k]) 54 55 其他需要掌握的方法 56 info={'name':'egon','age':18,'sex':'male'} 57 print(info['hobbies'])#不存在的key,就会报错 58 print(info.get('hobbies'))#不会报错,返回none 59 print(info.get('hobbies','没有'))#这个的返回值就是‘没有’ 60 61 info.pop('name1','xxx') 62 print(info.pop('name1','xxx'))#这个的返回值就是‘xxx’,跟get差不对 63 64 info.update 65 info={'name':'egon','age':18,'sex':'male'} 66 d={'x':1,'y',2,'name':'EGON'} 67 info.update(d)#原来的字典没有我给你加上,如果有就更新刚给赋的值 68 print(info) 69 70 info.setdefault() 71 info={'name':'egon','sex':'male'} 72 value=info.setdefault('age',18)#字典中新增一个key:value这个元素,增进去会有个返回值,返回值是曾进去的value 73 print(value) 74 75 info={'name':'egon','age',18,'sex':'male'} 76 value=info.setdefault('age',18)#字典中如果不存在我就把这个key:value加进去,并且返回值是value,如果有这个就不覆盖,返回原来有的值 77 print(value) 78 print(info) 79 80 81 info={'name':'egon'} 82 info['hobbies']=[] 83 info['hobbies'].append('music') 84 info['hobbies'].append('read') 85 print(info) 86 87 info={'name':'egon','hobbies':['music']} 88 if 'hobbies' not in info: 89 info['hobbies']=[] 90 else: 91 info['hobbies'.append('read')] 92 用setdefault实现 93 info={'name':'egon','hobbies':['music']} 94 hobbies_list=info.setdefault('hobbies',[]) 95 print(hobbis_list) 96 hobbies_list.append('read') 97 hobbies_list.append('play') 98 print(info)
#二:该类型总结 1 存一个值or存多个值 可以存多个值,值都可以是任意类型,key必须是不可变类型 2 无序 3 可变or不可变 !!!可变:值变,id不变。可变==不可hash
集合引入
1 # pythons=['egon','axx','ysb','wxx'] 2 # linuxs=['egon','oldboy','oldgirl','smallboy','smallgirl'] 3 # 4 # python_linux=[] 5 # 6 # for student in pythons: 7 # if student in linuxs: 8 # python_linux.append(student) 9 # 10 # print(python_linux)
集合set
1 #作用:关系运算,去重 2 #定义集合:{}内用逗号分割每个元素都必须是不可变类型,元素不能重复,无序 3 # s={1,'a',[1,2]} #TypeError: unhashable type: 'list',不可哈希就是可变类型,可变就不能当字典元素 4 # s={1,2,3,1} #s=set({1,2,3,1}) 5 # print(s,type(s)) 6 注意集合的目的是将不同的值存放到一起,不同的集合间用来做关系运算,无需纠结于集合中单个值 7 8 #优先掌握的操作: 9 #1、长度len 10 # s={1,2,3,1} #s=set({1,2,3,1}) 11 # print(len(s)) 12 13 #2、成员运算in和not in 14 # names={'egon','alex'} 15 # print('egon' in names) 16 17 #3、|合集 18 pythons={'egon','axx','ysb','wxx'} 19 linuxs={'egon','oldboy','oldgirl','smallboy','smallgirl'} 20 21 #4、&交集:同时报名两门课程的学生 22 # print(pythons & linuxs) 23 # print(pythons.intersection(linuxs)) 24 25 #5、|合集:老男孩所有的学生 26 # print(pythons | linuxs) 27 # print(pythons.union(linuxs)) 28 29 #6、^对称差集:没有同时报名两门课程 30 # print(pythons ^ linuxs) 31 # print(pythons.symmetric_difference(linuxs)) 32 33 #7.1 -差集:只报名python课程的学生 34 # print(pythons - linuxs) 35 # print(pythons.difference(linuxs)) 36 37 #7.2 -差集:只报名linux课程的学生 38 # print(linuxs-pythons) 39 40 #8 父集:>,>=,子集:<,<= 41 # s1={1,2,3} 42 # s2={1,2,} 43 # print(s1 >= s2) 44 # print(s1.issuperset(s2))#s1是s2它爹 45 # print(s2.issubset(s1))#判断S2是S1它儿子 46 47 # linuxs={'egon','oldboy','oldgirl','smallboy','smallgirl'} 48 # for student in linuxs: 49 # print(student) 50 51 52 53 #了解的知识点 54 # s1={1,2,3} 55 # s2={1,2,} 56 # print(s1-s2) 57 # print(s1.difference(s2)) 58 # s1.difference_update(s2) #s1=s1.difference(s2) 59 # print(s1) 60 61 # s2={1,2,3,4,5,'a'} 62 # print(s2.pop()) 63 64 # s2.add('b') 65 # print(s2) 66 67 # s2.discard('b') 68 # s2.remove('b') #删除的元素不存在则报错 69 # print(s2) 70 71 72 # s1={1,2,3,4,5,'a'} 73 # s2={'b','c',} 74 # print(s1.isdisjoint(s2)) #两个集合没有共同部分时,返回值为True 75 76 77 # s2={1,2,3,4,5,'a'} 78 # s2.update({6,7,8}) 79 # print(s2) 80 81 去重: 82 # l=['a','b',1,'a','a']#s=set(1)print(s)set指的是去掉重复的 83 # print(list(set(l)))# 84 85 # print(set('hello'))#一个个输出,没有顺序 86 # print(set({'a':1,'b':2,'c':3}))##for循环字典得到的就是Key 87 88 s1={1,2,3} 89 s2={2,3,} 90 print(s1-s2)#s1并不变 91 print(s1.difference(s2)) 92 print(s1.defference_update(s2))#减完了以后并更新相当于赋值操作s1=s1.difference(s2) 93 print(s1) 94 了解的知识点: 95 s1={1,2,3,4,5,'a'} 96 print(s1.pop())#删的意思,随机删 97 s1.add('b')#只能添加不可变类型进去 98 print(s1.add('b')) 99 s1.discard(s1)#明确指出删除的值# 100 s1.remove('b')#如果用这个删除集合中没有的字符串会报错,discard就不会报错 101 102 s1={1,2,3,4,5,'a'} 103 s2={'b','c'} 104 print(s1.isdisjoint(s2))#两个集合没有共同部分时,返回值为True 105 106 s1={1,2,3,4,5,'a'} 107 s2.update({6,7,8})#add只能加一个值,update可以加多个值 108 print(s2)
数据类型总结:
按存储空间的占用分(从低到高)
数字
字符串
集合:无序,即无序存索引相关信息
元组:有序,需要存索引相关信息,不可变
列表:有序,需要存索引相关信息,可变,需要处理数据的增删改
字典:无序,需要存key与value映射的相关信息,可变,需要处理数据的增删改
按存值个数区分
标量/原子类型 | 数字,字符串 |
容器类型 | 列表,元组,字典 |
按可变不可变区分
可变 | 列表,字典,集合 |
不可变 | 数字,字符串,元组 |
按访问顺序区分
直接访问 | 数字 |
顺序访问(序列类型) | 字符串,列表,元组 |
key值访问(映射类型) | 字典 |
字符编码:
字符编码总结:
1.存取文件不乱码的法则:用什么编码存的,用什么编码读
2.unicode----------encode-------->转成其他编码gbk,叫做encode
gbk-------->decode----------->unicode
3. python3解释器默认使用的字符编码是utf-8
python2解释器默认使用的字符编码 ascii
4.python2的str就是python3的bytes
python2的unicode就是python3的str
文件处理:
f=open( 'a.txt','rt',encoding='utf-8')#r默认就是rt文本模式#是操作系统打开这个文件,windows默认编码是gbk,而我存的是utf-8存的,所以我们要加上encoding='utf-8',告诉操作系统用utf-8打开,就不会报错了
data=f.read()#对出文件内容
print(data)
f.close()#关闭文件,回收的是操作系统的资源
如果这个时候在f.read(),就看不到了,因为文件关闭,操作系统已经回收了资源,所以看不到
with open( 'a.txt','rt',encoding='utf-8') as f:#文件打开的值给f
pass#执行完这个子代码后with会自动执行f.close()操作,避免忘记close()操作
f=open( 'a.txt','rt',encoding='utf-8')
data=f.read()
print('==1=>',data1)
data2=f.read()#这个意思是光标从文件的开始已经到了结尾,如果在print下面的2就为空了
print(==2=>,data2)
print(f.readline())#代表的是每次读一行
print(f.readline())#这个跟上面的输出结果会有空格(换行),想取消print换行就 print(f.readline(),end='')
print(f.readlines())#这个也是吧文件中的内容都读出来,但是会把文件内容放到列表中去
只限文件小的时候,因为如果文件过大,一下就会读到内存中去
写操作
f=open( 'a.txt','w',encoding='utf-8')#如果用r并且没有a.txt这个文件,那么就会报错,用w的话不会报错,没有这个文件就会造出这个文件出来,如果文件存在,还用w,就是相当于有创建了个文件,并把文件原来的文件覆盖掉了
f=open( 'a.txt','w',encoding='utf-8')
f.write('1111 ')
f.write('2222 ')#还可以f.write('111 222 ')
f.close()
f.writelines(['哈哈哈 ','你好','alex'])#可以通过列表或元组形式写到里面去