前排 如果显示有问题,请关闭黑暗模式 电脑端滚轴上滑会显示顶端栏,有一个黑暗模式 手机端点击右上角,找到黑暗模式
特别鸣谢: 童博扬、王昌翔、张紫涵、石非易
本文内容可能存在错误,欢迎指正 习题没有标准答案,提供的题解仅供参考
基本操作 Python程序的输入通过函数input()实现,特别注意,利用input()函数输入的任何数据都是 字符串 类型 所以需要整数数字需要用int()函数 转换为整数 如下
其中input()中引号中的内容为显示的内容,不影响 程序的运行
变量数据类型 int : 整数型 str :字符串类型 tuple : 元组类型 float : 浮点数类型(可以理解为有小数) list : 列表类型 dict : 字典类型 range : 数字序列类型 Bool : 布尔型 (只含有True和False两个值) *NoneType : 空值类型(None) *set : 无序的不重复集合
变量的赋值操作 直接赋值 赋值通过符号 实现
通过 ,我们将一个值5赋值给了变量 默认是整数int类型 它的默认值和你后面的数据有关 比如
1 2 3 >>> x = "5" >>> y = "abc" >>> z = True
x = “5” 加了引号,则这个x的值5 实际上是一个字符串类型,同理下面的y = abc 得到的也是一个字符串类型 就是一个布尔型
增量赋值 对于 变量 += 值 ,相当于 变量 = 变量 + 值 如下
1 2 3 4 >>> x = 5 >>> x += 2 (等价于x = x + 2 )>>> x7
链式赋值 多个等号赋值 即将x,y,z值都赋值为n
1 2 3 >>> x = y = z = 5 >>> print (x,y,z)5 5 5
位置赋值 等号两边的变量分别用逗号隔开,然后根据对应位置进行赋值 比如 a,b,c = x,y,z,结果a = x,b = y,c = z;
二、八、十六进制 关于进制学习
0b(0B) 二进制
0o(0O) 八进制
0x(0X) 十六进制
字符串 ASCII码 *介绍 通过整数int型 对应的字符串,是一种字符编码标准,用于表示文本中常见的字符。它通过给每个字符分配一个整数值,使得计算机能够存储和传输文本信息。 ord():将一个字符转换为对应的 ASCII(或 Unicode)码点。 chr():将一个整数(ASCII 或 Unicode 码点)转换为对应的字符。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 print (ord ('A' )) print (ord ('a' )) print (ord (' ' )) print (ord ('0' )) print (ord ('!' )) print (ord ('Z' )) print (ord ('z' )) print (chr (65 )) print (chr (97 )) print (chr (32 )) print (chr (48 )) print (chr (33 ))
常见元素的ASCII码
int()整数型 与ASCII码的关系为 比如 48的ASCII值对应字符’1’,49对应’2’,……,57对应’9’
A 的ASCII码为65 ,a 的ASCII码为97 A - Z,a - z 的ASCII码可以根据ABCDE……XYZ 的顺序推出 B 就是66 ,b 就是98
注意:以上不管是ABC,abc,还是0 1 2,ASCII码对应的都是字符型(str),数字也是字符型
索引与切片 索引 索引就是字符串按顺序从左到右的编号。特别地 ,如果字符串长度为n,字符串第一个元素地编号为0 ,最后一个为n-1 从0开始 反向索引则第一个为-n,最后一个为-1 则为从-1开始
1 2 3 4 5 >>> s = "ABC" >>> s[0 ]A >>> s[1 ]B
正反索引转换 为了方便,我们把反索引转换为正索引,下面给出公式:反索引为-i,正索引为n - i 正索引为i,反索引为n - i - 1 比如反索引为-5,字符串长度为9,正索引为4
切片 定义一个字符串s = “abcdefg” 切片: s[begin:end:step] begin : 起始索引 end : 终止索引(不包括该索引下的字符,可以理解为一个左闭右开区间[begin,end)) step : 步长,默认1,可省略起始终止索引如果省略默认为最左边的索引(0),但是二者中间的 : 不可省略 如果起始终止索引都不填,默认为整个字符串 看示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 >>> s[2 :5 ] cde >>> s[2 :5 :2 ] ce >>> s[ :5 ] abced >>> s[2 :-3 ] cd >>> s[5 : :-2 ] fdb
字符串运算符 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 x = "abc" y = "ABC" >>> x[2 ]c 略 >>> x + yabcABC >>> y + x>>> ABCabc>>> x * 2 abcabc >>> 'bc' in xTrue >>> 'bd' not in xTrue 注意 空格也算一个字符 >>> 'b c' in xFalse
字符串中的函数 详见P31-P36 课本很详细 在文末通过例题进行讲解,这里不赘述
运算符 算术运算符 1 2 3 4 5 6 7 8 9 10 a = 10 b = 3 print ("加法:" , a + b) print ("减法:" , a - b) print ("乘法:" , a * b) print ("除法:" , a / b) print ("整除:" , a // b) print ("取余:" , a % b) print ("幂运算:" , a ** b) print ("负号:" , -a)
其中//整除默认向下 取整
运算符优先级顺序(总结) 指数运算:** (最高优先级) 正负号:+ - (用于表达式的单目运算符) 乘法/除法等:* / // % 加法/减法:+ - 关系运算符:== != > < >= <= (最低优先级) 比如x = 5 + 2 * 3 ** 2 == 10 / 2
3 ** 2 = 9 2 * 9 = 18 5 + 18 = 23 10 / 2 = 5.0 23 == 5.0,结果为 False
关系运算符 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 a = 10 b = 5 c = 10 print (a == b) print (a == c) print (a != b) print (a != c) print (a > b) print (a > c) print (a < b) print (a < c) print (a >= b) print (a >= c) print (a <= b) print (a <= c)
感叹号在这不是阶乘,不是阶乘,等于关系是双等号!双等号! is,not is判断是不是一个内存地址,相当于id(x) ==或!= id(y)的用处 只需要记住整数型如果两个数的值相等且该值处于-5~256的闭区间,内存地址一样 字符串型号如果只有数字和字母(没有空格)且相同,内存地址一样
逻辑运算符 not and or,优先级 not > and > or not就是对表达式的布尔值取反 and就是连接两个表达式,都为真为真,有一个为假则为假 or就是两个表达式有一个为真就为真
常见保留关键字 False await else import pass None break except in raise True class finally is return and continue for lambda try as def from nonlocal while assert del global not with async elif if or yield
格式化 介绍 格式化输出主要使用到f-string 和format()两种 f-string 更加简洁和高效,推荐在 Python 3.6 及以后的版本中使用,尤其是当你需要直接嵌入变量或表达式时。 format 在需要更复杂的格式化控制时更有用,特别是当你需要在同一个字符串中使用多次相同的变量或进行特殊格式化时。 课本上给的大多数是format(),考试中的考察大多数也是format()用法 ,这里我们对两种方法进行讲解后面习题用的是f-string 注意 对于一些你想到的但是没有出现的可能,一定要试着自己敲一敲代码看一看结果,切记 实践是检验真理的唯一标准
f-string 它以字面值字符串的形式在前面加上 f 或 F,并在字符串中使用花括号 {} 来嵌入表达式或变量。 意思就是{}中的元素 输出时候会显示它的量,比如x = 1,{x}就是输出1而不是x,但是花括号外就是x 如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 x = 5 y = 1 print (f"x" )<<< x print (f"{x} " )<<< 5 print (f"x + y = x + y" )<<< x + y = x + y print (f"x + y = {x + y} " )<<< x + y = 6
你也可以把它当成一个变量来进行输出 如下
1 2 3 4 5 6 x = 5 y = 1 sum = x + y result = f"The sum of x + y = {sum } " print (result)<<< The sum of x + y = 6
这里我们详讲一下format(),这是考点之一 使用大括号 {} 作为占位符,在 format() 方法中传入相应的值。 示例
基本用法 1 2 3 4 5 name = "Alice" age = 30 greeting = "Hello, my name is {} and I am {} years old." .format (name, age) print (greeting)<<< Hello, my name is Alice and I am 30 years old.
位置参数 你可以通过在 format() 中指定位置来插入多个变量。位置是从 0 开始的,类似于列表索引。
1 2 3 greeting = "Hello, {0}! Today is {1}." .format ("Alice" , "Monday" ) print (greeting)<<< Hello, Alice! Today is Monday.
上面括号中的从左到右的索引顺序就是{}的索引
1 2 3 greeting = "Hello, {1}! Today is {0}." .format ("Monday" , "Alice" ) print (greeting)<<< Hello, Alice! Today is Monday.
关键字参数 你也可以使用关键字参数传递值,并在花括号中通过名字来引用它们。 如下
1 2 3 greeting = "Hello, {name}! Today is {day}." .format (name="Alice" , day="Monday" ) print (greeting)<<< Hello, Alice! Today is Monday.
重复使用变量 示例如下
1 2 3 4 greeting = "Hello, {0}! Your {0}'s status is confirmed." .format ("Alice" ) 或者 greeting = "Hello, {name}! Your {name}'s status is confirmed." .format (name="Alice" ) print (greeting)<<< Hello, Alice! Your Alice's status is confirmed.
混合用法 关键字参数和索引地一起使用 如下
1 2 3 greeting = "Hello, {0}! Today is {day}." .format ("Alice" , day="Monday" ) print (greeting)<<< Hello, Alice! Today is Monday.
注意 你可以将位置参数和关键字参数混合在同一个 format() 中,但位置参数必须放在关键字参数之前。 比如如下情况就会报错
1 2 3 4 greeting = "Hello, {0}! Today is {1}." .format ("Alice" , day="Monday" ) greeting = "Hello, {0}! Today is {1}." .format ("Alice" , day="Monday" ,"test" ) greeting = "Hello, {0}! Today is {day}." .format ("Alice" , day="Monday" ) greeting = "Hello, {0}! Today is {day}." .format (day="Monday" ,"Alice" )
即关键字在位置参数变量的后面,而且不算到位置参数里面,即索引的个数只与位置参数有关,与关键字参数的个数无关
数字格式化 format 可以用来格式化数字,指定小数位数、宽度、对齐方式等。 示例1:小数位数的保留 {:.nf} 保留n位小数
1 2 3 4 pi = 3.14159 formatted = "The value of pi is {:.2f}" .format (pi) print (formatted)<<< 3.14
其中:前面填它的位置参数
1 2 3 4 5 6 7 8 pi = 3.14159 tx = 2.22222 print ("The value of pi is {0:.2f}" .format (pi,tx))print ("The value of pi is {1:.2f}" .format (pi,tx))print ("The value of pi is {e:.2f}" .format (e=2.71828 ))<<< 3.14 <<< 2.22 <<< 2.72
保留小数的依据是:四舍五入 示例2:你可以使用 :<、:>、:^ 来设置文本的对齐方式,还可以使用数字来设置字段宽度。
1 2 3 4 5 6 7 8 9 10 11 12 text = "Hello" formatted = "{:<10}" .format (text) print (f"'{formatted} '" )formatted = "{:>10}" .format (text) print (f"'{formatted} '" )formatted = "{:^10}" .format (text) print (f"'{formatted} '" )<<< 'Hello ' <<< ' Hello' <<< ' Hello '
其中10为整个范围的场宽,如果这个数字小于原本元素的宽度,比如小于hello的宽度5,就不会有影响f-string的使用是为了显示出两个单引号’’来表示它的场宽 你也可以直接用一个数字来表示这个输出的宽度,不进行对齐
1 2 3 4 number = 42 formatted = "{:5}" .format (number) print (f"'{formatted} '" )<<< ' 42'
默认是右对齐
格式化数字的填充与符号
表示无论正数还是负数都显示符号:1 2 3 4 num1 = 42 num2 = -42 formatted1 = "{:+}" .format (num1) formatted2 = "{:+}" .format (num2)
表示仅在负数前显示符号,而正数不显示符号。实际上,这是默认的符号显示方式,所以即使省略 - 也会得到同样的效果。1 2 formatted1 = "{:-}" .format (num1) formatted2 = "{:-}" .format (num2)
(空格)表示在正数前显示一个空格,而负数显示 -。这种方式在对齐时很有用,因为正数会有一个占位空格,与负数对齐更整齐。
1 2 formatted1 = "{: }" .format (num1) formatted2 = "{: }" .format (num2)
填充
1 2 3 4 5 6 num = 42 formatted = "{:05}" .format (num) print (formatted)<<< 00042
除此之外 对于符号 比如+ - * . # 也可以填充,替换0即可
百分比格式化 你可以通过 format 来格式化百分比数值,使用 :.2% 来指定保留两位小数的百分比。
1 2 3 4 percentage = 0.12345 formatted = "{:.2%}" .format (percentage) print (formatted)<<< 12.35 %
日期格式化 1 2 3 4 5 from datetime import datetimenow = datetime.now() formatted = "Current date and time: {:%Y-%m-%d %H:%M:%S}" .format (now) print (formatted)<<< Current date and time: 2024 -11 -10 15 :42 :30
嵌套格式化 你也可以在格式化字符串中进行嵌套,先使用一个表达式再进行格式化。
1 2 3 formatted = "{:,.2f}" .format (1234567.8910 ) print (formatted)<<< 1 ,234 ,567.89
对应的f-string的功能用法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 pi = 3.14159 print (f"The value of pi is {pi:.2 f} " ) text = "Hello" print (f"'{text:<10 } '" ) print (f"'{text:>10 } '" ) print (f"'{text:^10 } '" ) num = 42 print (f"'{num:5 } '" )from datetime import datetimenow = datetime.now() print (f"Current date and time: {now:%Y-%m-%d %H:%M:%S} " )percentage = 0.12345 print (f"{percentage:.2 %} " )
课本习题 我们通过课本习题进行大多数内容讲解,建议看完课本剩余内容的基本定义 然后根据题目的讲解进行理解因为没有标准答案,所以答案仅供参考
P14 Problem 1-7
D
C
D
B
D
P14 Problem 8-12 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 def Problem_eight (): num1 = int (input ("请输入第一个整数:" )) num2 = int (input ("请输入第二个整数:" )) result = num1 + num2 print (f"这两个整数的和是: {result} " ) def Problem_nine (): num1 = int (input ("请输入第一个整数(高位):" )) num2 = int (input ("请输入第二个整数(低位):" )) result = int (str (num1) + str (num2)) print (f"组成的新整数是: {result} " ) def Problem_ten (): total = sum (range (1 , 11 )) print (f"1到10的和是: {total} " ) def Problem_eleven (): total = 1 for i in range (1 , 11 ): total *= i print (f"1到10的积是: {total} " ) def Problem_twelve (): print ("******** " ) print (" * " ) print (" * " ) print ("****** " ) print (" * " ) print (" * " ) print ("******** " ) print () print (" *** " ) print (" * " ) print (" * " ) print (" * " ) print ("* * " ) print ("* * " ) print ("******* " ) print () print ("* * " ) print ("* * " ) print ("* * " ) print ("* * " ) print ("* * " ) print ("* * " ) print ("********* " ) print () print ("********* " ) print (" * " ) print (" * " ) print (" * " ) print (" * " ) print (" * " ) print (" * " ) print ("请输入题号(8-12)来选择对应的题目:" )problem_number = int (input ()) if problem_number == 8 : Problem_eight() elif problem_number == 9 : Problem_nine() elif problem_number == 10 : Problem_ten() elif problem_number == 11 : Problem_eleven() elif problem_number == 12 : Problem_twelve() else : print ("无效的题号。请输入一个有效的题号(8-12)。" )
P53 Problem 2-10
A 解析 B : 变量名不可用数字开头,通常用大小驼峰习惯进行命名,比如getNumber这种 C : and是保留关键字,不可以命名 D : 不可用特殊符号进行命名,下划线_除外
B 解析 A D : 不严谨,不纯粹 C : 赋值左边是一个变量,不可以是一个表达式
D 解析 A B : 单双引号不影响,都是字符串类型 C : 字符串类型,空字符串 D : 复数类型
C 解析 指数运算,右结合(从右往左进行运算) 2 ** 3 = 8 2 ** 8 = 256
D 解析 A : 字符串不能直接加数字 ord函数:函数内填字符,返回字符所对应的ASCII码 chr函数: 函数内填ASCII码,返回字符 B : ord(‘D’) = 68,该选项得到67 C : chr(65)返回字符’A’,不可与数字相加 D : ord(‘B’) + 1 = 66 + 1 = 67,chr(67) = ‘C’ 正确
C 解析 A B : 分别得到第一个,第二个字符 D : len(s) 返回字符串s的长度,超出索引,应该是len(s) - 1
B 解析 A : 返回’Pr’ C : 返回’ro’ D : 返回’rog’
C 解析 A B D : 返回’ab’ C : 返回’aba’
D 解析 randint(10,99) 随机返回一个位于闭区间[10,99]的整数 randrange(10,100) 随机返回一个位于左闭右开区间[10,100)的整数,步长为1 randrange(10,100,2) 随机返回一个位于左闭右开区间[10,100)的整数,步长为2 即10 12 14 16 …… 96 98之一 uniform(10,99) 随机返回一个位于闭区间[10,99]的浮点数
D : 返回的不是整数
BC 解析 A : 使用大小驼峰进行命名 D : 可以使用中文名,但是不建议
P53 Problem 11 1 2 3 4 5 6 7 8 9 10 11 12 13 import mathr = float (input ("请输入球的半径 r: " )) V = (4 /3 ) * math.pi * r**3 print (f"球的体积 V: {V:.4 f} " )
P53 Problem 12 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 import matha = float (input ("请输入边 a 的长度: " )) b = float (input ("请输入边 b 的长度: " )) C = float (input ("请输入夹角 C 的角度值: " )) C_rad = math.radians(C) S = 0.5 * a * b * math.sin(C_rad) print (f"三角形的面积 S: {S:.4 f} " )
P53 Problem 13 1 2 3 4 5 6 7 8 9 10 11 12 import calendaryear = int (input ("请输入年份: " )) month = int (input ("请输入月份: " )) month_calendar = calendar.month(year, month) print (month_calendar)
P74 Problem 1-7
B 解析 int类型中0为False,非0都为True 字符串只有空串为False 其他为True
C 解析 列表大小比较先比较长度,短的小 长度一样从左往右依次比较对位元素,直到找到第一个可以比较大小的元素,停止,不看后面的元素 比如此题1 3都相同开始比较下一个元素字符串 字符串先比较长短,短的小 长度相同开始从左往右比较各个字符的ASCII码 按大小比较 c的ASCII码大于D 所以返回True 满足三目运算符,得3
D 解析 A B : Python也有类似C语言中的三目运算符 ? 但用法如下 a = x if x > y else y 取两个值较大的一个 C : if后跟冒号 改为if(x > y): 或者 if x > y :
A 解析 x初始为0,在布尔类型下0对应Falsewhile x:
循环条件为x,但一开始就为False无法进行
解析while s
即理解为s不为空串就执行 每一次更新s为它的子串0~length-1,也就是删掉最后一个元素
6.
解析
1 2 3 s = s[1 :] s = s[: : 2 ] s = s[: :-1 ]
7. 分行输出1 3 4 3 解析 else与j的for循环并列 : 如果j循环完全执行(即没有被break过),则进行else continue不影响else的函数,但是会影响它下面的输出ij 首先i = 1,j = 1,if和elif都不满足,执行print(i j),输出ij 也就是1 然后i = 1,j = 2,满足elif的条件,跳过,不执行执行print(i j) 此时i = 1时候j的循环完全执行,执行else里面的内容 执行print(i+j),输出i+j,此时j是循环到最后的值 也就是2i+1,为2,输出1+2,即3 然后i = 2,j = 1,满足elif 跳过 然后i = 2,j = 2,不满足if和elif,执行print(ij),输出4 然后i = 2,j = 3,满足if条件,执行break函数跳出j的循环,因为没有运行完整该循环 不执行else的内容 然后i = 3,j = 1,不满足if和elif,执行print(i j),输出3 然后i = 3,j = 2,满足if条件,执行break函数,不执行else的内容 i枚举完1~3,程序结束 所以分行输出1 3 4 3
P75 Problem 8 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 import randomnumber_one = random.randint(1 , 100 ) number_two = random.randint(1 , 100 ) total = number_one + number_two user_input = int (input (f"请计算 {number_one} + {number_two} 的和: " )) if user_input == total: print ("正确" ) else : print ("错误" )
P75 Problem 9 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 import mathx = float (input ("请输入x的值: " )) if x < 0 : y = x**2 + 5 elif 0 <= x < 10 : y = math.sin(math.radians(x))**2 else : y = math.exp(x) - math.log(x) print (f"y = {y:.4 f} " )
P75 Problem 10 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 import matha = float (input ("请输入边 a 的长度: " )) b = float (input ("请输入边 b 的长度: " )) c = float (input ("请输入边 c 的长度: " )) if a + b > c and a + c > b and b + c > a: s = (a + b + c) / 2 area = math.sqrt(s * (s - a) * (s - b) * (s - c)) print (f"三角形的面积为: {area:.4 f} " ) else : print ("无法构成三角形" )
P76 Problem 11 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 def convertTime (seconds ): if seconds >= 86400 : days = seconds // 86400 seconds %= 86400 hours = seconds // 3600 seconds %= 3600 minutes = seconds // 60 seconds %= 60 print (f"{days} 天{hours} 小时{minutes} 分钟{seconds} 秒" ) elif seconds >= 3600 : hours = seconds // 3600 seconds %= 3600 minutes = seconds // 60 seconds %= 60 print (f"{hours} 小时{minutes} 分钟{seconds} 秒" ) elif seconds >= 60 : minutes = seconds // 60 seconds %= 60 print (f"{minutes} 分钟{seconds} 秒" ) else : print (f"{seconds} 秒" ) seconds = int (input ("请输入秒数: " )) convertTime(seconds)
P76 Problem 12 1 2 3 4 5 6 def getZodiac (year ): animals = ["鼠" , "牛" , "虎" , "兔" , "龙" , "蛇" , "马" , "羊" , "猴" , "鸡" , "狗" , "猪" ] return animals[(year - 2020 ) % 12 ] year = int (input ("请输入年份: " )) print (f"{year} 年对应的生肖是:{getZodiac(year)} " )
P76 Problem 13 1 2 3 4 5 6 n = int (input ("请输入整数 n: " )) ans = 1 for i in range (1 , n + 1 ): ans *= i print (f"{n} 的阶乘是: {ans} " )
P76 Problem 14 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 import mathdef average (numbers ): return sum (numbers) / len (numbers) def standardDeviation (numbers ): n = len (numbers) sum_xi = sum (numbers) sum_xi_squared = sum ([x ** 2 for x in numbers]) variance = (sum_xi_squared - (sum_xi ** 2 ) / n) / (n - 1 ) return math.sqrt(variance) numbers_input = input ("请输入多个数,用逗号分隔: " ) numbers = [float (x) for x in numbers_input.split(',' )] avg = average(numbers) std_dev = standardDeviation(numbers) print (f"平均值: {avg:.4 f} , 标准差: {std_dev:.4 f} " )
P76 Problem 15 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 def isPrime (num ): if num < 2 : return False for i in range (2 , int (num ** 0.5 ) + 1 ): if num % i == 0 : return False return True def findPrimes (n ): primes = [i for i in range (2 , n + 1 ) if isPrime(i)] return primes n = int (input ("请输入整数 n: " )) primes = findPrimes(n) print (f"小于或等于 {n} 的素数有: {primes} , 总数为: {len (primes)} " )
P76 Problem 16 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 import mathdef calculateSeries (x ): sumResult = 0 n = 1 term = x sign = 1 while abs (term) >= 1e-5 : sumResult += term n += 2 sign *= -1 term = sign * (x**n) / math.factorial(n) return sumResult x = float (input ("请输入浮点数 x: " )) result = calculateSeries(x) print (f"计算结果: {result:.6 f} " )
P76 Problem 17 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 import mathangles = [0 , 30 , 60 , 90 , 120 , 150 , 180 ] print (f"{'角度' :<10 } {'sin' :<10 } {'cos' :<10 } {'tan' :<10 } " )for angle in angles: radians = math.radians(angle) sin_value = math.sin(radians) cos_value = math.cos(radians) tan_value = math.tan(radians) print (f"{angle:<10 } {sin_value:<10.4 f} {cos_value:<10.4 f} {tan_value:<10.4 f} " )
P76 Problem 18 1 2 3 4 5 6 7 8 9 10 11 def print_multiplication_table (): max_width = len (f"9 * 9 = 81" ) for i in range (1 , 10 ): for j in range (1 , i + 1 ): print (f"{j} * {i} = {i * j:2 } " , end=" " ) print () print_multiplication_table()
P107 Problem 7 1 2 3 4 5 6 7 8 9 10 11 numbersList = list (map (int , input ("请输入10个数值,用空格隔开:" ).split())) averageValue = sum (numbersList) / len (numbersList) greaterThanAverage = [num for num in numbersList if num > averageValue] print ("大于平均数的数值是:" , greaterThanAverage)
P106 Problem 1-7
B 解析 A : 一个空元组 C : 含有单个元素的元组 D : 一个元组 B : 整数1
D 解析 A. list.insert(index,number) 把number插入位置index 为[1,2,3,5] 比如 a.insert(2,5) 就是插到第二个数后面,变为[1,2,5,3],(实际上是插到索引为2的位置,索引从0开始在第二个数后面) B. list.append(number) 把number插入末尾,括号里面只能一个数字(或者数对) 比如 list.append((4,5)) 就是在末尾加入一个元组(4,5) 即[1,2,3,(4,5)] C. list.extend([number1,number2,….]) 将多个元素加入末尾 这里非法了,应改为a.extend([4,5]) 如果要加入一个元组,这样 a.extend([(4,5)]) 变为[1,2,3,(4,5)]
D 解析 [::-1] 切片操作,先翻转 (可以没有) [2] 找到索引为2的元素[1,2] [1] 找到[1,2]中索引为1的元素,即2 为2
A 解析 Python中元组和字符串是不可变的 A : 第一个元素会变为[1,2,’X’] 是合法的 B : add是集合set的用法,这里不能用 C : 字符串不可变 D : 元组不可变
[0, 2, 4, 6, 8] [4, 6, 8, 0, 2] [8, 6, 4, 2, 0] [4, 6, 8, 0, 2] 解析
1 2 3 4 5 6 7 8 9 10 11 12 x = [i for i in range (0 ,10 ) if i % 2 == 0 ] print (x) for i in range (3 ): t = x.pop() x.insert(0 ,t) print (x) y = x z = x[:] x.sort(reverse=True ) print (y) print (z)
[83, 3, 86, 89] [3, 83, 86, 89] [83, 86] [3] 解析 首先解释sort和sorted的区别sort : 只能用于列表,用法 a.sort(),修改 原函数 降序为a.sort(reverse = True) 可以理解为一个操作,sort看成一个动词
sorted : 可以用于任何迭代对象,且不会修改 原函数 理解返回它的变化值,sorted看成一个形容词 sorted_a = sorted(a, reverse=True) 降序排列操作,取a列表的降序顺序列表
1 2 3 x = [3 , 1 , 4 , 1 , 5 , 9 , 2 , 6 , 5 , 3 , 5 ] x.sort() print (x)
1 2 3 4 x = [3 , 1 , 4 , 1 , 5 , 9 , 2 , 6 , 5 , 3 , 5 ] y = sorted (x) print (x) print (y)
1 2 3 4 5 6 7 8 9 10 11 12 x = [86 ,89 ] a,b = x i = 0 while i < 2 : a,b = b-a,a x.insert(0 ,a) i = i + 1 print (x) print (sorted (x)) print (x[::2 ]) print ([n for n in reversed (x) if n % 3 == 0 ])
reversed同样不会改变x原先的状态
P107 Problem 8 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 import randomaList = [random.randint(10 , 99 ) for _ in range (10 )] print ("原列表是:" , aList)n = int (input ("请输入循环次数n:" )) n = n % len (aList) aList = aList[-n:] + aList[:-n] print ("循环后的列表是:" , aList)
P107 Problem 9 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 import mathcoords = input ("请输入多个点的坐标,格式为x1 y1 x2 y2 ...:" ).split() points = [(float (coords[i]), float (coords[i+1 ])) for i in range (0 , len (coords), 2 )] totalLength = 0 x0, y0 = 0 , 0 for x, y in points: distance = math.sqrt((x - x0)**2 + (y - y0)**2 ) totalLength += distance x0, y0 = x, y print (f"从原点开始按顺序连接这些点的总长度为: {totalLength:.2 f} " )
P107 Problem 10 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 import mathn = int (input ("请输入数据个数n:" )) data = list (map (float , input ("请输入n个浮点数,用空格隔开:" ).split())) average = sum (data) / n variance = sum ((x - average) ** 2 for x in data) standardDeviation = math.sqrt(variance / (n - 1 )) print (f"平均值: {average:.2 f} " )print (f"标准差: {standardDeviation:.2 f} " )
P107 Problem 11 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 def main (): students = [] while True : userInput = input ("请输入学号和成绩,用空格隔开(输入OVER结束):" ) if userInput == "OVER" : break studentInfo = userInput.split() studentId = int (studentInfo[0 ]) score = float (studentInfo[1 ]) if score >= 60 : students.append((studentId, score)) students.sort(key=lambda student: student[0 ]) print ("\n考试及格的学生名单:" ) for student in students: print (f"学号: {student[0 ]} , 成绩: {student[1 ]:.2 f} " ) main()
P107 Problem 12 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 def main (): students = [] while True : userInput = input ("请输入学号和成绩,用空格隔开(输入OVER结束):" ) if userInput == "OVER" : break studentInfo = userInput.split() studentId = int (studentInfo[0 ]) score = float (studentInfo[1 ]) if score >= 60 : students.append((studentId, score)) students.sort(key=lambda student: student[1 ], reverse=True ) print ("\n考试及格的学生名单:" ) for student in students: print (f"学号: {student[0 ]} , 成绩: {student[1 ]:.2 f} " ) main()
上机实验 本实验题目解析不再赘述,仅给出答案 需要学习具体用法可以参考课本习题,大多数用法已经介绍过 实验课题目仅给出代码
实验1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 a = input ("输入一个地名:" ) b = input ("输入一个人名:" ) print (a+"很美," +b+"想去看看" )month="JanFebMarAprMayJunJulAugSepOctNovDec" index=int (input ("请输入月份:" )) print ( str (index)+"月的月份简写是" + month[index*3 -3 ]+month[index*3 -2 ]+month[index*3 -1 ])nums=[34 ,5 ,89 ,3 ,32 ,122 ] print ("一组数:%s" %nums)sum =0 for i in nums: sum =sum +i res=sum /len (nums) print ("{:.3f}" .format (res))inp=input ("请输入三个字符用逗号分隔:" ) lis=inp.split("," ) orilis=lis if lis[0 ]>lis[1 ]: lis[1 ]=lis[2 ] else : lis[0 ]=lis[2 ] if lis[0 ]>lis[1 ]: res=lis[0 ] else : res=lis[1 ] print (orilis[0 ]+"," +orilis[1 ]+"," +orilis[2 ]+"中最大的字符是" +res)import mathx1 = int (input ("请输入x1的值: " )) x2 = int (input ("请输入x2的值: " )) y1 = int (input ("请输入y1的值: " )) y2 = int (input ("请输入y2的值: " )) s = math.sqrt(pow (y2 - y1,2 ) + pow (x2 - x1,2 )) print ("%.2f" %s)
实验2-1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 import random c = 5 while c > 0 : c = c - 1 ch = chr (random.randint(97 , 122 )) print (ch * 3 , end=" " ) print ("" )c = 5 while c > 0 : c = c - 1 chc = random.randint(3 , 5 ) while chc > 0 : chc = chc - 1 print (chr (random.randint(97 , 122 )), end="" ) print (" " , end="" )
实验2-2 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 inp=input ("请输入一个三位整数:" ) err=False try : inp=int (inp) if inp>999 or inp<=100 : err=True except : err=True if err: print ("请输入一个正确的三位整数!" ) else : if inp//100 ==inp%10 : print (inp,"是一个对称的三位数" ) else : print (inp,"不是一个对称的三位数" )
实验2-3 三种方法
1 2 3 4 5 6 7 8 9 10 11 12 inp = input ("请输入一个三位数:" ) err = False try : inp = int (inp) if inp > 999 or inp < 100 : err = True except : err = True if err: print ("警告:输入数据有误,请输入一个三位数!" ) else : print (str (inp % 10 ) + str ((inp % 100 ) // 10 ) + str (inp // 100 ))
1 2 3 4 5 6 7 8 9 10 11 12 13 inp = input ("请输入一个三位数:" ) err = False try : inp = int (inp) if inp > 999 or inp < 100 : err = True except : err = True if err: print ("警告:输入数据有误,请输入一个三位数!" ) else : inp = str (inp) print (inp[2 ] + inp[1 ] + inp[0 ])
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 inp = input ("请输入一个三位数:" ) err = False try : inp = int (inp) if inp > 999 or inp < 100 : err = True except : err = True if err: print ("警告:输入数据有误,请输入一个三位数!" ) else : inp = str (inp) inp = list (inp) inp.reverse() print ("" .join(inp))
实验2-4 1 2 3 4 5 6 7 8 9 10 import randomimport stringhead = random.choice(string.ascii_uppercase) tail ='' .join(random.choices(string.ascii_letters + string.digits, k=7 )) password = head + tail print (password)if any (char.isdigit() for char in password): print (password) else : print ("密码无效!" )
实验3-1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 import mathdef work (x ): if x < 0 : y = abs (x) elif 0 <= x < 5 : y = math.cos(math.radians(x)) * math.exp(x) elif 5 <= x < 10 : y = x ** 3 else : y = (7 + 8 * x) * math.log(x) return y def main (): x_input = input ("请输入一个数x:" ) try : x = float (x_input) y = work(x) if y.is_integer(): print (f"y = {int (y)} " ) else : print (f"y = {y:.2 f} " ) except ValueError: print ("请输入有效的数字" ) main()
实验3-2 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 def One (a, b, c ): if a >= b and a >= c: return a elif b >= a and b >= c: return b else : return c def Two (a, b, c ): max_value = a if b > max_value: max_value = b if c > max_value: max_value = c return max_value def max_of_two (x, y ): return x if x > y else y def Three (a, b, c ): return max_of_two(max_of_two(a, b), c) def main (): a, b, c = map (int , input (" " ).split()) max_one = One(a, b, c) max_two = Two(a, b, c) max_three = Three(a, b, c) print (max_one, max_two, max_three) main()
实验3-3 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 def number_to_words (num ): number_words = { 0 : 'zero' , 1 : 'one' , 2 : 'two' , 3 : 'three' , 4 : 'four' , 5 : 'five' , 6 : 'six' , 7 : 'seven' , 8 : 'eight' , 9 : 'nine' } return number_words.get(num, '' ) def main (): user_input = input ("请输入一串数字:" ) result_words = [] for char in user_input: if char.isdigit(): num = int (char) - 1 if num < 0 : num = 0 result_words.append(number_to_words(num)) else : print ("请输入有效的整数" ) return print (' ' .join(result_words)) main()
实验3-4 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 def is_hui (s ): return s == s[::-1 ] def is_shui (num ): num_str = str (num) n = len (num_str) total = sum (int (digit) ** n for digit in num_str) return total == num def main (): hui_input = input ("请输入一个字符串" ) if is_hui(hui_input): print (f"{hui_input} 是一个回文字符" ) else : print (f"{hui_input} 不是一个回文字符" ) shui_input = input ("请再次输入一个整数" ) if shui_input.isdigit(): shui_num = int (shui_input) if is_shui(shui_num): print (f"{shui_num} 是水仙花数" ) else : print (f"{shui_num} 不是水仙花数" ) else : print ("请输入有效的整数" ) main()
实验3-5 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 def work (sum ): if 100 <= sum < 300 : percent = 0.98 elif 300 <= sum < 500 : percent = 0.90 elif sum >= 500 : percent = 0.88 else : percent = 1.00 ans = sum * percent discount_amount = sum - ans return ans, discount_amount def main (): total_price_input = input ("请输入商品总价:" ) try : sum = float (total_price_input) ans, discount_amount = work(sum ) print (f"需要支付价格为{ans:.2 f} 元,优惠{discount_amount:.2 f} 元" ) except ValueError: print ("请输入有效的数字" ) main()
实验4-1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 def solve_one (): ans = 0 for i in range (1 ,1001 ): if i % 10 == 0 : continue else : ans+=i print (ans) def solve_two (): number_list = [i for i in range (1 ,1001 ) if i % 10 != 0 ] print (sum (number_list)) def flag (x ): return x % 10 != 0 def solve_three (): ans = sum (filter (flag,range (1 ,1001 ))) print (ans) def solve_four (): ans = sum (filter (lambda i : i % 10 != 0 ,range (1 ,1001 ))) print (ans) solve_one() solve_two() solve_three() solve_four()
实验4-2 本题题意有歧义,这里理解为多次输入
1 2 3 4 5 6 7 8 9 import randomnumber_one = random.randint(1 ,10 ) number_two = random.randint(1 ,10 ) if number_two > number_one: number_one,number_two = number_two,number_one a = int (input (f"What is {number_one} - {number_two} =" )) while a != number_one - number_two: a = int (input (f"Wrong! What is {number_one} - {number_two} = " )) print ("You Got It" )
实验4-3 1 2 3 4 5 6 7 8 9 x = float (input ("请输入x的值: " )) total = 0.0 now = 1.0 index = 0 while abs (x / now) > 1e-5 : total += pow (x, index) / now index += 1 now *= index print (total)
实验4-4 辗转相除法
1 2 3 4 5 6 7 8 9 10 11 def gcd (a,b ): while b: a,b = b,a % b return int (a) def lcm (a,b ): return int (a * b / gcd(a,b)) numbers = (input ("请输入两个数:" )) number_one,number_two = map (int ,numbers.split()) print (f"最大公因数为{gcd(number_one,number_two)} ;最小公倍数为{lcm(number_one,number_two)} " )
实验4-5 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 def solve_one (x ): arr = [] for i in range (1 ,x + 1 ): temp = str (x) * i arr.append(temp) total = ' + ' .join(arr) print (eval (total)) def solve_two (x ): arr = [] for i in range (1 ,x + 1 ): temp = int (str (x) * i) arr.append(temp) print (sum (arr)) def solve_three (x ): total = sum (int (str (x) * i) for i in range (1 ,x + 1 )) print (total) def solve_four (x ): total = sum (map (lambda i : int (str (x) * i) ,range (1 ,x + 1 ))) print (total) number = int (input ("请输入a:" )) solve_one(number) solve_two(number) solve_three(number) solve_four(number)
实验4-6 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 def GetPrimes (n ): is_prime = [True ] * (n + 1 ) primes = [] for i in range (2 ,n + 1 ): if is_prime[i] : primes.append(i) for j in range (i * 2 , n + 1 , i): is_prime[j] = False return primes def main (): n = int (input ("请输入一个整数N:" )) origin_n = n primes = GetPrimes(n) AnswerArr = [] temp = 0 while n > 1 : while (n % primes[temp] == 0 and n): n //= primes[temp] AnswerArr.append(primes[temp]) temp+=1 if AnswerArr[0 ] == origin_n : print (f"1 * {origin_n} " ) else : print (' * ' .join(map (str ,AnswerArr))) main()