所有“内置”标识符的直接访问
__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()