博客
关于我
Python黑魔法—学习笔记
阅读量:232 次
发布时间:2019-02-28

本文共 5044 字,大约阅读时间需要 16 分钟。

王炳明的学习笔记

小整数池

在同一行里,同时给两个变量赋同一值时,解释器知道这个对象已经生成,那么它就会引用同一个对象。如果分成两行的话,解释器并不知道这个对象已经存在,就会重新申请内存存放这个对象。


intern机制

intern机制用于优化Python程序的性能。这一机制通过将小块的代码或常量存储在内存中,使得在相同行内的多个变量引用同一个内存地址,避免重复分配内存。


site-packages和dist-packages

dist-packages是Debian系的Linux系统(如Ubuntu)使用的目录,用于存储通过apt安装的Python包。而site-packages则是通过pip或easy_install安装的Python包的默认目录。


argument和parameter

  • parameter:在函数定义时使用的变量名,属于函数的局部作用域。
  • argument:在函数调用时传递的实际参数,属于函数调用时的临时变量。

/usr/bin/python 和 /usr/bin/env python

  • /usr/bin/python:脚本或项目的入口文件的第一行通常包含#!/usr/bin/python,用于指定使用哪个Python解释器执行脚本。如果执行python,解释器会从文件系统中查找名为python的可执行文件。
  • /usr/bin/env python:执行env python时,解释器会依次查找/usr/bin/env路径下的python可执行文件。如果找不到,继续查找下一个路径。

空字典生成方法

在Python中,{}的生成速度比dict()快。这是因为{}是通过Python内置的字典生成器实现的,而dict()需要初始化一个空字典并进行内存分配。


return和try…finally

return语句用于从函数中返回一个值,而try…finally语句用于确保代码块执行后无论是否发生异常都能执行 cleanup代码。


IDE环境和CMD环境的区别

IDE(Integrated Development Environment,集成开发环境)和CMD(Command-line Interface,命令行界面)在运行结果上可能存在差异。IDE通常提供更友好的调试和错误处理功能,而CMD则更适合批量处理和脚本执行。


切片异常

在Python中,切片操作可能会抛出切片异常(SliceError),这通常发生在切片范围超出序列长度时。


查看包搜索路径的方法

可以使用importlib.sys.modulespkgutil.get_path等方法查看Python包的搜索路径。


安装包方法

安装Python包的常用方法是使用pip命令:

python3.6 -m pip install package_name

连接列表的方法

连接列表的常用方法包括:

  • 直接相加
    list1 + list2
  • 使用itertools.chain
    from itertools import chain
    list(chain(list1, list2))
  • 使用∗∗解包
    [*list1, *list2]
  • 使用extend
    list1.extend(list2)
  • 使用列表推导式
    [x for x in list1 + list2]
  • 使用heapq.merge
    import heapq
    combined = list(heapq.merge(list1, list2))

  • ##魔法方法

    在Python中,魔法方法(如__add__)定义了对象的行为,直接使用+运算符会调用对应的魔法方法。


    yield from方法

    yield from语句用于在生成器中逐步生成值,适用于处理嵌套结构或大量数据。


    合并字典的方法

    合并字典的常用方法包括:

  • 原地更新
    dict.update(other_dict)
  • 先解包再合并
    {**other_dict}
  • 使用itertools
    from itertools import chain
    dict(chain(other_dict.items()))
  • 使用ChainMap
    from collections import ChainMap
    ChainMap(other_dict).dict()
  • 使用dict.items()
    dict_a.update(dict_b.items())

  • 判断是否包含子串的方法

    判断字符串是否包含子串的方法包括:

  • 使用in和not in
    'abcd'.find('bc') → 1
  • 使用find方法
    'abcd'.find('bc') → 1
  • 使用index方法
    'abcd'.index('bc') → 1
  • 使用count方法
    'abcd'.count('bc') → 1
  • 使用正则匹配
    import re
    re.search('bc', 'abcd').span() → (1, 2)

  • 装饰器入门

    装饰器是一种用于增强函数或类功能的机制,常用于日志记录、性能计时等场景。使用装饰器的步骤包括:

  • 定义一个装饰器函数。
  • 定义一个被装饰的函数或类。
  • 将装饰器应用到函数或类上。

  • 装饰器实例:日志打印器

    def logger(func):
    def wrapper(*args, **kwargs):
    print(f'开始执行:{func.__name__}')
    func(*args, **kwargs)
    print(f'函数执行完了。')
    return wrapper
    @logger
    def add(x, y):
    print(f'{x} + {y} = {x + y}')
    add(20, 30)

    装饰器实例:时间计时器

    import time
    def timer(func):
    def wrapper(*args, **kwargs):
    t1 = time.time()
    func(*args, **kwargs)
    t2 = time.time()
    print(f'花费时间:{t2 - t1}')
    return wrapper
    @timer
    def want_sleep(sleep_time):
    time.sleep(sleep_time)
    want_sleep(10)

    类装饰器入门

    类装饰器通常实现__call____init__方法,常用于对函数或类进行增强。

    class Logger:
    def __init__(self, level='INFO'):
    self.level = level
    def __call__(self, func):
    def wrapper(*args, **kwargs):
    print(f'[{self.level}]: {func.__name__}()是运行...')
    func(*args, **kwargs)
    return wrapper
    @Logger(level='WARNING')
    def say(something):
    print(f'say {something}!')
    say('hello')

    描述符入门

    描述符用于控制属性的访问、设置和删除,常用于保护属性不被修改。

    class Student:
    def __init__(self, name):
    self.name = name
    @property
    def math(self):
    return self._math
    @math.setter
    def math(self, value):
    if 0 <= value <= 100:
    self._math = value
    else:
    raise ValueError('值必须在0到100之间')

    上下文管理器入门

    上下文管理器通过__enter____exit__方法实现资源的管理,确保资源在异常发生时也能被妥善处理。

    class Resource:
    def __enter__(self):
    print('连接到资源...')
    return self
    def __exit__(self, exc_type, exc_val, exc_tb):
    print('关闭资源连接...')
    return True
    with Resource() as res:
    res.operate()

    缓存机制

    使用functools.lru_cache实现函数缓存,可以显著提升函数调用的性能。

    from functools import lru_cache
    @lru_cache(maxsize=None)
    def add(x, y):
    print(f'计算:{x} + {y}')
    return x + y
    print(add(1, 2))
    print(add(1, 2))
    print(add(2, 3))

    流式读取超大文件

    使用read方法时,可以通过指定块大小实现流式读取。

    def read_from_file(filename, block_size=1024 * 8):
    with open(filename, 'r') as fp:
    for chunk in iter(partial(fp.read, block_size), ''):
    yield chunk

    自带的缓存机制

    Python的functools.lru_cache提供了一种简单的缓存机制,适用于函数调用的性能优化。


    延迟调用

    使用上下文管理器实现延迟调用。

    import contextlib
    def callback():
    print('B')
    with contextlib.ExitStack() as stack:
    stack.callback(callback)
    print('A')

    快速计算函数运行时间

    通过timeit库可以快速测试函数运行时间。

    import timeit
    def run_sleep(seconds):
    print(seconds)
    time.sleep(seconds)
    print(timeit.timeit(lambda: run_sleep(2), number=5))

    标准错误输出到日志文件中

    可以使用上下文管理器将标准错误输出到日志文件。

    import sys
    import contextlib
    log_file = 'test.log'
    def close_stdout():
    raw_stdout = sys.stdout
    file = open(log_file, 'a')
    sys.stdout = file
    yield
    sys.stdout = raw_stdout
    file.close()
    with close_stdout():
    task()

    反转字符串/列表

    可以使用切片操作来反转字符串或列表。

    mstr = 'abcd'
    ml = [1, 2, 3, 4]
    mstr[::-1]
    ml[::-1]

    函数参数

    函数参数的默认值可以通过赋值语句来实现。

    def func(item, item_list=[]):
    item_list.append(item)
    print(item_list)
    func('iphone')
    func('xiaomi', item_list=['oppo', 'vivo'])
    func('huawei')

    转载地址:http://mpqs.baihongyu.com/

    你可能感兴趣的文章
    ngrok | 内网穿透,支持 HTTPS、国内访问、静态域名
    查看>>
    NHibernate学习[1]
    查看>>
    NHibernate异常:No persister for的解决办法
    查看>>
    NIFI1.21.0_Mysql到Mysql增量CDC同步中_日期类型_以及null数据同步处理补充---大数据之Nifi工作笔记0057
    查看>>
    NIFI1.21.0_NIFI和hadoop蹦了_200G集群磁盘又满了_Jps看不到进程了_Unable to write in /tmp. Aborting----大数据之Nifi工作笔记0052
    查看>>
    NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_增删改数据分发及删除数据实时同步_通过分页解决变更记录过大问题_02----大数据之Nifi工作笔记0054
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_根据binlog实现数据实时delete同步_实际操作04---大数据之Nifi工作笔记0043
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置binlog_使用处理器抓取binlog数据_实际操作01---大数据之Nifi工作笔记0040
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_实现数据插入数据到目标数据库_实际操作03---大数据之Nifi工作笔记0042
    查看>>
    NIFI从MySql中离线读取数据再导入到MySql中_03_来吧用NIFI实现_数据分页获取功能---大数据之Nifi工作笔记0038
    查看>>
    NIFI从PostGresql中离线读取数据再导入到MySql中_带有数据分页获取功能_不带分页不能用_NIFI资料太少了---大数据之Nifi工作笔记0039
    查看>>
    NIFI同步MySql数据_到SqlServer_错误_驱动程序无法通过使用安全套接字层(SSL)加密与SQL Server_Navicat连接SqlServer---大数据之Nifi工作笔记0047
    查看>>
    Nifi同步过程中报错create_time字段找不到_实际目标表和源表中没有这个字段---大数据之Nifi工作笔记0066
    查看>>
    NIFI大数据进阶_FlowFile拓扑_对FlowFile内容和属性的修改删除添加_介绍和描述_以及实际操作---大数据之Nifi工作笔记0023
    查看>>
    NIFI大数据进阶_NIFI的模板和组的使用-介绍和实际操作_创建组_嵌套组_模板创建下载_导入---大数据之Nifi工作笔记0022
    查看>>
    NIFI大数据进阶_NIFI监控的强大功能介绍_处理器面板_进程组面板_summary监控_data_provenance事件源---大数据之Nifi工作笔记0025
    查看>>
    NIFI大数据进阶_NIFI集群知识点_集群的断开_重连_退役_卸载_总结---大数据之Nifi工作笔记0018
    查看>>
    NIFI大数据进阶_内嵌ZK模式集群1_搭建过程说明---大数据之Nifi工作笔记0015
    查看>>
    NIFI大数据进阶_外部ZK模式集群1_实际操作搭建NIFI外部ZK模式集群---大数据之Nifi工作笔记0017
    查看>>
    NIFI大数据进阶_离线同步MySql数据到HDFS_01_实际操作---大数据之Nifi工作笔记0029
    查看>>