python3 基础 练习 源码 2

时间:2021-07-10 12:29:08
#         2. 定义两个函数:
#    sum3(a, b, c)  用于返回三个数的和
#    pow3(x)        用于返回x的三次方
#   1) 计算 1 的立方 + 2的立方 + 3的立方的和
#     即: 1**3 + 2**3 + 3**3
#   2) 计算 1 + 2 + 3 的和的立方
#     即: (1+2+3) ** 3




def sum3(a, b, c):
    return a + b + c




def pow3(x):
    return x**3




# 1) 计算 1 的立方 + 2的立方 + 3的立方的和
#  即: 1**3 + 2**3 + 3**3
print(sum3(pow3(1), pow3(2), pow3(3)))




# 2) 计算 1 + 2 + 3 的和的立方
#  即: (1+2+3) ** 3

print(pow3(sum3(1, 2, 3)))



   #    思考 max 函数是如何实现的,我们能否写一个一模一样的mymax函数.试将mymax实现


def mymax(m, *args):
    if len(args) == 0:
        zuida = m[0]
        for i in range(1, len(m)):
            if m[i] > zuida:
                zuida= m[i]
        return zuida
    else:
        for x in args:
            if x > m:
                m = x
        return x




print(max('ABCDE'))
print(max(1,2,3,4))


.     写一个myrange函数,参数可以传1~3个,实际意义与range函数规则相同,此函数返回range规则的列表.
# 如:
#   L = myrange(4)
#   print(L)  # [0, 1, 2, 3]
#   L = myrange(4, 6)
#   print(L)  # [4, 5]
#   L = myrange(1, 10, 3)
#   print(L)  # [1, 4, 7]




def myrange(start, stop=None, step=1):
    if stop is None:
        stop = start
        start = 0
    L = []
    if step > 0:
        while start < stop:
            L.append(start)
            start += step
    elif step < 0:
        while start > stop:
            L.append(start)
            start += step
    return L
    # return [x for x in range(start, stop, step)]


L = myrange(4)
print(L)  # [0, 1, 2, 3]
L = myrange(4, 6)
print(L)  # [4, 5]
L = myrange(1, 10, 3)
print(L)  # [1, 4, 7]


L = myrange(10, 1, -2)
print(L)



#       已知有五位朋友在一起
#   第五位朋友比第四个人大2岁
#   第四位朋友比第三个人大2岁
#   第三位朋友比第二个人大2岁
#   第二位朋友比第一个人大2岁
#   第一个人说他10岁
#   编写程序求出第五个人几岁?


def get_age(n):
    if n == 1:
        return 10
    return 2 + get_age(n - 1)

print(get_age(5))


   编写函数fac(n) 优先使用递归返回n的阶乘
#   print(fac(5))  # 120
# n! = n * (n-1)*(n-2)* ... * 4*3*2*1

def fac(n):
    if n == 1:
        return 1
    return n * fac(n - 1)

print(fac(5))




# 2. 写程序算出1~20的阶乘的和
#   1! + 2! + 3! + .... 20!

print(sum(map(fac, range(1, 21))))



 编写一个闹钟程序,启动时设置 定时时间,
#   到时候后打印出一句话,然后退出程序


import time


h = int(input("输入小时:"))
m = int(input("输入分钟:"))




while True:
    t = time.localtime()
    print("\r%02d:%02d:%02d" % (t[3], t[4], t[5]),
        end=''
        )
    if t[3:5] == (h, m):
        print("时间到....")
        break
    time.sleep(1)
     


     模拟斗地主发牌,共54张扑克牌
  #   黑桃('\u2660'), 梅花('\2663u'), 方块('\u2665'), 红桃('\u2666')
#   A2-10JQK
#   大小王
#   三个人玩,每人发17张牌,底牌留三张


import random


kinds = ['\u2660', '\u2663', '\u2665','\u2666']
number = ['A']
number += [str(x) for x in range(2, 11)]
number += ['J', 'Q', 'K']
kings = ['大王', '小王']


L = [x + y for x in kinds for y in number]
L += kings


random.shuffle(L)


print("第一个人:", L[0:17])
print("第二个人:", L[17:34])
print("第三个人:", L[34:51])
print("底牌:", L[51:])



一个球从100米高空落下,每次落地后反弹高度为原高度的一半,再落下
#   写程序算出皮球在第10次落地后的反弹高度和此球共经过多少米路程
#   (建议用循环和递归两种方法实现)




def ball(meter: "初始高度",
         times: "次数") -> ("最终高度", "路程"):
    s = 0.0
    for _ in range(times):
        s += meter     # 下落高度
        s += meter / 2  # 反弹高度
        meter /= 2  # 计算反弹后高度
    return (meter, s)


meter, s = ball(100, 10)
print("最后高度是:", meter, "总行程:", s)


# 递归实现:
def ball(meter: "初始高度",
         times: "次数") -> ("最终高度", "行程"):
    if times <= 0:
        return(meter, 0)


    m, s = ball(meter / 2, times - 1)
    return (m, meter + meter / 2 + s)




meter, s = ball(100, 10)
print("最后高度是:", meter, "总行程:", s)



     分解质因数,输入一个正整数,分解质因数
# 如输入:90,则打印 "90=2*3*3*5"
# (质因数是指最小能被原数整除的素数(不包括1))


# def zhiyinshu(n):
#     """迭代实现"""
#     L = []
#     while True:
#         for x in range(2, n):
#             if n % x == 0:
#                 L.append(x)
#                 n /= x
#                 n = int(n)
#                 break
#         else:
#             if n != 1:
#                 L.append(n)
#             break
#     return L




def zhiyinshu(n):
    """ 递归实现"""
    for x in range(2, n):
        if n % x == 0:
            return [x] + zhiyinshu(int(n // x))
    if n == 1:
        return []
    else:
        return [n]




def output_zhiyinshu(n):
    lst = zhiyinshu(n)
    L = [str(x) for x in lst]
    return str(n) + "=" + '*'.join(L)




print(output_zhiyinshu(90))
print(output_zhiyinshu(6))
print(output_zhiyinshu(100))
print(output_zhiyinshu(3))



# 1. 写一个生成器函数myodd(x) 用来生成x以内的奇数
# 如:
#   myodd(10)  可以生成[1,3,5,7,9]


# 用while 实现
# def myodd(n):
#     begin = 0
#     while begin < n:
#         if begin % 2:
#             yield begin
#         begin += 1




# 用for 实现
def myodd(n):
    for begin in range(n):
        if begin % 2:
            yield begin




L = list(myodd(10))
print(L)


      写一个生成器函数 myprimes(n) 用来生成n以内的所有素数
#   打印100以内的素数




def isprime(x):
    for i in range(2, x):
        if x % i == 0:
            return False
    return True




def myprimes(n):
    for x in range(2, n):
        if isprime(x):
            yield x




L = list(myprimes(100))
print(L)







写一个生成器函数myrange([start, ] stop[, step])
#   用来生成一系列整数:
#   要求 :
#     myrange功能与range功能完全相同
#     不允许调用range函数和使用列表




def myrange(start, stop=None, step=1):
    if stop is None:
        stop = start
        start = 0
    if step > 0:
        while start < stop:
            yield start
            start += step
    elif step < 0:
        while start > stop:
            yield start
            start += step


    return "没有值了"




print(list(myrange(10)))
print(list(myrange(15, 20)))
print(list(myrange(15, 10, -1)))
print(list(myrange(15, 10, -2)))




写一个复制文件的程序 mycp.py 在程序启动后输入要复制的文件名(路径)
#   输入复制后的文件名(路径)
#   后开始复制
#   $ python3 mycp.py
#   请输入源文件:day16.txt
#   请输入目标文件:/home/tarena/day16.txt
#   开始复制....
#   复制完成


#   要求:
#      能够复制(文本文件和二进制文件)


import sys




try:
    src = input("请输入源文件:")
    f_src = open(src, 'rb')
except IOError:
    print("源文件不存在!", file=sys.stderr)
    sys.exit()


try:
    dst = input("请输入目标文件:")
    f_dst = open(dst, 'wb')
except IOError:
    f_src.close()  # 关闭之前打开的文件
    print("目标文件无法打开")
    sys.exit()






print("开始复制....")
try:
    while True:
        b = f_src.read(4096)
        if not b:
            break
        f_dst.write(b)
except:
    print("复制没有成功,,把复制一半的半成品删除")
finally:
    f_src.close()
    f_dst.close()


print("结束复制")





 写一个列表类 MyList 实现存储整数的列表,类的定义如下:
#   class MyList:
#       def __init__(self, it=None):
#           self.data = [....]
#       .... 以下内容自己实现
#   让此类的对象能返回迭代器进行访问.
#   让此类的对象能用len(x) 函数求取长度
#   思考:
#     如何让此类的对象用sum()函数求和




class MyList:
    class Lst_iterator:
        def __init__(self, lst):
            self.lst = lst  # 让self.lst 绑定可迭代对象的列表data
            self.index = 0  # 记录当前迭代器的位置
        def __next__(self):
            if self.index < len(self.lst):
                r = self.lst[self.index]
                self.index += 1
                return r
            raise StopIteration


    def __init__(self, it=None):
        if it:
            self.data = [x for x in it]
        else:
            self.data = []


    def __repr__(self):
        return "MyList(%r)" % self.data


    def __iter__(self):
        return self.Lst_iterator(self.data)  # 把列表传入




L = MyList(range(5))
print(L)
It1 = iter(L)
print(next(It1))  # 0


It2 = iter(L)
print(next(It2))  # 0
print(next(It2))  # 1
print(next(It2))  # 2


print("再次访问It1")
print("  ----> ", next(It1))  # 1



       写一个类MyPrimes,实现迭代器协议,让此类能生成从b开始到e结束的全部素数
#   class MyPrimes:
#       def __init__(self, b, e):
#            ....
#       def __iter__(self):
#           ...
#       def __next__(self):
#           ...
#   L = [x for x in MyPrimes(10, 20)]
#   print(L)  # [11, 13, 17, 19]




def isprime(x):
    if x <= 1:
        return False
    for i in range(2, x):
        if x % i == 0:
            return False
    return True




class MyPrimes:
    def __init__(self, b, e):
        self.begin, self.end = b, e


    def __iter__(self):
        print("__iter__ 被调用")
        self.cur_value = self.begin  # cur_value 给迭代器用
        return self


    def __next__(self):
        print("__next__ 被调用")
        for x in range(self.cur_value, self.end):
            if isprime(x):
                self.cur_value = x + 1
                return x
        raise StopIteration


L = [x for x in MyPrimes(10, 20)]
print(L)  # [11, 13, 17, 19]


p1 = MyPrimes(0, 10)
for x in p1:
    print(x)


for y in p1:
    print(y)