Python练习程序(持续更新)
1、九九乘法表
第一种写法,缺陷:每行之后多出一个空格
#!/usr/bin/python3 # -*- coding: UTF-8 -*- # author by :luky for i in range(1, 10): for j in range(1, i+1): print('{}*{}={}\t'.format(j, i, i * j), end='') print()
修改后可去除末尾的空格。
#!/usr/bin/python3 # -*- coding: UTF-8 -*- # author by :luky for i in range(1, 10): for j in range(1, i+1): if i == j: print('{}*{}={}'.format(j, i, i * j)) else: print('{}*{}={}'.format(j, i, i * j), end='\t')
2、求一个数是否为质数
输入任意数字求是否为质数
最基本的方法:
#!usr/bin/env python3 # -*- coding: UTF-8 -*- # author by : luky num= int(input('请输入数字:')) for i in range(2, int(num*0.5)+1) : if num % i == 0: print("不是质数") break else: print('{}是质数'.format(num))
升级,缩小遍历范围,先除去偶数,遍历到根号下n即可
#!usr/bin/env python3 # -*- coding: UTF-8 -*- # author by : luky num= int(input('请输入数字:')) if (num % 2 == 0 )and(int(num/2) )!= 1: #排除偶数,但不包含2 print("{}不是质数".format(num)) else: for i in range(3, int(num**0.5)+1, 2): #遍历到根号下n if num % i == 0: print("{}不是质数".format(num)) break else: print("{}是质数".format(num))
再升级,采用简单的筛子先除去一些数,采用6K的筛子,其中6K+2,6K+3,6K+4肯定不是质数,直接排除,然后只需要判断6K+1,6K+5是否为质数即可。
#!usr/bin/env python3 # -*- coding: UTF-8 -*- # author by : luky #6N+1方法,实际上就是制作一个简单的筛子!! num= int(input('请输入数字:')) s = num % 6 if num < 6: #先罗列出较小数 if(num==1 or num ==2 or num ==3 or num==5 ): print('{}是质数'.format(num)) else: print('{}不是质数'.format(num)) elif s == 0 or s == 2 or s == 3 or s == 4: #用筛子先排除一部分 print('{}不是质数'.format(num)) else: for i in range(3, int(num**0.5)+1, 2): if num % i == 0: print('{}不是质数'.format(num)) break else: print('{}是质数'.format(num))
3、求一个数是否为质数
笨方法,从小到大开始计算。
#!/usr/bin/env python3 # -*- coding: utf-8 -*- #author by:luky def max_g(x, y): if x > y: min_num = y else: min_num = x for i in range(1, min_num+1): if x % i ==0 and y % i ==0: max_g = i return max_g x = int(input("请输入")) y = int(input("请输入")) print("{}和{}的最大公约数为:{}".format(x, y, max_g(x, y)))
升级,采用欧几里得算法,大大提高效率
算法依据定理:两个整数的最大公约数等于较小的数与两数相除的余数的最大公约数
#!/usr/bin/env python3 # -*- coding: utf-8 -*- #author by:luky def max_g(x, y): while y != 0: y , x= x % y , y #x, y = y, x % y,两个的执行结果一样,即同时执行。 return x x = int(input("请输入:")) y = int(input("请输入:")) print("{}和{}的最大公约数为:{}".format(x, y, max_g(x, y)))
4、日历
直接调用Python内置的库,方便简单。
#!usr/bin/env python3 # -*- coding: UTF-8 -*- #author by:luky import calendar years = int(input("请输入年份:")) month = int(input("请输入月份:")) print(calendar.month(years, month))
自己动手写的日历,显示的感觉没用标准库的好。在算法方面加了一些自己的想法
#!usr/bin/env python3 # -*- coding: UTF-8 -*- # author by:luky date_day = {1: 31, 2: 28, 3: 31, 4: 30, 5: 31, 6: 30, 7: 31, 8: 31, 9: 30, 10: 31, 11: 30, 12: 31} date_month = {1: 'January', 2: 'February', 3: 'March', 4: 'April', 5: 'May', 6: 'June', 7: 'July', 8: 'August', 9: 'September', 10: 'October', 11: 'November', 12: 'December'} date_week = {1: 'Mon ', 2: 'Tue ', 3: 'Wen ', 4: 'Thu ', 5: 'Fri ', 6: 'Sat ', 7: 'Sun '} #找一个参考标准 ref_years = 2018 ref_month = 1 ref_week = 1 #月份第一天是星期几 #判断是否是闰年 def if_LeapYear(year): if year % 100 == 0 and year % 400 == 0: return True elif year % 4 == 0: return True else: return False #当为闰年时修改天数 def chage_month2(year): global date_day if_leap = if_LeapYear(year) if if_leap == 1: date_day[2] = 29 else: date_day[2] = 28 #计算和参考时间的天数差 def get_week(year, month): global date_day global date_week leap_num = 0 num_day = 0 s1 = 4 - (year + 1) % 4 s = 4 - ref_years % 4 print(s1) if (year + month) >= (ref_years + ref_month): for i in range(ref_years + s, year, 4): if if_LeapYear(i) == 1 and s != 0: leap_num += 1 chage_month2(ref_years) for i in range(ref_month, 13): num_day = num_day + date_day[i] chage_month2(year) for i in range(1, month): num_day = num_day + date_day[i] num_day = 365 * (year - ref_years - 1) + leap_num + num_day print(leap_num) print(num_day) week = num_day % 7 week = week + ref_week if week > 7: week = week - 7 else: for i in range(year + 1 + s1, ref_years + 1, 4): if if_LeapYear(i) == 1: leap_num += 1 chage_month2(ref_years) for i in range(1, ref_month): num_day = num_day + date_day[i] chage_month2(year) for i in range(month, 13): num_day = num_day + date_day[i] num_day = 365 * (ref_years - year - 1) + leap_num + num_day print(leap_num) week = num_day % 7 week = ref_week - week if week < 1: week = week + 7 return week # 显示日历 def show(year, month): week = get_week(year, month) print(week) print('\t\t{} {}'.format(date_month[month], year)) print('{}{}{}{}{}{}{}'.format('Mon ', 'Tue ', 'Wen ', 'Thu ', 'Fri ', 'Sat ', 'Sun')) print(' ' + ' ' * (week - 1), end='') for i in range(1, date_day[month] + 1): if week == 7: print(str(i) + ' ' * (4 - len(str(i)))) elif week == 1: print(' ' + str(i) + ' ' * (4 - len(str(i))), end='') else: print(str(i) + ' ' * (4 - len(str(i))), end='') i += 1 week += 1 if week == 8: week = 1 year = int(input("输入年份:")) month = int(input("输入月份:")) show(year, month)
5、找出文件中内容相同的行
先读取每一行,再逐次比较每行。
#!usr/bin/env python3 # -*- coding: UTF-8 -*- f1 = open("C:/Users/luky/Desktop/1.txt", "r+") f2 = open("C:/Users/luky/Desktop/2.txt", "r+") f3 = open("C:/Users/luky/Desktop/3.txt", "w+") all1 = f1.readlines() # 先取出文件1中所有行取出 all2 = f2.readlines() # 再取出文件2中所有行取出 f1.close() f2.close() for l1 in all1: for l2 in all2: if l1.strip() == l2.strip(): # 比较行中内容是否一样,strip()表示移除字符串头尾指定的字符(默认为空格) f3.write(l2) else: continue else: pass f3.close()
注:strip([chars]):Python的字符串内置函数,作用:移除字符串头尾指定的字符(默认为空格)
6、反向读取文件
先将文件中的内容取出,在反向遍历输出即可,在取出文件的内容时,有以下两个函数:
file1.readlines() #表示将整个文本取出
file1.readline() #取出每一行的内容,一次只取一行
#!usr/bin/env python3 # -*- coding: UTF-8 -*- # author by:luky file1 = open('C:/Users/luky/Desktop/1.txt', 'r') #list1 = [] # 用一个空列表用于存放每行的内容 list1 = file1.readlines() #读取每一行,一次性读完 i = len(list1) for j in list1[::-1]: list1[i-1] = j.strip() print(list1[i-1]) i -= 1 file1.close()
file1 = open('C:/Users/luky/Desktop/1.txt', 'r') list1 = [] # 用一个空列表用于存放每行的内容 while True: line = file1.readline() list1.append(line.strip()) if len(line) == 0: break for l in list1[::-1]: # 反向遍历,然后依次读取出来 print(l) file1.close()