• python 学习摘录


    各种函数

    1. ord(‘A’)获取字符整数表示,chr()转化为对应字符。
    2. .encode('ascii') .encode('utf-8')可以编码为指定的字节 。decode()可以把bytes变为str。.decode('utf-8',erroes='ignore')可以忽略错误字节
    3. len()函数计算str的字符数或bytes的字节数
    4. range()函数可生成一个整数序列,
    5. 输入与输出 input()  print() 可以input('shafkjdhsha:')呈现
    6. 占位符格式化字符串,format()格式化字符串,f-string格式化字符串。%x 十六进制整数 ,如果不确定,%s永远起作用

    头文件

    #/usr/bin/env python3         
    # -*- coding: utf-8 -*-
    

    输入与输出的表示

    1. 数之间可以_隔开
    2. 转义字符 r' ',%%表示一个普通字符
    3. ''' ''' 简化换行

    运算

    1. /计算,结果浮点数。//计算,结果整数,%运算,结果余数。
    2. 布尔值and or not运算
    3. 空值None表示

    tips

    1. python整数,浮点数都无大小限制。

    原理

    1. ASCLL Unicode UTF-8编码
    2. 内存大都是Unicode,读入硬盘时转化为UTF-8。 服务器动态生产Unicode,网页上呈现UTF-8

    模块

    1. 列表list a[-1]直接获取最后一个元素[-2]倒数第二个 a.append()追加 a.insert(1, )插入,删除末尾a.pop(),删除指定位置的元素pop(i) list力度元素类型可以不同,甚至可以在里面加list
    2. 元组tuple 一旦初始化就不能修改。tuple陷阱 t=(1)其实是t=1,只有t=(1,)才能消除歧义,成功定义为tuple

    条件判断

    1. elif :

    循环

    1. 循环 list与tuple中的循环for a in b b是列表元组, while循环 break可以提前结束循环 continnue跳过当前循环

    使用dict与set

    基本格式:

    1. d={'dsa':87,}
    2. s=set([1,2,3])

    基本函数:

    1. .get('dsa',任何你想的返回值)判断是否存在,pop()删除
    2. add()的方式可以添加,remove()方式可以删除。

    函数

    1. 定义函数
    def df(x):
        if x>=0:
            return x
        elif:
            return -x#如果没有return语句,函数执行完毕返回结果None,return None可以简写为return
    
    1. from 文件名 import 函数名(不要括号),可以导入自己定义的函数
    2. 空函数:
    def nop():
        pass
    
    1. 参数检查
    #在函数里增加语句
    if not isinstance(int,float):
        raise TypeError('bad operand type')
    
    1. 可以返回多个值
    return nx,ny #实质是返回一个tuple
    
    1. 默认参数与位置参数
    def power(x,n=2)
    sadasd(a,b,c=2,d='asd')
    
    1. 定义可变参数.

    和定义一个list或tuple参数相比,仅仅在参数前面加了一个*号。

    def calc(*numbers):
        sum = 0
        for n in numbers:
            sum = sum + n * n
        return sum
    

    *nums表示把nums这个list的所有元素作为可变参数传进去。这种写法相当有用,而且很常见。

    calc(*nums)
    

    关键字参数

    可变参数允许你传入0个或任意个参数,这些可变参数在函数调用时自动组装为一个tuple。而关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict。请看示例:

    def person(name, age, **kw):
        print('name:', name, 'age:', age, 'other:', kw)
    

    **extra表示把extra这个dict的所有key-value用关键字参数传入到函数的**kw参数,kw将获得一个dict,注意kw获得的dict是extra的一份拷贝,对kw的改动不会影响到函数外的extra

    >>> extra = {'city': 'Beijing', 'job': 'Engineer'}
    >>> person('Jack', 24, **extra)
    name: Jack age: 24 other: {'city': 'Beijing', 'job': 'Engineer'}
    

    命名关键字参数

    如果要限制关键字参数的名字,就可以用命名关键字参数,例如,只接收cityjob作为关键字参数。这种方式定义的函数如下:

    def person(name, age, *, city, job):
        print(name, age, city, job)
    

    和关键字参数**kw不同,命名关键字参数需要一个特殊分隔符**后面的参数被视为命名关键字参数。

    调用方式如下:

    >>> person('Jack', 24, city='Beijing', job='Engineer')
    Jack 24 Beijing Engineer
    

    如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符*了:

    def person(name, age, *args, city, job):
        print(name, age, args, city, job)
    

    命名关键字参数可以有缺省值,从而简化调用:

    def person(name, age, *, city='Beijing', job):
        print(name, age, city, job)
    

    由于命名关键字参数city具有默认值,调用时,可不传入city参数:

    >>> person('Jack', 24, job='Engineer')
    Jack 24 Beijing Engineer
    

    默认参数一定要用不可变对象,如果是可变对象,程序运行时会有逻辑错误!

    *args是可变参数,args接收的是一个tuple

    **kw是关键字参数,kw接收的是一个dict。

    可变参数既可以直接传入:func(1, 2, 3),又可以先组装list或tuple,再通过*args传入:func(*(1, 2, 3))

    关键字参数既可以直接传入:func(a=1, b=2),又可以先组装dict,再通过**kw传入:func(**{'a': 1, 'b': 2})

    命名的关键字参数是为了限制调用者可以传入的参数名,同时可以提供默认值。

    定义命名的关键字参数在没有可变参数的情况下不要忘了写分隔符*,否则定义的将是位置参数。

    尾递归

    切片

    L[0:3]
    
    L[:3]
    
    L[-2:]
    
    L[-2:-1]
    

    只写[:]就可以原样复制一个list:

    字符串'xxx'也可以看成是一种list,每个元素就是一个字符。因此,字符串也可以用切片操作,只是操作结果仍是字符串:

    迭代

    Python的for循环抽象程度要高于C的for循环,因为Python的for循环不仅可以用在listtuple上,还可以作用在其他可迭代对象上。

    list这种数据类型虽然有下标,但很多其他数据类型是没有下标的,但是,只要是可迭代对象,无论有无下标,都可以迭代,比如dict就可以迭代:

    >>> d = {'a': 1, 'b': 2, 'c': 3}
    >>> for key in d:
    ...     print(key)
    ...
    a
    c
    b
    

    因为dict的存储不是按照list的方式顺序排列,所以,迭代出的结果顺序很可能不一样。

    默认情况下,dict迭代的是key。如果要迭代value,可以用for value in d.values(),如果要同时迭代key和value,可以用for k, v in d.items()

    由于字符串也是可迭代对象,因此,也可以作用于for循环:

    >>> for ch in 'ABC':
    ...     print(ch)
    ...
    A
    B
    C
    

    那么,如何判断一个对象是可迭代对象呢?方法是通过collections.abc模块的Iterable类型判断:

    >>> from collections.abc import Iterable
    >>> isinstance('abc', Iterable) # str是否可迭代
    True
    >>> isinstance([1,2,3], Iterable) # list是否可迭代
    True
    >>> isinstance(123, Iterable) # 整数是否可迭代
    False
    

    最后一个小问题,如果要对list实现类似Java那样的下标循环怎么办?Python内置的enumerate函数可以把一个list变成索引-元素对,这样就可以在for循环中同时迭代索引和元素本身:

    >>> for i, value in enumerate(['A', 'B', 'C']):
    ...     print(i, value)
    ...
    0 A
    1 B
    2 C
    

    上面的for循环里,同时引用了两个变量,在Python里是很常见的,比如下面的代码:

    >>> for x, y in [(1, 1), (2, 4), (3, 9)]:
    ...     print(x, y)
    ...
    1 1
    2 4
    3 9
    

    列表生成式

    生成list [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]可以用list(range(1, 11))

    >>> list(range(1, 11))
    [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    
    >>> [x * x for x in range(1, 11)]
    [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
    
    >>> [x * x for x in range(1, 11) if x % 2 == 0]
    [4, 16, 36, 64, 100]
    
    >>> [m + n for m in 'ABC' for n in 'XYZ']
    ['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']
    

    for循环其实可以同时使用两个甚至多个变量,比如dictitems()可以同时迭代key和value:

    >>> d = {'x': 'A', 'y': 'B', 'z': 'C' }
    >>> for k, v in d.items():
    ...     print(k, '=', v)
    ...
    y = B
    x = A
    z = C
    
    >>> d = {'x': 'A', 'y': 'B', 'z': 'C' }
    >>> [k + '=' + v for k, v in d.items()]
    ['y=B', 'x=A', 'z=C']
    
    >>> L = ['Hello', 'World', 'IBM', 'Apple']
    >>> [s.lower() for s in L]
    ['hello', 'world', 'ibm', 'apple']
    
    >>> [x if x % 2 == 0 else -x for x in range(1, 11)]
    [-1, 2, -3, 4, -5, 6, -7, 8, -9, 10]
    

    上述for前面的表达式x if x % 2 == 0 else -x才能根据x计算出确定的结果。

    可见,在一个列表生成式中,for前面的if ... else是表达式,而for后面的if是过滤条件,不能带else

    生成器

    要创建一个generator,有很多种方法。第一种方法很简单,只要把一个列表生成式的[]改成(),就创建了一个generator:

     g = (x * x for x in range(10))
    

    这就是定义generator的另一种方法。如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator:

    next()函数

    >>> g = (x * x for x in range(10))
    >>> for n in g:
    ...     print(n)
    
    def fib(max):
        n, a, b = 0, 0, 1
        while n < max:
            yield b
            a, b = b, a + b
            n = n + 1
        return 'done'
    

    迭代器

    可迭代对象与迭代器的概念区分

    高阶函数

    把函数作为参数传入,这样的函数称为高阶函数,函数式编程就是指这种高度抽象的编程范式。

    变量可以直接赋给函数

    函数名也是变量

    一个最简单的高阶函数:

    def add(x, y, f):
        return f(x) + f(y)
    

    map reduce

    现在,我们用Python代码实现:

    >>> def f(x):
    ...     return x * x
    ...
    >>> r = map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])
    >>> list(r)
    [1, 4, 9, 16, 25, 36, 49, 64, 81]
    

    map()传入的第一个参数是f,即函数对象本身。由于结果r是一个IteratorIterator是惰性序列,因此通过list()函数让它把整个序列都计算出来并返回一个list。

    所以,map()作为高阶函数,事实上它把运算规则抽象了,因此,我们不但可以计算简单的f(x)=x2,还可以计算任意复杂的函数,比如,把这个list所有数字转为字符串:

    >>> list(map(str, [1, 2, 3, 4, 5, 6, 7, 8, 9]))
    ['1', '2', '3', '4', '5', '6', '7', '8', '9']
    
    reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
    

    filter()也接收一个函数和一个序列。

    def is_odd(n):
        return n % 2 == 1
    
    list(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15]))
    # 结果: [1, 5, 9, 15]
    

    注意到filter()函数返回的是一个Iterator,也就是一个惰性序列,所以要强迫filter()完成计算结果,需要用list()函数获得所有结果并返回list。

    排序算法

    Python内置的sorted()函数就可以对list进行排序:

    >>> sorted([36, 5, -12, 9, -21])
    [-21, -12, 5, 9, 36]
    

    此外,sorted()函数也是一个高阶函数,它还可以接收一个key函数来实现自定义的排序,例如按绝对值大小排序:

    >>> sorted([36, 5, -12, 9, -21], key=abs)
    [5, 9, -12, -21, 36]
    

    这样,我们给sorted传入key函数,即可实现忽略大小写的排序:

    >>> sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower)
    ['about', 'bob', 'Credit', 'Zoo']
    

    要进行反向排序,不必改动key函数,可以传入第三个参数reverse=True

    >>> sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower, reverse=True)
    ['Zoo', 'Credit', 'bob', 'about']
    

    闭包

    占位坑

    匿名函数

    通过对比可以看出,匿名函数lambda x: x * x实际上就是:

    def f(x):
        return x * x
    

    关键字lambda表示匿名函数,冒号前面的x表示函数参数。

    匿名函数有个限制,就是只能有一个表达式,不用写return,返回值就是该表达式的结果。

    用匿名函数有个好处,因为函数没有名字,不必担心函数名冲突。此外,匿名函数也是一个函数对象,也可以把匿名函数赋值给一个变量,再利用变量来调用该函数:

    >>> f = lambda x: x * x
    >>> f
    <function <lambda> at 0x101c6ef28>
    >>> f(5)
    25
    

    装饰器

    函数对象有一个__name__属性,可以拿到函数的名字:

    占位坑

    偏函数

    >>> import functools
    >>> int2 = functools.partial(int, base=2)
    >>> int2('1000000')
    64
    >>> int2('1010101')
    85
    

    所以,简单总结functools.partial的作用就是,把一个函数的某些参数给固定住(也就是设置默认值),返回一个新的函数,调用这个新函数会更简单。

    注意到上面的新的int2函数,仅仅是把base参数重新设定默认值为2,但也可以在函数调用时传入其他值:

    >>> int2('1000000', base=10)
    1000000
    

    模块

    模块名不要和系统模块名冲突,最好先查看系统是否已存在该模块,检查方法是在Python交互环境执行import abc,若成功则说明系统存在此模块。

    错误处理

  • 相关阅读:
    职场中如何沟通 15条技巧现在学
    白领丽人:这六行盛产“钻石王老五”
    个人创业融资中的八大法律问题
    [转帖]用心领导先于理性管理
    职场中牢固人际关系的三十六计
    创业:如何制定最佳融资决策
    工作中如何演绎好你的职场情绪
    怎么成为一个成功的人
    创业不得不看:华商富豪们的成功哲学
    一流简历的10大关注项
  • 原文地址:https://www.cnblogs.com/xxmxxm/p/15377390.html
Copyright © 2020-2023  润新知