10个提高python水平的高级知识点(python看完入门后怎样提高)
off999 2024-11-05 10:54 26 浏览 0 评论
分享一些有助于我们掌握 Python 的高级概念。如迭代器、生成器、装饰器、双端队列、排序字典等!
本文,我们将分享一些有助于我们掌握 Python 的高级概念。如迭代器、生成器、装饰器等!
1. 异常处理
异常处理是一个很重要的概念,它可以帮助我们更好地解决程序中的各种问题。
异常是在程序执行过程中发生并中断的情况。它可能由于多种原因而发生。比如:除法运算中分母为0的情况,会抛出:ZeroDivisionError;导入不存在的包时,会抛出:ImportError;列表越界时,会抛出:IndexError。python 中大约有30个内置异常。
我们使用 try 和 except 来处理 Python 中的异常。语法如下:
try:
pass # 可能发生异常的代码
except ValueError:
pass # 发生异常时执行的代码
except ZeroDivisionError:
pass # 发生异常时执行的代码
else:
pass # 其他情况时执行的代码
finally:
pass # 最终执行的执行的代码
2. collections模块
collections 模块被称为用于存储数据的容器。例如列表、元组、集合、字典。Python 中有许多库是为了提供额外的数据结构而开发的, collections就是其中之一,旨在改进内置容器的功能。该模块中最常用的五种数据结构:
1. Counter
对可迭代对象的计数。
from collections import Counter
data = [1,1,1,2,3,4,3,3,5,6,7,7,1]
count = Counter(data)
print(count) # Counter({1: 4, 2: 1, 3: 4, 4: 1, 5: 1, 6: 1, 7: 2})
## ?? Counter有几个惊艳的方法:
# 返回出现次数最多的前3个元素
print(count.most_common(3)) # [('1', 4), ('3', 4), ('2', 1)]
# 返回生成Counter对象的数据,迭代器格式。
for i in count.elements():
print(i) # 1 1 1 2 3 4 3 3 5 6 7 7 1
2. namedtuple
给元组元素命名,并且可以通过名字访问元素。
from collections import namedtuple
User = namedtuple('User', ['name', 'sex', 'age'])
user = User(name='Runoob', sex='male', age=12)
print(user) # User(name='Runoob', sex='male', age=12)
user = User._make(['RunoX', 'Male', 13])
print(user) # User(name='RunoX', sex='Male', age=13)
print(user.name, user.sex, user.age) # RunoX Male 13
user = user._replace(age=22)
print(user) # User(name='RunoX', sex='Male', age=22)
print(user._asdict()) # {'name': 'RunoX', 'sex': 'Male', 'age': 22}
3. OrderedDict
OrderedDict 是一种可以记住它们插入顺序的字典。当然,在最新版本的 Python 中,内置的 dict 也可以记住它。
from collections import OrderedDict
dictt = OrderedDict()
dictt['a'] = 5
dictt['d'] = 2
dictt['c'] = 1
dictt['b'] = 3
print(dictt) # OrderedDict([('a', 5), ('d', 2), ('c', 1), ('b', 3)])
4. defaultdict
defaultdict 将返回字典中不存在的键的默认值,而不是显示键错误。当然新版的dict.get()方法也可以返回默认值。
# 创建一个默认值为0的字典
from collections import defaultdict
dictt = defaultdict(int)
dictt['a'] = 2
print(dictt['a']) # 2
print(dictt['b']) # 0
# 新版本的 `dict.get()` 方法
dict = {'a': 1, 'b': 2}
print(dict.get('a', 0)) # 1
print(dict.get('c', 0)) # 0
print(dict.get('c')) # None
5. deque
deque 是一个双端队列,可以从两侧添加和删除元素。
from collections import deque
queue = deque(['a', 'b', 'c'])
queue.append('d')
print(queue) # deque(['a', 'b', 'c', 'd'])
queue.appendleft('e')
print(queue) # deque(['e', 'a', 'b', 'c', 'd'])
queue.pop()
print(queue) # deque(['e', 'a', 'b', 'c'])
queue.popleft()
print(queue) # deque(['a', 'b', 'c'])
3. itertools 模块
Python itertools 模块提供了各种适用于组合计算的函数。
- product(iterable,iterable):两个iterables的笛卡尔积
- permutation(iterable):所有可能的排序,没有重复元素
- combinations(iterable,n):指定长度的所有可能组合,不重复。这里 n 是组合元组的大小。
- combinations_with_replacement(iterable,n):指定长度的所有可能的组合,重复。
- accumlate(iterable) :返回累积iterable元素的总和。
- groupby(iterable,key=FUNC) :返回一个迭代器,其中包含来自可迭代对象的连续键和组。
from itertools import product, permutations, combinations, combinations_with_replacement, accumulate, groupby
a = [1,2,3]
print(list(product(a,a))) # [(1, 1), (1, 2), (1, 3), (2, 1), (2, 2), (2, 3), (3, 1), (3, 2), (3, 3)]
print(list(permutations(a))) # [(1, 2, 3), (1, 3, 2), (2, 1, 3), (2, 3, 1), (3, 1, 2), (3, 2, 1)]
print(list(combinations(a,2))) # [(1, 2), (1, 3), (2, 3)]
print(list(combinations_with_replacement(a,2))) # [(1, 1), (1, 2), (1, 3), (2, 2), (2, 3), (3, 3)]
print(list(accumulate(a))) # [1, 3, 6]
print(list(groupby(a))) # [(1, <itertools._grouper object at 0x7f8b8b8b9d10>), (2, <itertools._grouper object at 0x7f8b8b8b9d20>), (3, <itertools._grouper object at 0x7f8b8b8b9d30>)]
4. lambda 函数
lambda 函数是一种匿名函数,它的语法只包含一个语句,即:lambda [arg1 [,arg2,.....argn]]:expression。
even_or_odd = lambda a: a%2==0
numbers = [1,2,3,4,5]
even = list(map(even_or_odd,numbers))
print(even) # [False, True, False, True, False]
5. 装饰器
装饰器是 Python 的一个特性,它可以在不显式修改现有代码的情况下向现有代码添加一些新功能。
有两种类型的装饰器——函数装饰器和类装饰器。装饰器函数在函数名前有一个@。
要理解装饰器的概念,我们首先需要了解一件事——python 中的函数是类对象。与其他对象不同,它们可以在函数内部定义,在其他函数中作为参数传递,甚至作为函数返回。
import functools
def decorator(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
a,b = args
print(a*b)
result = func(*args,**kwargs)
print(a/b)
return result
return wrapper
@decorator
def add(x,y):
return x+y
result = add(5,6)
print(result) ##
让我们理解上面装饰器的例子:
首先,我们有一个函数名 add,它的工作是获取两个变量并返回它们的总和。现在经过一段时间的工作后,我们意识到需要为同一个函数添加乘法和除法功能。现在我们有两个选择,第一个是在同一个 add 函数中添加乘法和除法代码。或者我们可以使用装饰器来添加功能而无需显式更改函数。
为了使用装饰器,我们首先在第 2 行定义了一个装饰器函数。此函数将 func 作为输入。在第二行中,我们有另一个函数,因为我们知道我们可以在函数内部定义函数。它是一个具有 *args、**kwargs 函数参数的包装函数。有了这些,两者都定义为参数,现在我们可以在函数内部传递任意数量的参数。在包装函数的主体中,我们有乘法逻辑,然后仅使用加法逻辑调用实际的加法函数,最后我们有除法逻辑。当我们使用一些参数 add(5,6) 调用 add 函数时,输出将是:
30
0.8333333333333334
11
因为它首先执行乘法逻辑并打印值,然后加法逻辑并保存值,然后除法逻辑并打印值,最后返回相加的值并打印值。
6. 迭代器
生成器是一种返回可迭代对象的函数。它至少包含一个 yield 语句。yield 是 Python 中的一个关键字,用于从函数返回值而不破坏其当前状态或对局部变量的引用。带有 yield 关键字的函数称为生成器。相对于 return 你可以把 yield 理解为不中断函数的暂停,并且返回一个值。
生成器仅在需要时生成一次项目。它们的内存效率很高,占用的内存空间更少。
def fibonacci(n):
a,b = 0,1
for i in range(n):
a,b = b,a+b
yield a
for i in fibonacci(5):
print(i) ## 1 1 2 3 5
7. 进程和线程
线程和多处理都用于同时运行多个脚本。进程是程序的一个实例,线程是进程中的一个实体。
线程化是多个线程同时运行以执行不同任务的技术,而多处理是多个进程同时运行在不同CPU上的技术。下图对进程和线程的区别进行了说明,更多的信息请参考:这儿
8. 双下划线方法
Dunder 是 Double 和 Under 的缩写,称为双下划线方法,是python中的一种特殊方法。
num =5
print(num*6) ## 30
print(num.__mul__(6)) ## 30
这些方法主要用于重载预定义的运算符。例如,+、-、*、/ 是必须在数字对象周围使用的数字运算符,但 + 也用作两个字符串之间的连接运算符。所以我们可以说 + 运算符被重载来执行多个任务。
a =5
b =6
print(a+b) ## 11
print(a.__add__(b)) ## 11
c = 'hello'
d = 'world'
print(c+d) ## helloworld
print(c.__add__(d)) ## helloworld
9. 日志
日志记录是在代码执行时捕获代码流的过程。日志记录有助于轻松调试代码。它通常在文件中完成,以便我们以后可以检索它。在 python 中,我们有一个库日志记录,可以帮助我们将日志写入文件。有五个级别的日志记录:
- Debug 调试:用于诊断问题的详细信息。
- Info 信息:成功确认。
- Warning 警告:发生意外情况时。
- Error 错误:由于比警告更严重的问题。
- Critical 严重:严重错误后程序无法自行运行。
这儿作者推荐大家一个简单的日志记录工具:loguru。
10. 上下文管理器
上下文管理器是 Python 中的一个很好的工具,可以帮助进行资源管理。它们允许您在需要时分配和释放资源。上下文管理器最常用和最受认可的例子是 with 语句。with 主要用于打开和关闭文件。
with open('./test.txt', 'w') as f:
f.write('Hello World!')
小节
上面分享的10个提供python水平的高级知识点,希望在你工作或面试中有所帮助。
在编程的路上,挑战与精进同在,尝试学习使用装饰器 、yield、itertool 之类的高级功能,可以让你的编程生活变得更加有趣!
相关推荐
- python import 出现 ModuleNotFoundError 解决方法
-
错误的原因是你的Python环境没有正确安装库文件。本文以Scapy为例,给出详细方案:1.确认是否成功安装Scapy运行以下命令检查Scapy是否已安装:pip3list|gre...
- Github 7.4k star,一个强大的 Python 库-sh!
-
大家好,今天为大家分享一个强大的Python库-sh。Github地址:https://github.com/amoffat/shsh库是Python生态系统中一个专门用于执行系统命令的第三方...
- 学习编程第148天 python编程循环的嵌套使用
-
今天学习的是刘金玉老师零基础Python教程第32期,主要内容是python编程循环的嵌套使用。(一)一维数组及输出#一维数组list1=["110001","四川二流子...
- 2025-07-09:使数组元素互不相同所需的最少操作次数。用go语言,
-
2025-07-09:使数组元素互不相同所需的最少操作次数。用go语言,给定一个整数数组nums和一个整数k,对于数组中的每个元素,你最多可以对其进行一次操作:将一个在区间[-k,k]内的...
- python数据分析numpy基础之max求数组最大值
-
1python数据分析numpy基础之max求数组最大值python的numpy库的max()函数,用于计算沿指定轴(一个轴或多个轴)的最大值。用法numpy.max(a,axis=None,...
- 加快Python算法的四个方法(四)Dask
-
CDA数据分析师出品相信大家在做一些算法经常会被庞大的数据量所造成的超多计算量需要的时间而折磨的痛苦不已,接下来我们围绕四个方法来帮助大家加快一下Python的计算时间,减少大家在算法上的等待时间。...
- 六十六、Leetcode数组系列(中篇)(leetcode679)
-
@Author:Runsen@Date:2020/6/8人生最重要的不是所站的位置,而是内心所朝的方向。只要我在每篇博文中写得自己体会,修炼身心;在每天的不断重复学习中,耐住寂寞,练就真功,不畏艰难...
- Numpy中的ndarray是什么?('numpy.ndarray' object has no attribute 'append')
-
1.创建ndarray创建数组最简单的办法就是使用array函数。它接受一切序列型的对象(包括其他数组),然后产生一个新的含有传入数据的Numpy数组。np.array会尝试为新建的这个数组推断出一个...
- Python中的数据导入与查询(python怎样导入数据库)
-
适用场景:快速导入文本/Excel数据→Pandas读取大型数值数据→Numpy处理复杂二进制文件→h5py/scipy.io数据库交互→SQLAlchemy+Pandas一、数据...
- 2025-07-02:统计数组中的美丽分割。用go语言,给定一个整数数组
-
2025-07-02:统计数组中的美丽分割。用go语言,给定一个整数数组nums,我们要把它划分成三个连续且非空的子数组nums1、nums2、nums3,且这三个子数组按顺序拼接后还原为原数组...
- 2025-07-10:字符相同的最短子字符串Ⅰ。用go语言,给定一个长度
-
2025-07-10:字符相同的最短子字符串Ⅰ。用go语言,给定一个长度为n的二进制字符串s和一个允许执行的最大操作次数numOps。每次操作可以选择字符串中的任意一个位置i(0≤i...
- 2025-06-19:识别数组中的最大异常值。用go语言,你有一个长度为
-
2025-06-19:识别数组中的最大异常值。用go语言,你有一个长度为n的整数数组nums,其中恰好有n-2个元素属于“特殊数字”类别。剩下的两个元素中,一个等于所有这些特殊数字的总和,另...
- 2025-06-28:长度可被 K 整除的子数组的最大元素和。用go语言,给
-
2025-06-28:长度可被K整除的子数组的最大元素和。用go语言,给定一个整数数组nums和一个整数k,求nums中长度为k的倍数的非空子数组中,子数组和的最大值。返回该最大和...
- 在 Python 中如何向一个已排序的数组(列表) 中插入一个数呢
-
在Python中如何向一个已排序的数组(列表)中插入一个数呢?方法有很多种,关键在于原来数组是什么样的排序,用到啥排序方法效率高,就用哪种。我们来练习其中的几种插入方法,另外也掌握下遍历数组的...
- 2025-07-04:统计符合条件长度为 3 的子数组数目。用go语言,给定
-
2025-07-04:统计符合条件长度为3的子数组数目。用go语言,给定一个整数数组nums,请你计算有多少个长度恰好为3的连续子数组满足这样的条件:子数组的第一个元素与第三个元素的和,正好...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- python import 出现 ModuleNotFoundError 解决方法
- Github 7.4k star,一个强大的 Python 库-sh!
- 学习编程第148天 python编程循环的嵌套使用
- 2025-07-09:使数组元素互不相同所需的最少操作次数。用go语言,
- python数据分析numpy基础之max求数组最大值
- 加快Python算法的四个方法(四)Dask
- 六十六、Leetcode数组系列(中篇)(leetcode679)
- Numpy中的ndarray是什么?('numpy.ndarray' object has no attribute 'append')
- Python中的数据导入与查询(python怎样导入数据库)
- 2025-07-02:统计数组中的美丽分割。用go语言,给定一个整数数组
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python字典遍历 (54)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python读取文件夹下所有文件 (59)
- java调用python脚本 (56)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)