Python进阶学习(一)
背景
在编程语言的大背景下,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_stringdef 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 = nameself.age = ageself.location = locationself.weight = weightdef __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 = 18location: float = 10.0weight: float = 20.0person = 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 attributedef _wrap(n):if n in memory.cache:print('hit {}'.format(n))return memory.cache[n]else:r = f(n)memory.cache[n] = rreturn rreturn _wrap@memory
# 实现一个斐波那契数列
def fib(n):return fib(n - 1) + fib(n - 2) if n >= 2 else 1if __name__ == '__main__':# fib = memory(fib) // 使用装饰器相当于执行这行代码print(fib(10))
说明:
上述就是一个装饰器的使用,起到一个缓冲机制的作用,使得函数fib运行速度更加高效;
六、PYTHONPATH环境变量
这里需要介绍一个环境变量:PYTHONPATH
如果将自定义的一个py文件的路径放到这个环境变量中,代码如下:
export PYTHONPATH=${PWD}
那么在别的路径下,可以直接引用该环境变量路径下的包;
作用:十分便捷的引入外部工具包的方式,避免了一些工程文件的复制以及复杂的文件调用;
七、一些实用的工具函数
1、reduce
作用:将一个集合中的所有元素依次执行某个操作;
代码实现:
from functools import reducesome_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
这是一个运算符操作的汇总库,可使用的一些操作在其内置的文件中有进行说明,下面是其包含的操作符方法:
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 partialdef 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*arg2print(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装饰器可以缓存一部分数据,使得程序运行更加高效;
Python进阶学习(一)相关推荐
- leetcode与python进阶学习总结
转自:leetcode与python进阶学习总结 l1是一个链表型,val是其属性,以下句子意义为如果l1不为空则取l1.val否则取0,节省代码空间,干净利落 x= l1.val if l1 els ...
- python进阶学习--- django框架解析 ---领悟编程语言共性与特性【后续详解】
python进阶学习---> django框架解析 --->领悟编程语言共性与特性 1.python语言介绍 python解释型脚本语言 2.python执行原理 python解释 ...
- python进阶学习路线(全)
学习路线: 1.硬件: 1.操作系统简介 2.第二篇:操作系统 2.linux基础: 1.初始Linux 2.基本使用 3.Linux进阶 3.python基础 : 1.python基础大纲 2.变量 ...
- 以下属于python标准库的选项是-Python 标准库一览(Python进阶学习)
转自:http://blog.csdn.net/jurbo/article/details/52334345 写这个的起因是,还是因为在做Python challenge的时候,有的时候想解决问题,连 ...
- python进阶学习
小编在此整理了python面向对象的相关内容,内容较长,请耐心读完. 注意:由于本人的个人习惯,为了使代码更加清晰明了,将采取以下方式呈现代码,诸位在学习敲代码时注意将前面的>>>去 ...
- python进阶学习笔记(四)--多线程thread
在使用多线程之前,我们首页要理解什么是进程和线程. 什么是进程? 计算机程序只不过是磁盘中可执行的,二进制(或其它类型)的数据.它们只有在被读取到内存中,被操作系统调用的时候才开始它们的生命期.进程( ...
- 21天Python进阶学习挑战赛打卡------第2天(基础内容)
活动地址:CSDN21天学习挑战赛 学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩:迟一天就多一天平庸的困扰.各位小伙伴,如果您: 想系统/深入学习某技术知识点- 一个人摸索学习很难坚持 ...
- python进阶学习--PyCharm使用
一.Pycharm整体结构 工具栏中可以对IDE做一些设置 项目文件区主要是自己工程下的一些文件,还有Python依赖库 运行调试区可以用来运行.调试Python代码 代码区为自己编写代码的窗口 控制 ...
- 【Python进阶学习】gRPC在Python的异步非阻塞实现方式
gRPC在Python的异步非阻塞实现方式 前言 问题&分析 问题阐述 原因分析 解决方案 服务端 原服务端实现方式 aio的服务端实现方式: 客户端 异步非阻塞方式 同步阻塞方式 性能优化效 ...
最新文章
- Spring源码阅读(六)
- CefSharp For WPF响应页面点击事件
- 模拟电磁曲射炮设计报告_毕业设计展 | 他们的毕业设计,有趣又实用
- 洛谷——P1605 迷宫
- html的排版标题的是,HTML 5结构排版布局
- 奥鹏数据库应用系统设计下列关于php_南开大学《主干课2-数据库应用系统设计》2020秋主干课考试...
- 【数码管/定时器/中断】一个定时器控制数码管显示
- c++ java string_C++中string类型的内部结构是什么?
- pytorch 对特征进行mean_Pytorch的mean和std调查实例
- python实现递归和非递归求两个数最大公约数、最小公倍数
- this.$router.push跳转到原来页面不刷新的问题解决
- win10最常用dos命令以及win+R即可运行的命令
- revel + swagger 文档也能互动啦
- jade2html 在线转换,jade转化为html
- 密码学之前后向安全性
- 让每个生命带着尊严谢幕!淘宝竟有这样一家“临终关怀”网店
- 饥荒:mod教程索引
- 正则表达式,匹配数字
- 【从零开始学微服务】01.微服务的过去与现在
- PHP strtotime()函数
热门文章
- 浏览器截图方法(长截图、node截图、指定区域截图)
- Cadence Orcad Capture CIS更换元器件之Link Database 功能介绍图文教程及视频演示
- react 表单受控组件
- mono mysql jexus,Linux +MySQL+mono +Jexus 上使用MySQL的简单总结 - Linux DotNET程序员大本营...
- springboot全局配置文件可设置的属性
- 【java】网易云信发送短信接口和验证短信验证码接口
- API接口汇聚,调用
- 已解决pip正确安装fitz模块
- 未来10年最具潜力的行业已出现,你一定不能错过?
- 类加载子系统【JVM之内存与垃圾回收篇】