https://github.com/piglei/one-python-craftsmangithub.com
https://github.com/crazyguitar/pysheeetgithub.com
![41d4b885b67a6688da78ebf51633d36b.png](https://i-blog.csdnimg.cn/blog_migrate/7680a5be7cb769f50cbaee7095ca1540.jpeg)
![f24d8f42177ddabe34d5283c53782df0.png](https://i-blog.csdnimg.cn/blog_migrate/aa5859b57d5c5ee09ac56233280a3843.jpeg)
![ce8953287830cdd6f6aba6488c601f94.png](https://i-blog.csdnimg.cn/blog_migrate/35c570307b56d3007c45e29b6c2c5d3b.jpeg)
![49d2cb24310954d28d1e40525dea21bf.png](https://i-blog.csdnimg.cn/blog_migrate/1d51f3bf391441bce6c29f2c178f334d.jpeg)
![f1fdf48dd2a5b678f2fe2c7c5c65517f.png](https://i-blog.csdnimg.cn/blog_migrate/e33837dc1147df45f883b137cec42e8c.jpeg)
![9a88efb90a09f2351f975e52752ac6c5.png](https://i-blog.csdnimg.cn/blog_migrate/724d7c2bd4acb9a58311c3f23a936131.png)
![1cf7487432809559a8e334a52fbf57a2.png](https://i-blog.csdnimg.cn/blog_migrate/e9e960cf5bf42f49dd1fd6ceab45db3c.jpeg)
![a97d23f00bf026ec1020d621d57ce2ef.png](https://i-blog.csdnimg.cn/blog_migrate/f91f5201ee171a6dd9c877463506ba6f.png)
![bb170e41b66f1b7b929c3b0e8583746d.png](https://i-blog.csdnimg.cn/blog_migrate/efd31ddf38cdfe3e69635cd796c0ec82.jpeg)
![fd93924a4d1c538af318447f22195e35.png](https://i-blog.csdnimg.cn/blog_migrate/4dda70d77d3f9ab75661eddaf8d2be01.jpeg)
![ce9c60b1a7bf20072c2ffae33bf2f810.png](https://i-blog.csdnimg.cn/blog_migrate/a4b981d4647dc1265694ec8c2aa4bcf8.jpeg)
![58b0b1eebf5888971979b117068fccc2.png](https://i-blog.csdnimg.cn/blog_migrate/0b375c12f561fdbf99a46fc10b01c000.jpeg)
![6d7b3f29d95be21e05426d3f4af7e5c2.png](https://i-blog.csdnimg.cn/blog_migrate/faf8b06dfa4c544a4d3f57521a53843e.jpeg)
![c8975b77c3d9a49d04f5722e5860018c.png](https://i-blog.csdnimg.cn/blog_migrate/3a5a5fb297bf5d3770cc72a2f154ad6a.png)
![5576d202e11dac74042565d40735f913.png](https://i-blog.csdnimg.cn/blog_migrate/7da3c0767104649a400992a6d9b9465b.jpeg)
# -*- coding:utf-8 -*-
import random
import wrapt
def provide_number_v1(min_num, max_num):
"""装饰器:随机生成一个在 [min_num, max_num] 范围的整数,追加为函数的第一个位置参数
嵌套层级深、无法在类方法上使用
"""
def wrapper(func):
def decorated(*args, **kwargs):
num = random.randint(min_num, max_num)
# 将 num 作为第一个参数追加后调用函数
return func(num, *args, **kwargs)
return decorated
return wrapper
#使用 wrapt 模块编写更扁平的装饰器
def provide_number(min_num, max_num):
@wrapt.decorator
def wrapper(wrapped, instance, args, kwargs):
# 参数含义: wrapt 模块是一个专门帮助你编写装饰器的工具库。
#
# - wrapped:被装饰的函数或类方法
# - instance:
# - 如果被装饰者为普通类方法,该值为类实例
# - 如果被装饰者为 classmethod 类方法,该值为类
# - 如果被装饰者为类/函数/静态方法,该值为 None
#
# - args:调用时的位置参数(注意没有 * 符号)
# - kwargs:调用时的关键字参数(注意没有 ** 符号)
#
print("instance ", instance) # instance <__main__.Foo2 object at 0x0A3F309ECC0>
num = random.randint(min_num, max_num)
# 无需关注 wrapped 是类方法或普通函数,直接在头部追加参数
args = (num,) + args
return wrapped(*args, **kwargs)
return wrapper
@provide_number_v1(1, 100)
def print_random_number(num):
print(num)
class Foo:
@provide_number_v1(1, 100)
def print_random_number(self, num):
print(num)
class Foo2:
@provide_number(1, 100)
def print_random_number(self, num):
print(num)
print_random_number() # 26
Foo().print_random_number() # <__main__.Foo object at 0x000001A3F309ECC0>
# 方法将会输出类实例 self ,而不是我们期望的随机数 num
Foo2().print_random_number() # 15
import functools
#记得用 functools.wraps() 装饰内层函数,修改外层变量时记得使用 nonlocal
def counter(func):
"""装饰器:记录并打印调用次数"""
count = 0
@functools.wraps(func)
def decorated(*args, **kwargs):
# 次数累加
nonlocal count # 不加这个会报错
#nonlocal 关键字告诉解释器 count 变量并不属于当前的 local 作用域,去外面找找吧
count += 1
print(f"Count: {count}")
return func(*args, **kwargs)
return decorated
@counter
def foo():
pass
foo()
![b9b5cdab9538a8c3fcb58ac63f53ed79.png](https://i-blog.csdnimg.cn/blog_migrate/d622be78c7f3ea85977dfa68d4f1541f.jpeg)
1.打印漂亮的json字符串
# -*- coding:utf-8 -*-
import json
data = {"status": "OK", "count": 2, "results": [{"age": 27, "name": "lee"},
{"age": 29, "name": "dorra"}]}
def print_json(data):
print(json.dumps(data, sort_keys=False, indent=4, separators=(', ', ': '),
ensure_ascii=False))
data_json = json.dumps(data) # 字典转成json字符串
print(data_json)
print_json(data) # 推荐使用
'''
{"status": "OK", "count": 2, "results": [{"age": 27, "name": "lee"}, {"age": 29, "name": "dorra"}]}
{
"status": "OK",
"count": 2,
"results": [
{
"age": 27,
"name": "lee"
},
{
"age": 29,
"name": "dorra"
}
]
}
'''
2.实现蜂鸣器,播放mp3文件一次后退出
# -*- coding:utf-8 -*-
import ctypes
import pygame
from mutagen.mp3 import MP3
import time
def beep(): # 实现蜂鸣器
player = ctypes.windll.kernel32
player.Beep(1000, 1500)
def play_mp3(): # 播放mp3文件一次后退出
pygame.mixer.init()
filename = r'~Desktoptest.mp3'
audio = MP3(filename) # 获取mp3的长度
length = int(audio.info.length) # 220.32 --> 220
pygame.mixer.music.load(filename)
#pygame.mixer.music.play(1, 200)
pygame.mixer.music.play()
time.sleep(length)
查找指定目录下 指定子文件夹
res = []
def get_dirlist(dir=des_dir):
"""
fun: 查找指定目录下 指定子文件夹 eg:ng
:param dir:
:return: 返回子文件夹 绝对路径列表
"""
if os.path.isdir(dir):
if ("ng" in dir):
res.append(dir)
return # 这样减少 运算量,文件夹下面的文件就不会继续运算了
for s in os.listdir(dir):
newDir = os.path.join(dir, s)
get_dirlist(newDir)
#推荐用glob库实现
#glob.glob(pathname) 匹配的文件路径列表,list类型,
ps: 只能遍历当前文件夹下的文件,不能遍历子文件夹中的文件
from glob import iglob
#paths = list(iglob("D:MODEL**ng", recursive=True)) #py3.5 支持 iglob
#print(paths)#结果和上面 get_dirlist()是一模一样的