一、前言
接下来通过一些习题练习下代码感,以及熟悉解题思路和基本函数使用,参考博客:https://www.cnblogs.com/poloyy/p/15255670.html
二、习题实战
1、open函数、字典.items()、with open() as f 、f格式化字符串
题目1:
有一个数据list of dict如下 lists = [ {"test1": "1111"}, {"test2": "2222"}, ] 写入到本地一个txt文件,内容格式如下: test1,1111 test2,2222
答案:
''' 解题思路: 打开文件 循环列表,提取字典 提取key,value 写入文件 ''' lists = [ {"test1": "1111"}, {"test2": "2222"}, ] with open("test.txt","w+",encoding="utf-8") as f: for i in lists: for key,value in i.items(): # python的字符串前面加f表示格式化字符串,加f后可以在字符串里面使用用花括号括起来的变量和表达式 f.write(f"{key},{value}\n")
1)open() 函数的语法为:
f = open(file, mode, encoding)
file:表示要保存或要打开的文件的路径,可以是相对路径,也可以是绝对路径。
mode:表示数据以何种方式打开、写入文本。
encoding:指定了文件的编码方式。
2)字典 items() 函数
该函数是以列表返回可遍历的(键, 值) 元组数组,可以用于 for 来循环遍历;items() 方法把字典中每对 key 和 value 组成一个元组,并把这些元组放在列表中返回。
--使用语法:dict.items()
--返回值:返回列表
3)with open() as f
在操作文件完成之后,需要调用close()方法关闭文件。因为文件对象会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限的。由于文件读写时有可能产生IOError,一旦出错,后面的f.close()就不会调用。所以,为了保证无论是否出错都能正确地关闭文件,我们可以使用try ... finally通过捕捉异常、处理异常来实现。如果能保证文件打开没有异常的情况下,我们每次都这么写,实在太繁琐。所以,Python引入了with语句来自动帮我们调用close()方法。也就是说:文件读取的这个操作,只有在with语句内部才会生效,不会离开。
语法:
with
open
(文件名, 模式) as 文件对象:
文件对象.方法()
由此可见:with自带回收机制,代码更加简洁、优美,不必调用close()方法。
4)f格式化字符串:
python的字符串前面加f表示格式化字符串,加f后可以在字符串里面使用用花括号括起来的变量和表达式
2、列表index()、列表append()、len()函数、range()函数
题目2:
a = [1, 2, 3, 4, 5] b = ["a", "b", "c", "d", "e"] 如何得出c = ["a1", "b2", "c3", "d4", "e5"]
答案:
''' 解题思路: a、b两个列表长度一致,获取长度 一个for循环,每次获取同下标值 字符串拼接,添加到c列表 ''' a = [1,2,3,4,5] b = ["a","b","c","d","e"] c = [] # 方案一 for i in a: # 循环a列表,1-5 inx = a.index(i) # a.index(1),用index函数获取值1在a列表的位置:0,即inx=0 # 循环后inx输出结果为:0 1 2 3 4 d = b[inx] # 直接用下标获取b列表值,比如b[0]即等于"a" # 循环后d输出的结果为:a b c d e if d != -1: # d != -1 判断是起到什么作用?如果b[inx]不存在,那么d=-1 c.append(f"{d}{i}") print(c) # 方案二 e = [] for i in range(0,len(a)): # a的len=5,range(0,5) 输出结果为[0,1,2,3,4] ,i从range范围循环,即i从0-4循环 a1 = a[i] # a[0]=1 b1 = b[i] # b[0]=a e.append(f"{b1}{a1}") print(e)
1)列表index()
index()方法搜索列表中的元素并返回其索引值,注意: Python中的索引从0开始,而不是1。还有 index() 方法仅返回值的首次出现
fruits = ['apple', 'banana', 'cherry'] x = fruits.index("cherry")
值 "cherry" 的位置是:2
2)列表append()
append() 函数可以向列表末尾添加元素。语法:list.append(element),
- element:任何类型的元素,比如普通类型:数值、字符串,集合类型:元组(1,2,3)、列表[a,c,b]
- 使用 append() 函数添加列表时,是添加列表的「引用地址」而不是添加列表内容,当被添加的列表发生变化时,添加后的列表也会同步发生变化。
3)len()函数
1:作用:返回字符串、列表、字典、元组等长度
2:语法:len(str)
3:参数:
str:要计算的字符串、列表、字典、元组等
4:返回值:字符串、列表、字典、元组等元素的长度
4)range()函数
range()函数:用于生成一个整数序列,打印时 print(list(a))
range()的三种创建方式:
第一种:只有一个参数(小括号中只给了一个数)即range(stop) ,比如range(10),指的是默认从0开始,步长为1,不包括10,则输出[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
第二种:range(start,stop) (给了两个参数,即小括号中给了两个数),比如range(1,10),则输出[1, 2, 3, 4, 5, 6, 7, 8, 9]
第三种:range(start,stop,step):创建一个在[start,stop)之间,步长为step; 比如range(1,10,2),则输出[1, 3, 5, 7, 9]
range()函数中可以使用in 和not in 判断整数序列中是否存在(不存在)指定的整数,例如:
在上面第三种的基础上 print(10 in r) 运行结果为False; print(9 in r)运行结果为True ;print(10 not in r)运行结果为True;print(9 not in r)的运行结果为False;
range类型的优点:不管range对象表示的整数序列有多长,所有range对象占用的内存空间都是相同的,因为仅仅需要储存start,stop,step,只有当用到range对象时,才会去计算序列中的相关元素
3、split()函数、正则表达式re模式re.findall()函数
题目3:
写一个小程序:控制台输入邮箱地址(格式为 username@companyname.com), 程序识别用户名和公司名后,将用户名和公司名输出到控制台。 要求: 1. 校验输入内容是否符合规范(xx@polo.com), 如是进入下一步,如否则抛出提 示"incorrect email format"。注意必须以.com 结尾 2. 可以循环“输入--输出判断结果”这整个过程 3. 按字母 Q(不区分大小写)退出循环,结束程序
答案:
''' 解题思路: 固定以.com结尾,用正则匹配 以 @ 和 . 分割字符串 提取username和companyname ''' import re while True: email = input("请输入邮箱:") if email.upper() == "Q": # upper() 方法将字符串中的小写字母转为大写字母 break # 若用户输入字母Q或q,则中断退出 # findall(pattern, string, flags=0),返回string中所有与pattern匹配的全部字串,返回形式为数组 # 用$符号表示以.com结尾的字符串返回,判断是否字符串结束的字符串 res = re.findall(".com$", email) # 输出结果为:['.com'] if not res: print("incorrect email format") else: temp = email.split("@") # 若用户输入11@qq.com,则输出结果为['11', 'qq.com'] name = temp[0] com = temp[1].split(".")[0] print(f"username:{name} , companyName:{com}") # 输出结果为 username:11 , companyName:qq
1)split()函数
split() 通过指定分隔符对字符串进行切片。返回值:返回分割后的字符串列表。
2)re.findall()函数
findall(pattern,string,flags=0)返回string中所有与pattern匹配的全部字符串,返回形式为数组。
re.search()返回的是匹配的字符串,只匹配第一个;re.findall()匹配上几个就返回几个,用数组形式返回。
import re str = 'aabbabaabbaa' # 一个"."就是匹配除 \n (换行符)以外的任意一个字符 print(re.findall(r'a.b', str)) # ['aab', 'aab'] # *前面的字符出现0次或以上 print(re.findall(r'a*b', str)) # ['aab', 'b', 'ab', 'aab', 'b'] # 贪婪,匹配从.*前面为开始到后面为结束的所有内容 print(re.findall(r'a.*b', str)) # ['aabbabaabb'] # 非贪婪,遇到开始和结束就进行截取,因此截取多次符合的结果,中间没有字符也会被截取 print(re.findall(r'a.*?b', str)) # ['aab', 'ab', 'aab'] # 非贪婪,与上面一样,只是与上面的相比多了一个括号,只保留括号的内容 print(re.findall(r'a(.*?)b', str)) # ['a', '', 'a'] str = '''aabbab aabbaa bb''' # 后面多加了2个b # 没有把最后一个换行的aab算进来 print(re.findall(r'a.*?b', str)) # ['aab', 'ab', 'aab'] # re.S不会对\n进行中断 print(re.findall(r'a.*?b', str, re.S)) # ['aab', 'ab', 'aab', 'aa\n b']标签:Python,练习,列表,re,range,字符串,print,习题,findall From: https://www.cnblogs.com/Chilam007/p/16988961.html