• python 杂记20191102


    权限系统要考虑:页面权限, 操作权限, 数据权限  :https://mp.weixin.qq.com/s/XXCDaPP4DTHKLBzsamND2A

    =====

    __init__.py 会在 import 的时候被执行

    configparser在python中该模块适用于配置文件的格式与windows ini文件类似,可以包含一个或多个节(section),每个节可以有多个参数(键=值)

    ============

    try...except Exception as e 其中的e代表什么意思呢?
    Exception匹配了所有异常,把异常名称赋给了e。

    ============

    上下文管理器:

    def __exit__(self, exc_type, exc_val, exc_tb):
    若exc_tb不是空,则说明有异常
    返回值只能是true或false,若是false,则会把之前发生的异常抛出来

    ===========

    可以定义一个枚举类来管理一些常量

    =====使用顺序

    ==========自定义字符串比较大小的方法

    class MY_CMP(str):
        def __lt__(self,y):
            return self+y>y+self
    ru
    =[3,2,43,56,70,7,11,9] aa=list(map(str,ru)) aa.sort(key=MY_CMP)

    =====================

    安装虚拟环境的工具:pipenv
    安装pipenv: pip install pipenv

    使用 pipenv --venv 命可以 查看项 目对应的虚拟环
    到一个目录下创建虚拟环境:pipenv install
    进入虚拟环境:pipenv shell

    给虚拟环境安装flask:pipenv install flask


    查看安装包的依赖:pipenv graph
    退出虚拟环境:exit

    允许你不显式激活虚拟环境即可在当前项目的虚拟环境中执行命令:pipenv run python hello.py

    数据库可视化工具:Navicat [可以是mysql的可视化工具]

    ===============

    网盘搜索:https://www.dalipan.com/?from=enfi_desktop

     =======装饰器

    from functools import wraps
    def my_decrate(f):
        @wraps(f)
        def tst(*args,**kwargs):
            print('befor')
            ret=f(*args,**kwargs)
            print('after')
            return ret
        return  tst
    
    @my_decrate     # 没参数的装饰器
    def tt(name,age):
        print('hello,name=%s,age=%s'%(name,age))
    
    def logit(lala=' out.log'):  #有参数装饰器的定义
        def logging_decorator(func):
            @wraps(func)
            def wrapped_function(*args, **kwargs):
                log_string = func.__name__ + " was called"
                print(log_string+lala)
                return func(*args, **kwargs)
            return wrapped_function
        return logging_decorator
    
    @logit()  #有参数的装饰器,加了()
    def sdf(name,age):
        print('hello,name=%s,age=%s'%(name,age))
    
    @logit(lala=' haha')
    def sdf2(name,age):
        print('hello,name=%s,age=%s'%(name,age))

     定义类装饰器

     类装饰器的调用

     ==========多维数组

    from collections import  defaultdict
    import json
    
    def tst():
        return defaultdict(tst)
    
    users = tst()
    users['core']['ip'] = 'hrldcpr'
    users['core']['port'] = 'matthandlersux'
    users['age']=18
    users['wfids']["tree"]['leaf']=990
    
    print(users['core']['port'])  # matthandlersux
    print(users['age']) # 18
    print(json.dumps(users))  # {"core": {"ip": "hrldcpr", "port": "matthandlersux"}, "age": 18, "wfids": {"tree": {"leaf": 990}}}

     ===========

    生成器是一种使用普通函数语法定义的迭代器 。

    实现了方法__iter__的对象是可迭代的,

    而实现了方法__iter__和__next__的对象是迭代器

    包含yield语句的函数都被称为生成器(生成器也有方法__iter__和__next__

    #自定义生成器
    
    class tst(object):
        def __init__(self,n):
            self.n=n
            self.i =1
        def __iter__(self):
            return self
        def __next__(self):
            if self.i >self.n:
                raise StopIteration()
            i=self.i
            self.i +=1
            return i
    
    
    aa=tst(3)
    print('==11111=====')
    for j in aa:
    print(j)
    print('==3333=====')
    for j in aa: # 迭代器只能消费一次,所以没打印
    print(j)
    print('=======')
    结果

    ==11111=====
    1
    2
    3
    ==3333=====
    =======

    可以使用chardet模块来检测文件中的字符集合。这在分析大量随机文本时非常有用。安装chardet模块
    ==============
    匿名函数:lambda 参数:操作(参数)     你不想在程序中对⼀个函数使⽤两次, 你也许会想⽤lambda表达式


    for循环还有⼀个else从句, 这个else从句会在循环正常结束时执⾏。 这意味着, 循环没有遇到任何break.


    ctypes接⼜允许我们在调⽤C函数时使⽤原⽣Python中默认的字符串型和整型 ,⽽对于其他类似布尔型和浮点型这样的类型, 必须要使⽤正确的ctype类型才可以
    =============
    如果__exit__返回的是True以外的任何东西, 那么这个异常将被with语句抛出

    我们来写⼀个程序, 读取⼀个⽂件, 检测它是否是JPG(提⽰: 这些⽂件头部以字节FF D8开始) :jpgdata.startswith(b'xffxd8')

    Python中当函数被定义时, 默认参数只会运算⼀次, ⽽不是每次被调⽤时都会重新运算。 你应该永远不要定义可变类型的默认参数

    ===========用yield实现一个协程

    def grep(pattern):
        print("Searching for", pattern)
        while True:
            line = (yield)
            if pattern in line:
                print(line)
    
    tst = grep('love')
    next(tst)  # 启动协程,执行yield表达式
    tst.send('i love you')
    tst.send('do you love me')
    tst.send('yes i do')
    tst.close()  # 关闭协程

     ==对二进制进行编码:base64.b64encode

    所谓转义就是不采用符号本来的含义,而是采用另外一种含义。如 指换行, 指回车。
    可以使用r取消转义,如r"c: ews"

    Unicode编码通常是2个字节。
    UTF-8:常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节。
    如果你写的文本基本上全部是英文的话,用Unicode编码比ASCII编码需要多一倍的存储空间,本着节约的精神,又出现了把Unicode编码转化为“可变长编码”的UTF-8编码.

    f=open("tst.txt")
    f.tell() #指针所在位置
    f.seek(4) #将指针定位到从开头的第四个字符后面

    封装就是让别人看不到,就是定义私有属性和方法

    特殊方法:两个对象是否能进行加法运算,首先要看对象是否有__add__方法

    __slot__已经把实例属性管控起来了,若要增加属性,只能通过类属性来实现

    __setattr__(self,name,value):给name属性赋值时就调用这个方法
    __getattr__(self,name):name被访问且它不存在时会调用此方法
    __getattribute__(self,name):name被访问时被调用,无论name是否存在

    def __setattr__(self,name,value):
        print("tst for fun")
        self.__dict__[name]=value
    def __getattribute__(self,name):
        print('aaaaaaa")
        return object.__getattribute__(self,name)
    def __getattr__(self,name):
        if name == "size"
            return self.width,self.length
        esle:
            raise AttributeError            

     =======

    __打头的变量是私有变量,不能被子类继承,对应的实例也不能访问
    _打头的变量是protect的,可以被子类继承,实例可以访问,不能在其他模块import

    from  hah import *
    print('begin')
    print(eae.name)
    print(_eye.name) # 会报错

    ========拷贝

    import copy
    t1={'name':'t1'}
    t2={'name':'t2','son':t1}
    t3=t2
    t4=copy.copy(t2)
    t5=copy.deepcopy(t2)
    t1['age1']=10
    t2['age2']=18
    print('t3 ',t3," t4 ",t4," t5 ",t5)

     ==========

    >>> python xxx.py # 直接运行 >>> python -m xxx # 相当于import,叫做当做模块来启动

    主要区别在于sys.path不同

    直接运行会将该脚本所在目录添加至sys.path
    当做模块启动则会将当前运行命令的路径添加至sys.path

    deque提供了⼀个双端队列, 你可以从头/尾两端添加或删除元素.
    我们也可以限制这个列表的⼤⼩, 当超出你设定的限制时, 数据会从对队列另⼀端被挤出去(pop)。

    捕获多个异常:except (IOError, EOFError) as e:

    for循环还有个else从句,这个else从句会在循环正常结束时执。这意味着,循环没有遇到任何break.

    检测文件是否是JPG(这些文件头部以字节FF D8开始): if jpgdata.startswith(b'xffxd8'):

    ==============

    计算字符长度
    def str_byte_len(mystr):
    return (len(mystr.encode('utf-8')))

    str_byte_len('i love python') # 13(个字节)
    str_byte_len('字符') # 6(个字节)

    过滤掉各种空值
    def filter_false(lst):
    return list(filter(bool, lst))

    filter_false([None, 0, False, '', [], 'ok', [1, 2]])# ['ok', [1, 2]]

    嵌套数组完全展开
    from collections.abc import *

    def flatten(input_arr, output_arr=None):
    if output_arr is None:
    output_arr = []
    for ele in input_arr:
    if isinstance(ele, Iterable): # 判断ele是否可迭代
    flatten(ele, output_arr) # 尾数递归
    else:
    output_arr.append(ele) # 产生结果
    return output_arr

    flatten([[1,2,3],[4,5]], [6,7]) # [6, 7, 1, 2, 3, 4, 5]

    对象转换为可迭代类型
    from collections.abc import Iterable

    def cast_iterable(val):
    return val if isinstance(val, Iterable) else [val]

    cast_iterable('foo')# foo
    cast_iterable(12)# [12]
    cast_iterable({'foo': 12})# {'foo': 12}

    检查list是否有重复元素
    def has_duplicates(lst):
    return len(lst) == len(set(lst))

    列表翻转
    def reverse(lst):
    return lst[::-1]

    互为变位词
    from collections import Counter
    # 检查两个字符串是否 相同字母异序词,简称:互为变位词
    def anagram(str1, str2):
    return Counter(str1) == Counter(str2)

    anagram('eleven+two', 'twelve+one') # True 这是一对神器的变位词
    anagram('eleven', 'twelve') # False

    是否为变位词;
    方法1:
    def isAnagrams(self, str1, str2):
    if sorted (str1) == sorted(str2):
    return True
    return False
    方法2:
    class Solution:
    def anagram(self, s, t):
    return collections.Counter(s) == collections.Counter(t)

    给定一个字符串 S,找出 S 中最长的回文字符串:最简单的方案,穷举所有可能的子串,判断子串是否为回文

    class Solution:
        # @param {string} s input string
        # @return {string} the longest palindromic substring
        def longestPalindrome(self, s):
            if not s:
                return ""
    
            n = len(s)
            longest, left, right = 0, 0, 0
            for i in xrange(0, n):
                for j in xrange(i + 1, n + 1):
                    substr = s[i:j]
                    if self.isPalindrome(substr) and len(substr) > longest:
                        longest = len(substr)
                        left, right = i, j
            # construct longest substr
            result = s[left:right]
            return result
    
        def isPalindrome(self, s):
            if not s:
                return False
            # reverse compare
            return s == s[::-1]
  • 相关阅读:
    [APIO2018]Circle selection
    [CF1025D]Recovering BST
    [CF1023D]Array Restoration
    [POI2006]PRO-Professor Szu
    [CF888G]Xor-MST
    可持久化并查集小结
    [国家队集训]最短路
    [POI2012]FES-Festival
    [SDOI2010]所驼门王的宝藏
    洛谷 P1025 & [NOIP2001提高组] 数的划分(搜索剪枝)
  • 原文地址:https://www.cnblogs.com/testzcy/p/11781362.html
Copyright © 2020-2023  润新知