先来听一个恐怖故事😲
在一个月黑风高的夜晚🌒,林大夕可同学埋头于昏黄的台灯下,为不久之后的Python期末考试做着复习。时间不多了,他把重点放在输入输出,字符串、列表、字典的操作上,至于函数与类,只是匆匆扫了一眼,他认为凭借着在字符串、列表、字典上较为熟练的操作,应该就勉强能及格了。 可万万没想到的是,不久之后的考场上,在浏览考题的那半分钟里,仿佛是有数道惊雷在耳边炸响——他复习的内容全都没考… 题目净是些诸如带有可变参数的函数、用类实现发牌等等。 这样一来,林大夕可同学的补考也就随之提上了日程。
这两个月以来,我断断续续地为Python补考做了很多准备🙇🏻♂️,包括
阅读Python Cookbook约1/3的内容阅读Python官方文档中的入门教程与部分标准库参考完成PTA上的浙大版《Python 程序设计》题目集与学校老师出的5套题目集在经历了这个过程后,很多Python相关的知识都能够灵活运用了~ 🥳
然而到目前为止,学校还没通知补考时间和补考地点。再加上对翻书马冬梅,考试孙红雷的墙裂担忧,我便把各种知识点与题型进行了系统性的总结,等到补考(很可能安排在下学期)前也不用到时候再四处找零散的复习资料了,将这份总结看上一看、练上一练,应该会有事半功倍的效果。
同时,希望这份Python总结也能够帮助到很多正在为学校里的Python考试(尤其是试题以编程题居多的考试)而做着准备🧑🏻💻的小可爱们~
一、知识储备 1. 输入输出 1.1 输入 1.1.1 拆分输入数据使用map()与split()将输入数据进行拆分
注:map()与split()的组合会自动忽略空格
a, b, c = map(int, input().split())# split()中为将元素拆分的标志,默认为空格value = b*b - 4*a*cprint(value)1.1.2 设定截止位只要#之前的输入内容
a = input()s = ''for i in a: if i == '#':break s = s + i# 将'#'前的输入数据储存到s中1.1.3 去调输入前后的空格strip():去掉元素前后方的空格,但中间的空格不去掉
s1 = input().strip()s2 = input().strip()print(s1)print(s2)1.1.4 所输即所得eval():直接将字符串当作有效的表达式(可以暂且理解为直接去掉字符串的双引号)
test = eval(input())# 尝试输入内容1:[1, 2, 3, 4, 5]# 尝试输入内容2:{'John': 89, 'Dutton': 95}print(test)print(type(test))# 查看经过eval转化后的类型 result_dict = {"+": "x+y", "-": "x-y", "*": "x*y", "/": "x/y if y!=0 else 'divided by zero'"}x = int(input())op = input()y = int(input())result = eval(result_dict[op])print(result)1.2 输出 1.2.1 格式化输出format :,引导符号用于填充的单个字符< 左对齐 > 右对齐 ^居中对齐输出宽度千位分隔符小数部分的精度整数类型或浮点数类型{index : space . decimal_precision conversion_type}
a, b = map(int, input().split(","))for i in range(a, b):print("{:^6d} | {:^6d} | {:^6d} | {:^6d}".format(i, i**2, i**3, i**4))1.2.2 end # python默认输出会换行# 使用end=''可以将前后输出内容连接在一行print("Linda", end='_') print("Silk") 2. 列表、元组、集合、字典![](https://img-blog.csdnimg.cn/20200521115227428.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1NoZXJsb29vY2s=,size_16,color_FFFFFF,t_70#pic_center)
⚠️注意:像 insert ,remove 或者 sort 能够修改列表中元素的方法,没有打印出返回值(它们返回默认值 None ,这是Python中所有可变数据结构的设计原则)。
举个栗子🌰
hosts = ['Dolores', 'Angela', 'Charlotte']# 1. insert修改了原来的列表hosts.insert(1, 'William')print(hosts)# 直接调用原列表名,会得到修改后的列表new_hosts = hosts.insert(2, 'Teddy')# 若创建一个变量存放返回结果,变量的值会变为Noneprint(new_hosts)# 2. index并未修改原来的列表position = hosts.index('Dolores')# 可创建一个变量存放返回结果print(position)2.1.1 增、删、改、查①. 增加/插入
append():在list的最后加入一个元素
courses = ['History', 'Math', 'Physics']courses.append('Art')extend():在list的最后加入一个列表
courses = ['History', 'Math', 'Physics']courses_2 = ['Art', 'Education']courses.extend(courses2)insert():在list的某个位置加入一个元素
courses = ['History', 'Math', 'Physics']courses.insert(0, 'Art')②. 删除
remove():删除list中的特定元素
courses = ['History', 'Math', 'Physics']courses.remove('Math')pop():移除list最后一个元素
courses = ['History', 'Math', 'Physics']courses.pop()③. 修改
courses = ['History', 'Math', 'Physics']courses[0] = 'Art'④. 查询
index():查询某元素的在列表中的位置(索引)
courses = ['History', 'Math', 'Physics', 'CompSci']print(courses.index('CompSci'))in:查询某元素是否在列表中
courses = ['History', 'Math', 'Physics', 'CompSci']print('Art' in courses)列表中用到:index(), in
字符串中用到:find(), count(), in
使用find()时,若查询的元素存在,返回首次出现的位置索引;若不存在,返回 -1使用count()时, 若查询元素出现,返回出现次数;若未出现,返回 0使用in时,返回值为True或False2.1.2 切片语法:list_name [start_index : stop_index : step]
courses = ['History', 'Math', 'Physics', 'CompSci']print(courses[0:2])# stepprint(courses[0:3:2])# 若step为负,则代表反向print(courses[-1:0:-1])# 理解切片# 将索引视作指向字符之间 ,第一个字符的左侧标为0,最后一个字符的右侧标为n,其中n是字符串长度。# +---+---+---+---+---+---+# | P | y | t | h | o | n |# +---+---+---+---+---+---+# 0123456# 注意:切片的开始总是被包括在结果中,而结束不被包括 。这使得s[:i] + s[i:]总是等于s# word = 'Python'# print(word[:2] + word[2:])2.1.3 排序sort() / sorted() 顺序
courses = ['Math', 'History', 'Physics', 'CompSci']# 1. sort()# sort()会改变原列表顺序courses.sort()print(courses)# 2. sorted()# sorted()不会改变原列表顺序,它会返回一个排序后的版本# 需创建一个变量来接收返回值sorted_courses = sorted(courses)print(sorted_courses)reverse() / reversed() / sort() / [::-1] 反转 / 倒序
courses = ['Math', 'History', 'Physics', 'CompSci']# 1. reverse()# reverse()会改变原列表顺序courses.reverse()print(courses)# 2. reversed()# sorted()不会改变原列表顺序,它会返回一个排序后的版本# 需创建一个变量来接收返回值reversed_courses = reversed(courses)print(reversed_courses)# 3. sort()# 用包含申明的sort方法courses.sort(reverse = True)print(courses)# 4. [::-1]print(courses[::-1])2.1.4 去重使用set(),因集合中没有重复的元素
num_list = [1, 2, 3, 1, 2, 4, 2, 5, 3, 2, 6, 7]print(set(num_list))# 若要将去重的结果以列表表示print(list(set(num_list)))2.1.5 列表与字符串间的转化列表 --> 字符串:join()
字符串 --> 列表:split()
courses = ['History', 'Math', 'Physics', 'CompSci']# 以逗号和空格结合列表中的元素,将其变为一长串字符串course_str = ', '.join(courses)# 使用split()将字符串重新变换为列表new_list = course_str.split(', ')2.1.6 列表推导式列表推导式的结构是由一对方括号所包含的以下内容:一个表达式,后面跟一个 for 子句,然后是零个或多个 for 或 if 子句。
其结果将是一个新列表,由对表达式依据后面的 for 和 if 子句的内容进行求值计算而得出。
举个栗子🌰
# 为了创建一个求平方的列表# 1. 普通方法squares = []for x in range(10):squares.append(x**2)print(squares)# 2. 列表推导式squares = [x**2 for x in range(10)]# for前方的内容为返回值print(squares) # 用列表推导式来将输入值处理为矩阵m, n = map(int, input().split())# m为行,n为列,其间用空格隔开matrix = []for i in range(m):# 重复m次(m行)s = input()# 输入n个数,每个数之间用空格隔开matrix.append([int(n) for n in s.split()])# ⚠️注意:将每个元素转化为整型print(matrix)2.1.7 最值 / 求和对于可迭代对象,可以直接用sum(), max(), min()方法来进行快速计算
nums = [1, 5, 2, 6, 3, 4]print(min(nums))print(max(nums))print(sum(nums))2.2 元组 courses = ('History', 'Math', 'Physics')print(courses)courses[0] = 'Art'# ❌错误: 元组内元素为只读,不可更改print(courses)2.3 集合 courses = {'History', 'Math', 'Physics', 'CompSci', 'Math'}# 重复执行多次,输出结果不同# 因set不注重内部元素顺序# set会自动消除元素重复部分print(courses)# 当判断某元素是否在一群元素中时,set是首选项print('Math' in courses)集合间的运算
cs_courses = {'History', 'Math', 'Physics', 'CompSci'}art_courses = {'History', 'Math', 'Art', 'Design'}# 交集(共有的元素)print(cs_courses.intersection(art_courses))# 不同(独有的元素)print(cs_courses.difference(art_courses))# 并集(所有的元素)print(cs_courses.union(art_courses))2.4 字典从某种程度上来说,可以将字典看做一个自定义索引(index)的列表
列表中的某个元素可以表示为:list[index]
字典中的某个值可以表示为:dict[key]
student = {'name': 'John', 'age': 25, 'courses': ['Math', 'CompSci']}# get方法可以使得在字典中缺少要查询的值时显示出默认或自定义的结果,而不是抛出异常# 括号内第二个参数为自定义默认输出内容print(student.get('name'))print(student.get('phone', 'Sorry. Not Found~'))# ------------------------# 添加student['phone'] = '199-8011-8011'# 更新student['name'] = 'Jane'print(student)# ------------------------# 使用update可以一次更新多个值!!!student.update({'name': 'Silk', 'age': 100, 'phone': '188-0525-7633'})print(student)# ------------------------# 删除 方法一:使用deldel student['age']# 删除 方法二:使用pop# pop会删除该值,但也会同时返回删除的值,需用变量来接收age = student.pop('age')print(student)print(age)# ------------------------# 查看长度print(len(student))# 查看键print(student.keys())# 查看值print(student.values())# 成对展现键与值print(student.items())重点
# 以键循环for key in student:print(key)# 键、值循环for key, value in student.items():print(key, value) 3. 函数、类、异常 3.1 函数函数参数中arg表示:传入的一个参数
函数参数中有单星号的*args 表示:将参数以元组的形式导入(不限个数)
函数参数中有双星号的**kwargs 表示:将参数以字典的形式导入(不限个数)
from datetime import datedef mission(arg, *args, **kwargs):information = []for i in args:information.append(i)print('New Mission')print('------------------------------')print('System date: {}'.format(arg))print('Location: {}, {}'.format(information[0], information[1]))print('Mission ID: {}'.format(information[2]))print('------------------------------')for k, v in kwargs.items():print('{:8}········ {}'.format(k, v))mission(date.today(), 'Berlin', 'German', 293821, AGENT='Jason Bourne', GENDER='Male', PROJECT='Treadstone')3.2 类举个栗子🌰
class MyDog:kind = 'Labrador'def __init__(self, name):self.name = nameself.tricks = []# 实例变量(每个实例的变量都不尽相同)def add_tricks(self, *trick):for i in trick:self.tricks.append(i)dog1 = MyDog('Tommy')dog2 = MyDog('Tom Me')dog1.add_tricks('Bark', 'Slaughter')dog2.add_tricks('Embark', 'Laughter')print('My Dogs Info:')print('-------------')print('Dog1: {}--{}--{}'.format(dog1.kind, dog1.name, dog1.tricks))print('Dog2: {}--{}--{}'.format(dog2.kind, dog2.name, dog2.tricks))3.3 异常 a = input('Enter a number: ')try:b = 5/int(a)print(b)except ZeroDivisionError as err:# 输入为0时执行print("There's a problem:", err)except ValueError:# 输入不为数字时执行print('You entered a wrong value!')else:# 输入为非零数字时执行print('try语句能顺利执行时,打印此句~') 4. 一些常用的方法 4.1 判断数字、字母、大小写、空格判断是否为数字:isdigit();判断是否为字母:isalpha()
是否为大写字母:isupper();是否为小写字母:islower()
判断是否为空格:isspace()
# ~ 原方法 ~# 使用列表储存数字,随后再转化为字符串,最后转化为整形a = input()b = []# 列表存放数据for i in a :if i.isdigit() : b.append(n)print(int("".join(b)))# ~ 改进版方法 ~# 字符串可以通过+来连接。因此,可以用字符串来存储数字。之后就不用再进行转化了a = input()b = ''# 字符串存放数据for i in a: if i.isdigit():b += i# 直接通过'+'将字符连接print(b)4.2 编码与转化 4.2.1 UTF-8编码使用encode()方法
注意:编码格式需要被引号包含
s = '人生苦短,我用Python'print(s.encode('UTF-8'))4.2.2 ASCII码与字符的互换使用ord() 与chr()
# 字符 --> ASCIIcharacter = 'z'print(ord(character))# ASCII --> 字符ascii = 126print(chr(ascii))有时还需根据ASCII码的相加关系来做出一些限定,如’A’ + ‘Z’ = 155
4.2.3 进制转化①. 其它进制转化为十进制
使用int(x, y)将其他进制转化为十进制。其中x为原值,y为原进制
# 将8进制的56转化为十进制print(int(56, 8))# 56需要加上'',即转化为字符串形式②. 十进制转化为其它进制
# 转化为二进制:binprint(bin(1024))# 转化为八进制:octprint(oct(8732))# 转化为十六进制:hexprint(hex(2918))4.3 判断某个字符(串)是否属于另一个字符串 string_1 = input('1st string: ')string_2 = input('2nd string: ')# 方法一:使用find()# 如果字符串1包含字符串2,返回字符串2在1中的起始索引# 如果不包含,则返回❀'-1'❀print(string_1.find(string_2))# 方法二:使用count()# 若出现,返回出现次数;若未出现,返回0print(string_1.count(string_2))# 方法三:使用in# 返回值为'True'或'False'print(string_2 in string_1)4.4 替换 message = "I like you!"trim = message.replace("l", "n")print('Then:', message)# 由此可知,replace并不改变原字符串。故需要创建新变量来接收print('Now:', trim)4.5 获取帮助使用dir()或help()来查询方法该如何使用
greeting = 'Hello'name = 'Silk'# dir()能显示括号内变量所有操作的函数、方法print(dir(name))# help()能显示某函数/方法的具体用法# 括号内不能是变量名print(help(str))# 查询具体的某函数/方法print(help(str.lower)) 5. 一些常用的库 5.1 math①. 平方根:sqrt()
# 先导入mathimport matha, b, c = map(int, input().split())s = (a + b + c)/2# 使用sqrt()求平方根area = math.sqrt(s*(s - a)*(s - b)*(s - c))②. 幂:pow(x, y)
import math# 使用pow()计算3**4d = math.pow(3, 4)③. π:pi
# 使用pi获取π值num = math.pi5.2 random①. random():返回一个在区间[0.0, 1.0)的随机浮点数
import randomfor i in range(10):print(random.random())②. randint(a, b):返回一个在区间[a, b]的随机整数,相当于randrange(a, b+1)
import randomfor i in range(10):print(random.randint(1, 15))③. randrange(start, stop[, step]):从 range(start, stop, step) 返回一个随机选择的元素
import randomfor i in range(10):print(random.randrange(5, 120, 10))④. seed():获取某种特定生成的随机数 当seed()无参数时,每次生成的随机数不同, 当seed()有参数时,若参数相同,则每次生成的随机数相同;若参数不同,则生成的随机数也不同
import randomls = [1, 2, 3, 4, 5, 6, 7, 8]for i in range(8):random.seed(4) # 试着改变seed()中的数或者注释掉这一行,看看输出的变化print(random.randint(1, 10))# randint(a, b)随机生成[a, b]间的整数# 注意⚠️:randint与range取值范围的区别。前者能取右侧的值,后者不能⑤. shuffle():将一个序列(列表、字符串或元组)的顺序打乱
import randommylist = ["apple", "banana", "cherry"]random.shuffle(mylist)print(mylist)5.3 datetime获取今天的日期
from datetime import dateday = date.today()print(day) 二、题目练习 1. 语言相关 1.1 打印一些形状 1.1.1 四种直角三角型①. 直角在左上方
# 打印形状 #***************# 实现代码 ## 输入层数a = int(input('请输入层数:'))for i in range(a):print('*'*(a - i))# 若要使打印出的星号✳️之间有空格,将'*'改为'* '即可②. 直角在左下方
# 打印形状 #***************# 实现代码 ## 输入层数a = int(input('请输入层数:'))for i in range(a):print('*'*(i + 1))③. 直角在右上方
# 打印形状 #***** **** ******# 实现代码 ## 输入层数a = int(input('请输入层数:'))# 可以将第三第四种三角形看作一个由' '和'*'组成的矩形,# >>> 因此,每行的' '和'*'数量相加必等于a 因此,每行的' '和'*'数量相加必等于a