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分钱
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
上一篇: Java多线程——线程同步
下一篇: java 多线程“同步锁”