Python3学习笔记(一)

跟着廖雪峰老师的Python教程学习Python3,遇到需要注意的地方写到这里,方便以后查阅总结,温故知新。感谢廖雪峰老师!

基础

  1. Python中不限定数值大小

  2. 除法: / 普通除法,浮点型, // 取整数部分, % 取余

  3. Python提供了==ord()==函数获取字符的整数表示,==chr()==函数把编码转换为对应的字符

  4. Python的字符串类型是str, 以字节为单位的bytes, 用 b'abc' 表示,读取字节流需要用bytes

  5. 编码encode(): 'ABC'.encode('ascii') = b'ABC', '中文'.encode('utf-8')

  6. 解码decode(): b'ABC'.decode('ascii') = 'ABC'

  7. 计算str包含多少个字符,可以用len()函数, len('abc') = 3

  8. 一般加这两行,说明使用python3,编码方式是utf-8

    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    
  9. 占位符:%d 整数,%f 浮点数,%s 字符串,%x 十六进制整数,%% 转义 %,%.2f 保留2为小数

  10. list:l = [1, 2, 3, 'a'], 不同类型的元素也可以放到一个list里, 可操作的函数:append() = add(), insert(index, value), extend(list) = addAll(), count() = size(), clear(), copy(), pop(value), remove(index), reverse(), sort() ...

  11. tuple: t = (1, 2, 4), 不可变list, 当有一个元素是 t = (1,) 用 , 区分

  12. 条件判断:if, elif, else

  13. 循环:for x in ...:, while boolean:

  14. 生成序列: range(5), 转换成list/tuple:list/tuple(range(5))

  15. 字典:dict = {'a': 1, 'b': 2}, 相当于Java的Map, dict的key必须是不可变对象, 可操作函数:setdefault(), get(), clear(), copy() ...

  16. 集合:set:s = set([1, 2, 3]) / s = {1, 2, 3}, 相当于Java的Set, add(), remove(), & 交集, | 并集

函数

Python的内置函数 (注意函数名不要与内置函数重名)

  1. 定义函数:def,空函数:pass

  2. 判断类型:isinstance(x, A_tuple), 判断实例:issubclass(x, A_tuple)

  3. 函数可以返回多个值,但本质上是返回一个tuple!(例子中的 angel=0 表示默认值,必选参数在前,默认参数在后,默认参数必须指向不变对象!)

    import math
    
    
    def move(x, y, step, angle=0):
        nx = x + step * math.cos(angle)
        ny = y + step * math.sin(angle)
        return nx, ny
    r = move(100, 100, 50, 30)
    print(r)
    
  4. 可变参数:def calc(*nums): pass, 在参数前加个星号,即表示为可变参数,0-n都可以,如果想传入list 或者 tuple,可以把在变量钱加个星号转换成可变数组:

    nums = [1, 2, 3]
    print(calc(*nums))
    
  5. 关键字函数:**kw : 入参是dict,好处是可以控制参数的传入

  6. 命名关键字参数:def person(name, age, *, city, job):,用星号分隔,后面的视为命名关键字函数,可以有默认值。调用时必须传入keycity=HangZhou

  7. 五种参数类型的定义顺序:必选参数、默认参数、可变参数、命名关键字参数和关键字参数,def f1(a, b, c=0, *args, **kw): pass

  8. 任意函数都可以通过: fun(*args, **kw) 调用,无论参数如何定义,

    • *args是可变参数,args接收的是一个tuple
    • **kw是关键字参数,kw接收的是一个dict
    • 命名的关键字参数是为了限制调用者可以传入的参数名,同时可以提供默认值
    • 定义命名的关键字参数在没有可变参数的情况下不要忘了写分隔符*,否则定义的将是位置参数

高级特性

  1. 切片(Slice):L是个list:L[0:3], L[:3] 0 可省略, L[:10:2] 取前10个数,步长为2, L[:] 复制一个L. tuple, str等都可以切片

  2. 迭代:迭代dict的key: for key in d, 迭代dict的value: for value in d.values(), 同时迭代dict: for k, v in d.items(), 字符串也可以迭代,通过isinstance('abc', Iterable) 判断是否可以迭代。

  3. 多个变量也可迭代:for x, y in [(1, 1), (2, 4), (3, 9)]: pring(x, y), Python内置的enumerate函数可以把一个list变成索引-元素对, 这样就可以在for循环中同时迭代索引和元素本身

  4. 列表生成式:写列表生成式时,把要生成的元素x * x放到前面,后面跟for循环, [x * x for x in range(1, 11)], 还可以跟 if 判断,还可再跟 for 循环[m + n for m in 'ABC' for n in 'XYZ'], 注意是方括号,如果是小括号就是生成器

  5. 生成器(generator):如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator, yield相当于print,但是每遇到yield就会中断
    杨辉三角形:

    def triangles():
        row = [1]
        while True:
            yield row
            row = [1] + [row[i] + row[i + 1] for i in range(0, len(row) - 1)] + [1]
    
    n = 0
    for t in triangles():
        print(t)
        n += 1
        if n == 10:
            break
    
  6. 迭代器:注意区分IterableIterator

    • Iterable: 可直接作用于for循环的
    • Iterator: 可以被next()函数调用并不断返回下一个值的对象,直到没有对象时抛出StopIteration错误

    generator都是 Iterator 对象,但 list,dict,str虽然是 Iterable,却不是Iterator
    使用iter()函数,可以把Iterable变成Iterator。Iterator是一个数据流,惰性计算,所以可以表示无限大的数据流。
    for循环的本质就是不断调用next()函数实现的

函数式编程

  1. 高阶函数:变量可以指向函数 f = abs,函数名是什么呢? 函数名其实就是指向函数的变量。编写高阶函数,就是让函数的参数能够接收别的函数。

    def wtf(a, b, f):
    return f(a) + f(b)
    
    print(wtf(-1, 2, abs))
    
    

    高阶函数举例:

    • map:map(f, Iterable) 接收两个参数,函数和Iterable, map将函数作用于每一个元素,并返回一个Iterator。Iterator是惰性的,可以通过list()把整个结果计算出来,并返回一个list
    • reduce:reduce把一个函数作用在一个序列[x1, x2, x3, ...]上,取前两个元素算出的结果与下一个元素继续计算, 就像这样:reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
    • filter:filter()也接收一个函数和一个序列。filter把函数作用于序列,返回True保该留元素,False丢弃该元素。同样也返回一个Iterator 惰性序列。
      例如序列中的空字符串删掉:
       list(filter(lambda s: s and s.strip(), ['A', '', 'B', None, 'C', '  ']))
       # 结果: ['A', 'B', 'C']
    
    • sorted:对数字,按大小asc排序,对字符串,ASCII码排序, 例如:sorted([36, 5, -12, 9, -21], key=abs),还可以传入func和是否反转:sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower, reverse=True)
  2. 返回函数:高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回。
    像这样:当调用lazy_sum()时,并没有返回结果,而是返回了sum函数(变量),再次调用会返回一个新函数!每次的调用结果互不影响!

    def lazy_sum(*args):
    def sum():
        ax = 0
        for n in args:
            ax = ax + n
        return ax
    return sum
    

    闭包:返回闭包时牢记的一点就是:返回函数不要引用任何循环变量,或者后续会发生变化的变量。
    因为返回一个函数时,该函数并未执行!所以不要引用可能会变化的变量

  3. 匿名函数:lambda表达式 lambda x: x * x

  4. 装饰器(Decorator):在代码运行期间动态增加功能的方式,称为装饰器。本质上decorator就是一个返回函数的高阶函数。如果需要给decorator传入参数,则需要编写一个返回decorator的高阶函数。一个完整的decorator如下:注意:装饰器不能改变原函数的行为

    import functools
    
    def log(func):
        @functools.wraps(func)  ##@functools.wraps(func) 是为了保证装饰器不会对装饰器函数造成影响
        def wrapper(*args, **kw):
            print('call %s():' % func.__name__)
            return func(*args, **kw)
        return wrapper
    

    带参数的decorator:

    import functools
    
    def log(text):
        def decorator(func):
            @functools.wraps(func)
            def wrapper(*args, **kw):
                print('%s %s():' % (text, func.__name__))
                return func(*args, **kw)
            return wrapper
        return decorator
    

    函数如果没有显示的return,则会return None

  5. 偏函数:functools模块提供的一个功能,例如: int2 = functools.partial(int, base=2) 这样调用int2时,base默认就是2了,不用再传一遍,当然也可以传其他值,更灵活。偏函数可以接收函数对象,*args, **kw这三个参数。

模块

Python中一个.py文件就是一个模块(module). Python中有包(package)的概念,每个包下必须要有__init__.py文件,用于区分普通目录与Python的包。 __init__.py 也是一个模块,它的模块名是包的名称。 包可以有多级。注意创建的模块名不要与Python自带的模块名冲突,否则无法导入自带模块,比如 sys 模块。

  1. 使用模块:import sys 之后就可以使用 sys 提供的功能了。

    例如 sys.argv , sys的argv变量,用list存储了命令行的所有参数,argv至少有一个元素,就是文件名称。
    其他注意的地方:

    • 任何模块代码的第一个字符串都被视为模块的文档注释
    • 使用author 把模块作者写进去,__author__ = 'DreamYoung'
    • 命令行运行测试:if __name__ = '__main__'
    • 作用域:__xxx__ 是特殊变量,一般不要用这种变量名,模块的文档注释可以用__doc__访问,__xx是private函数或变量,不应该被外部模块直接引用(Python并没有限制),其他函数或变量为public。注意封装与抽象。
  2. 安装第三方模块:通过包管理工具pip完成,由于是Python3,应该使用pip3,比如安装处理图像的工具库Pillow: pip3 install Pillow (Python解释器搜索模块路径放到 sys.path 变量中,如果找不到可以设置下环境变量 PYTHONPATH

    其他常用模块:

    • MySQL的驱动 mysql-connector-python,
    • 科学计算的NumPy库 numpy
    • 生成文本的模板工具 Jinja2

    Python第三方库官方repo

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容

  • http://python.jobbole.com/85231/ 关于专业技能写完项目接着写写一名3年工作经验的J...
    燕京博士阅读 7,557评论 1 118
  • 基础1.r''表示''内部的字符串默认不转义2.'''...'''表示多行内容3. 布尔值:True、False(...
    neo已经被使用阅读 1,665评论 0 5
  • 教程总纲:http://www.runoob.com/python/python-tutorial.html 进阶...
    健康哥哥阅读 2,017评论 1 3
  • Python 是一种相当高级的语言,通过 Python 解释器把符合语法的程序代码转换成 CPU 能够执行的机器码...
    Python程序媛阅读 1,897评论 0 3
  • 昨天晚上开始被乔振梁的离开刷屏了,当我知道他是因为抑郁症而离开这个世界的时候,我真的忍不住哭了出来。 嗯,我想到了...
    披个马甲好吐槽阅读 252评论 0 0