Python黑魔法手册记录

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

__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()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值