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()
九九乘法表1

修改后可去除末尾的空格。

#!/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

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)))
代码1

升级,采用欧几里得算法,大大提高效率

算法依据定理:两个整数的最大公约数等于较小的数与两数相除的余数的最大公约数

#!/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))
代码1

自己动手写的日历,显示的感觉没用标准库的好。在算法方面加了一些自己的想法

#!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)
日历2

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()
使用readlines
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()
使用readline

 

 
posted @ 2018-01-04 19:53  影-辰  阅读(290)  评论(0编辑  收藏  举报