本章涉及条件表达式,选择结构,循环结构,random库的基本应用,程序流程控制应用实例
这次处理上要比上次第二章的更具体一点,基本上稍微有难度的题目和要注意的点 我都给批注了
另外 我还加了题目(前面有几道题目没加)
中间还有第三章涉及到的一些方法(函数)总结也记录总结了
# 例3-2 '''a,b = 10,50 print(a) print(b) print(0 < a < b) print(a > 10 and b < 100) print(a > 10 or b < 100) print(not(a > 10 and b < 100))''' # 表示一个偶数 # a % 2 == 0 # 一个整数是3的倍数且个位上为5 # a % 3 == 0 and a % 10 == 5 # 能构成三角形的条件 # (a+b>c) and (a+c>b) and (b+c>a) # 闰年的条件 # (a % 4 == 0 and a % 100 !=0) or (a % 400 ==0) # 例3-3 三角形三边长求面积 '''import math a,b,c = eval(input("请输入三角形的边长:")) l = (a + b + c) /2 s = math.sqrt(l*(l-a)*(l-b)*(l-c)) print("三角形的面积:{:.2f}".format(s))''' # 例3-4 输入两整数,比较大小,输出较大的那个数 '''a,b = eval(input("输入两整数:")) if a < b : print(b) else : print(a)''' '''a = eval(input("请输入整数a;")) b = eval(input("请输入整数b;")) print("输入值a={},b={}".format(a,b)) # {}里面不要加空格 if a < b : a, b = b, a print("比较后的值a={},b={}".format(a,b))''' # 例3-5 判断字符串是否是回文 '''s = input("请输入一个字符串:") if(s == s[::-1]): print(s +"是回文") else:print(s + "不是回文")''' # 例3-6 对输入数据做合法性检查,再求面积 '''import math a,b,c = eval(input("请输入三角形的边长:")) if((a+b>c) and (a+c>b) and (b+c>a)): l = (a + b + c) /2 s = math.sqrt(l*(l-a)*(l-b)*(l-c)) print("三角形的面积:{:.2f}".format(s)) else: print("数据输入错误请重新输入")''' # 例3-7 BIM指数,并给出建议 '''h,w = eval(input("请输入您的身高(m)体重(kg):")) BIM = w / h ** 2 print(BIM) print("您的BIM指数为:{:.1f}".format(BIM)) if(BIM < 18.5): print("您的体型偏瘦,多吃饭") elif(18.5 <= BIM < 23.9): print("您的体型正常,继续保持") elif(24 < BIM < 27.9): print("您的体型偏胖,有发福迹象") elif(28 < BIM < 32): print("不要悲伤,你是个迷人的胖子") elif(BIM > 32): print("什么也不说了,您照照镜子就知道了")''' # 例3-8 输入一个三位正整数,并比较输出最大的一位数字 '''a = int(input("输入一个三位正整数:")) b = str(a) x1 = b[0] x2 = b[1] x3 = b[2] if(x1 < x2): if(x2 < x3): print(b + "中的最大的一个数字是",x3) else: print(b + "中的最大的一个数字是",x2) else: if(x1 < x3): print(b + "中的最大的一个数字是",x3) else: print(b + "中的最大的一个数字是",x1)''' '''a = int(input("输入一个三位正整数:")) b = str(a) x1 = b[0] x2 = b[1] x3 = b[2] if(x1 < x2): if(x2 < x3): mx = x3 else: mx = x2 else: if(x1 < x3): mx = x3 else: mx = x1 print(b + "中最大的数是",mx)''' # 课本例题写法 '''a = int(input("输入一个三位正整数:")) x1 = str(a)[0] x2 = str(a)[1] x3 = str(a)[2] if(x1 < x2): if(x2 < x3): mx = x3 else: mx = x2 else: if(x1 < x3): mx = x3 else: mx = x1 print(str(a) + "中最大的数是",mx)''' # python 内置函数 # 求绝对值 fabs(x) # 求两个数的 取整数 和 取余数 divmod(x,y) # 保留小数四舍五入 round(x,[保留的位数]) # 求幂函数(可以求完幂函数再对某个数取余) pow(x,y[,z]) # 求最大值 max(x,y,...) # 求最小值 min(x,y,...) '''for s in "abcd": print(s,end = " ")''' # 字符串 # 拼接 + # 复制 * # 判断是否为字串 ##内置函数 # 求字符串长度 len(x) # 把其他类型转化为字符串类型 str(x) # 输入编码数字,返回其对应的字符 chr(x) # 输入字符,返回其对应的编码数字 ord(x) # 把整数转换为十六进制 hex(x) # 把整数转换为八进制 oct(x) ##内置处理方法 # 查找位置 # 首次 s.find('') # 最后 s.rfind('') # 首次 s.index('') # 最后 s.rindex('') # 查看出现的次数 # s.count('') # 分隔字符 # 左端 s.split('') # 右端 s.rsplit('') # 可指定分隔次数,比如s.split(maxsplit=3) # 字符串连接(将列表中的连接) # ‘ ‘.join(li) # 转换大小写字母 # 小写 s.lower() # 大写 s.upper() # 首字母大写 s.captialize() # 每个首字母大写 s.title() # 大小写互换 s.swapcase() # 替换字符或字符串 # s.replace(' ',' ') # 删除字符 # 两端 s.strip('') # 左端 s.lstrip('') # 右端 s.rstrip('') # 判断是否以指定字符开始或结束 # 开始 s.startswith('') # 结束 s.endswith('') # 判断字符串类型 # 是否全小写 s.islower() # 是否全大写 s.isupper() # 是否全数字 s.isdigit() # 是否为数字或字母或汉字 s.isalnum() # 是否为全字母和汉字 s.isalpha() # 字符串排版 # 居中对齐 s.center(20,'') # 居左对齐 s.ljust(20,'') # 居右对齐 s.rjust(30,'') # 在左侧以0补充 s.zfill(30) # 字符串格式化 # "{:填充字符 对齐方式 宽度}".format('') # 例如:"{:*^20}".format("Mike") # 例如:"{:*^20.3f}".format(3.1415) # 例3-9 统计英文句子中大写,小写,数字各有多少个 '''s = input("请输入一句英文:") c_lower = 0 c_upper = 0 c_digit = 0 # 上面表示实际字符串的要和in 后面的即迭代器要保持一致 for s in s: # for后面的是表示形式字符串要和if条件里的保持一致 if(s.islower()):c_lower += 1 if(s.isupper()):c_upper += 1 if(s.isdigit()):c_digit += 1 print("小写字符:",c_lower) print("大写字符:",c_upper) print("数字字符:",c_digit)''' # range()函数生成迭代序列 # range(3) 从0到2 # range(4,10) 从4到9 # 前闭后开 # range(1,100+1,2) 从1到100.每个两个取 # 例3-10 求1-100所有整数的和 '''sum = 0 for i in range(1,100 + 1): sum = sum + i print("1-100所有整数的和:",sum)''' # 例3-11 求1-100中的所有奇数和偶数的和 '''s1 = 0 s2 = 0 for i in range(1,100+1): if i % 2 == 0: # 写偶数 s1 = s1 + i else: s2 = s2 + i print("1-100中的所有奇数和偶数的和分别为:",s1,s2) # 或者 s = 0 for i in range(1,100+1,2): s = s +i print("1-100中的所有奇数的和:",s) a = 0 for i in range(2,100+1,2): a = a + i print("1-100中的所有偶数的和:",a) # 或者 s1 = 0 s2 = 0 for i in range(1,100+1): if i % 2 == 1: #写奇数 s1 = s1 + i else: s2 = s2 + i print("1-100中的所有奇数和偶数的和分别为:",s2,s1)''' # 例3-12 例用for循环求正整数的所有约数 '''n = eval(input("请输入一个正整数:")) for i in range(1,n+1): if(n % i ==0): print(i,end=" ")''' # 例3-13 用While语句求1-100的所有整数的和 '''n = 1 s = 0 while n <= 100: s = s + n n = n + 1 print("1-100的所有整数的和为:",s)''' # 例3-14 求非负数字序列的最小值,最大值和平均值。用户输入-1时就表示序列终止 # 1.不知道什么时候用户输入结束,用while语句,以输入-1这个作为循环条件 # 2.可以先令输入的第一个数字为最大值和最小值,然后将每次循环的值再与这个进行比较 # 然后再令这个比较完后的新值重新作为新的最大值或最小值 # 3.注意要在循环开始之前就先让用户输入一次,作为第一次 # 4.平均值的计算,可以分为求和,个数这两部分,总和/个数 即为 平均值 # 个数 可以 用计数法,在开始之前 令计数 为0,总和也为0 # 5.中间还需要判断一下这个计数得>0,若不大于0,也没意义了,可以列情况else说明 '''print("请输入一个非负数字,以输入-1时作为结束") n = int(input("输入数据:")) mx = n mi = n c_s = 0 c_c = 0 while(n != -1): if n > mx: mx = n if n < mi: mi = n c_s = c_s + n c_c = c_c + 1 n = int(input("输入数据:")) if(c_c > 0): print("输入的这些非负数序列的最大值为{},最小值为{},平均值为{:.2f}".format(mx,mi,c_s/c_c)) else: print("输入为空")''' # 例3-15用牛顿迭代法求算术平方根 # 计算规则如下 # 1)假设需要求实数x的平方根,任取y为某个实数值 # 2)如果yxy =x,计算结束,y就是x的平方根 # 3)否则令z =(y +x/y)/2 # 4)令y的新值等于z,转回步骤1) # 这种计算平方根的方法被称为“牛顿迭代法” # 需要注意的是在while的条件中不能写成 y * y = x # 这是因为 浮点数只能表示其近似值,永远接近不了这个值 # 所以判断条件 可以取两者的误差值的小于一个可以接受的某个很小的数来进行判断 # # y这个数最开始可以令为 1,从1开始 '''import math x = int(input("请输入一个正实数:")) y = 1 while abs(y*y-x) > 1E-8: y = (y + x / y) / 2 print("{}的算术平方根为:{}".format(x,y))''' # 为了更清楚地知道每次取值近似的情况可以加一个计数器count # 并且可把每次循环的结果列出来(在循环写一个print) # 最后可以和数学库中的sqrt进行比较来看迭代法算出的结果 '''import math x = float(input("请输入一个正实数:")) # 例题中的用的是float y = 1 # 我认为可能是肯定是有小数的用float精度会更大一点 c = 0 while abs(y*y-x) > 1E-8: y = (y + x / y) / 2 c = c + 1 print("第{}次循环,求得的算术平方根为{}".format(c,y)) print("{}的算术平方根为:{}".format(x,y)) print("用迭代法求得的算术平方根为:",y) print("数学库sqrt求的算术平方根为",math.sqrt(x))''' # 格式化输出 '''name = "Tony" print(f"My name is {name}")''' # break 和 continue # 在1-10中找出不是3倍数的并输出 '''for i in range(1,10+1): if i % 3 == 0: continue # 结束当前循环,进入下一次循环 print(i,end=" ") for i in range(1,10+1): if i % 3 == 0: break # 结束整个循环,直接跳出 print(i,end=" ")''' # 例3-16 判断一个正整数是否是素数 # 除了1和它自身外,不能被其它整数整除的数叫做素数 '''n = int(input("请输入一个正整数:")) flag = 1 # 设一个标识变量为1,表示为1的时候是素数 for i in range(2,n): # 因为除了1和它自身外,所以不从1开始,也不会到n if n % i == 0: flag = 0 # 若能够整除说明除了1和它自身外,还有其他数,flag赋值为0 break # 不用再循环下一个数,直接跳出来 if flag == 1: print(n,"是素数") else: print(n,"不是素数")''' # 例3-17 求两个正整数的最大公约数 # 最大公约数应该在1和这两个数中最小的之间 # 最大公约数满足的条件是都能被这两个数整除 # 因为要 求最大,所以倒着遍历,第一个找到的即为最大的 '''m, n = eval(input("请输入两个正整数:")) # m, n = int(input("请输入两个正整数:")) for i in range(min(m,n), 0 ,-1): # 这样的写法是错误的 if m % i == 0 and n % i == 0 : break # 找到了就直接跳出,不用在进行了 print("{}和{}的最大公约数为{}".format(m,n,i))''' # 例3-17 拓展 求三个正整数的最大公约数和最小公倍数 # 最大公约数 '''m, n, p = eval(input("请输入三个正整数:")) for i in range(min(m,n), 0 ,-1): if m % i == 0 and n % i == 0 and p % i == 0: break # 找到了就直接跳出,不用在进行了 print("{},{}和{}的最大公约数为{}".format(m,n,p,i))''' # 最小公倍数 '''m, n, p = eval(input("请输入三个正整数:")) for i in range(min(m,n), 0 ,-1): if m % i == 0 and n % i == 0 and p % i == 0: m1 = m / i n1 = n / i p1 = p / i break #要记住 找到后记得break跳出去,否则它会继续遍历!!! print("{},{}和{}的最大公倍数为{}".format(m,n,p,m1*n1*p1*i))''' # 循环结构中的else子句 # 如果是由于不满足循环条件或者遍历完成后结束那么就执行else的语句 '''for i in range(5): print(i,end=" ") else: print("循环正常结束!!")''' # 如果循环时由于break导致提前结束则不执行else语句 '''for i in range(5): print(i,end=" ") if i >= 3 : break else: print("循环正常结束!!")''' # 例3-18 用带有else语句判断是不是素数 # 这里用循环语句中的else,可以避免用标识变量flag,使代码更为简单了 '''n = int(input("请输入一个正整数:")) for i in range(2,n): if n % i == 0: print(n,"不是素数") break else: print(n,"是素数")''' # 循环的嵌套 # 打印"*"组成的图形 '''for m in range(5):# 外层循环控制行数 # 等价 for m in range(1,5+1) for n in range(10): # 内层循环控制每行字符的个数 # 等价 for n in range(1,10+1): print("*",end=" ") print() # 或者print("")或者print(" ")都可以,作用是换行''' # * * * * * * * * * * # * * * * * * * * * * # * * * * * * * * * * # * * * * * * * * * * # * * * * * * * * * * # 例3-19 "*"组成的图形 # * # ** # *** # **** # ***** # ***** # **** # *** # ** # * # 关键是找外层行和内层的关系 '''for m in range(0,5): for n in range(0,m+1): print("*",end="") print() # 要注意这个换行print的缩进很重要,他是保证在每一次每循环结束后换行 for m in range(0,5+1): for n in range(0,6-(m+1)): print("*",end="") print() # 要注意这个换行print的缩进很重要,他是保证在每一次每循环结束后换行 # 我这个写的稍微有点问题,但是没影响结果 # 是因为在写上半部分的是外层是0的时候,内层也是0,打印不出来 # 下半部分的时候外层是5的时候这时候虽然是第六层但是内层是0,打印不出来,所以也没影响 # 这是自己尝试写的不清楚不推荐,下面是例题解法 # 课本例题是 for m in range(1,5+1): for n in range(1,m+1): print("*",end="") print() # 要注意这个换行print的缩进很重要,他是保证在每一次每循环结束后换行 for m in range(1,5+1): for n in range(1,(6-m)+1): print("*",end="") print() # 要注意这个换行print的缩进很重要,他是保证在每一次每循环结束后换行'''
# 或者 for m in range(1,5+1): for n in range(1,m+1): print("*",end="") print() # 要注意这个换行print的缩进很重要,他是保证在每一次每循环结束后换行 for m in range(5,0,-1): # 这里是区别 倒着用 for n in range(m,0,-1): # 这里是区别 倒着用 print("*",end="") print() # 要注意这个换行print的缩进很重要,他是保证在每一次每循环结束后换行
# 例3-20 找出300以内的素数 '''for m in range(2,299+1): for n in range(2,m): if m % n == 0: break # break跳出内层循环,即遇到能整除了,就不再往下了,直接判断下一个数 else: # else对应的是内层循环 print("{:>4}".format(m),end='')''' # 如果想要知道这之间有多少个素数,需要加一个计数器 '''c = 0 for m in range(2,299+1): for n in range(2,m): if m % n == 0: break # break跳出内层循环,即遇到能整除了,就不再往下了,直接判断下一个数 else: # else对应的是内层循环 c = c + 1 print("{:>4}".format(m),end='') if c % 10 == 0: # 10个为一行 print("") # 换行 print("\n一共有{}个素数".format(c))''' # 这里穿插一下引进库函数的写法,以math库函数为例 '''import math # 把整个math库函数都引进来 print("{:.2f},{:.2f}".format(math.pi,math.e)) print("{:.2}".format(math.sqrt(2)))''' # 3.14,2.72 # 1.4 '''from math import pi,e,sqrt # 用谁把谁引进来 print("{:.2f},{:.2f}".format(pi,e)) print("{:.2}".format(math.sqrt(2)))''' # 3.14,2.72 # 1.4 '''from math import * # 这个写法,math库里的可以直接使用,就不需要前面加math.了 print("{:.2f},{:.2f}".format(pi,e)) print("{:.2}".format(math.sqrt(2)))''' # 3.14,2.72 # 1.4
# random库 提供了与随机数有关的功能的函数 # random() 返回左闭右开区间[0.0,1.0)的一个随机 浮点数 # 从range()形式中生成的序列中随机一个 整数 # randrange(n) # randrange(m,n) # randrage(m,n,d) # randint(m,n) 闭区间 左闭右闭 # choice(s) 从序列s中随机算出一个 元素 # uniform(m,n) 从闭区间中生成一个随机小数 # sample(pop,k) 从pop类型中随机选取k个元素,以列表类型返回 # (pop是一个字典(dict)对象的方法,用于删除并返回指定键(key)对应的值(value) # pop方法的基本语法是 dictionary.pop(key[, default]),其中: # - key: 要从字典中删除的键。 # - default: 可选参数,如果指定的键不存在于字典中,将返回这个默认值 # 如果不提供该参数,且键不存在,则会引发一个`KeyError`异常 # pop方法的作用包括: # 1. 删除元素:从字典中移除指定的键及其对应的值。 # 2. 返回值:返回被删除的键对应的值。 # 3. 处理默认值:如果指定的键不存在,可以返回一个默认值,而不是引发错误。 # 例如,假设有一个字典my_dict = {'a': 1, 'b': 2, 'c': 3}, # 使用my_dict.pop('b')将会删除键'b'及其对应的值2,并返回值2 # 如果调用my_dict.pop('d', 'Not found'),由于键'd'不存在,它将返回字符串'Not found'而不引发异常。 # pop类型是一个字典对象的内置方法,用于操作字典中的元素) # shuffle(s) 类似洗牌 # seed(n) 用整数n重置随机数生成器.(相当于一个种子) # 利用系统当时的时间重置随机数生成器, # 调用seed函数,相当于要求重新开始一个随机序列. # 比如 seed(25) //(相当于一个种子) # 然后用random() 随机出来一个数 # 如果不改变n,则随机出来的数是一样的 # (就像是一个种子,你这个种子是确定的,那么随机生成的就不会变) # (除非你把种子给改变了)
# 例3-21 '''from random import * print("{:.2f}".format(random())) # 不超过1的随机正浮点数 print(randrange(10)) # 一个小于10的随机非负 整数 print(randrange(0,10,3)) # 区间[0,10)间隔为3一个的随机整数 print(randint(20,50)) # 闭区间[20,50]的一个随机整数 print(choice("ABCDEFG")) # ABCDEFG序列里的一个随机元素 ls = [1,2,3,4,5] # 列表 我现在还没学到,只会在里面放数字(笑哭) print(choice(ls)) print("{:.2f}".format(uniform(3,8))) # 闭区间[3,8]的一个随机小数 ls = [1,2,3,4,5,6,7,8] # print(shuffle(ls)) #这样写不可以,运行出来是 None shuffle(ls) # 洗牌,打乱顺序 print(ls) # 这样写才对,运行出来是 [2, 5, 1, 7, 6, 3, 8, 4] print(sample(ls,4)) # 以列表形式返回 s = "ABCDEFG" print(sample(s,4)) # 以列表形式返回,返回的仍是字符串 a = "0987654" print(sample(a,3)) # 以列表形式返回,返回的仍是字符串 seed(20) print(random()) # 0.9056396761745207 seed(20) # 会发现只要种子不变,随机出来的数就不变 print(random())# 0.9056396761745207 seed(35) print(randrange(10)) # 8 seed(35) print(randrange(10)) # 8''' # 例3-22 用随机数模拟掷骰子的过程,测两个骰子点数之和为7的概率 # 求概率,需要记录每次点数之和为7的次数和总次数,所以需要设置计数器 '''from random import * c = 0 for i in range(100000): a = randrange(1,6+1) b = randrange(1,6+1) if a + b == 7: c += 1 print("概率",c/100000)''' # 例3-22 拓展 问题:赌场有一种游戏,称为“幸运7” # 游戏规则是你丢两个骰子,如果其点数之和为7你就赢4元,不是7你就输1元, # 请你分析一下,这样的规则是否公平呢? # 假设你刚开始有10元,当全部输掉为0元的时候游戏结束 # 下面我们来写一段代码模拟你参加游戏的过程 # 设计随机 要用到random库 # 不确定什么时候结束,用while语句 # 可以设计一个计数器来记录最多玩几次把钱输完 '''from random import * m = 10 c = 0 while m > 0: a = randint(1, 6 ) b = randint(1, 6 ) if a + b == 7: m = m + 4 else: m = m - 1 c = c + 1 print(m,end=' ') print("\n最多能玩{}次".format(c))''' # 例题中还设置了变量sm保存玩家过程中的能赢的最多钱是多少 # from random import * '''m = 10 sm = m #把开始的钱给sm c = 0 while m > 0: # 判断条件是 是不是还有钱即 m 是否大于0 不能写成sm a = randint(1, 6 ) b = randint(1, 6 ) if a + b == 7: m = m + 4 if m > sm : sm = m # 和sm进行比较 else: m = m - 1 c = c + 1 print(m,end=' ') print("\n最多能玩{}次,能得到的最多的钱{}".format(c,sm))''' # 例3-23 找出所有水仙花数(三位数) # 用切片方法 '''for i in range(100, 1000): a = int(str(i)[0])**3 b = int(str(i)[1])**3 c = int(str(i)[2])**3 if a + b + c == i: print(i,end=' ') for i in range(100, 1000): a = i // 100 b = i % 100 // 10 # 或者写成 b = i // 10 % 10 c = i % 10 if a ** 3 + b ** 3 + c ** 3 == i: print(i,end=" ")''' # 例3-24 找出1000以内所有的完数 # 完全数 (Perfect number) ,是一些特殊的自然数。 # 它所有的真因子(即除了自身以外的因子)的和(即因子函数),恰好等于它本身 # s = 0 #这个s = 0 不能放在这 # for i in range(2,1000): # s = 0 # 应该放在外层循环里,内层循环外 # for j in range(1,i): # if i % j == 0: # s = s + j # if s == i: # print(i,end=' ') # 例3-25 求无穷极数4/1 - 4/3 + 4/5 - 4/7+...的和是圆周率Π,计算前n项的和 '''n = eval(input('请输项数:')) s = 0 for i in range(1,n+1): # 要注意(2*i-1)的括号不要忘记了 a = (-1)**(i+1)*(1/(2*i-1)) s = s + a print(4*s)''' # 例3-26 斐波那契数列 # 需要设置三个变量,设置两个不太够,两项的和需要第三个变量给接住 # 很重要的是 要注意 放置的顺序 '''i = 1 j = 1 c = 2 n = eval(input('请输入项数:')) print('{:>5}{:>5}'.format(i,j),end=' ') # 因为你先把1,1给单独拿出来了,所以要先输出来 for m in range(3,n+1): k = i + j # 因为1,1先拿出来了,所以应该直接写第三个数,不能先交换 c = c + 1 # 把每一个数完成好后再进行交换,不要一上来就先交换 print('{:>5}'.format(k),end=' ') if c % 4 == 0: print(' ') i = j # 然后再进行交换 这个顺序也很重要,要先确定i(即第一位上的数) j = k # 然后再确定j(即第二位上的数)'''