欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

python多学多练系列一

程序员文章站 2022-05-04 18:18:07
...

1、计算某个文件夹的总大小

  • 当这个文件夹下面只有文件,没有文件夹的时候
  • 当这个文件夹下面还有文件夹,并且文件夹的层数、个数都不确定

方法一:递归

import os


def folder_size(path):
    files = os.listdir(path)
    size = 0
    for file in files:
        abs_path = os.path.join(path, file)
        if os.path.isdir(abs_path):
            size += folder_size(abs_path)
        else:
            size += os.path.getsize(abs_path)
    return size


ret = folder_size(r'F:\code\pythonCode')
print(f'size:{round(ret/1024, 2)} kb')

方法二:堆栈,【tips:列表pop(),默认删除最后一个元素,且返回这个元素】

import os


def folder_size(path):
    dir_list = [path]
    total_size = 0
    while dir_list:
        path = dir_list.pop()
        files = os.listdir(path)
        for file in files:
            abs_path = os.path.join(path, file)
            if os.path.isdir(abs_path):
                dir_list.append(abs_path)
            else:
                total_size += os.path.getsize(abs_path)
    return total_size


ret = folder_size(r'F:\code\pythonCode')
print(f'total_size: {round(ret/1024, 2)} kb')

2、模拟微信发红包

  • 要求每人的抢红包的概率一样
  • 每人至少1分钱
    python多学多练系列一
def red_envelope(money, n):
    if money / n >= 0.01:
        num_list = random.sample(range(money*100), n-1)      # 每次取值的概率相同,且最小值为0.01
        num_list.insert(0, 0)
        num_list.append(money*100)
        num_list.sort()
        for index in range(len(num_list) - 1):
            val = num_list[index+1] - num_list[index]
            yield val/100                                   # 每次点击抢红包时,生成一个数


ret = red_envelope(1, 200)
print(list(ret))

输出:

[18.19, 13.42, 1.13, 78.99, 9.58, 17.68, 9.39, 2.36, 43.93, 5.33]

3、一行代码生成九九乘法表

  • 列表推导式
  • 格式化输出的占位符问题
print('\n'.join([' '.join([f'{y}*{x}={y*x:<2d}' for y in range(1, x+1)]) for x in range(1, 10)]))

python多学多练系列一
解析过程:

# 先推导生成一个 x 列表
print([x for x in range(1, 10)])
# [1, 2, 3, 4, 5, 6, 7, 8, 9]

# 基于 x 的取值范围,推导生成 y 的列表
print([[y for y in range(1, x+1)] for x in range(1, 10)])
# [[1], [1, 2], [1, 2, 3], [1, 2, 3, 4], [1, 2, 3, 4, 5], [1, 2, 3, 4, 5, 6], [1, 2, 3, 4, 5, 6, 7], [1, 2, 3, 4, 5, 6, 7, 8], [1, 2, 3, 4, 5, 6, 7, 8, 9]]

# 基于 y 的列表,结合 x 的值,输出元素形式为 y * x = x*y
print([[f'{y}*{x}={y*x}' for y in range(1, x+1)] for x in range(1, 10)])
# [['1*1=1'], ['1*2=2', '2*2=4'], ['1*3=3', '2*3=6', '3*3=9'], ['1*4=4', '2*4=8', '3*4=12', '4*4=16'], ['1*5=5', '2*5=10', '3*5=15', '4*5=20', '5*5=25'], ['1*6=6', '2*6=12', '3*6=18', '4*6=24', '5*6=30', '6*6=36'], ['1*7=7', '2*7=14', '3*7=21', '4*7=28', '5*7=35', '6*7=42', '7*7=49'], ['1*8=8', '2*8=16', '3*8=24', '4*8=32', '5*8=40', '6*8=48', '7*8=56', '8*8=64'], ['1*9=9', '2*9=18', '3*9=27', '4*9=36', '5*9=45', '6*9=54', '7*9=63', '8*9=72', '9*9=81']]

# 基于 y 的列表,通过 空格 连接 y 列表内的每个元素
print([' '.join([f'{y}*{x}={y*x}' for y in range(1, x+1)]) for x in range(1, 10)])
# ['1*1=1', '1*2=2 2*2=4', '1*3=3 2*3=6 3*3=9', '1*4=4 2*4=8 3*4=12 4*4=16', '1*5=5 2*5=10 3*5=15 4*5=20 5*5=25', '1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36', '1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49', '1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64', '1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81']

# 基于 x 的列表,通过 换行 连接 x 列表内的每个 y 列表
print('\n'.join([' '.join([f'{y}*{x}={y*x}' for y in range(1, x+1)]) for x in range(1, 10)]))
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
1*4=4 2*4=8 3*4=12 4*4=16
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81

# 通过 f-string 优雅地输出,'<' 左对齐, '2d' 表示整数两位,'.2f'表示小数两位,'2s'表示字符串两位占位
# f-string用法参考:https://blog.csdn.net/sunxb10/article/details/81036693
print('\n'.join([' '.join([f'{y}*{x}={y*x:<2d}' for y in range(1, x+1)]) for x in range(1, 10)]))
1*1=1 
1*2=2  2*2=4 
1*3=3  2*3=6  3*3=9 
1*4=4  2*4=8  3*4=12 4*4=16
1*5=5  2*5=10 3*5=15 4*5=20 5*5=25
1*6=6  2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7=7  2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8=8  2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9=9  2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81