我的python之路【第二章】循环-内置方法-数据类型
一、判断表达式:if...elif...else
用法:
if <条件>:
.....
else:
....
我们先写一个简单的小程序,熟悉一下
#liuhao #if else简单应用 #场景一、用户登录验证 import getpass name = input("请输入用户名:") pwd= input("请输入密码") #使用getpass模块隐藏用户输入密码,但是pycharm不支持~ #pwd=getpass.getpass("请输入用户名") if name=='alex' and pwd=='123': print("验证通过") else: print("验证失败")
场景二、猜年龄游戏
在程序里设定好你的年龄,然后启动程序让用户猜测,用户输入后,根据他的输入提示用户输入的是否正确,如果错误,提示是猜大了还是小了。
这个程序你可以先尝试自己去写一下,
age=25 guess_age=int(input("请尝试猜一下alex的年龄~有惊喜啊!").strip()) if guess_age ==25: print("你好牛啊,真的猜出来了。你们是不是搞基呀?") elif guess_age >25: print("你也太坏了,alex年纪有那么大吗?") elif guess_age<25: print("你猜的太小啦~")
你会发现,这个程序运行有些问题,程序每次运行我只能猜一次年龄。如果我们想猜多次呢?
二、for 循环
最简单的for循环示例:
#liuhao #打印 0-9 for i in range(10): print(i) #输出: 0 1 2 3 4 5 6 7 8 9
continue的用法:
范例1:循环打印0-9,当打印到5的时候跳过,不打印5.
#打印 0-9 for i in range(10): if i==5: continue #跳过此次循环,进行下一次循环 print('loop:',i)
范例2:还是这个程序,当遇到5时不进行打印,直接退出当前循环。
#打印 0-9 for i in range(10): if i==5: break #执行退出当前循环 print('loop:',i)
范例3:内外两层循环,进行内循环
#打印 0-9 for i in range(10): if i==5: for i in range(10): print("inloop:",i) if i ==5: break continue print('outloop:',i)
执行结果:
outloop: 0 outloop: 1 outloop: 2 outloop: 3 outloop: 4 inloop: 0 inloop: 1 inloop: 2 inloop: 3 inloop: 4 inloop: 5 outloop: 6 outloop: 7 outloop: 8 outloop: 9
三、while 循环
范例1:无限循环
count=0 #这就是一个死循环,while 判断 True 就是真,每一次循环都是真 while True: print("就是死循环,",count) count+=1
范例2:循环100次,程序退出
#liuhao count=0 while True: print("就是死循环,",count) if count== 100: #判断循环到100,执行退出 break count+=1
练习题:如何实现让用户不断的猜年龄,但只给最多3次机会,再猜不对就退出程序,猜对了,直接退出。
#liuhao count=0 while count<3: age=25 guess_age=int(input("请尝试猜一下alex的年龄~有惊喜啊!").strip()) if guess_age ==25: print("你好牛啊,真的猜出来了。你们是不是搞基呀?") break elif guess_age >25: print("你也太坏了,alex年纪有那么大吗?") elif guess_age<25: print("你猜的太小啦~") count+=1
四、字符串操作:特性不可修改
name="my name is alex" #设置一个字符串。
#字符串的首字母大写 print(name.capitalize())
#输出:
My name is alex
#统计字符串种单个字符'a'的个数 print(name.count('a')) #输出 2
#一共打印50个字符,字符串居中,字符个数不足50的位置用#补全 print(name.center(50,'#')) #ljust,rjust.定义50个字符,字符串一个居左,一个居右对齐 print(name.ljust(50,'*')) print(name.rjust(50,'*'))
#输出 #################my name is alex################## my name is alex*********************************** ***********************************my name is alex
#expandtabs()设置一个\t特殊字符,代表距离为多少个字符 a="a\tb" #代表一个tab为30个字符的距离 print(a.expandtabs(30)) #输出: a b
#find,获取字符的位置 print(name.find("is")) #获取is在name中的(字符位置-1), print(name[0:name.find("is")]) #对字符进行切片 #输出: #8 #my name 这里还发现name后面还有一个空格。
#rfind找到最后一个值得下标返回 print('alex lil'.rfind('l'))
#format格式化输出 a="this is {name},he is {age}" print(a.format(name="alex",age=33)) #字典格式化输出 print(a.format_map({'name':'liuhao','age':'23'})) #输出: #this is alex,he is 33 #this is liuhao,he is 23
以下是str格式进行判断的函数,返回的为布尔类型
#判断字符串的结尾是不是ex,返回布尔值 print(name.endswith("ex")) #判断是否为数字或字母。不能有特殊字符。返回布尔值 print('2222'.isalnum()) #判断只为字符,返回布尔值 print("abA".isalpha()) #判断是不是一个整数,常用 print("2222".isdigit()) #判断是不是一个合法的标识符,字符和_开头 print('d77sss'.isidentifier()) #判断为小写 print('a'.islower()) #判断是不是每个首字母大写 print("I Am Is".istitle())
#字符串join用法,用前面的填充后面的 print("666is ".join("====")) print('+'.join(['1','2','3'])) #将前面的字符,分割加入到后面 #输出 #=666is =666is =666is = #1+2+3
#全部变小写,全部变大写 print('Alex'.lower()) print('Alex'.upper()) #输出 #alex #ALEX
#去掉两边的换行符strip() #去掉左边的换行符,lstrip#rstrip去掉右边的换行符 print('\nAlex'.lstrip()) #输出 #Alex
#编码,将前面的字符进行加密。与后面的密码集进行对应。 p=str.maketrans("abcdef",'123456') print("alex li".translate(p)) #输出 #1l5x li
#replace替换,将l替换为L,只替换一个 print('alex li'.replace('l','L',1)) #输出 #aLex li
#分割,将字符串分割为列表,默认为空格 print('al ex dd li l ss'.split()) print('1+2+3+4'.split('+')) #字符串大小写转换 print('Alex Li'.swapcase()) #输出: #['al', 'ex', 'dd', 'li', 'l', 'ss'] #['1', '2', '3', '4'] #aLEX lI
全部整体脚本测试:
#liuhao name="my name is alex" #首字母大写 print(name.capitalize()) #统计字符的个数 print(name.count('a')) #一共打印50个字符,不够的用#补全 print(name.center(50,'#')) #ljust,rjust.定义50个字符,不够的填充 print(name.ljust(50,'*')) print(name.rjust(50,'*')) #设置\t距离为多少个字符 a="a\tb" print(a.expandtabs(30)) #find,获取字符的位置 print(name.find("is")) print(name[0:name.find("is")]) #format格式化输出 a="this is {name},he is {age}" print(a.format(name="alex",age=33)) #字典格式化输出 print(a.format_map({'name':'liuhao','age':'23'})) #判断结尾是不是ex,返回布尔值 print(name.endswith("ex")) #判断是否为数字+字母。不能有特殊字符。返回布尔值 print('2222'.isalnum()) #判断只为字符, print("abA".isalpha()) #判断是不是一个整数,常用 print("2222".isdigit()) #判断是不是一个合法的标识符,字符和_开头 print('d77sss'.isidentifier()) #判断为小写 print('a'.islower()) #判断是不是每个首字母大写 print("I Am Is".istitle()) #字符串join用法,用前面的填充后面的 print("666is ".join("====")) print('+'.join(['1','2','3'])) #全部变小写,全部变大写 print('Alex'.lower()) print('Alex'.upper()) #去掉左边的换行符,lstrip#rstrip去掉右边的换行符 print('\nAlex'.lstrip()) print('-------') #去掉两边的换行符strip() #编码, p=str.maketrans("abcdef",'123456') print("alex li".translate(p)) #replace替换,将l替换为L,只替换一个 print('alex li'.replace('l','L',1)) #rfind找到最后一个值得下标返回 print('alex lil'.rfind('l')) #分割,将字符串分割为列表,默认为空格 print('al ex dd li l ss'.split()) print('1+2+3+4'.split('+')) #字符串大小写转换 print('Alex Li'.swapcase())
测试结果
C:\Users\liuhao\AppData\Local\Programs\Python\Python35\python.exe C:/Users/liuhao/PycharmProjects/s16/day2/str_字符串函数.py My name is alex 2 #################my name is alex################## my name is alex*********************************** ***********************************my name is alex a b 8 my name this is alex,he is 33 this is liuhao,he is 23 True True True True True True True =666is =666is =666is = 1+2+3 alex ALEX Alex ------- 1l5x li aLex li 7 ['al', 'ex', 'dd', 'li', 'l', 'ss'] ['1', '2', '3', '4'] aLEX lI Process finished with exit code 0
五、字典
字典是无序的,通过key:value键值对的方式存取
先写一个字典,对字典的基础操作。
info = { 'student01':"TengLan Wu", 'student02':"LongZe Luola", 'student03':"XiaoZe Maliya" }
#打印全部字典 print(info) #通过key值,获取value print(info["student01"]) #修改字典 info["student01"]="武藤兰" #增加字典 info["student04"]="ChangJingkong"
del info["student01"] print(info) #输出结果:{'student03': 'XiaoZe Maliya', 'student02': 'LongZe Luola'} info.pop("student02") #输出结果:{'student03': 'XiaoZe Maliya'} print(info) #随机删除一个 info.popitem() print(info) #输出结果:{}
info = { 'student01':"TengLan Wu", 'student02':"LongZe Luola", 'student03':"XiaoZe Maliya" } #查找: # 确定有key值 print(info["student01"]) #输出:TengLan Wu #不确定是否有key值,没有返回None print(info.get('student02122')) #输出:LongZe Luola #判断是否存在key.返回布尔值 print('student01' in info) #输出:True
利用eval将字符串转换为字典
#转换为字典 a="{'name' : 'jim', 'sex' : 'male', 'age': 18}" #注意此处是字符串形式 b=eval(a) print(b) #输出结果:{'age': 18, 'sex': 'male', 'name': 'jim'}
字典的多级嵌套,其中可以嵌套:字典,字符,数字,列表,元组
范例:
av_catalog = { "欧美":{ "www.youporn.com": ["很多免费的,世界最大的","质量一般"], "www.pornhub.com": ["很多免费的,也很大","质量比yourporn高点"], "letmedothistoyou.com": ["多是自拍,高质量图片很多","资源不多,更新慢"], "x-art.com":["质量很高,真的很高","全部收费,屌比请绕过"] }, "日韩":{ "tokyo-hot":["质量怎样不清楚,个人已经不喜欢日韩范了","听说是收费的"] }, "大陆":{ "1024":["全部免费,真好,好人一生平安","服务器在国外,慢"] } }
#字典多级嵌套修改值,key尽量不要用中文 av_catalog["大陆"]["1024"][1]="可以在国内做个镜像" #print(av_catalog) #打印字典里的key值 print(av_catalog.keys()) #输出:dict_keys(['日韩', '大陆', '欧美']) #添加一个字典。 av_catalog.setdefault("台湾",{"www.baidu.com":[1,2,3,4]}) print(av_catalog) #如果key存在,就不添加,返回他的值 av_catalog.setdefault("大陆",{"www.baidu.com":[1,2,3,4]}) print(av_catalog)
两个字典合并:
info = { 'student01':"TengLan Wu", 'student02':"LongZe Luola", 'student03':"XiaoZe Maliya" } b={ 'student01':'Alex', 1:3, 3:4 } #合并info和b两个字典,有重复的key,进行赋值。没有重复的,进行添加(info.update) info.update(b) print(info) #输出:{3: 4, 1: 3, 'student03': 'XiaoZe Maliya', 'student02': 'LongZe Luola', 'student01': 'Alex'} #将一个字典转换成一个列表(info.items) print(info.items()) #输出:dict_items([(1, 3), (3, 4), ('student03', 'XiaoZe Maliya'), ('student01', 'Alex'), ('student02', 'LongZe Luola')])
初始化一个字典:
#初始化一个字典,key为列表中的值,value为"tt"。只适用于定义第一层的值,不使用与套字典 b=dict.fromkeys([1,2,3,4],'tt') print(b) #输出{1: 'tt', 2: 'tt', 3: 'tt', 4: 'tt'} #此处的1,2,3,4为key值,由于列表存在了内存中,修改值得时候,修改的同一块内存,类似于log中的问题。 c=dict.fromkeys([1,2,3,4],['name',{'tt':"sss"}]) print(c) #输出:{1: ['name', {'tt': 'sss'}], 2: ['name', {'tt': 'sss'}], 3: ['name', {'tt': 'sss'}], 4: ['name', {'tt': 'sss'}]} #这里请注意观察,下面只是进行修改了一个 key值对应的value。所有key对应的value都发生了改变 #原因,这里所有列表的内存地址,指向的是同一块内存地址,所以发生改变就会全部发生变化 c[2][1]["tt"]="alex" print(c) #输出:{1: ['name', {'tt': 'alex'}], 2: ['name', {'tt': 'alex'}], 3: ['name', {'tt': 'alex'}], 4: ['name', {'tt': 'alex'}]}
循环查询字典的方法:
#for循环查看字典 info = { 'student01':"TengLan Wu", 'student02':"LongZe Luola", 'student03':"XiaoZe Maliya" } #推荐使用,基本循环查看字典 for i in info: print(i,info[i]) #这个会有一个把字典转成列表(items)。不高效,推荐上面的操作 for k,v in info.items(): print(k,v)
六、文件操作
#liuhao #打开文件指定字符编码集,encoding="utf-8" #data=open("test",encoding="utf-8").read() #将文件的内存对象保存给f #(文件句柄) #读文件(默认open就是读模式) #f=open("test",'r',encoding="utf-8") #data=f.read() #print(data) ''' # w 写文件(以写打开文件,创建一个文件。) f=open("test2",'w',encoding="utf-8") f.write("我爱北京天安门,\n") f.write("天安门上太阳升\n") f.close() # a=append追加,(可以追加的写内容,不能读文件) f=open("test2",'a',encoding="utf-8") f.write("我爱北京天安门,\n") f.write("天安门上太阳升\n") f.close() ''' f=open("test","r",encoding="utf-8") #for i in range(5): # print(f.readline()) #print(f.readlines()) ''' #readlines()打印全部。 for line in f.readlines(): print(line) ''' #readlines()只适合读小文件,大文件会把内存读死 '''for index,line in enumerate(f.readlines()): if index==9: print("-----我是分隔符-----------") continue print(line.strip()) ''' #高逼格,一行行读,不占用内存。边读边覆盖 #高效率,只用这种方法。f 变成了迭代器了。 '''for line in f: print(line) ''' #f.tell()查看当前光标读取位置,seek()修改光标读取位置 ''' print(f.tell()) print(f.readline()) print(f.tell()) print(f.readline()) print(f.tell()) f.seek(10) print(f.readline()) #打印文件的编码 print(f.encoding) #返回内存编号 print(f.fileno()) ''' ''' #刷新,写文件时候,缓存达到一定的量,写入硬盘 print(f.flush()) #实时刷新,没执行完写操作,执行f.flush() ''' #b=open("test2",'a',encoding='utf-8') #截断, #b.truncate(20) #打开test2文件,发现只剩下从开头到20个字符的内容 ''' #读写模式,用于读取已经存在的文件,在文件末尾追加内容。 file=open("test2",'r+',encoding='utf-8') print(file.readline()) print(file.readline()) print(file.tell()) file.write("\n---------------diao------------") print(file.readline()) ''' ''' #a+模式,追加读file2=open("test2",'a+',encoding='utf-8') #写读模式,用于创建文件,同时进行写入操作。没什么用。一般不用 file2=open("test2",'w+',encoding='utf-8') file2.write("-------------1\n") file2.write("-------------2\n") file2.write("-------------3\n") file2.write("-------------4\n") #此处移动光标位置,在10 的位置进行写入操作。 file2.seek(10) print(file2.tell()) file2.write("dialdiao") ''' #二进制文件读,二进制模式没有编码格式。不指定'encoding' #file2=open("test2",'rb') #以二进制文件模式打开写入文本模式 file2 = open("test2",'wb') #写入内容,指定编码方式encode默认系统编码。encode转换为二进制 file2.write("hellow binary\n".encode()) file2.close() #"U"表示在读取时,可以将\r\n \r\n自动转换成\n(与r或r+模式同时使用) #rU r+U
推荐用法:
#程序会帮你自动关闭文件。 with open("test2.bak",'r',encoding='utf-8') as file : for i in file: print(i) #python规范,一行不超过80个字符,建议换行 with open("test2.bak",'r',encoding='utf-8') as f1,\ open("test2",'r',encoding='utf-8') as f2: for i in f1: print(i) for i in f2: print(i)
小知识:
打印进度条
#进度条 import sys,time for i in range(20): sys.stdout.write("#") sys.stdout.flush() time.sleep(0.5)
七、集合
基本操作
#liuhao #无序的 #添加 list_1=set([1,2,3,4,9]) list_1.add(999) list_1.update([888,777,555]) print(list_1) #删除,元素不存在会报错 list_1.remove(9) #删除,元素存不存在都不会返回值 print(list_1.difference(888)) print(list_1) #随机删除 print(list_1.pop()) print(list_1.pop()) print(list_1.pop()) #集合的长度 print(len(list_1)) #判断在不在集合里 a=1 in list_1 print(a)
交集、并集、差集、子集、父集、对等差集
#liuhao list_1=[1,2,3,4,5,5,5,6,2,1] list_1=set(list_1) #打印集合,集合是无序且不重复的 print(list_1) list_2=set([2,4,66,5,66,22]) print(list_1,list_2) #交集 print(list_1.intersection(list_2)) #并集 print(list_1.union(list_2)) #差集list_1中,list_2中没有的。 print(list_1.difference(list_2)) print(list_2.difference(list_1)) #子集,list_3是list1的自己 list_3=set( [2,4]) print(list_3.issubset(list_1)) #父集,list_1是list_3的父集 print(list_1.issuperset(list_3)) #对称差集,两个中相互没有的 print(list_1.symmetric_difference(list_2)) print("-------------------------") list_4=set([1,3]) #没有交集 print(list_3.isdisjoint(list_4)) list_1=set([1,2,3]) list_2=set([2,3,4]) #交集 print(list_1&list_2) #并集 print(list_2|list_1) #差集 print(list_2-list_1) print(list_1-list_2) #对称差集 print(list_1 ^list_2)