美文网首页
2019-11-10 Python语法练习

2019-11-10 Python语法练习

作者: 阿丧小威 | 来源:发表于2019-10-19 15:16 被阅读0次

    1. 九九乘法表

    第一步:定义乘数x,即每一行中不变的那个数;定义被乘数y,即每一行的乘以乘数x,依次递增1,但不超过x的数;
    第二步:print被乘数,乘数,积的相关信息,当乘数增加1时,输出一个换行;
    第三步:格式化输出最大长度为6的字符串,右补空格,以显示整齐。

    for x in range(1,10):    ---x为乘数
        for y in range(1,x+1):    ---y为被乘数
            print(f"{y}x{x}={x*y}".ljust(6), end=' ')    ---使用新特性格式化字符串,也可以使用format,%等格式化,其中ljust(6)左对齐,长度为6,右补空格
        print("")    ---打印一个换行
    
    九九乘法表

    2. 发放奖金的梯度

    企业发放的奖金根据利润提成,利润(I)低于或等于10万元时,奖金可提10%;利润高于10万元低于20万元时,低于10万元的部分按10%提成,高于10万元的部分可提成7.5%;20万元到40万元之间时,高于20万元的部分可提成5%;40万元到60万元之间时,高于40万元的部分可提成3%;60万元到100万元时,高于60万元的部分可提成1.5%;高于100万元时,超过100万元的部分按1%提成。计算给定的利润I,应发奖金总数。
    思路:利用数组(列表)来分界和定位。

    arr = [1000000, 600000, 400000, 200000, 100000, 0]    ---定义利润列表
    rat = [0.01, 0.015, 0.03, 0.05, 0.075, 0.1]    ---定义提成比例列表,与利润列表一一对应
    
    while True:
        i = input('净利润(q退出):')    ---获取用户输入
        if i == 'q':
            exit(0)    ---退出程序
        if not i.isdigit():    ---如果不是数字,则重新开始循环,重新输入数据
            continue
        reward = []    ---定义奖金列表,存放每一区间计算的奖金
        print("奖金为:", end='')    ---不换行
        I=int(i)
        for idx in range(0,6):
            if I > arr[idx]:
                reward.append ((I - arr[idx]) * rat[idx])    ---将每一区间的奖金存放在奖金列表中
                I = arr[idx]
        reward.reverse()    ---逆序奖金列表,目的为方便输出
        if(len(reward)) == 1:    ---如果只有一个,直接输出
            print(reward[0])
        else:
            print(" + ".join([str(num) for num in reward]),"=",sum(reward))    ---输出每个区间的奖金,并求和
    
    发放奖金的梯度

    3. 递归获取目录下文件的修改时间

    列出某一文件目录下的所有文件(包括其子目录文件),打印修改时间,距当前时间有几天几时几分
    思路:使用标准库os模块的os.walk方法,使用datetime模拟计算时间差。

    # encoding=utf-8
    
    import os
    import datetime
    
    # 循环H:\SecureCRT目录和子目录,r表示原始字符串,不含转义字符
    print(f"当前时间:{datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
    for root, dirs, files in os.walk(r"H:\SecureCRT"):
        for file in files:
            # 获取文件的绝对路径
            absPathFile = os.path.join(root, file)
            # 获取修改时间并转化为datetime类型
            modifiedTime = datetime.datetime.fromtimestamp(os.path.getmtime(absPathFile))
            # 获取当前时间
            now = datetime.datetime.now()
            # 获取时间差
            diffTime = now - modifiedTime
            # 打印相关信息,ljust(60)表示该字符串,若不足60字节,则右补空格
            # diffTime.days指间隔的天数,diffTime.seconds表示间隔除了天数外还剩余的秒数,将其转化为时和分
            # diffTime.seconds//3600: 对3600秒取整表示小时数
            # (diffTime.seconds%3600)//60: 先对3600秒取余,再对60秒取整,表示分钟数
            print(f"{absPathFile}".ljust(60), f"修改时间[{modifiedTime.strftime('%Y-%m-%d %H:%M:%S')}] \
            距今[{diffTime.days}天{diffTime.seconds//3600}时{(diffTime.seconds%3600)//60}分]")
    
    递归获取目录下文件的修改时间

    4. 两行代码查找替换3或5的倍数

    列出1~20的数字,若是3的倍数就用apple代替,若是5的倍数就用orange代替,若既是3的倍数又是5的倍数,就用apple、orange代替。注意,只能使用两行代码。
    思路:若是一般的思路,则肯定是一个for循环,再加上if else等操作。而这里练习使用字符串的切片操作。

    for i in range(1,21):
        print("apple"[i%3*5:]+"orange"[i%5*6:] or i)
    
    两行代码查找替换3或5的倍数

    其实算法很简单,就是i对3和5取余,如果为0,则从下标0*5=0开始切片,就取到了apple;如果余数不为0,则最小是从下标1*5=5开始切片,就取到字符串为空。即“apple”[5:]的结果为空。最后使用了or关键字,print(A or B)的含义:如果A为True,则结果为True:当A是False再判断B,则B是True,则结果是True。

    5. 一行代码实现示例4的效果

    思路:学习使用列表推导式及字符串与列表的join操作。

    print("\n".join([str("apple"[i%3*5:]+"orange"[i%5*6:] or i) for i in range(1,21)]))
    
    一行代码实现

    相关文章

      网友评论

          本文标题:2019-11-10 Python语法练习

          本文链接:https://www.haomeiwen.com/subject/suabyctx.html