美文网首页19-23年 学习笔记
【Python】学习笔记

【Python】学习笔记

作者: Du1in9 | 来源:发表于2020-08-10 19:46 被阅读0次

    抽空总结的一篇笔记,顺便复习一下python语法,通俗易懂 ~


    第1章 变量和数据类型

    • 数据类型

    ①整数
    计算机由于使用二进制,所以有时候用十六进制表示整数比较方便,用0x前缀和0-9,a-f表示,例如:0xff00,0xa5b4c3等等
    ②浮点数
    浮点数也就是小数,之所以称为浮点数,是因为按照科学记数法表示时,一个浮点数的小数点位置是可变的
    ③字符串
    字符串是以' '或" "括起来的任意文本,例如:'abc',"xyz"等等
    ④布尔值
    布尔值只有True、False两种值,它可以用and、or和not运算
    ⑤空值
    空值是Python里一个特殊的值,用None表示
    None不能理解为0,因为0是有意义的,而None是一个特殊的空值

    • print语句
    print 'hello, world'
    
    • 注释

    注释是用来说明代码的,给自己或别人看,不影响结果

    # 这是我写的代码
    print 'hello, world'
    
    • 变量

    变量不仅可以是数字,还可以是任意数据类型
    变量名必须是大小写英文、数字和下划线(_)的组合,且不能用数字开头
    比如:a = 1,变量a是一个整数。t_007 = 'T007',变量t_007是一个字符串。

    • 整数和浮点数

    整数运算结果是整数
    浮点数运算结果是浮点数
    整数和浮点数混合运算结果是浮点数

    • 字符串

    如果字符串既包含 ' 又包含 " ,这个时候对某些特殊字符可以用 \ 进行转义

    s = 'Python was started in 1989 by \"Guido\".'
    print s
    

    ①如果一个字符串包含多个需要转义的字符,转义会很麻烦。我们可以在字符串前面加个前缀 r ,表示这是一个 raw 字符串,里面的字符就不需要转义了
    ②要表示多行字符串,可以用 '''...''' 表示

    print r'\(~_~)/ \(~_~)/'
    print '''Line 1
    Line 2
    Line 3'''
    

    中国制定了GB2312编码,用来把中文编进去。类似的,日文和韩文等其他语言也有这个问题。为了统一所有文字的编码,Unicode应运而生。Unicode编码把所有语言都统一起来,这样就不会再有乱码问题了。

    print u'''
    床前明月光
    疑是地上霜
    举头望明月
    低头思故乡'''
    
    • 布尔类型

    与运算:只有两个布尔值都为 True 时,计算结果才为 True
    True and True # ==> True
    True and False # ==> False
    False and True # ==> False
    False and False # ==> False
    或运算:只要有一个布尔值为 True,计算结果就是 True
    True or True # ==> True
    True or False # ==> True
    False or True # ==> True
    False or False # ==> False
    非运算:把True变为False,或者把False变为True
    not True # ==> False
    not False # ==> True

    print 100 < 99 or 0xff == 255
    

    Python把0、空字符串和None看成 False,其他数值和非空字符串都看成 True
    短路计算法则:
    1.在计算 a and b 时,如果 a 是 False,返回 a;如果 a 是 True,返回 b。
    2.在计算 a or b 时,如果 a 是 True,返回 a;如果 a 是 False,返回 b。

    a = 'python'
    print 'hello,', a or 'world'
    b = ''
    print 'hello,', b or 'world'
    

    第2章 List和Tuple类型

    • 创建list

    list是数学意义上的有序集合,元素是按照顺序排列的,可以随时添加和删除其中的元素
    构造list非常简单,直接用 [ ] 把list的所有元素都括起来,就是一个list对象

    L = ['Adam', 95, 'Lisa', 85, 'Bart', 59]
    print L
    
    • 索引访问list

    ①索引从 0 开始,第一个元素的索引是0,第二个元素的索引是1,以此类推
    ②使用索引时,千万注意不要越界

    L = ['Adam', 'Lisa', 'Bart']
    print L[0]
    print L[1]
    print L[2]
    
    • 倒序访问list
    L = [95, 85, 59]
    print L[-1]
    print L[-2]
    print L[-3]
    
    • 添加元素

    ①list 的 append() 方法,可以把新的元素添加到尾部
    ②list 的 insert() 方法,第一个参数是索引号,第二个参数是待添加的新元素

    L = ['A', 'B', 'C']
    L.insert(2, 'YYDL')
    L.append('SSY')
    print L
    
    • 删除元素

    list 的 pop()方法,可以删掉最后一个元素,也可以添加索引删除指定元素

    L = ['Adam', 'Lisa', 'Paul', 'Bart']
    L.pop(2)
    print L
    L.pop()
    print L
    
    • 替换元素
    L = ['Adam', 'Lisa', 'Bart']
    L[0] = 'Bart'
    L[2] = 'Adam'
    print L
    
    • 创建tuple

    ①tuple是另一种有序的列表,和 list 类似,但是tuple一旦创建完毕就不能修改了
    用 ( ) 把tuple的所有元素都括起来,就是一个tuple对象
    ②用 ( ) 定义单元素的tuple有歧义,所以要多加一个逗号,更明确地告诉你这是一个tuple

    t = (0 ,1, 2, 3, 4, 5, 6, 7, 8, 9)
    print t
    t = ('Adam',)
    print t
    
    • “可变”的tuple

    tuple所谓的不变是说每个元素指向永远不变。即指向'a',就不能改成指向'b',指向一个list,就不能改成指向其他对象。但指向的这个list本身是可变的

    t = ('a', 'b', ['A', 'B'])
    L = t[2]
    print L
    L[0] = 1
    L[1] = 2
    print t
    

    第3章 条件判断和循环

    • if 语句
    score = 75
    if score >= 60:
        print 'passed'
    
    • if-else 语句
    score = 55
    if score >= 60:
        print 'passed'
    else:
        print 'failed'
    
    • if-elif-else 语句
    score = 85
    if score >= 90:
        print 'excellent'
    elif score >= 80:
        print 'good'
    elif score >= 60:
        print 'passed'
    else:
        print 'failed'
    
    • for 循环

    for 循环可以依次把 list 或 tuple 的每个元素迭代出来

    # 计算平均成绩
    L = [75, 92, 59, 68]
    sum = 0.0
    for x in L:
        sum += x
    print sum / 4
    
    • while 循环

    while 循环不会迭代元素,而是根据表达式判断循环是否结束

    # 计算100以内奇数的和
    sum , x = 0 , 1
    while x < 100:
        sum += x
        x += 2
    print sum
    
    • break语句

    break语句可以直接退出循环

    t = (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
    for x in t:
        if x ==7:
            break
        print x
    
    • continue语句

    continue语句可以跳过后续代码,继续下次循环

    t = (0, 1, 2, 3)
    for x in t:
        if x ==2:
            continue
        print x
    
    • 多重循环
    for x in ['A', 'B', 'C']:
        for y in ['1', '2', '3']:
            print x + y
    

    第4章 Dict和Set类型

    • 什么是dict

    ①list 和 tuple 可以用来表示顺序集合,例如班里同学的名字和考试成绩,但是要根据名字找到对应的成绩,用两个 list 表示就不方便,而 dict 就是专门干这件事的
    ②我们把名字称为key,对应的成绩称为value,dict就是通过 key 来查找 value。
    花括号 { } 表示这是一个dict,然后按照 key: value 写出来即可
    ③由于dict也是集合,len() 函数可以计算大小,一个 key-value 算一个

    d = {
        'Adam': 95,
        'Lisa': 85,
        'Bart': 59
    }
    print len(d)
    
    • 访问dict

    ①list 使用索引返回对应的元素,而 dict 使用 key 返回对应的 value
    ②使用dict本身提供的一个 get 方法,在 key 不存在的时候,返回 None
    ③用 in 操作符可以判断 key 是否存在

    d = {
        'Adam': 90,
        'Lisa': 80,
        'Bart': 70
    }
    print d['Adam']
    print d.get('Lisa')
    if 'Bart' in d:
        print d['Bart']
    
    • dict的特点

    ①查找速度快,无论dict有10个元素还是10万个元素,查找速度都一样。
    而list的查找速度随着元素增加而逐渐下降,缺点是占用内存大
    ②存储的key-value序对是没有顺序的,这和list不一样
    ③key不能重复,且作为 key 的元素不可变

    d = {
        90: 'Adam',
        80: 'Lisa',
        70: 'Bart'
    }
    print d
    
    • 更新dict
    d = {
        95: 'Adam',
        85: 'Lisa'
    }
    d[72] = 'Paul'
    print d
    
    • 遍历dict
    d= {
        'A':1,
        'B':2,
        'C':3
    }
    for i in d:
        print i,d[i]
    
    • 什么是set

    set 有一系列元素,这点和 list 很像,但是元素没有重复且无序,这点和 dict 的 key很像

    s = set(['A', 'B', 'C', 'C'])
    print len(s)
    print s
    
    • 访问set

    由于 set 存储的是无序集合,所以我们没法通过索引来访问。
    访问 set 中的某个元素实际上就是判断一个元素是否在 set 中

    s = set(['Adam', 'Lisa', 'Bart', 'Paul'])
    print 'Adam' in s
    print 'bart' in s
    
    • set的特点

    set的内部结构和dict很像,唯一区别是不存储value,因此判断元素是否在set中速度很快
    set存储的元素和dict的key类似,必须是不变对象,因此任何可变对象是不能放入set中的

    months = set(['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'])
    x1 = 'Feb'
    x2 = 'Sun'
    if x1 not in months:
        print 'x1: error'
    if x2 not in months:
        print 'x2: error'
    
    • 遍历set
    s = set([('Adam', 95), ('Lisa', 85), ('Bart', 59)])
    for x in s:
        print x[0] , x[1]
    
    • 更新set

    由于set存储的是一组不重复的无序元素,因此更新set要做两件事:
    一是 add() 把新的元素添加到set中,二是 remove() 把已有元素从set中删除

    s = set(['A', 'B', 'C'])
    L = ['C', 'D', 'E', 'F']
    for x in L:
        if x in s:
            s.remove(x)
        else:
            s.add(x)
    print s
    

    第5章 函数

    • 什么是函数

    当我们知道半径r的值时,就可以根据公式计算出面积
    假设我们需要计算10个不同大小的圆的面积,每次写s = 3.1415926535 * r * r很麻烦
    有了函数,我们就写成函数调用 s = S(r),而函数本身只需要写一次,而且可以多次调用

    • 内置函数

    Python内置了很多有用的函数,要调用一个函数,需要知道函数名和参数,例如:
    ①求绝对值的函数 abs, abs(-20) = 20
    ②比较函数 cmp(x, y) 需要两个参数,x<y,返回 -1;x==y,返回 0 ;x>y,返回 1
    ③把其他数据类型转换为整数的函数 int(),int('123') = 123
    ④把其他类型转换成字符串的函数 str(),str(123) = '123'

    • 编写函数

    定义一个函数要使用 def 语句,依次写出函数名、括号、参数和冒号,然后编写函数体,函数返回值用 return 语句返回。如果没有返回值,可以简写为return

    # 定义一个函数,它返回 list 的元素平方和
    def f(L):
        sum = 0
        for x in L:
            sum += x * x
        return sum
    print f([1, 2, 3, 4, 5])
    print f([-5, 0, 5, 15, 25])
    
    • 函数之返回多值

    Python的函数返回多值其实就是返回一个tuple,但写起来更方便

    '''
    请编写一个函数,返回一元二次方程 ax² + bx + c = 0 的两个解。
    注意:Python的math包提供了sqrt()函数用于计算平方根
    '''
    import math
    
    def f(a, b, c):
        t = math.sqrt(b * b - 4 * a * c)
        return (-b + t) / (2 * a),( -b - t )/ (2 * a)
    print f(1, -6, 5)
    
    • 递归函数

    如果一个函数在内部调用了自己,这个函数就是递归函数

    # 计算阶乘 50! = 1 * 2 * 3 * ... * 50
    def fact(n):
        if n==1:
            return 1
        return n * fact(n - 1)
    print fact(50)
    
    • 默认参数
    def greet(name='world'):
        print 'Hello ' + name
    greet()
    greet('ABC')
    
    • 可变参数
    def average( *p ):
        sum = 0.0
        if len(p) == 0:
            return sum
        for x in p:
            sum += x
        return sum / len(p)
    print average()
    print average(1, 2, 2, 4.3)
    

    第6章 切片

    • 正序切片

    L[1:4] 表示从索引1开始,到4为止,但不包括4。即索引1,2,3正好是3个元素
    L[a:b:N] 表示从a开始,到b为止,每N个取一个元素。索引为第一个或最后一个可以省略
    L[:] 表示从头到尾全部元素

    # L = [0,1,2...,99]
    L = range(100)
    print L[1:4]
    print L[3:8:2]
    print L[1: :3]
    print L[:]
    
    • 倒序切片

    L[-a:-b:N] 表示从倒数第a个开始,到倒数第b个为止,每隔N个取一个元素

    L = range(1, 101)
    print L[-10:-1]
    print L[-46:  :5]
    
    • 字符串切片

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

    '''
    实现将首字母大写
    注意:函数upper()可以把字符变成大写字母
    '''
    def UP(s):
        return s[0].upper() + s[1: ]
    print UP('hello')
    print UP('sunday')
    

    第7章 迭代

    • 什么是迭代

    迭代是通过 for ... in 来完成的

    # 循环迭代数列 1-100,打印出7的倍数
    for i in range(1, 101):
        if i % 7 == 0:
            print i
    
    • 索引迭代

    ①迭代是取出元素本身,而非元素的索引
    ②enumerate() 函数可以在 for 循环中同时绑定索引和元素
    ['Adam', 'Lisa', 'Bart', 'Paul'] --> [(0, 'Adam'), (1, 'Lisa'), (2, 'Bart'), (3, 'Paul')]
    ③zip()函数可以把两个 list 变成一个 list
    zip([10, 20, 30], ['A', 'B', 'C']) -- > [(10, 'A'), (20, 'B'), (30, 'C')]

    L = ['Adam', 'Lisa', 'Bart', 'Paul']
    for i, name in zip(range(1,5), L):
        print i, '-', name
    
    • 迭代dict的value
    d = { 'Adam': 95, 'Lisa': 85, 'Bart': 59, 'Paul': 74 }
    sum = 0.0
    for v in d.values():
        sum += v
    print sum / len(d)
    
    • 迭代dict的key和value
    d = { 'Adam': 95, 'Lisa': 85, 'Bart': 59, 'Paul': 74 }
    sum = 0.0
    for i, j in d.items():
        sum += j
        print i, ':', j
    print sum / len(d)
    

    第8章 列表生成式

    • 生成列表

    把要生成的元素放到前面,后面跟 for 循环,就可以把 list 创建出来

    print [x*x for x in range(1, 100, 2)]
    
    • 复杂表达式

    字符串可以用指定的参数替代 %s。join() 方法可以把一个 list 拼接成一个字符串

    d = { 'Adam': 95, 'Lisa': 85, 'Bart': 59 }
    def M(name, score):
        return '<tr><td> %s </td><td> %s </td></tr>' % (name, score)
    tds = [M(name, score) for name, score in d.items()]
    
    print '<table border="1">'
    print '<tr><th> name </th><th> score </th><tr>'
    print '\n'.join(tds)
    print '</table>'
    
    • 条件过滤

    在列表生成式中,for 循环后面还可以加上 if 判断
    ①isinstance(x, str) 可以判断变量 x 是否是字符串
    ②upper() 可以返回大写字母

    def f(L):
        return [x.upper() for x in L if isinstance(x, str)]
    print f(['hello', 'world', 101])
    
    • 多层表达式

    在列表生成式中,也可以用多层 for 循环来生成列表

    print [ 100 * n1 + 10 * n2 + n3 
    for n1 in range(1, 10) for n2 in range(10) for n3 in range(10) 
    if n1 == n3 ]
    

    第9章 函数式编程

    • 把函数作为参数
    import math
    
    def add(x, y, f):
        return f(x) + f(y)
    print add(25, 9, math.sqrt)
    
    • map()函数

    map() 函数是 python 内置的高阶函数,它接收一个函数 f 和一个 list,
    f 依次作用在 list 的每个元素上,得到一个新的 list 并返回

    def F(s):
        return s[0].upper() + s[1:].lower()
    print map(F, ['adam', 'LISA', 'barT'])
    
    • reduce()函数

    reduce() 函数也是 python 内置的高阶函数,它接收一个函数 f 和一个 list,
    f 必须接收两个参数,reduce() 对 list 的每个元素反复调用 f 并返回

    def p(x, y):
        return x * y
    print reduce(p, [1, 2, 3, 4])
    
    • filter()函数

    filter() 函数也是 python 内置的高阶函数,它接收一个函数 f 和一个 list,
    f 对 list 每个元素进行判断,filter() 根据判断返回符合条件元素组成的新 list

    import math
    # 能否开方返回True,不能开方返回False
    def f(x):
        r = int(math.sqrt(x))
        return r*r==x
    print filter(f, range(1, 101))
    
    • 自定义排序函数

    ①python内置的 sorted() 函数可对 list 进行排序
    sorted( [36, 5, 12, 9, 21] ) --> [5, 9, 12, 21, 36]
    ②它可以接收一个比较函数来实现自定义,传入两个元素x,y,

    如果x排在y的前面返回 -1,如果x排在y的后面返回 1,如果x和y相等,返回 0

    # 自定义倒序排列
    def f(s1, s2):
        if s1 > s2:
            return -1
        if s1 < s2:
            return 1
        return 0
    print sorted(['bob', 'about', 'zoo', 'credit'], f)
    
    • 返回函数

    函数不但可以返回int、str、list、dict等数据类型,还可以返回函数

    def p1(l):
        def p2():
            def f(x, y):
                return x * y
            return reduce(f, l)
        return p2  
    f = p1([1, 2, 3, 4])
    print f()
    
    • 闭包

    闭包:内层函数引用了外层函数的变量,然后返回内层函数的情况
    特点:返回的函数引用了外层函数的局部变量,所以要确保变量在函数返回后不能变

    def count():
        fs = []
        for i in range(1, 4):
            # 返回一个闭包g,g所引用的m不是循环变量
            def f(m):
                def g():
                    return m*m
                return g
            fs.append(f(i))
        return fs
    f1, f2, f3 = count()
    print f1(), f2(), f3()
    
    • 匿名函数

    ①关键字 lambda 表示匿名函数,冒号前面的 x 表示函数参数
    匿名函数只能有一个表达式,不写return,返回值就是表达式的结果
    ②匿名函数不定义函数名,直接创建一个函数对象,很多时候可以简化代码

    print map(lambda x: x * x, [1, 2, 3, 4])
    
    • decorator装饰器
    • 无参数decorator

    ①decorator 本质上是高阶函数,它接收一个函数作为参数,然后返回一个新函数
    使用 decorator 用@语法,这样可以避免手动编写 f = decorate(f) 这样的代码
    ②可以利用Python的 *args 和 **kw,保证任意个数的参数总是能正常调用

    import time
    # 编写一个@Performance,打印出函数ABC()调用的时间
    def Performance(f):
        def P(*args, **kw):
            t1 = time.time()
            x = f(*args, **kw)
            t2 = time.time()
            print 'call %s () in %f s' % (f.__name__, (t2 - t1))
            return x
        return P
    @ Performance
    def ABC(x,y,z):
        return x+y+z
    print ABC(10,11,12)
    
    • 带参数decorator
    import time
    
    def Performance(s):
        def P1(f):
            def P2(*args, **kw):
                t1 = time.time()
                x = f(*args, **kw)
                t2 = time.time()
                print 'call %s () in %f %s' % (f.__name__, (t2 - t1) * 1000, s)
                return x
            return P2
        return P1
    @ Performance('ms')
    def ABC(x,y,z):
        return x+y+z
    print ABC(10,11,12)
    
    • 偏函数

    functools.partial 就是帮助我们创建一个偏函数的,
    它可以把一个参数多的函数变成一个参数少的新函数,这样函数调用的难度就降低了

    # 二进制转换十进制
    def f(x, base=2):
        return int(x, base)
    print f('1000000')
    

    第10章 模块

    • 模块和包

    ①包 --> 文件夹
    模块 --> xxx.py 文件
    包里必须有 _init _.py 文件,以此来区分普通文件夹
    ②因为模块名也可能相同,把模块放入不同包即可避免冲突

    • 导入模块

    ① math是Python自带的模块,导入后可以使用其中所有公开的函数、变量和类
    ② os.path是Python自带的模块,它的isdir() 和 isfile()函数可以判断目录和文件是否存在
    ③ from ... import * 这样导入,后面使用就可以省略模块名

    import math
    
    print math.pow(2, 0.5) # pow是函数
    print math.pi # pi是变量
    
    from os.path import *
    
    print isdir(r'C:\Program Files')
    print isfile(r'C:\123.txt')
    
    • 动态导入模块

    ① 利用 import ... as ... 可以动态导入不同名称的模块
    ② try 的作用是捕获错误,并在捕获到指定错误时执行 except 语句
    ③ Python2.7 提供了 json 模块,但 Python 2.5 以及更早版本没有 json 模块
    只有 simplejson 模块,这两个模块功能一模一样

    # 先尝试导入json,如果失败再 import simplejson as json
    try:
        import json
    except ImportError:
        import simplejson as json
    print json.dumps({'python':2.7})
    
    • 使用__future __

    ①Python 2 的整数除法结果仍是整数
    Python 3 改进了整数除法运算,“ / ” 除将得到浮点数,“ // ” 除才是整数
    ②要在Python 2 中引入Python 3的除法规则,可以导入__future __的division

    from __future__ import division
    print 10 / 3
    
    • 第三方模块

    使用 Python 内置模块管理工具 pip 可以安装第三方模块
    例如安装 web 模块,命令行输入 pip install web.py 即可

    第11章 面向对象编程基础

    第12章 类的继承

    第13章 定制类

    相关文章

      网友评论

        本文标题:【Python】学习笔记

        本文链接:https://www.haomeiwen.com/subject/qdowrktx.html