Python黑魔法手册记录

tech2026-04-07  1

所有“内置”标识符的直接访问

__builtins__.go = None def my_abs(x): if x > 0: return x else: return -x go go print(my_abs(10)) print(my_abs(-10))

多个列表谅解的方式

def list_sum(): a = [1,2] b = [3,4] c = [5,6] d = [1, 2] print(sum((a,b,c,d), []))

Python 安装目录

def get_python_lib(): from distutils.sysconfig import get_python_lib print(get_python_lib()) #正负得正,负负得正 def aa(): print( 5---3)

计算空字符串的个数

def count(): print("aaaa".count("aa"))

#2.* 和3.* 字母欺骗

def value(): valuе = 32 print(valuе)

#Counter(计数器):用于追踪值的出现次数

def collections(): from collections import Counter ct = Counter('abcdbcaa') print(ct) Counter({'a': 3, 'b': 2, 'c': 2, 'd': 1}) ct['c'] = 0 ct['d'] = -2 print(ct) print(+ct) #由于Counter的机制,+ 用于两个 Counter 实例相加,而相加的结果如果元素的个数 <= 0,就会被丢弃

#分隔符

def msg(): msg = 'hello----world' msg.split('-') filter(None, msg.split('-'))

连接列表

def add_list(): from itertools import chain list01 = [2, 5, 3] list02 = [1,4,6] list03 = [7,9,8] print(list01 + list02 + list03) print(list(chain(list01, list02, list03))) #* 解包 print( [*list01, *list02, *list03]) #推导式 print([x for l in (list01, list02, list03) for x in l]) #使用 heapq,合并后的最终的列表进行排序 from heapq import merge print(list(merge(list01, list02, list03))) #__add__ print(list01.__add__(list02)) # reduce() 函数会对参数序列中元素进行累积 from functools import reduce print(reduce(list.__add__, (list01, list02, list03))) def merge(*lists): for l in lists: yield from l print(list(merge(list01, list02, list03)))

连接字典

def add_dict(): #原地更新 profile = {"name": "ming", "age": 27} ext_info = {"gender": "male","name": "xiao"} profile.update(ext_info) print(profile) #COPY 原地更新 from copy import deepcopy full_profile = deepcopy(profile) full_profile.update(ext_info) print(full_profile) #解包 profile = {"name": "xiaoming", "age": 27} ext_info = {"gender": "male"} full_profile02 = dict(**profile, **ext_info) print(full_profile02) #itertools先将多个字典(可迭代对象)串联起来,组成一个更大的可迭代对象,然后再使用 dict 转成字典 print("#######################") profile = {"name": "ming", "age": 27} ext_info = {"gender": "male", "name": "xiao"} import itertools print(dict(itertools.chain(profile.items(), ext_info.items()))) #借助 ChainMap 当字典间有重复的键时,只会取第一个值 from collections import ChainMap print(dict(ChainMap(profile, ext_info))) #dict.items() 合并 print( dict(profile.items() | ext_info.items())) #dist print( dict(list(profile.items()) + list(ext_info.items()))) print({k:v for d in [profile, ext_info] for k,v in d.items()})

#import 导入包

def import_d(): os = __import__('os') print(os.getcwd()) #__import__ print(__builtins__.__dict__['__import__']('os').getcwd()) #importlib importlib 是 Python 中的一个标准库 import importlib os = importlib.import_module("os") print(os.getcwd()) # #imp Python 3.4 开始,importlib 模块是之前 imp 模块和 importlib 模块的合集。 # #模块查找(find_module)、模块加载(load_module)等等(模块的导入过程会包含模块查找、加载、缓存等步骤)。可以用该模块来简单实现内建的 __import__ 函数功能 # import imp # file, pathname, desc = imp.find_module('os') # myos = imp.load_module('sep', file, pathname, desc) # print(myos.getcwd()) # #execfile py2函数 py3不适用 # aa=execfile("/usr/lib64/python2.7/os.py") # print(aa.getcwd()) #pip install import_from_github_com 可以从 github 下载安装并导入的包 #from github_com.zzzeek import sqlalchemy # from my_importer import install_meta # install_meta('http://localhost:12800/') # import my_info # 打印ok,说明导入成功

#条件

def condition(): age1 = 20 age2 = 17 print("已成年" if age1 > 18 else "未成年") print( age2 > 18 and "已成年" or "未成年") print( ("未成年", "已成年")[age1 > 18]) print( (lambda:"未成年", lambda:"已成年")[age1 > 18]()) print({True: "已成年", False: "未成年"}[age1 > 18]) print( ((age1 > 18) and ("已成年",) or ("未成年",))[0])

#判断是否包含子串

def String_in(): print("lol" in "hello, python") print("hello, python".find("llo") != -1)#没有找到,就返回 -1 def is_in(full_str, sub_str): try: full_str.index(sub_str) return True except ValueError: return False full_str='hello' sub_str='l' full_str.count(sub_str) print( "hello, python".__contains__("lol")) import operator operator.contains("hello, python", "llo") #使用正则匹配 import re def is_in(full_str, sub_str): if re.findall(sub_str, full_str): return True else: return False

####带参数的函数装饰器

def say_hello( contry): def wrapper(func): def deco(*args, **kwargs): if contry == "china": print("你好!") elif contry == "america": print('hello.') else: return # 真正执行函数的地方 func(*args, **kwargs) return deco return wrapper # 小明,中国人 @say_hello( "china") def xiaoming(): pass # jack,美国人 @say_hello("america") def jack(): pass xiaoming() print("------------") jack()

#,Python 对某个对象是否能通过装饰器( @decorator)形式使用只有一个要求:decorator 必须是一个“可被调用(callable)的对象。 ####不带参数的类装饰器 begin

class logger(object): def __init__(self, func): self.func = func def __call__(self, *args, **kwargs): print("[INFO]: the function {func}() is running..."\ .format(func=self.func.__name__)) return self.func(*args, **kwargs) @logger def say(something): print("say {}!".format(something)) say("hello") ####不带参数的类装饰器 end

########带参数的类装饰器 begin

class logger(object): def __init__(self, level='INFO'): self.level = level def __call__(self, func): # 接受函数 def wrapper(*args, **kwargs): print("[{level}]: the function {func}() is running..."\ .format(level=self.level, func=func.__name__)) func(*args, **kwargs) return wrapper #返回函数 @logger(level='WARNING') def say(something): print("say {}!".format(something)) say("hello") ########带参数的类装饰器 end

“”“描述符 #get: 用于访问属性。它返回属性的值,若属性不存在、不合法等都可以抛出对应的异常。 #set:将在属性分配操作中调用。不会返回任何内容。 #delete:控制删除操作。不会返回内容。”""

class Score: def __init__(self, default=0): self._score = default def __set__(self, instance, value): if not isinstance(value, int): raise TypeError('Score must be integer') if not 0 <= value <= 100: raise ValueError('Valid value must be in [0, 100]') self._score = value def __get__(self, instance, owner): return self._score def __delete__(self): del self._score class Student: math = Score(0) chinese = Score(0) english = Score(0) def __init__(self, name, math, chinese, english): self.name = name self.math = math self.chinese = chinese self.english = english def __repr__(self): return "<Student: {}, math:{}, chinese: {}, english:{}>".format( self.name, self.math, self.chinese, self.english ) aa=Student('aa',89,98,60)

“”"描述符分两种: 数据描述符:实现了__get__ 和 set 两种方法的描述符 非数据描述符:只实现了__get__ 一种方法的描述符 数据描述器和非数据描述器的区别在于:它们相对于实例的字典的优先级不同

class TestProperty(object): def __init__(self, fget=None, fset=None, fdel=None, doc=None): self.fget = fget self.fset = fset self.fdel = fdel self.__doc__ = doc def __get__(self, obj, objtype=None): print("in __get__") if obj is None: return self if self.fget is None: raise AttributeError return self.fget(obj) def __set__(self, obj, value): print("in __set__") if self.fset is None: raise AttributeError self.fset(obj, value) def __delete__(self, obj): print("in __delete__") if self.fdel is None: raise AttributeError self.fdel(obj) def getter(self, fget): print("in getter") return type(self)(fget, self.fset, self.fdel, self.__doc__) def setter(self, fset): print("in setter") return type(self)(self.fget, fset, self.fdel, self.__doc__) def deleter(self, fdel): print("in deleter") return type(self)(self.fget, self.fset, fdel, self.__doc__) class Student: def __init__(self, name): self.name = name # 其实只有这里改变 @TestProperty def math(self): return self._math @math.setter def math(self, value): if 0 <= value <= 100: self._math = value else: raise ValueError("Valid value must be in [0, 100]") aa=Student('小明') aa.math=30 aa.math 使用TestProperty装饰后,math 不再是一个函数,而是TestProperty 类的一个实例。所以第二个math函数可以使用 math.setter 来装饰,本质是调用TestProperty.setter 来产生一个新的 TestProperty 实例赋值给第二个math。 第一个 math 和第二个 math 是两个不同 TestProperty 实例。但他们都属于同一个描述符类(TestProperty),当对 math 对于赋值时,就会进入 TestProperty.__set__,当对math 进行取值里,就会进入 TestProperty.__get__。仔细一看,其实最终访问的还是Student实例的 _math 属性。"""

#################上下文管理器######################## #可以将资源的连接或者获取放在__enter__中,而将资源的关闭写在__exit__ 中

with EXPR as VAR:

BLOCK

class Resource(): def __enter__(self): print('===connect to resource===') return self def __exit__(self, exc_type, exc_val, exc_tb): print('===close resource connection===') def operate(self): print('===in operation===') with Resource() as res: res.operate()
最新回复(0)