#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('-'))#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__ 中
