# 排列组合c(n,m)
m = int(input('m = ')) n = int(input('n = ')) fm = 1 for num in range(1, m + 1): fm *= num fn = 1 for num in range(1, n + 1): fn *= num fmn = 1 for num in range(1, m - n + 1): fmn *= num print(fm // fn // fmn)
def f(x): """ 求函数x的阶乘 :param x: 任意正整数 :return: x的阶乘 """ y = 1 for z in range(1, x + 1): y *= z return y if __name__ == '__main__': m = int(input('m = ')) n = int(input('n = ')) # 当需要计算阶乘的时候,不用再写循环,而是直接调用已经定义好的函数就可以了。 print(f(m) // f(n) // f(m - n))
# Craps 游戏改进版
from random import randint def roll_dice(n=2): total = 0 for _ in range(n): total += randint(1, 6) return total # 改名字,选中要修改的名字,按中shift + F6 from random import randint money = 1000 while money >0: print('玩家总资产:%d' % money) while True: debt = int(input('清下注:')) if 0 < debt <= money: break go_on = False print('玩家摇出了%d' % roll_dice()) if roll_dice() == 7 or roll_dice() == 11: print('玩家胜') money += debt elif roll_dice() == 2 or roll_dice() == 3 or roll_dice() == 12: print('玩家输') money -= debt else: go_on = True while go_on: roll_dice() print('玩家摇出了%d' % roll_dice()) if roll_dice() == roll_dice(): print('玩家胜!') money += debt go_on = False elif roll_dice() == 7: print('玩家输!') money -= debt go_on = False print('你已经破产!')
# 判断质数
from math import sqrt def is_prime(num): for factor in range(2,int(sqrt(num)) + 1): if num % factor == 0: return False return num !=1 and True or False # 通过下面的if条件,可以在导入模块时不去执行下面的代码。 # ctrl + 鼠标左键 可以查找解释定义。 if __name__ == '__main__': num = int(input('请输入一个数判断是不是质数:')) print(is_prime(num))
# 最小公倍数和最大公约数
def lcm(x, y): # if x > y: # (x, y) = (y, x) ''' 求最小公倍数 :param x: 任意正整数 :param y: 任意正整数 :return: x和y的最小公倍数 ''' (x, y) = (y, x) if x > y else (x, y) for i in range(y, x * y + 1): if i % x == 0 and i % y == 0: return i def gcd(x, y): # if x > y: # (x, y) = (y, x) #文档注释 """ 计算最大公约数 :param x: 任意正整数 :param y: 任意正整数 :return: 最大公约数 """ # (x, y) = (y, x) if x > y else (x, y) i = x while i > 0: if x % i ==0 and y % i == 0: # range(x, 0, -1) 从大到小。 return i i -= 1 if __name__ == '__main__': x = int(input('请输入第一个数x=')) y = int(input('请输入第二个数y=')) print('最小公倍数:', lcm(x,y)) print('最大公约数:', gcd(x, y))
# 判断回文质数
from math import sqrt def is_prime(num): for factor in range(2,int(sqrt(num)) + 1): if num % factor == 0: return False return num !=1 and True or False def is_palindrome(num): ''' 判断是不是回文数 :param num: 非负整数 :return: 是回文数返回True,不是回文数返回Flase. ''' temp = num total = 0 while temp > 0: total = total * 10 + temp % 10 temp //= 10 return num == total #and和or运算符都是带短路功能的运算符 #如果and左边的表达式是Flase,那么右边的表达式被短路 #如果or左边的表达式是True,那么右边的表达式被短路 #所以左右两边的表达式放置的顺序可能会对执行效率产生明显的影响。 if __name__ == "__main__": num = int(input('请输入一个数:')) print(is_palindrome(num)) if is_palindrome(num) and prime_number(num): print('%是回文质数' % num) else: print('%f不是回文质数' % num)
# 21根火柴的游戏,谁拿到最后一根,谁就输。每次拿的范围[1,4].保证计算机获胜。
def game_match(): total = 21 while True: my_number = int(input('请输入你拿的火柴数:')) if 1 <= my_number <= 4: com_number = 5 - my_number total -= 5 print('电脑拿完还有多少根', total) if total == 1: print('你输了') break else: print('请输入正确的火柴数!') if __name__ == '__main__': game_match()
# 21根火柴游戏公平版
from random import randint def main(): total = 21 while total > 0: print('还剩下%d根火柴' % total) while True: num = int(input('请输入你要拿的火柴数:')) if 1 <= num <= 4 and num <= total: break total -= num print('你拿完之后还剩%d' % total) if total > 0: com = randint(1,min(4,total)) print('电脑拿了%d根火柴' % com) total -= com if total == 0: print('电脑拿走了最后一根火柴,电脑输了!') break if total == 0: print('你拿走了最后一根火柴,你输了1') if __name__ == '__main__': main()
# 根据给出的长度,生成相同长度的随机验证码,字母和数字构成的,区分大小写的。A-Z(65-90) a-z(97-122)
#我写的! list1 = '' for x in range(65, 91): list1 += (chr(x)) for y in range(97, 123): list1 += (chr(y)) for z in range(0, 10): list1 += 'z' print(list1) from random import randint def main(x): """ 指定长度的验证码 :param x: 指定长度 :return: 生成指定长度的验证码。 """ list2 = '' for i in range(x): list2 += (list1[(randint(0, 61))]) return list2 if __name__ == '__main__': print(main(4))
#老师评讲! import random def generate_code(code_len=4): """ 生成指定长度的验证码 :param code_len: 指定长度 :return: 由大小写字母和数字组成的指定长度的随机验证码 """ all_chars = '0123456789abcdefghigklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' code = '' for _ in range(code_len): index = random.randint(0, 61) code += all_chars[index] return code if __name__ == '__main__': print(generate_code())
# 根据输入的文件名,输出后缀名。
# 我写的 def main(file_name): position = file_name.rfind('.') if 0 < position < len(file_name)-1: suffix_name = file_name[position + 1:] else: suffix_name = '' return suffix_name if __name__ == '__main__': file_name = input('请输入文件名:') print(main(file_name))
老师讲的!加了是否带点这个功能 def get_suffix(filename, has_dot=False): """ 获取文件的后缀名 :param filename:文件名 :param has_dot: 是否带点 :return: 文件的后缀名 """ pos = filename.rfind('.') if 0 < pos < len(filename) - 1: index = pos if has_dot else pos + 1 return filename[index:] else: return '' if __name__ == '__main__': print(get_suffix('.avcc')) print(get_suffix('hello.jpg')) print(get_suffix('hello.c'))
# 生成随机文件名,保证生成的文件名不会和之前的重复。 26个字母加10个数字,生成随机文件名
# 我写的
from random import random, randint import math def main(n): list1 = [] for x in range(65, 91): list1.append(chr(x)) for y in range(0, 10): list1.append(y) print(list1) list2 = [] for i in range(n): list2.append(list1[randint(0, 35)]) return list2 if __name__ == '__main__': print(main(11))
# 骰子随机数之和,用list表示 1-(1,6)-6 2-(2,12)-11 3-(3,18)-16 4-(4,24)
# 我写的
from random import random, randint def main(n, m): """ n个骰子,掷m次的点数和 :param n: 骰子数 :param m: 掷的次数 :return: 点数和 """ list = [] total = 0 for i in range(n, 6 * n + 1): list.append(i) print(list) for _ in range(m): total += randint(n, 6 * n) return total if __name__ == '__main__': print(main(6, 4))
#老师讲的 from random import random, randint # 有了列表容器,我们可以使用1个变量来保存多个数据 # 更为重要的是,我们可以使用循环对列表中保存的数据进行操作。 def roll_dice(n=2): total = 0 for _ in range(n): total += randint(1, 6) return total def main(): """ 一个骰子掷6万次,每个面出现的次数 :return: 每个面出现的次数 """ f = [0] * 11 for _ in range(60000): face = roll_dice() f[face - 2] += 1 for index, val in enumerate(f): print('%d点摇出的次数%d为%.2f%%' % (index + 2, val, f[index] / 600)) # 直接通过for-in循环对列表进行遍历。 for counter in f: print(counter) if __name__ == '__main__': main()
# # 设计一个函数,计算传入列表的成绩的平均分,要求去掉一个最高分和一个最低分
def main(n=2): grade_list = [] total = 0 for _ in range(n): grade = int(input('请传入成绩:')) grade_list.append(grade) # grade_list.sort() # grade_list = grade_list[1:-1] max_grade = min_grade = grade_list[0] for x in grade_list: if x > max_grade: max_grade = x if x < min_grade: min_grade = x grade_list.remove(max_grade) grade_list.remove(min_grade) for index, val in enumerate(grade_list): total += val print('平均分:%.2f' % (total / len(grade_list))) if __name__ == '__main__': main()
# 名字加成绩,并输出最高分和最低分
def main(): names = ['刘备', '张飞', '曹操', '袁绍', '关羽', '赵云', '周瑜'] scores = [] for name in names: score = input('请输入%s的成绩:' % name) scores.append(score) min_scores = max_scores = scores[0] print(scores) name_min = name_max = names[0] for s in scores: if s > max_scores: max_scores = s name_max = names[scores.index(s)] if s < min_scores: min_scores = s name_min = names[scores.index(s)] print('%s最高分:%s' % (name_max, max_scores)) print('%s最低分:%s' % (name_min, min_scores)) if __name__ == '__main__': main()
# 设计一个函数,从传入的列表中,找出第二大的函数,只能使用一次循环。(元组)tuple(集合)set
# 自己写 def main(n=4): list_in = [] for _ in range(n): a = input('请输入你要传入的列表:' ) list_in.append(a) print(list_in) list_in.sort() a_set = set(list_in) list1 = list(a_set) # n = len(list1) print(list1) list1.sort() print(list1) second_max = list1[-2] print('第二大的数为', second_max)
# 老师讲 def second_max(x): # tuple 元组 不可更改,占的空间小一些。安全一些,能用元组,不用列表。 """ 输出最大值和第二大的值 :param x: 输入的列表 :return: 返回最大值和第二大的值 """ (m1, m2) = (x[0], x[1]) if x[0] > x[1] else (x[1], x[0]) for index in range(2, len(x)): if x[index] > m1: m2 = m1 m1 = x[index] elif m1 > x[index] > m2: m2 = x[index] return m1, m2 def main(): my_list = [35, 79, 92, 92, 68, 55, 40] print(second_max(my_list)) if __name__ == '__main__': main()