zoukankan      html  css  js  c++  java
  • 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]
  • 相关阅读:
    内存泄漏 Memory Leaks 内存优化 MD
    Handler Thread 内部类引起内存泄露分析
    为什么不取消注册BroadcastReceiver会导致内存泄漏
    WebChromeClient 简介 API 案例
    WebViewClient 简介 API 案例
    java.net.URI 简介 文档 API
    android.net.Uri 简介 API
    RV 多样式 MultiType 聊天界面 消息类型 MD
    JS函数声明与定义,作用域,函数声明与表达式的区别
    CSS中table tr:nth-child(even)改变tr背景颜色: IE7,8无效
  • 原文地址:https://www.cnblogs.com/testzcy/p/11781362.html
Copyright © 2011-2022 走看看