12_Python语法示例(函数)

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

42.名片管理系统

    1.项目目录结构:
        ~/Desktop/Python/01_名片管理系统 $ tree
        .
        ├── __pycache__
        │   └── cards_tools.cpython-37.pyc
        ├── cards_main.py
        └── cards_tools.py

    2.cards_main.py文件代码

#! /usr/bin/python3

import cards_tools


# 无限循环,由用户主动决定什么时候退出循环!
while True:

    # 显示功能菜单
    cards_tools.show_menu()

    action_str = input("请选择希望执行的操作: ")
    print("您选择的操作是【%s】" % action_str)

    # 1,2,3 针对名片的操作
    if action_str in ["1", "2", "3"]:

        # 新增名片
        if action_str == "1":
            cards_tools.new_card()
        # 显示全部
        elif action_str == "2":
            cards_tools.show_all()
        # 查询名片
        elif action_str == "3":
            cards_tools.search_card()

    # 0 退出系统
    elif action_str == "0":

        print("欢迎再次使用【名片管理系统】")

        break
        # 如果在开发程序时,不希望立刻编写分支内部的代码
        # 可以使用 pass 关键字,表示一个占位符,能够保证程序的代码结构正确!
        # 程序运行时,pass 关键字不会执行任何的操作!
        # pass
    # 其他内容输入错误,需要提示用户
    else:
        print("您输入的不正确,请重新选择")
cards_main.py

    3.cards_tools.py文件代码

# 记录所有的名片字典
card_list = []


def show_menu():

    """显示菜单"""
    print("*" * 50)
    print("欢迎使用【名片管理系统】V 1.0")
    print("")
    print("1. 新增名片")
    print("2. 显示全部")
    print("3. 搜索名片")
    print("")
    print("0. 退出系统")
    print("*" * 50)


def new_card():

    """新增名片"""
    print("-" * 50)
    print("新增名片")

    # 1. 提示用户输入名片的详细信息
    name_str = input("请输入姓名: ")
    phone_str = input("请输入电话: ")
    qq_str = input("请输入QQ: ")
    email_str = input("请输入邮箱: ")

    # 2. 使用用户输入的信息建立一个名片字典
    card_dict = {"name": name_str,
                 "phone": phone_str,
                 "qq": qq_str,
                 "email": email_str}

    # 3. 将名片字典添加到列表中
    card_list.append(card_dict)

    print(card_list)

    # 4. 提示用户添加成功
    print("添加 %s 的名片成功!" % name_str)


def show_all():

    """显示所有名片"""
    print("-" * 50)
    print("显示所有名片")

    # 判断是否存在名片记录,如果没有,提示用户并且返回
    if len(card_list) == 0:

        print("当前没有任何的名片记录,请使用新增功能添加名片!")

        # return 可以返回一个函数的执行结果
        # 下方的代码不会被执行
        # 如果 return 后面没有任何的内容,表示会返回到调用函数的位置
        # 并且不返回任何的结果
        return

    # 打印表头
    for name in ["姓名", "电话", "QQ", "邮箱"]:
        print(name, end="\t\t")

    print("")

    # 打印分隔线
    print("=" * 50)

    # 遍历名片列表依次输出字典信息
    for card_dict in card_list:

        print("%s\t\t%s\t\t%s\t\t%s" % (card_dict["name"],
                                        card_dict["phone"],
                                        card_dict["qq"],
                                        card_dict["email"]))


def search_card():

    """搜索名片"""
    print("-" * 50)
    print("搜索名片")

    # 1. 提示用户输入要搜索的姓名
    find_name = input("请输入要搜索的姓名: ")

    # 2. 遍历名片列表,查询要搜索的姓名,如果没有找到,需要提示用户
    for card_dict in card_list:

        if card_dict["name"] == find_name:

            print("姓名\t\t电话\t\tQQ\t\t邮箱")
            print("=" * 50)
            print("%s\t\t%s\t\t%s\t\t%s" % (card_dict["name"],
                                            card_dict["phone"],
                                            card_dict["qq"],
                                            card_dict["email"]))

            # 针对找到的名片记录执行修改和删除的操作
            deal_card(card_dict)

            break

    else:

        print("抱歉,没有找到 %s" % find_name)


def deal_card(find_dict):

    """处理查找到的名片

    :param find_dict: 查找到的名片
    """
    print(find_dict)

    action_str = input("请选择要执行的操作 "
                       "[1] 修改 [2] 删除 [0] 返回上级菜单")

    if action_str == "1":

        find_dict["name"] = input_card_info(find_dict["name"], "姓名: ")
        find_dict["phone"] = input_card_info(find_dict["phone"], "电话: ")
        find_dict["qq"] = input_card_info(find_dict["qq"], "QQ: ")
        find_dict["email"] = input_card_info(find_dict["email"], "邮箱: ")

        print("修改名片成功!")
    elif action_str == "2":

        card_list.remove(find_dict)

        print("删除名片成功!")


def input_card_info(dict_value, tip_message):

    """输入名片信息

    :param dict_value: 字典中原有的值
    :param tip_message: 输入的提示文字
    :return: 如果用户输入了内容,就返回内容,否则返回字典中原有的值
    """
    # 1. 提示用户输入内容
    result_str = input(tip_message)

    # 2. 针对用户的输入进行判断,如果用户输入了内容,直接返回结果
    if len(result_str) > 0:

        return result_str
    # 3. 如果用户没有输入内容,返回 `字典中原有的值`
    else:

        return dict_value
cards_tools.py

    4.完整项目网盘链接: https://pan.baidu.com/s/1QKW3Dhr5RxDrqRo6eXPC6w  密码: 59s2

43.信息管理系统

    1.项目目录结构:
        ~/Desktop/Python/02_信息管理系统 $ tree
        .
        ├── haproxy.conf
        └── main.py

    2.main.py文件代码

import os


def file_handler(backend_data, res=None, type="fetch"):
    """文件操作"""
    if type == "fetch":  # 查询文件逻辑操作
        with open("haproxy.conf", "r") as read_f:
            tag = False
            ret = []
            for read_line in read_f:
                if read_line.strip() == backend_data:
                    tag = True
                    continue
                if tag and read_line.startswith("backend"):
                    break
                if tag:
                    print("\033[1;45m%s\033[0m" % read_line, end="")
                    ret.append(read_line)
        return ret
    elif type == "change":
        # 读写文件
        with open("haproxy.conf", "r") as read_f, \
                open("haproxy.conf_new", "w") as write_f:
            tag = False  # 头部状态警报
            has_write = False  # 身体状态警报
            for read_line in read_f:
                # 判断读到的头部数据是否是我要找的头部数据
                if read_line.strip() == backend_data:  # backend www.oldboy1.org
                    tag = True
                    continue

                # 头部数据找到情况下读到了下一个头部信息则重置头部警报
                if tag and read_line.startswith("backend"):
                    tag = False
                # 没有找到头部情况下写其他读到的数据
                if not tag:
                    write_f.write(read_line)
                else:
                    if not has_write:  # 找到头部后写表头和修改身体数据
                        for record in res:
                            write_f.write(record)
                        has_write = True  # 把身体列表写完后开起身体警报
        os.rename("haproxy.conf", "haproxy.conf.bak")  # 备份源文件
        os.rename("haproxy.conf_new", "haproxy.conf")  # 覆盖源文件
        os.remove("haproxy.conf.bak")  # 删除备份后的源文件


def fetch(data):
    """查询功能,返回查询结果ret"""
    print("\033[1;43m这是查询功能\033[0m")  # \033[显示方式;前景色;背景色m
    print("\033[1;43m用户数据是\033[0m", data)  # \033[0m 采用终端默认设置,即取消颜色设置
    backend_data = "backend %s" % data

    return file_handler(backend_data)  # 返回调用文件操作函数执行结果


def add():  # 添加
    pass


def change(data):
    """修改传入的参数-->列表嵌套字典,列表的第0个元素是查找的数据,第1个元素是找到后要修改的数据
    [{'backend':'www.oldboy1.org','record':{'server':'2.2.2.5','weight':30,'maxconn':4000}},\
     {'backend':'www.oldboy1.org','record':{'server':'2.2.2.100','weight':20,'maxconn':3000}}]
     """

    backend = data[0]["backend"]  # 取传入头部值 www.oldboy1.org','record
    backend_data = "backend %s" % backend  # 拼接完整头部 backend www.oldboy1.org

    # 取传入身体--->要修改的值 'record':{'server':'2.2.2.5','weight':30,'maxconn':4000}
    oid_server_record = "%sserver %s %s weight %s maxconn %s\n" % (" " * 8, data[0]["record"]["server"],
                                                                   data[0]["record"]["server"],
                                                                   data[0]["record"]["weight"],
                                                                   data[0]["record"]["maxconn"])

    # 取传入身体--->修改后的值 'record':{'server':'2.2.2.100','weight':20,'maxconn':3000}
    new_server_record = "%sserver %s %s weight %s maxconn %s\n" % (" " * 8, data[1]["record"]["server"],
                                                                   data[1]["record"]["server"],
                                                                   data[1]["record"]["weight"],
                                                                   data[1]["record"]["maxconn"])

    #  测试输出拼接结果:       server 2.2.2.5 2.2.2.5 weight 30 maxconn 4000
    print("要查找的数据是:%s" % oid_server_record)

    res = fetch(backend)  # 调用查找函数fetch查找对应头部的身体数据并返回身体数据
    print(res)

    # 头部信息没有匹配到或者要修改的身体数据不在在返回的身体数据列表中
    if not res or oid_server_record not in res:
        return "修改的记录不存在"
    else:
        index = res.index(oid_server_record)  # 取索引
        res[index] = new_server_record  # 根据索引修改返回的身体数据

    res.insert(0, "%s\n" % backend_data)  # 拼接完整的头部和身体: backend www.oldboy1.org 身体数据
    file_handler(backend_data, res=res, type="change")  # 调用修改文件内容逻辑操作


def delete():  # 删除
    pass


if __name__ == "__main__":
    msg = """
    1:查询
    2:添加
    3:修改
    4:删除
    5:退出
    """
    msg_dic = {
        "1": fetch,
        "2": add,
        "3": change,
        "4": delete
    }

    while True:
        print(msg)  # 打印提示信息
        choice = input("请输入选项:").strip()
        if not choice: continue  # 用户输入为空,跳过
        if choice == "5": break  # 退出程序

        data = input("请输入要查询的数据:").strip()
        if data != "1":
            data = eval(data)
        res = msg_dic[choice](data)  # 执行功能函数
        print(res)  # 根据功能打印执行结果

# 测试修改功能传递的修改参数
# [{'backend': 'www.oldboy1.org', 'record': {'server': '2.2.2.5', 'weight': 30, 'maxconn': 4000}},
#     {'backend': 'www.oldboy1.org', 'record': {'server': '2.2.2.100', 'weight': 20, 'maxconn': 3000}}]
main.py

    3.haproxy.conf文件代码

global
        log 127.0.0.1 local2
        daemon
        maxconn 256
        log 127.0.0.1 local2 info
defaults
        log global
        mode http
        timeout connect 5000ms
        timeout client 50000ms
        timeout server 50000ms
        option  dontlognull

listen stats :8888
        stats enable
        stats uri       /admin
        stats auth      admin:1234

frontend oldboy.org
        bind 0.0.0.0:80
        option httplog
        option httpclose
        option  forwardfor
        log global
        acl www hdr_reg(host) -i www.oldboy.org
        use_backend www.oldboy.org if www

backend www.oldboy1.org
        server 101.1000.7.9 101.1000.7.9 weight 20 maxconn 30
        server 2.2.2.7 2.2.2.7 weight 30 maxconn 4000
        server 10.10.10.1 10.10.10.1 weight 22 maxconn 2000
        server 2.2.2.5 2.2.2.5 weight 30 maxconn 4000

backend www.oldboy2.org
        server 3.3.3.3 3.3.3.3 weight 20 maxconn 3000
backend www.oldboy20.org
        server 10.10.0.10 10.10.0.10 weight 9999 maxconn 33333333333
haproxy.conf

    4.完整项目网盘链接: https://pan.baidu.com/s/1kZ7UovzbgCSzGgQ7D3e6Dw  密码: kppf

posted @ 2020-08-10 22:15  唐雪成  阅读(923)  评论(0编辑  收藏  举报