Python - 习题练习(1-3)

一、前言

  接下来通过一些习题练习下代码感,以及熟悉解题思路和基本函数使用,参考博客: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:

写一个小程序:控制台输入邮箱地址(格式为 [email protected]), 程序识别用户名和公司名后,将用户名和公司名输出到控制台。 
要求: 
1. 校验输入内容是否符合规范([email protected]), 如是进入下一步,如否则抛出提 示"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("@") # 若用户输入[email protected],则输出结果为['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']


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章