Python进阶学习(一)

2023-11-02

背景

在编程语言的大背景下,Python普遍被认为是一门易上手的脚本语言;

而随着Python的应用越来越广泛,仅仅停留在会跑Python程序是不够的;

本篇专栏主要记录一些高阶的用法以及Python语言的一些机制;

Python语言掌握需要具备的能力:

1、深入掌握Python编程机制,掌握高级语法功能,能够解决更加复杂的编程问题;

2、面对常见的Python编程问题明白其原理,能够快速解决;

3、深入理解面向对象和面向函数的作用,写出高质量代码;

4、掌握并发编程、异步编程等高级编程方法,解决高并发问题;

5、掌握Python与C语言的融合,科学加速等性能优化能力;

6、具备企业实战能力,解决复杂性高、性能要求高的任务;

Python对比其他语言的运行速度:

在这里插入图片描述

知识点

一、exce使用案例,结合String做的一种编程方式

def decision_process(conditions, outs):
    base_string = f"if string.startswith('{conditions[0]}'): print('{outs[0]}')"    

    for c, out in zip(conditions[1:], outs[1:]):
        base_string += f"\n\telif string.startswith('{c}'): print('{out}')"    


    return base_string


def create_func(conditions, outs):
    return f"""def complexit_if(string):
\t{decision_process(conditions, outs)} 
    """

programming = create_func(['0', '1', '2'], ['none', 'first', 'second'])

exec(programming)				# 执行这一行创建了一个函数对象complexit_if
exec("complexit_if('001231')")	
exec("complexit_if('112311')")
exec("complexit_if('201231')")

说明:这个案例主要是想表示,exec可以作为一种执行代码的函数,也体现了Python的解释型语言;

拓展:还有一种eval()的函数方式,也可以对string进行执行,并且得到的是返回值;

二、Python3.10新特性——match case

Python3.10之后,引入了一种模式匹配的方法,并且具有更好的泛型能力;

下面简单创建一个json的字典样例:

    parsed_json = {
        "Age": 19,
        "user_id": "uuid1231241",
        "goods_info": {
            "price": 100,
            "createtime": 2022
        }
    }

接下来用match case进行匹配:

    match parsed_json:
        case {"Age": age, "user_id": userd_id, "goods_info": {"price": p, 'createtime': time_}}:
            print(f"{age} with id {userd_id} bought {p} goods")
        case {'Age': age, 'user_id': userd_id, "action_info": {"last_login": p}}:
            print(f"{userd_id} with age {age} last login is {p}")
        case _:
            print("None")

结果当然是输出第一个匹配的对象,可以看出模式匹配还是很强大的,还可以对其他的类型进行匹配;

三、一种初始化类的快速方式——dataclass

首先正常情况下我们定义一个类并且初始化:

class OldPerson:
    def __init__(self, name="Tom", age=10, location=10.0, weight=20.0):
        self.name = name
        self.age = age
        self.location = location
        self.weight = weight

    def __repr__(self):
        return f"Person(name={self.name}, age={self.age}, location={self.location}, weight={self.weight})"

从上面代码可以看出来,其中的过程是有些复杂的,特别是对于参数较多或者复杂的类别来说;

下面介绍一种新的定义类的方法:

from dataclasses import dataclass

@dataclass
class Person:
    name: str = ""
    age: int = 18
    location: float = 10.0
    weight: float = 20.0

person = Person()
person.name = "Jack"
print(person)				# Person(name='Jack', age=18, location=10.0, weight=20.0)

可以看出,节省了大量的代码,使得代码更加友好;

四、生成器及yied的作用

通常情况下我们程序处理都是面向过程的,下面模拟一个读取文件的操作,代码如下:

# 导入头文件
import time
from collections import defaultdict
import datetime

# 设定处理一个文件的操作
def count_words(filename):
    counts = defaultdict(int)    
    time.sleep(1)	# 假设整个流程需要一秒
    return counts

# 传入一个文件列表,对其中的每个文件都进行上述操作
def get_all_results(files):
    results = []
    for f in files:
        results.append(count_words(f))	# 遍历列表中的每个文件,当全部遍历完后才会返回结果
    return results

# 对得到的数据做处理
def collect_results(files):

    for c in get_all_results(files):
        print('get one {}'.format(datetime.datetime.now()))		# 假设处理一次就打印一次处理的时间

if __name__  == '__main__':
    files = ['some_file'] * 10		# 假设有10个文件
    print('programming running at {}'.format(datetime.datetime.now()))		# 程序开始运行的时间
    collect_results(files)		# 开始处理

运行结果:

在这里插入图片描述

存在问题:

1、直到所有文件读取完,才开始后续的操作,如果文件过多的话,就会卡在读取这一步;

2、 如果在读取过程中程序中断或崩溃,会导致后面的处理也失效,并且之后也要重新读取;

3、占用内存资源大,将所有文件内容都存在了一个空间中;

使用yied生成器的方法:

# 只需要在处理文件部分做修改
def get_all_results(files):
    
    for f in files:
        yield count_words(f)	# 使用yield返回结果,这个函数也被作为一个生成器
    
    # return (count_words(f) for f in files)	# 也可以直接返回一个可迭代对象,也是一个生成器

运行结果:

在这里插入图片描述

说明:

可以看出,不需要等待全部文件读取完,每次读取后都会对该文件进行处理,节省了空间的同时也提高了安全性;

拓展:

map、filter实际上也是一种生成器的作用,返回一个可迭代对象;

五、装饰器

作用:对函数做改变,并且随时可以取消这个改变;

本质:Fun = anthor(Fun),简写成了@anthor,这也就是改变函数;

代码实战:

# 首先定义一个函数,来修改传进来的函数
def memory(f):
    memory.cache = {}  # function attribute

    def _wrap(n):
        if n in memory.cache:
            print('hit {}'.format(n))
            return memory.cache[n]
        else:
            r = f(n)
            memory.cache[n] = r
            return r
    return _wrap

@memory
# 实现一个斐波那契数列
def fib(n):
    return fib(n - 1) + fib(n - 2) if n >= 2 else 1


if __name__ == '__main__':
    # fib = memory(fib)     // 使用装饰器相当于执行这行代码
    print(fib(10))

说明:

上述就是一个装饰器的使用,起到一个缓冲机制的作用,使得函数fib运行速度更加高效;

六、PYTHONPATH环境变量

这里需要介绍一个环境变量:PYTHONPATH

如果将自定义的一个py文件的路径放到这个环境变量中,代码如下:

export PYTHONPATH=${PWD}

那么在别的路径下,可以直接引用该环境变量路径下的包;

作用:十分便捷的引入外部工具包的方式,避免了一些工程文件的复制以及复杂的文件调用;

七、一些实用的工具函数

1、reduce

作用:将一个集合中的所有元素依次执行某个操作;

代码实现:

from functools import reduce

some_lists = [
    [1, 2],
    [3, 5],
    [5, 6, 7, 1, 10.1, 11.1],
    [121.4, 11.34],
    [11.31, 1921, 321.],
]

print(reduce(lambda a, b: a + b, some_lists))

说明:

以上就是对多个数组进行相加的实现,reduce的功能很强大,可以对任意数据类型实现多种操作;

拓展:

  • operator库

    import operator
    

    这是一个运算符操作的汇总库,可使用的一些操作在其内置的文件中有进行说明,下面是其包含的操作符方法:

    LrqWcj.md.png

2、cache

作用:

起到一个保存缓存数据的作用,对一些重复数据的结果进行保存,提高程序运行的效率;

代码示例:

from functools import cache

@cache
def fib(n):
	return fib(n - 1) + fib(n - 2) if n > 2 else 1

说明:以上代码实现了一个斐波那契数列,用cache工具包能提高其运行效率;

如果想要指定缓存多少个数据,可以用lru_cache这个库,本质上cache也是调用这个库函数;

from functools import lru_cache

@lru_cache(maxsize=2**8)
3、Partial

作用:

中文含义为偏函数,是指将一个函数变为有默认值的函数;

代码示例:

from functools import partial

def load_info(id, name, age, sex):
  print(sex)

# 定义默认参数的值
id1_config = {
    "id": '001',
    "name": "hero"
    }

# 创建一个新函数,设定默认参数
load_info_1 = partial(load_info, **id1_config)
load_info_1(age=10,sex="男")

说明:这个工具能够起到简化代码的作用,不需要每次传入相同的参数,只需要创建一个具有固定参数的对象即可;更好的体现了面向对象编程这个概念,并且能够优化内存空间;

4、singledispatch

作用:

中文含义为单例分发模式,往往一个函数可以接收不同类型的参数,如果想修改不同类型参数时的实现,往往需要改变函数体,也不便于维护;单例分发模式可以在不修改源代码的情况下,将实现分发出去,更符合开发逻辑;

代码示例:

from functools import singledispatch

@singledispatch
def multiply(arg1, arg2):
  pass

@multiply.register
def _(arg1:str, arg2:str): return arg1+arg2

@multiply.register
def _(arg1:int, arg2:int): return arg1*arg2

print(multiply(1, 2))		# 2

注意:这里需要注意的是,register()属性支持类型标注在3.7版本更新,一开始用236版本一直无法使用类型标注;

总结

下面列举下本篇相关知识点:

  • exce
  • match case(python 3.10)
  • dataclass(python 3.8)
  • yied及生成器
  • 装饰器
  • PYTHONPATH环境变量配置
  • 工具类函数:reduce、cache、partial、singledispatch

以上知识点都是在工程项目中可以使用来优化代码的,特别是环境配置以及生成器的使用;像cache装饰器可以缓存一部分数据,使得程序运行更加高效;

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python进阶学习(一) 的相关文章

随机推荐

  • C++ Vector用法(带例程)

    介绍 vector是可变大小数组的序列容器 vector是连续存储的 与数组存储相同 区别是大小是动态改变的 可随机访问 因此vector访问速度快 vector在末尾删除添加元素时相对高效 若在其他任意位置添加删除元素则效率更低 使用 1
  • Window系统下如何生成ssh key以及如何在码云中添加公钥

    前言 本篇文章是以window系统和码云为例讲解如何在window系统下生成ssh key 然后在码云中添加公钥 然后可以远程仓库的ssh地址克隆远程git仓库代码 一 首先在window下生成ssh key 1 首先要在我们的电脑下安装g
  • 码字必备:18 款优秀的 Markdown 写作工具

    现在是 2015 年底 自 2004 年 John Gruber1创造 Markdown 语言以来 已经过去了 11 年 在这 11 年里 Markdown 语言从程序员圈子中逐渐扩散开来 成为了越来越多的电脑写作者第一选择 随着使用人群的
  • go-zero&go web集成redis实战

    前言 上一篇 go zero go web集成JWT和cobra命令行工具实战 从零开始基于go zero搭建go web项目实战 03集成redis实战 源码仓库地址 源码 https gitee com li zheng treasur
  • 请确保在bios菜单中启用了磁盘的控制器

    进入 BIOSS 然后看看 启动里面是不是把硬盘启动关了 是的话 打开就好了
  • 目标检测入门:帧差法,光流法和背景减法

    概述 运动目标检测是指当监控场景中有活动目标时 采用图像分割的方法从背景图像中提取出目标的运动区域 运动目标检测技术是智能视频分析的基础 因为目标跟踪 行为理解等视频分析算法都是针对目标区域的像素点进行的 目标检测的结果直接决定着智能视觉监
  • C语言-位段详解

    1 位段的定义 位段是定义结构体 或联合体 中的成员变量所占的空间 单位是bit 含有位段的结构体 联合体 称为位段结构 2 位段的意义 能够节省空间 比如性别 2个bit位可以表示2 2 4种可能性 不需要一个整形32个bit位 3 位段
  • idea中快捷键Ctrl+Shift+F冲突

    Ctrl Shift F在idea中的作用是全文或全项目搜索某个词的使用 windows系统自带的微软输入法中简繁体切换的快捷键也是Ctrl Shift F 会导致冲突 如果对简繁体切换需求没那么大 建议将输入法的快捷键关闭 具体操作为 在
  • 三阶矩阵求特征值的快速算法

    一般的三阶矩阵求特征值其实是解析不了的 因为特征方程对应的是三次方程 对于一般的三次方程 是很难求解的 要想方程有三个整数根 并且能够不用完全暴力展开三阶行列式这样的矩阵实际是很特殊的 1 某一行有两个0的情况是最好算的情况 分块上 下三角
  • 2023.7.13

    代码讲解01 PTA 7 38 等边三角形面积 数学基础对于程序设计能力而言很重要 对于等边三角形面积 请选择合适的方法计算之 输入格式 测试数据有多组 处理到文件尾 每组测试输入1个实数表示等边三角形的边长 输出格式 对于每组测试 在一行
  • 开源考试系统

    项目介绍 学之思开源考试系统是一款 java vue 的前后端分离的考试系统 主要优点是开发 部署简单快捷 界面设计友好 代码结构清晰 支持web端和微信小程序 能覆盖到pc机和手机等设备 支持多种部署方式 集成部署 前后端分离部署 doc
  • 为什么推荐编程初学者学习C(C++)/Python?

    人类走进信息化时代 掌握计算机编程是一项不错的技能 培养逻辑思维 解决现实中实际问题的能力 学会将计算机作为人类思想和能力的延展性工具 计算机行业寒冬 但AI和互联网仍然是未来发展的大趋势 学习C语言和Python的区别在哪 为什么选这俩
  • (CVPR2019)图像语义分割(18) DANet-集成双路注意力机制的场景分割网络

    论文地址 Dual Attention Network for Scene Segmentation 工程地址 github链接 1 介绍 该论文提出新型的场景分割网络DANet 利用自注意力机制进行丰富语义信息的捕获 在带有空洞卷积的FC
  • 详解BGP 双平面

    拓扑描述 上平面为A 面 AS1 下平面为B 面 AS2 左边用户群 AS3 右边用户群 AS4 组成两个平面的原因 两个城市之间的数据交互 分为业务流量和办公流量 于此同时 希望业务流量走 上面 办公流量走下面 流量的组成会很清晰 同时两
  • 用windows系统做服务器配置,windows系统做服务器配置

    windows系统做服务器配置 内容精选 换一换 迁移前 您需要设置目的端服务器 该目的端用来接收源端的数据 同时您也可以使用该目的端进行迁移测试和启动目的端 只有 迁移阶段 gt 迁移实时状态 为时才可设置目的端 进入 主机迁移服务 页面
  • Windows10神州网信政府版的配置修改

    Windows10神州网信政府版初始安装完成后 在有些界面上呈现 某些设置已隐藏或由你的组织管理 这就意味着有很多属性并不能由使用者修改 这对用户来说很不不方便 下面是经常用到的一些属性修改 1 修改屏幕保护属性 按Win键 R键调出运行框
  • 排序算法之分治排序

    归并排序是基于分治法实现的 归并排序将待排序的元素序列分为两个长度相等的子序列 为每一个子序列排序 然后再将它们合并成一个序列 合并两个子序列的过程称为两路归并 在执行两路归并算法时 先把待归并元素序列L1复制到辅助数组L2中 再从L2归并
  • Selenium隐藏浏览器特征

    Selenium隐藏浏览器特征 Selenium特征 1 CDP 2 stealth min js 3 undetected chromedriver 4 操作已开启的浏览器 4 常见的隐藏Selenium特征的方法 4 1 修改navig
  • hadoop集群优化(四):开启历史任务服务器

    文章目录 说明 分享 操作 修改配置 同步配置 启动历史服务器 查看jobHistory 总结 说明 hadoop支持历史服务器功能 默认关闭 开启后 通过web可查看完成运行的MapReduce做的的信息记录 如Map和Reduce使用情
  • Python进阶学习(一)

    背景 在编程语言的大背景下 Python普遍被认为是一门易上手的脚本语言 而随着Python的应用越来越广泛 仅仅停留在会跑Python程序是不够的 本篇专栏主要记录一些高阶的用法以及Python语言的一些机制 Python语言掌握需要具备