zoukankan      html  css  js  c++  java
  • 学习--流畅的Python

    colors = ['black', 'white']
    sizes = ['S', 'M', 'L']
    tshirts = [(color, size) for color in colors
                               for size in sizes]
    tshirtss = (('%s %s') % (color, size) for color in colors for size in sizes)
    print(tshirts)
    for i in tshirtss:
        print(i)
    
    symbols = '$¢£¥€¤'
    codes = [ord(symbol) for symbol in symbols]
    c = tuple((ord(symbol) for symbol in symbols))
    print(codes)
    print(c)
    
    t = (20, 8)
    print(divmod(*t))
    
    a, b, *c = range(5)
    print(a,b,c)
    fmt = '{:}'.format(12323)
    print(fmt)
    
    print('{:^14}'.format('陈某某'))
    print('{:>14}'.format('陈某某'))
    print('{:<14}'.format('陈某某'))
    print('{:*<14}'.format('陈某某'))
    print('{:&>14}'.format('陈某某'))#填充和对齐^<>分别表示居中、左对齐、右对齐,后面带宽度
    
    print('{:.1f}'.format(4.234324525254))
    print('{:.4f}'.format(4.1))
    
    print('{:.2f}'.format(4.2222326))
    
    print('{:^12}'.format("阿斯蒂芬"))
    print('{:o}'.format(250))
    
    print('{:,}'.format(100000000))
    print('{:,}'.format(235445.234235))
    
    print('{名字}abc{性别}'.format(名字="曾智超",性别=""))
    
    print('{0}abc{1}'.format("曾智超",""))
    
    #具名元组
    import collections
    City = collections.namedtuple('City', 'name country population coordinates')
    tolyo1 = City._make(('Tokyo', 'JP', 36.933, (35.689722, 139.691667)))
    print(tolyo1._asdict())
    tokyo = City('Tokyo', 'JP', 36.933, (35.689722, 139.691667))
    print(tolyo1)
    print(tokyo)
    print(tokyo.coordinates)
    
    print(City._fields)
    
    #切片赋值
    l = list(range(10))
    print(l)
    l[2:5]=[2, 2, 2]
    print(l)
    del l[2:5]
    print(l)
    l[3::2] = [9,8]
    print(l)
    l[2:5] = (100,100)  #如果被赋值的对象是一个切片,那么赋值必须是一个可迭代的对象,即便是一个单独数值,也应变为可迭代序列
    print(l)
    
    #对序列使用+ 和 *
    l = [[1,2,3,'abc'],[4,5,6]]
    l = 3*l
    print(l)
    l[0][1]='X'
    print(l)
    #序列的增量赋值 *= 、+=(__iadd__) 可变序列上面一般实现了__iadd__方法,不可变序列上则没有
    def p(x):
        return print(x)
    l = [1, 2, 3]
    p(id(l))
    l *= 2
    p(id(l))
    p(l)
    l = (1, 2, 3)
    p(id(l))
    l *= 2
    p(id(l))
    p(l)
    #+=谜题
    t = (1, 2, [30, 40])
    t[2].extend([50 ,60])
    print(t)
    import dis
    p(dis.dis('s[a] += b'))
    '''
    Tips:
        不要将可变对象放入元组中
        查看Python的字节码
        增量赋值不是一个原子操作
    '''
    #2.7 list.sort方法和内置函数sorted
    '''
        返回None来表示就地进行的改变(list.sort)
        sorted新建一个列表作为返回值
    '''
    fruits = ['grape', 'rasphberry', 'apple', 'banana']
    p(sorted(fruits,key=len))
    p(fruits)
    list.sort(fruits)
    p(fruits)
    #2.8 用bisect来管理自己已排序的序列
    import bisect
    import random
    def grade(score, break_score=[60, 70, 80, 90], grades='FDCBA'):
        return grades[bisect.bisect_right(break_score, score)]
    print([grade(score) for score in [83, 92, 100, 50, 30, 72]])
    
    SIZE = 7
    random.seed(1)
    my_list = []
    for i in range(SIZE):
        new_item = random.randrange(SIZE*2)
        bisect.insort(my_list, new_item)
        print("%2d ->" % new_item, my_list)
    
    #当列表不是首选时,比如存放一个只包含数字的列表,数组可能是个好的选择
    import array
    import random
    data = array.array('d', (random.random() for i in range(10**2)))
    print(data[-1])
    fb = open('data.bin', 'wb')
    data.tofile(fb)
    fb.close()
    data2 = array.array('d')
    fp = open('data.bin', 'rb')
    data2.fromfile(fp, 10**2)
    fp.close()
    print(data2[-1])
    #Numpy和Scipy
    import numpy as np
    #data = np.loadtxt('data.txt',encoding='UTF-8')
    #print(data[-3:])
    
    #使用deque
    from collections import deque
    p = range(10)
    print(p)
    data = deque(range(10),maxlen=10)
    print(data)
    data.rotate(3)
    print(data)
    
    
    #字典(dict)和集合(set)
    import  collections
    my_dist = {}
    print(isinstance(my_dist,collections.abc.Mapping))
    '''
        什么是可散列类型
        一个对象是可散列的,在对象生命周期中,散列值是不变的!
        需事先实现__hash__()和__qe__()方法,两个散列对象如果相等,得到的散列值是一样的
        Python中不可变类型都是可散列的
        映射的key只能是可散列的
    '''
    
    
    a = dict(one=1, two=2, three=3)
    b = {'one':1, 'two':2, 'three':3}
    c = dict({'one':1, 'two':2, 'three':3})
    d = dict([('one', 1), ('two', 2), ('three', 3)])
    p = zip(['one', 'three', 'two'], [1, 3, 2])
    e = dict(p)
    print(a==b==c==d==e)
    
    #字典推导 dictcomp
    D_CODES = [(86, 'China'), (91, 'India'), (1, 'United States'), (62, 'Indonesia'), (55, 'Brazil'),
               (92, 'Pakistan'), (880, 'Bangladesh'), (234, 'Nigeria'), (7, 'Russia'), (81, 'Japan')]
    
    p = {code:country for code, country in D_CODES}  #字典推导式
    print(p)
    print(dict(D_CODES))
    q = {country.upper():code for code, country in p.items() if int(code)<64}
    print(q)
    
    # my_dist.setdefault(key,[]).append(new_value)
    #映射的弹性查询   1.利用defaultdict    2.自定义dict子类,重写__miss__()方法
    class StrKeyDict0(dict):
        def __missing__(self, key):
            if isinstance(key, str):
                raise KeyError(key)
            return self[str(key)]
        def get(self, key, default=None):
            try:
                return self[key]
            except KeyError:
                return default
    def __contains__(self, key):
        return key in self.keys() or str(key) in self.keys()
    
    a = StrKeyDict0({'one':1, '1':1, '2':'two'})
    
    #字典的变种
    collections.OrderedDict #添加键的时候会保持顺序,删除的时候会删除末尾也就是最后一个加入的元素
    
    collections.ChainMap
    
    p = collections.Counter('aaabbbcccddewffjjll')
    print(p)
    p.update('aaa')
    print(p)
    
    collections.UserDict    #让用户来写dict的子类的!~
    
    
    #不可变映射类型
    from types import MappingProxyType
    pi = {'A':65}
    pi_proxy = MappingProxyType(pi)
    print(pi_proxy)
    #pi_proxy['B'] = 66
    pi['B'] = 66
    print(pi_proxy)
    p = frozenset(range(10))
    q = set(range(10))
    print(p)
    print(q)
    
    #集合操作
    p = {i for i in range(10)}
    print(p)
    
    DIAL_CODES = [(86, 'China'),(91, 'India'),(1, 'United States'),(62, 'Indonesia'),(55, 'Brazil'),
                  (92, 'Pakistan'),(880, 'Bangladesh'),(234, 'Nigeria'),(7, 'Russia'),(81, 'Japan'),]
    d1 = dict(DIAL_CODES)
    print("d1:", d1.keys())
    d2 = dict(sorted(DIAL_CODES))
    print("d2:", d2.keys())
    print(d1 == d2)
    
    #人类使用文本 计算机使用字节序列
    s = 'café'
    print(len(s))
    b =  s.encode('utf-8') #用utf-8将str对象编码成bytes对象
    print(b)
    print(len(b))
    print(b.decode('utf-8'))
    
    p = bytes.fromhex('31 4B CE A9')  #解析十六进制,构建二进制序列
    print(p)
    
    p = bytes('café',encoding='utf-8')
    print(p)
    cafe_crr = bytearray(p)
    print(cafe_crr)
    print(cafe_crr[-1:])
    
    import array
    numbers = array.array('h', [-2, -1, 0, 1, 2])  #短整数16位
    octets = bytes(numbers)
    print(octets)
    
    #结构体和内存视图
    # coding: cp1252
    print('Olá, Mundo!')
    
    u16 = 'El Niño'.encode('utf_16')
    print(u16)
    print(list(u16))
    u16 = 'El Niño'.encode('utf_16le')
    print(u16)
    print(list(u16))
    
    fp = open('cafe.txt', 'w', encoding='utf-8')  #open采用文本模式,返回一个TextIOWrapper对象
    print(fp)
    fp.write('café')
    fp.close()
    import os
    print(os.stat('cafe.txt').st_size) #UTF-8 编码的 'é' 占两个字节
    fp2 = open('cafe.txt')
    print(fp2)
    print(fp2.read())
    fp3 = open('cafe.txt', encoding='utf_8')
    print(fp3)
    print(fp3.read())
    fp4 = open('cafe.txt', 'rb') #在二进制模式中读取文件, 返回BufferReader对象
    print(fp4)
    print(fp4.read())  #返回对应的字节序列
    
    
    import sys, locale
    expressions = """
        locale.getpreferredencoding()
        type(my_file)
        my_file.encoding
        sys.stdout.isatty()
        sys.stdout.encoding
        sys.stdin.isatty()
        sys.stdin.encoding
        sys.stderr.isatty()
        sys.stderr.encoding
        sys.getdefaultencoding()
        sys.getfilesystemencoding()
        """
    my_file = open('dummy', 'w')
    for expression in expressions.split():
        value = eval(expression)                        # eval将str当做表达式求值并返回结果
        print(expression.rjust(30), '->', repr(value))  # repr返回一个对象的string格式
    
    #
    s1 = 'café'
    s2 = 'cafeu0301'
    print(s1, s2)
    print(len(s1), len(s2))
    print(s1 == s2)   #不同的码位序列
    
    
    from unicodedata import name
    micro = 'μ'
    micro_cf = micro.casefold()
    print(name(micro))
    
    #对非ASCII码排序使用的是 local.strxfrm 函数
    fruits = ['caju', 'atemoia', 'cajá', 'açaí', 'acerola']
    print(sorted(fruits))
    
    import locale
    #locale.setlocale(locale.LC_COLLATE, 'pt_BR.UTF-8')
    sorted_fruits = sorted(fruits, key=locale.strxfrm)
    print(sorted_fruits)
    
    #PyUCA 使用Unicode排序算法排序
    
    
    def factroial(n):
        '''return n!'''
        return 1 if n < 2 else n*factroial(n-1)
    
    print(factroial(42))
    print(factroial.__doc__)
    print(type(factroial))
    help(factroial)
    print(list(map(factroial, range(6))))
    print([factroial(n) for n in range(6)])
    print(list(map(factroial, filter(lambda n : n%2, range(6)))))
    print([factroial(n) for n in range(6) if n%2])
    print(all([1, 1, 1]))
    print(any([0, 1, 1]))
    
    fruits = ['strawberry', 'fig', 'apple', 'cherry', 'raspberry', 'banana']
    print(sorted(fruits,key=lambda a:a[::-1]))
    print(str,abs,123)
    
    print([callable(n) for n in [str,abs,123]])
    #用户定义的可调用类型
    import random
    class BingoCage:
        def __init__(self,items):
            self._items = list(items)
            random.shuffle(self._items)
        def pick(self):
            return self._items.pop()
        def __call__(self, *args, **kwargs):
            return self.pick()
    p = BingoCage(range(6))
    print(p._items)
    print(p.pick())
    print(p())
    
    print(dir(factroial))
    #从定位参数到仅限关键字参数
    def f(a, *, b):
        return (a, b)
    print(f(1, b=2))
    
    '''
        为什么引入激活函数
            答:如果不用激活函数,很容易看到每一层的输出是上一层的输入的线性函数,那么
            多层的隐含层就没有实际的效果,容易看到多层隐含层后得到的输出与单个隐含层得
            到的输出是一样的,也就没有了深层网络的意义。
             
    '''
    #函数注解  作用:为IDE和lint程序等工具中的静态类型检查功能提供额外的类型信息
    def clip(text:str, max_len:'int > 0'=80) -> str:
        """在max_len前面或后面的第一个空格处截断文本
        """
        end = None
        if len(text) > max_len:
            space_before = text.rfind(' ', 0, max_len)
        if space_before >= 0:
            end = space_before
        else:
            space_after = text.rfind(' ', max_len)
        if space_after >= 0:
            end = space_after
        if end is None: # 没找到空格
            end = len(text)
        return text[:end].rstrip()
    print(clip.__annotations__)
    from inspect import signature
    sig = signature(clip) #返回Signature对象
    print(sig.return_annotation)
    print(type(sig.parameters))
    for i in sig.parameters.values():
        print(type(i))  #参数名映射到Parameter对象
        note = repr(i.annotation).ljust(13)
        print(note, ':', i.name, '=', i.default)
    
    #支持函数式编程的包

    非学无以广才,非志无以成学! 【Magic_chao

  • 相关阅读:
    Poj 1742 Coins(多重背包)
    Poj 2350 Above Average(精度控制)
    求二进制数中1的个数
    Poj 1659 Distance on Chessboard(国际象棋的走子规则)
    Poj 2411 Mondriaan's Dream(压缩矩阵DP)
    Poj 2136 Vertical Histogram(打印垂直直方图)
    Poj 1401 Factorial(计算N!尾数0的个数——质因数分解)
    poj 2390 Bank Interest(计算本利和)
    Poj 2533 Longest Ordered Subsequence(LIS)
    Poj 1887 Testing the CATCHER(LIS)
  • 原文地址:https://www.cnblogs.com/logo-88/p/8643378.html
Copyright © 2011-2022 走看看