2019-11-10 Python语法练习

2019-10-19  本文已影响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)]))
一行代码实现
上一篇下一篇

猜你喜欢

热点阅读