1.写一个函数mysum,此函数带有两个参数x,y打印出两个参数x,y的和
def mysum(x, y):
print(x + y)
mysum(3, 2)
2.写一个函数print_even,传入一个数参n代表终止整数(不包含n),打印0-n之间所有偶数
def print_even(n):
print(list(x for x in range(n) if x % 2 == 0))
print_even(10)
3.写一个函数mymax,返回两个数的最大值
def mymax(a, b):
return a if a > b else b
print(mymax(3, 7))
4.写一个函数input_number用于读取输入的多个整数,输入负数时结束将输入的数形成列表返回给调用者
def input_number():
L1 = list()
while True:
num = int(input("输入整数为负停止:") or "-1")
if num >= 0:
L1.append(num)
else:
break
return L1
print(input_number())
5.写一个函数mysum,可以传入任意个实参的数字,返回所有实参的和
def mysum(*args):
num = 0
for i in args:
num += i
return num
print(mysum(1, 2, 3, 4))
6.仿照max写一个mymax函数,实现功能与max完全相同
def mymax(a, *args): # *聚合
def _max(*args):
m = args[0]
i = 1
while i < len(args):
if args[i] > m:
m = args[i]
i += 1
return m
if len(args) == 0:
return _max(*a) # *打散
return _max(a, *args) # *打散
print(mymax(1, 2, 3, 4))
7.写一个函数minmax,可以给出任意个数字实参,返回这些实参的最小数和最大数
# 方法一
def minmax(*args):
return min(args), max(args)
a, b = minmax(2, 1, 3, 7, 4)
print(a, b)
# 方法二
def my_max_min(*args):
args = list(args)
# print(args)
for i in range(0, len(args)-1):
if args[i] > args[i+1]:
args[i+1], args[i] = args[i], args[i+1]
max_num = args[len(args)-1]
for i in range(len(args)-1, 0, -1):
if args[i] < args[i-1]:
args[i-1], args[i] = args[i], args[i-1]
min_num = args[0]
print(args) # [1, 2, 5, 3, 4, 6, 7]
return (min_num, max_num)
res = my_max_min(5, 1, 7, 2, 4, 3, 6)
print(res) # (1, 7)
8.写一个函数 mysum此函数可以传入一个参数,两个参数和三个参数
'''此函数的功能是返回从开始到终止值的和
1) 当传入一个参数时,这个参数代表终止数
2) 当传入两个参数时,第一个参数代表起始值,第二个参数代表终止值
3) 当传入三个参数时,第三个参数代表步长
'''
def mysum(start, stop=None, step=1):
if stop is None:
start, stop = 0, start
num = 0
for i in range(start, stop, step):
num += i
return num
print(mysum(101)) # 50050
print(mysum(1, 100)) # 4950
print(mysum(0, 101, 2) ) # 2550
# 方法二:
def mysum(*args):
return sum(range(*args))
print(mysum(101)) # 5050
9.创建一个列表L = []写一个函数 input_number读取数据放入列表L中
def input_number():
L = list()
while True:
s = input("输入-1结束") or "-1"
if s == "-1":
break
L.append(s)
return L
print(input_number())
10.写一个函数primes(n),返回小于n的所有的素数的列表
def primes(n):
if n < 2:
return []
L = [2]
for i in range(n): # 循环判断2-n之间的数是不是素数
for j in range(2, i): # 判断i是不是素数
if i % j == 0:
break
if i - j == 1:
L.append(i)
return L
print(primes(10))
11.写一个lambda表达式,判断这个数的2次方+1能否被5整数,如果能整除返回True,否则返回False
fx = lambda x: True if (x**2 + 1) % 5 == 0 else False
print(fx(3)) # True
12.写一个lambda 表达式,求两个变量的最大值
fx = lambda x, y: x if x >y else y
print(fx(4, 3)) # 4
13.自己写一个程序,解释执行用户输入的任何语句
g = {}
l = {}
while True:
s = input(">>>") or "-1"
if s == "-1":
break
exec(s, g, l)
print(g)
print(l)
14.求: 1 + 1/2 + 1/4 + 1/8 + ... + 1/2**n 的和
# 方法一
n = int(input(">>>") or '-1')
print(sum([1/2**n for x in range(n + 1)]))
# 方法二
res = sum(map(lambda x: 1/2**x, range(int(input(">>>")))))
print(res)
15.求 1**2 + 2**2 + 3**2 + ... 9**2 的和
res = sum(map(lambda x: x**2, range(10)))
print(res)
16.求 1**9 + 2**8 + 3**7 + ... 9**1 的和
# 方法一
print(sum(map(lambda x, y: x**y, range(1, 10), range(9, 0, -1))))
# 方法二
print(sum(map(pow, range(1, 10)), range(9, 0, -1)))
17.编写函数 myfac(x) 计算x的阶乘 x! 例如:5! = 5 * 4 * 3 * 2 * 1
# 匿名函数和递归嵌套运用
fx = lambda x: 1 if x == 1 else x * fx(x - 1)
print(fx(5)) # 120
18.写程序算出1~20的阶乘的和 1! + 2! + 3! + .... + 19! + 20!
# 匿名函数和递归嵌套运用
fx = lambda x: 1 if x == 1 else x*fx(x - 1)
print(sum(map(fx, range(1, 21)))) # 2561327494111820313
19.已知有列表:L = [[3,5,8], 10, [[13, 14], 15], 18]
# 1) 写一个函数 print_list(lst) 打印出列表中所有数字
L = [[3,5,8], 10, [[13, 14], 15], 18]
def print_list(lst):
for i in lst:
if type(i) is list:
print_list(i)
else:
print(i)
print_list(L)
# 2) 写一个函数sum_list(lst) 返回列表中所有数字的和
L = [[3,5,8], 10, [[13, 14], 15], 18]
def sum_list(lst):
s = 0
for i in lst:
if type(i) is list:
s += sum_list(i)
else:
s += i
return s
print(sum_list(L)) # 86
20.输入一个圆的半径打印出这个圆的面积,输入一个圆的面积打印出这个圆的半径,用math模块实现
import math
print(math.pi * math.pow(int(input("r:")), 2))
print(math.sqrt(int(input("area:"))/math.pi)) # math.sqrt 求平方根
21.请编写函数 fun(n) 其功能是计算和 Sn = 1 + 1/1! + 1/2! + 1/3! + 1/4! +... +1/n!
import math
# 方法一
def fun(n):
s = 0
for i in range(n+1):
s += 1/math.factorial(i) # math.factorial(i) 求i的阶乘 i!
print(s)
fun(10) # 2.7182818011463845
# 方法二
def func(n):
return sum(map(lambda i: 1/math.factorial(i), range(n+1)))
print(func(10)) # 2.7182818011463845
22.编写函数 fun(x, n) 计算s = 1 + x + x**2/2! + x**3/3! + x**n/n!的和并返回
import math
def fun(x, n):
return sum(map(lambda n: math.pow(x, n)/math.factorial(n), range(n)))
print(fun(3.1, 10)) # 22.1668536447133
23.写一个程序,以电子时钟的格式显示时间:HH:MM:SS
import time
def show_time():
while True:
t = localtime() # 年 月 日 时 分 秒 星期 一年中的第几天 夏令时
s = "\r%02d:%02d:%02d" % t[3:6] # \r 回车后的光标位置
print(s, end='')
time.sleep(1)
show_time()
24.输入你的生日,计算出你出生的那天是星期几?已经出生了多少天?
import time
y = int(input("输入出生的年:"))
m = int(input("输入出生的月:"))
d = int(input("输入出生的日:"))
t = time.mktime((y, m, d, 0, 0, 0, 0, 0, 0))
print("UTC时间的秒数:", t)
time_tuple = time.localtime(t)
week = time_tuple[6]
L = ['星期一',
'星期二',
'星期三',
'星期四',
'星期五',
'星期六',
'星期日']
print("这一天是:", L[week])
t = time.time() - t # 从生日到现在过了多少秒
d = t / (60 * 60 * 24) # t / 一天的秒数
print("您已出生", d, "天")
25.可以作为密码的字符有:大小写的A-Z,0_9,下划线,写一个程序随机生成六位密码
import random
def get_random_passwd(n):
source = [chr(x) for x in range(ord("a"), ord("z")+1)]
source += [chr(x) for x in range(ord("A"), ord("Z")+1)]
source += [str(x) for x in range(10)]
code = ""
while len(code) < n:
code += random.choice(source)
return code
print(get_random_passwd(6))
26.编写一个闹钟程序,启动时设置定时时间(小时和分钟),到时间后打印"时间到....." 然后退出程序
import time
def alarm():
h = int(input("请输入小时: "))
m = int(input("请输入分钟: "))
while True:
ct = time.localtime() # 当前时间的元组
if (h, m) == ct[3:5]:
print("\n时间到...")
return
print("\r%02d:%02d:%02d" % ct[3:6], end='')
time.sleep(1)
# 启动闹钟
alarm()
27.模拟斗地主发牌,扑克牌共54张,三个人,每人发17张牌,底牌留三张
'''
花色:黑桃('\u2660'), 梅花('\u2663'), 方块('\u2665'), 红桃('\u2666')
数值:A2-10JQK 大小王
输入回车,打印第1个人的17张牌,输入回车,打印第2个人的17张牌
输入回车,打印第3个人的17张牌,再输入回车,打印出三张底牌
'''
import random
def get_new_poker():
kinds = ['\u2660', '\u2663', '\u2665', '\u2666']
numbers = ['A']
numbers += [str(x) for x in range(2, 11)]
numbers += ['J', 'Q', 'K']
# 以下生成52张牌
L = [k + n for k in kinds for n in numbers]
L += ['大王', '小王']
return L
def play():
poker = get_new_poker()
random.shuffle(poker)
input("按任意键发第一个人的牌: ")
print("第一个人的牌是:", poker[:17])
input("按任意键发第二个人的牌: ")
print("第二个人的牌是:", poker[17:34])
input("按任意键发第三个人的牌: ")
print("第三个人的牌是:", poker[34:51])
input("按任意键看底牌: ")
print("底牌是:", poker[51:])
play()
28.写函数get_score来获取输入的学生成绩(0~100的整数),出现错误则返回0,输入正确返回这个数
def get_score():
try:
score = int(input("请输入成绩:"))
except ValueError:
return 0
if score in range(101):
return score
return 0
score = get_score()
print('学生的成绩是:', score)
29.一个球从100米高度落下,每次落地后反弹高度为原高度的一半,再落下
'''
1) 写程序算出皮球从第10次落地后反弹高度是多少?
2) 球共经过多少米路径?
'''
def fall_height(m, n, s=0):
s += m
if n == 0:
return m, s
return fall_height(m / 2, n - 1, s)
ret = fall_height(100, 10)
print("最后落地后反弹高度是%s 球共经过%s米" % ret)
30.输入一个正整数,分解质因数,如90 = 2*3*3*5, (质因数是指最小能被原数整除的素数(不包含1))
def primefactor(n, lst, pf_lst):
for i in lst:
if n % i == 0:
pf_lst.append(i)
# 递归加入分解得到的质因数[2, 2, 3, 5]
return primefactor(n / i, lst, pf_lst)
def qualty(n):
qualty_lst = [2]
# 拿到小于n的素数列表 qualty_lst
for i in range(2, n//4+1): # 最小分解质因数是4= 2*2, 优化算法n//4+1
for j in range(2, i):
if i % j == 0:
break
if i - j == 1:
qualty_lst.append(i)
# 循环加入90//2 +1 以内的质素
# [2, 3, 5, 7, 11, 13, 17, 19, 23]
pf_lst = []
# 拿到小于n的分解质因数递归返回列表 pf_lst
primefactor(n, qualty_lst, pf_lst)
s = ""
# 格式化输出
for i in pf_lst:
s += str(i)
s = "%s = " % n + "*".join(s)
print(s)
qualty(90)
31.已知s = {"工商银行", "建设银行", "中国银行", "农业银行"}
# 1.用for 语句遍历集合中的元素并打印
# 2.将上面的for 语句改写为while语句实现上面同样的功能
s = {"工商银行", "建设银行", "中国银行", "农业银行"}
for i in s:
print(i)
t = iter(s)
try:
while True:
print(next(t))
except Exception:
pass
32.写入一个生成器函数, myodd(start, stop) 用于生成start开始到stop结束(不包含stop)的所有奇数
def myodd(start, stop):
while start < stop:
if start % 2 != 0:
yield start
if start < stop:
start += 1
for i in myodd(1, 100):
print(i)
L = [x for x in myodd(1, 100)]
print(L)
33.写一个程序,读入任意行的文字数据,当输入空行时结束输入,打印带有行号的输入结果
L = []
while True:
s = input("请输入: ")
if not s:
break
L.append(s)
for t in enumerate(L, 1): # t= (0, "hello")
print("第%d行: %s" % t)
34.用生成器函数生成斐波那契数列的前n个数:1 1 2 3 5 8 13 ... n
# 1) 输出前 20 个数
# 2) 求前 30 个数的和
def fibonacci(n):
a = 0
b = 1
for i in range(1, n+1):
a, b = b, a + b
yield a
for i in fibonacci(20):
print(i)
print(sum(fibonacci(30)))
35.写程序打印杨辉三角(只打印6层)
'''
1 0+1
1 1 0+1 1+0
1 2 1 0+1 1+1 1+0
1 3 3 1 0+1 1+2 2+1 1+0
1 4 6 4 1
1 5 10 10 5 1
'''
def triangle(n):
L = []
if not L:
L.append(1)
yield L
for i in range(n-1):
R = []
for i in range(len(L)-1):
R.append(L[i]+L[i+1])
L = [1] + R + [1]
yield L
for i in triangle(6):
s = ''
for j in i:
s += str(j) + ' '
print(s.center(13))
36.将如下数据用文本编辑器写入到data.txt文件中
"""
小张 13888888888
小李 13999999999
小赵 13666666666
写程序读取数据,打印出姓名和电话号码,格式如 姓名: 小张, 电话: 13888888888
"""
def read_data():
try:
f = open("data.txt")
L = []
while True:
s = f.readline()
if not s:
f.close()
return L
s = s.rstrip()
name, number = s.split(" ")
L.append((name, number))
except IOError:
print("打开文件失败")
def read_lst(L):
for line in L:
print("姓名:%s, 电话:%s" % line)
def main():
L = read_data()
read_lst(L)
main()
37.读入任意行的文字信息,当输入空行时结束输入,将读入的字符串存于列表写入文件 input.txt 中
def read_input():
L = []
while True:
s = input("请输入: ")
if not s:
break
L.append(s)
return L
def write_input(L):
try:
# 打开文件
f = open("input.txt", 'w')
# 写入数据
for line in L:
f.write(line)
f.write('\n') # 写入换行符('\n', '\r\n')
# 关闭文件
f.close()
except IOError:
print("写文件失败")
def main():
lst = read_input()
print(lst)
write_input(lst)
main()
38.从input.txt中读取之前输入的数据存入列表中,再加上行号进行打印显示,如 第1行: aaaa
def read_input_file(filename='input.txt'):
f = open(filename)
L = []
while True:
# 读取每一行数据
s = f.readline()
if not s:
break
# 把换行符'\n'去掉
s = s.rstrip()
L.append(s) # 放入列表
f.close() # 关闭文件
# 返回L绑定的列表
return L
def print_file_info(L):
for line in enumerate(L, 1):
print("第%d行: %s" % line)
def main():
lst = read_input_file()
print(lst)
print_file_info(lst)
main()
39.用装饰器实现用户验证
user_list = [
{"name": "coco", "passwd": 123},
{"name": "zhangsan", "passwd": 123},
{"name": "lisi", "passwd": 123},
{"name": "wangwu", "passwd": 123}
] # 定义一个列表存储用户数据源
current_dic = {"username": None, "login": False} # 记录用户登录状态
def auth(auth_type="MySQL.db"): # 留给用户传递数据来源
def auth_func(func):
def wrapper(*args, **kwargs):
print("数据库来源是: %s" % auth_type)
if auth_type == user_list:
if current_dic["username"] and current_dic["login"]:
res = func(*args, **kwargs)
return res
username = input("请输入账号:").strip()
passwd = int(input("请输入密码:").strip())
for user_dic in user_list:
if username == user_dic["name"] and passwd ==user_dic["passwd"]:
current_dic["username"] = username
current_dic["login"] = True
ret = func(*args, **kwargs)
return ret
else:
print("账号或密码不正确")
else:
print("请指定源数据库")
return wrapper
return auth_func
def index():
print("欢迎来到主页")
@auth(auth_type=user_list)
def home(name):
print("欢迎回家%s" %name)
@auth()
def shopping(name):
print("%s的购物车里有[手机,外星人,Mac]" %name)
index()
home("coco")
shopping("coco")
49.学生信息管理项目
'''
需要两个函数:
input_student() 返回学生信息的字典的列表
output_student(lst) 以表格式方打印学生信息
学生信息:
姓名(name) 字符串
年龄(age) 整数
成绩(score) 整数
input_student()调用时等待用户输入学生信息,当输入姓名为空时结束输入形成字典后存如列表中返回
L = input_student()
请输入学生姓名: xiaozhang
请输入学生年龄: 20
请输入学生成绩: 98
请输入学生姓名: xiaoli
请输入学生年龄: 23
请输入学生成绩: 100
请输入学生姓名: <回车>输入结束
此时列表数据为:
L = [{'name':'xiaozhang',
'age':20,
'score': 98},
{'name':'xiaoli',
'age':23,
'score': 100}
]
def output_student(lst):pass
print(L) # 打印出字典的列表
output_student(L) # 打印出学生信息的表格如下:
+-----------+--------+---------+
| name | age | score |
+-----------+--------+---------+
| xiaozhang | 20 | 98 |
| xiaoli | 23 | 100 |
+-----------+--------+---------+
'''
def input_student():
L = []
while True:
name = input("请输入学生姓名:") or '-1'
if name == '-1':
break
age = int(input("请输入学生年龄:"))
score = int(input("请输入学生成绩:"))
L.append({'name': name,
'age': age,
'score': score
})
return L
def head(length):
s = '+%s+%s+%s+' % ('-' * (length), '-'*5, '-'*7)
print(s)
def body(length, *args):
s = ('|%s|%s|%s|' %
(args[0].center(length), str(args[1]).center(5), str(args[2]).center(7)))
print(s)
def output_student(lst):
length = max(map(lambda x: len(x['name']), lst)) + 2
head(length) # 开始表格线+------+-----+-------+
body(length, 'name', 'age', 'score') # 抬头行| name | age | score |
head(length) # 分割表格线+------+-----+-------+
for i in lst:
info = (i['name'], i['age'], i['score'])
body(length, *info) # 内容
head(length) # 结束表格线+------+-----+-------+
L = input_student()
print(L)
# [{'name': 'coco', 'age': 18, 'score': 100}, {'name': 'gogo', 'age': 17, 'score': 60}]
output_student(L)
41.改写学生信息管理项目源码,要求带有操作界面
'''
+--------------------------------+ # show_menu() 显示功能选择菜单
| 1) 添加学生信息 | # input_student()
| 2) 显示所有学生的信息 | # output_student() 可作为筛选的嵌套调用
| 3) 删除学生信息 | # delete_student()
| 4) 修改学生成绩 | # modify_student()
| 5) 按学生成绩高-低显示学生信息 | # desc_score() 4种排序并一个函数sort_student()
| 6) 按学生成绩低-高显示学生信息 | # asc_score()
| 7) 按学生年龄高-低显示学生信息 | # desc_age()
| 8) 按学生年龄低-高显示学生信息 | # asc_age()
| 9) 保存学生信息到文件(si.txt) | # write_file()
| 10) 从文件中读取数据(si.txt) | # read_file()
| q) 退出 | # quit()
+--------------------------------+
'''
# 显示功能选择菜单
def show_menu(lst):
# 显示菜单
show_list = [
'+--------------------------------+',
'1) 添加学生信息',
'2) 显示所有学生的信息',
'3) 删除学生信息',
'4) 修改学生成绩',
'5) 按学生成绩高-低显示学生信息',
'6) 按学生成绩低-高显示学生信息',
'7) 按学生年龄高-低显示学生信息',
'8) 按学生年龄低-高显示学生信息',
'9) 保存学生信息到文件(si.txt)',
'10) 从文件中读取数据(si.txt)',
'q) 退出',
'+--------------------------------+'
]
for row in show_list:
print(row)
# 选择菜单
menu_dic = {
'1': input_student, # 添加
'2': output_student, # 显示
'3': delete_student, # 删除
'4': modify_student, # 修改
'5': sort_student, # 排序
'6': sort_student,
'7': sort_student,
'8': sort_student,
'9': write_file, # 保存学生数据
'10': read_file, # 读取学生数据
'q': quit # 退出
}
# 选择功能
choice = input('>>>') or '-1'
if choice in menu_dic:
if choice == '6':
menu_dic[choice](lst, desc=False)
elif choice == '7':
menu_dic[choice](lst, basis='age')
elif choice == '8':
menu_dic[choice](lst, basis='age', desc=False)
else:
menu_dic[choice](lst)
else:
print("输入有误,请从新选择")
# 1.添加学生信息
def input_student(lst):
while True:
name = input("请输入学生姓名:") or '-1'
if name == '-1': break
age = input("请输入学生年龄:")
score = input("请输入学生成绩:")
lst.append({'name': name,
'age': age,
'score': score
})
# 2.显示所有学生信息
def output_student(lst):
def head(length):
s = '+%s+%s+%s+' % ('-' * (length), '-' * 5, '-' * 7)
print(s)
def body(length, *args):
s = '|%s|%s|%s|' % (args[0].center(length), args[1].center(5), args[2].center(7))
print(s)
if lst:
length = max(map(lambda x: len(x['name']), lst)) + 2
head(length) # 开始表格线+------+-----+-------+
body(length, 'name', 'age', 'score') # 抬头行| name | age | score |
head(length) # 分割表格线+------+-----+-------+
for i in lst:
info = (i['name'], i['age'], i['score'])
body(length, *info) # 内容
head(length) # 结束表格线+------+-----+-------+
else:
print("没有学生信息,请选择: 1)添加学生信息")
# 3.删除学生信息
def delete_student(lst):
choice = input("请输入要删除学生的姓名:") or '-1'
sign = False
for i, item in enumerate(lst):
if choice == item['name']:
sign = True
break
else:
print("你要删除的学生不存在")
if sign:
lst.pop(i)
print("已删除学生:%s的信息" % choice)
# 修改学生成绩
def modify_student(lst):
choice = input("请输入要修改学生的姓名:") or '-1'
for item in lst:
if choice == item['name']:
temp_list = [item]
output_student(temp_list)
score = input("请输入新的成绩:") or '-1'
item['score'] = score
print("已修改学生:%s的成绩" % choice)
break
else:
print("你要修改成绩的学生不存在")
# 排序-->按选择的条件排序列表后,作为实参传递给显示函数output_student(lst)
def sort_student(lst, basis='score', desc=True): # 默认按年龄大到小
lst = sorted(lst, key=lambda dic: int(dic[basis]), reverse=desc)
output_student(lst)
# 保存学生信息
def write_file(lst, file="si.txt"):
try:
f = open(file, "w")
for i in lst:
s = "%s,%s,%s\n" % (i['name'], i['age'], i['score'])
f.write(s)
f.flush()
f.close()
print("已成功保存学生信息到[%s]文件" % file)
except IOError:
print("文件打开失败")
# 读取学生信息
def read_file(lst, file="si.txt"):
try:
f = open(file)
while True:
s = f.readline()
if not s:
f.close()
break
s = s.rstrip()
s = s.split(",")
dic = {'name': s[0], 'age': s[1], 'score': s[2]}
lst.append(dic)
print("已成功从文件:[%s]读取到学生信息" % file)
except IOError:
print("文件打开失败")
def main():
"""学生信息管理项目主逻辑入口"""
while True:
show_menu(L)
if __name__ == "__main__":
L = []
main()