python多学多练系列一

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分钱
    在这里插入图片描述
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)]))

在这里插入图片描述
解析过程:

# 先推导生成一个 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

4、斐波那契数列,生成 10项 数列

def fib_get(n):
    first, second, count = 0, 1, 2
    while count < n + 2:
        yield second
        first, second = second, first + second
        count += 1


ret = fib_get(10)
print(list(ret))

输出:

[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]

5、递归计算 10 的阶乘 【 n! = n * (n-1)! 】

def rec(n):
    if n == 1:
        return 1
    else:
        return n * rec(n-1)


ret = rec(5)
print(ret)

输出:

120

猜你喜欢

转载自blog.csdn.net/Sunny_Future/article/details/108331225