# 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)